prevent longjmp / forkret from writing over tf->edi
This commit is contained in:
parent
0dd4253747
commit
bd228a8156
3 changed files with 9 additions and 6 deletions
5
pipe.c
5
pipe.c
|
@ -61,6 +61,8 @@ pipe_alloc(struct fd **fd1, struct fd **fd2)
|
||||||
void
|
void
|
||||||
pipe_close(struct pipe *p, int writeable)
|
pipe_close(struct pipe *p, int writeable)
|
||||||
{
|
{
|
||||||
|
acquire(&p->lock);
|
||||||
|
|
||||||
if(writeable){
|
if(writeable){
|
||||||
p->writeopen = 0;
|
p->writeopen = 0;
|
||||||
wakeup(&p->readp);
|
wakeup(&p->readp);
|
||||||
|
@ -68,6 +70,9 @@ pipe_close(struct pipe *p, int writeable)
|
||||||
p->readopen = 0;
|
p->readopen = 0;
|
||||||
wakeup(&p->writep);
|
wakeup(&p->writep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
release(&p->lock);
|
||||||
|
|
||||||
if(p->readopen == 0 && p->writeopen == 0)
|
if(p->readopen == 0 && p->writeopen == 0)
|
||||||
kfree((char *) p, PAGE);
|
kfree((char *) p, PAGE);
|
||||||
}
|
}
|
||||||
|
|
2
proc.c
2
proc.c
|
@ -109,7 +109,7 @@ copyproc(struct proc* p)
|
||||||
// Set up new jmpbuf to start executing at forkret (see below).
|
// Set up new jmpbuf to start executing at forkret (see below).
|
||||||
memset(&np->jmpbuf, 0, sizeof np->jmpbuf);
|
memset(&np->jmpbuf, 0, sizeof np->jmpbuf);
|
||||||
np->jmpbuf.eip = (uint)forkret;
|
np->jmpbuf.eip = (uint)forkret;
|
||||||
np->jmpbuf.esp = (uint)np->tf;
|
np->jmpbuf.esp = (uint)np->tf - 4;
|
||||||
|
|
||||||
// Copy file descriptors
|
// Copy file descriptors
|
||||||
for(i = 0; i < NOFILE; i++){
|
for(i = 0; i < NOFILE; i++){
|
||||||
|
|
|
@ -13,8 +13,7 @@
|
||||||
* System call number in %eax.
|
* System call number in %eax.
|
||||||
* Arguments on the stack, from the user call to the C
|
* Arguments on the stack, from the user call to the C
|
||||||
* library system call function. The saved user %esp points
|
* library system call function. The saved user %esp points
|
||||||
* to a saved frame pointer, a program counter, and then
|
* to a saved program counter, and then the first argument.
|
||||||
* the first argument.
|
|
||||||
*
|
*
|
||||||
* Return value? Error indication? Errno?
|
* Return value? Error indication? Errno?
|
||||||
*/
|
*/
|
||||||
|
@ -56,11 +55,11 @@ fetcharg(int argno, void *ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
putint(struct proc *p, uint addr, int ip)
|
putint(struct proc *p, uint addr, int x)
|
||||||
{
|
{
|
||||||
if(addr > p->sz - 4)
|
if(addr > p->sz - 4)
|
||||||
return -1;
|
return -1;
|
||||||
memmove(p->mem + addr, &ip, 4);
|
memmove(p->mem + addr, &x, 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +268,6 @@ syscall(void)
|
||||||
int num = cp->tf->eax;
|
int num = cp->tf->eax;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
//cprintf("%x sys %d\n", cp, num);
|
|
||||||
switch(num){
|
switch(num){
|
||||||
case SYS_fork:
|
case SYS_fork:
|
||||||
ret = sys_fork();
|
ret = sys_fork();
|
||||||
|
|
Loading…
Reference in a new issue