Make fetchint and fetchstr use proc instead of taking a struct proc
Previously, these were inconsistent: they used their struct proc argument for bounds checking, but always copied the argument from the current address space (and hence the current process). Drop the struct proc argument and always use the current proc. Suggested by Carmi Merimovich.
This commit is contained in:
parent
12abb1a561
commit
9d59eb0151
4
defs.h
4
defs.h
|
@ -142,8 +142,8 @@ char* strncpy(char*, const char*, int);
|
|||
int argint(int, int*);
|
||||
int argptr(int, char**, int);
|
||||
int argstr(int, char**);
|
||||
int fetchint(struct proc*, uint, int*);
|
||||
int fetchstr(struct proc*, uint, char**);
|
||||
int fetchint(uint, int*);
|
||||
int fetchstr(uint, char**);
|
||||
void syscall(void);
|
||||
|
||||
// timer.c
|
||||
|
|
18
syscall.c
18
syscall.c
|
@ -13,28 +13,28 @@
|
|||
// library system call function. The saved user %esp points
|
||||
// to a saved program counter, and then the first argument.
|
||||
|
||||
// Fetch the int at addr from process p.
|
||||
// Fetch the int at addr from the current process.
|
||||
int
|
||||
fetchint(struct proc *p, uint addr, int *ip)
|
||||
fetchint(uint addr, int *ip)
|
||||
{
|
||||
if(addr >= p->sz || addr+4 > p->sz)
|
||||
if(addr >= proc->sz || addr+4 > proc->sz)
|
||||
return -1;
|
||||
*ip = *(int*)(addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Fetch the nul-terminated string at addr from process p.
|
||||
// Fetch the nul-terminated string at addr from the current process.
|
||||
// Doesn't actually copy the string - just sets *pp to point at it.
|
||||
// Returns length of string, not including nul.
|
||||
int
|
||||
fetchstr(struct proc *p, uint addr, char **pp)
|
||||
fetchstr(uint addr, char **pp)
|
||||
{
|
||||
char *s, *ep;
|
||||
|
||||
if(addr >= p->sz)
|
||||
if(addr >= proc->sz)
|
||||
return -1;
|
||||
*pp = (char*)addr;
|
||||
ep = (char*)p->sz;
|
||||
ep = (char*)proc->sz;
|
||||
for(s = *pp; s < ep; s++)
|
||||
if(*s == 0)
|
||||
return s - *pp;
|
||||
|
@ -45,7 +45,7 @@ fetchstr(struct proc *p, uint addr, char **pp)
|
|||
int
|
||||
argint(int n, int *ip)
|
||||
{
|
||||
return fetchint(proc, proc->tf->esp + 4 + 4*n, ip);
|
||||
return fetchint(proc->tf->esp + 4 + 4*n, ip);
|
||||
}
|
||||
|
||||
// Fetch the nth word-sized system call argument as a pointer
|
||||
|
@ -74,7 +74,7 @@ argstr(int n, char **pp)
|
|||
int addr;
|
||||
if(argint(n, &addr) < 0)
|
||||
return -1;
|
||||
return fetchstr(proc, addr, pp);
|
||||
return fetchstr(addr, pp);
|
||||
}
|
||||
|
||||
extern int sys_chdir(void);
|
||||
|
|
|
@ -388,13 +388,13 @@ sys_exec(void)
|
|||
for(i=0;; i++){
|
||||
if(i >= NELEM(argv))
|
||||
return -1;
|
||||
if(fetchint(proc, uargv+4*i, (int*)&uarg) < 0)
|
||||
if(fetchint(uargv+4*i, (int*)&uarg) < 0)
|
||||
return -1;
|
||||
if(uarg == 0){
|
||||
argv[i] = 0;
|
||||
break;
|
||||
}
|
||||
if(fetchstr(proc, uarg, &argv[i]) < 0)
|
||||
if(fetchstr(uarg, &argv[i]) < 0)
|
||||
return -1;
|
||||
}
|
||||
return exec(path, argv);
|
||||
|
|
Loading…
Reference in a new issue