STATUS: 78%
0000 T _exec compatible
0010 T _exece 99% compatible - uses a different temp. reg.
0618 T _getxfile not compatible
0fe8 T _setregs compatible
1164 T _rexit compatible
118c T _exit compatible
1374 T _wait compatible
1428 T _freeproc compatible
14a2 T _fork compatible
This commit is contained in:
parent
00d8dd899b
commit
c601b93f3a
|
|
@ -244,7 +244,7 @@ register unsigned nargc;
|
||||||
int stackno, offs;
|
int stackno, offs;
|
||||||
char segno[NUSEGS];
|
char segno[NUSEGS];
|
||||||
int j;
|
int j;
|
||||||
unsigned int segmts[NUSEGS-1];
|
unsigned int segmts[NUSEGS];
|
||||||
unsigned int stext;
|
unsigned int stext;
|
||||||
unsigned int sdata;
|
unsigned int sdata;
|
||||||
unsigned int sbss;
|
unsigned int sbss;
|
||||||
|
|
@ -255,7 +255,7 @@ register unsigned nargc;
|
||||||
u.u_segflg = 1;
|
u.u_segflg = 1;
|
||||||
readi();
|
readi();
|
||||||
u.u_segflg = 0;
|
u.u_segflg = 0;
|
||||||
if (u.u_error) /* 1 */
|
if (u.u_error)
|
||||||
return ovly;
|
return ovly;
|
||||||
if (u.u_count){
|
if (u.u_count){
|
||||||
bad0: u.u_error = ENOEXEC;
|
bad0: u.u_error = ENOEXEC;
|
||||||
|
|
@ -278,27 +278,29 @@ bad0: u.u_error = ENOEXEC;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
switch (magic){
|
switch (magic){
|
||||||
case S_MAGIC3: sepid++;
|
case S_MAGIC3:
|
||||||
case S_MAGIC1: scn = -1;
|
sepid++;
|
||||||
|
case S_MAGIC1:
|
||||||
|
scn = -1;
|
||||||
for (i=0; i < (nseg+1)/2; i++){
|
for (i=0; i < (nseg+1)/2; i++){
|
||||||
for(j = 0; ; j++){
|
for(j = 0;; j++){
|
||||||
if ( j <= 1){
|
if ( j <= 1){
|
||||||
segment = u.u_exdata.segtable[j].sg_segno;
|
segment = u.u_exdata.segtable[j].sg_segno;
|
||||||
stext = u.u_exdata.segtable[j].sg_code;
|
stext = u.u_exdata.segtable[j].sg_code;
|
||||||
sdata = u.u_exdata.segtable[j].sg_data;
|
sdata = u.u_exdata.segtable[j].sg_data;
|
||||||
sbss = u.u_exdata.segtable[j].sg_bss;
|
sbss = u.u_exdata.segtable[j].sg_bss;
|
||||||
if (++cseg > nseg) /* 10 */
|
if (++cseg > nseg)
|
||||||
break;
|
break;
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
segno[++scn] = segment;
|
segno[++scn] = segment;
|
||||||
segmts[scn] = 0;
|
segmts[scn] = 0;
|
||||||
/* 11 */ if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
|
if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
|
||||||
segmts[scn] = stext;
|
segmts[scn] = stext;
|
||||||
/* 12 */ if (sepid){
|
if (sepid){
|
||||||
segno[scn] |= 0x80;
|
segno[scn] |= 0x80;
|
||||||
code_size += (unsigned long)stext;
|
code_size += (unsigned long)stext;
|
||||||
/* 13 */ if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
|
if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
|
||||||
goto bad0;
|
goto bad0;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -311,7 +313,7 @@ bad0: u.u_error = ENOEXEC;
|
||||||
goto bad0;
|
goto bad0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* 17 */ if (u.u_exdata.segtable[j].sg_atr & SG_DATA){
|
if (u.u_exdata.segtable[j].sg_atr & SG_DATA){
|
||||||
segmts[scn] += sdata;
|
segmts[scn] += sdata;
|
||||||
curdsiz = (unsigned long)segmts[scn] + (unsigned long)sbss;
|
curdsiz = (unsigned long)segmts[scn] + (unsigned long)sbss;
|
||||||
if ((unsigned)curdsiz != curdsiz){
|
if ((unsigned)curdsiz != curdsiz){
|
||||||
|
|
@ -320,12 +322,12 @@ bad0: u.u_error = ENOEXEC;
|
||||||
}
|
}
|
||||||
data_size += sdata;
|
data_size += sdata;
|
||||||
bss_size += sbss;
|
bss_size += sbss;
|
||||||
/* 19 */ if (sestabur(lbtoc((long)(segmts[scn]+sbss)), segno[scn], scn, 1))
|
if (sestabur(lbtoc((long)(segmts[scn]+sbss)), segno[scn], scn, 1))
|
||||||
goto bad0;
|
goto bad0;
|
||||||
} else {
|
} else {
|
||||||
if (u.u_exdata.segtable[j].sg_atr & SG_BSS){
|
if (u.u_exdata.segtable[j].sg_atr & SG_BSS){
|
||||||
bss_size += sbss;
|
bss_size += sbss;
|
||||||
/* 21 */ if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1))
|
if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1))
|
||||||
goto bad0;
|
goto bad0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -337,12 +339,12 @@ bad0: u.u_error = ENOEXEC;
|
||||||
u.u_segflg = 0;
|
u.u_segflg = 0;
|
||||||
}
|
}
|
||||||
if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
|
if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
|
||||||
u.u_error = ENOSEG;
|
u.u_error = ETXTBSY;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
ussize = lbtoc((long)nargc) + SSIZE;
|
ussize = lbtoc((long)nargc) + SSIZE;
|
||||||
u.u_stakseg = stackno;
|
u.u_stakseg = stackno;
|
||||||
/* 25*/ if (sestabur(ussize, stackno, 0, 0))
|
if (sestabur(ussize, stackno, 0, 0))
|
||||||
goto bad0;
|
goto bad0;
|
||||||
utsize = lbtoc((long)code_size);
|
utsize = lbtoc((long)code_size);
|
||||||
udsize = lbtoc((long)(data_size + bss_size));
|
udsize = lbtoc((long)(data_size + bss_size));
|
||||||
|
|
@ -354,7 +356,7 @@ bad0: u.u_error = ENOEXEC;
|
||||||
setscr();
|
setscr();
|
||||||
u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
|
u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
|
||||||
u.u_nsegs = nseg;
|
u.u_nsegs = nseg;
|
||||||
/* 27*/ for (i = 0; i < nseg; i++)
|
for (i = 0; i < nseg; i++)
|
||||||
u.u_segno[i] = segno[i];
|
u.u_segno[i] = segno[i];
|
||||||
u.u_sep = (unsigned char)sepid;
|
u.u_sep = (unsigned char)sepid;
|
||||||
u.u_prof[0].pr_scale = 0;
|
u.u_prof[0].pr_scale = 0;
|
||||||
|
|
@ -395,10 +397,11 @@ bad0: u.u_error = ENOEXEC;
|
||||||
segureg();
|
segureg();
|
||||||
return ovly;
|
return ovly;
|
||||||
case S_MAGIC4:
|
case S_MAGIC4:
|
||||||
default: u.u_error = ENOEXEC;
|
default:
|
||||||
|
u.u_error = ENOEXEC;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
} else /* von b3 */
|
} else
|
||||||
code_size = u.u_exdata.segtable[0].sg_code;
|
code_size = u.u_exdata.segtable[0].sg_code;
|
||||||
if ((head_size = u.u_exdata.s_exc.s_segt) == sizeof(struct segt) || (magic == N_MAGIC1))
|
if ((head_size = u.u_exdata.s_exc.s_segt) == sizeof(struct segt) || (magic == N_MAGIC1))
|
||||||
data_size = u.u_exdata.segtable[0].sg_data;
|
data_size = u.u_exdata.segtable[0].sg_data;
|
||||||
|
|
@ -410,7 +413,7 @@ bad0: u.u_error = ENOEXEC;
|
||||||
u.u_exdsz -= head_size;
|
u.u_exdsz -= head_size;
|
||||||
switch(magic){
|
switch(magic){
|
||||||
case N_MAGIC1:
|
case N_MAGIC1:
|
||||||
{ data_size = curdsiz = data_size + code_size;
|
data_size = curdsiz = data_size + code_size;
|
||||||
u.u_exdata.segtable[0].sg_data = curdsiz;
|
u.u_exdata.segtable[0].sg_data = curdsiz;
|
||||||
if ((unsigned)curdsiz != curdsiz){
|
if ((unsigned)curdsiz != curdsiz){
|
||||||
u.u_error = ENOMEM;
|
u.u_error = ENOMEM;
|
||||||
|
|
@ -419,28 +422,24 @@ bad0: u.u_error = ENOEXEC;
|
||||||
code_size=0;
|
code_size=0;
|
||||||
u.u_exdata.segtable[0].sg_code=0;
|
u.u_exdata.segtable[0].sg_code=0;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case N_MAGIC4:
|
|
||||||
{ ovly++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case N_MAGIC3:
|
case N_MAGIC3:
|
||||||
{ sepid++;
|
sepid++;
|
||||||
|
break;
|
||||||
|
case N_MAGIC4:
|
||||||
|
ovly++;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{ u.u_error = ENOEXEC;
|
u.u_error = ENOEXEC;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
}
|
if ((code_size) && (ip->i_flag & ITEXT) == 0 &&
|
||||||
if (code_size && (ip->i_flag & ITEXT) == 0 &&
|
|
||||||
ip->i_count!=(cnt_t)1){
|
ip->i_count!=(cnt_t)1){
|
||||||
u.u_error = ENOSEG;
|
u.u_error = ETXTBSY;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
utsize = lbtoc((long)code_size);
|
utsize = lbtoc((long)code_size);
|
||||||
curdsiz = data_size + bss_size;
|
curdsiz = data_size + bss_size;
|
||||||
/* 45 */if ((unsigned)curdsiz != curdsiz){
|
if ((unsigned)curdsiz != curdsiz){
|
||||||
u.u_error = ENOMEM;
|
u.u_error = ENOMEM;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
|
|
@ -454,7 +453,7 @@ bad0: u.u_error = ENOEXEC;
|
||||||
u.u_error = ENOMEM;
|
u.u_error = ENOMEM;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
/* 49 */if (nargc){
|
if (nargc){
|
||||||
u.u_error = ENOMEM;
|
u.u_error = ENOMEM;
|
||||||
return ovly;
|
return ovly;
|
||||||
}
|
}
|
||||||
|
|
@ -472,14 +471,19 @@ bad0: u.u_error = ENOEXEC;
|
||||||
while (--i >= USIZE)
|
while (--i >= USIZE)
|
||||||
clearseg(u.u_procp->p_addr + i);
|
clearseg(u.u_procp->p_addr + i);
|
||||||
xalloc(ip, code_size);
|
xalloc(ip, code_size);
|
||||||
estabur(0, udsize, 0, 1);
|
/* read in data segment */
|
||||||
|
estabur((unsigned)0, udsize, (unsigned)0, 1);
|
||||||
u.u_base.left = USEGW;
|
u.u_base.left = USEGW;
|
||||||
u.u_base.right = 0;
|
u.u_base.right = 0;
|
||||||
u.u_offset = (unsigned long)(u.u_exdsz+(unsigned)code_size);
|
u.u_offset = (unsigned long)(u.u_exdsz+(unsigned)code_size);
|
||||||
u.u_count = data_size;
|
u.u_count = data_size;
|
||||||
readi(ip);
|
readi(ip);
|
||||||
/* 51 */ if ((u.u_procp->p_flag & STRC)==0){
|
/*
|
||||||
if ((ip->i_mode & ISUID) && (u.u_uid)){
|
* set SUID/SGID protections, if no tracing
|
||||||
|
*/
|
||||||
|
if ((u.u_procp->p_flag & STRC)==0){
|
||||||
|
if (ip->i_mode & ISUID)
|
||||||
|
if (u.u_uid){
|
||||||
u.u_uid = ip->i_uid;
|
u.u_uid = ip->i_uid;
|
||||||
u.u_procp->p_uid = ip->i_uid;
|
u.u_procp->p_uid = ip->i_uid;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue