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:
Austin Clements 2012-02-17 23:20:13 -05:00
parent 12abb1a561
commit 9d59eb0151
3 changed files with 13 additions and 13 deletions

4
defs.h
View file

@ -142,8 +142,8 @@ char* strncpy(char*, const char*, int);
int argint(int, int*); int argint(int, int*);
int argptr(int, char**, int); int argptr(int, char**, int);
int argstr(int, char**); int argstr(int, char**);
int fetchint(struct proc*, uint, int*); int fetchint(uint, int*);
int fetchstr(struct proc*, uint, char**); int fetchstr(uint, char**);
void syscall(void); void syscall(void);
// timer.c // timer.c

View file

@ -13,28 +13,28 @@
// library system call function. The saved user %esp points // library system call function. The saved user %esp points
// to a saved program counter, and then the first argument. // 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 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; return -1;
*ip = *(int*)(addr); *ip = *(int*)(addr);
return 0; 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. // Doesn't actually copy the string - just sets *pp to point at it.
// Returns length of string, not including nul. // Returns length of string, not including nul.
int int
fetchstr(struct proc *p, uint addr, char **pp) fetchstr(uint addr, char **pp)
{ {
char *s, *ep; char *s, *ep;
if(addr >= p->sz) if(addr >= proc->sz)
return -1; return -1;
*pp = (char*)addr; *pp = (char*)addr;
ep = (char*)p->sz; ep = (char*)proc->sz;
for(s = *pp; s < ep; s++) for(s = *pp; s < ep; s++)
if(*s == 0) if(*s == 0)
return s - *pp; return s - *pp;
@ -45,7 +45,7 @@ fetchstr(struct proc *p, uint addr, char **pp)
int int
argint(int n, int *ip) 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 // Fetch the nth word-sized system call argument as a pointer
@ -74,7 +74,7 @@ argstr(int n, char **pp)
int addr; int addr;
if(argint(n, &addr) < 0) if(argint(n, &addr) < 0)
return -1; return -1;
return fetchstr(proc, addr, pp); return fetchstr(addr, pp);
} }
extern int sys_chdir(void); extern int sys_chdir(void);

View file

@ -388,13 +388,13 @@ sys_exec(void)
for(i=0;; i++){ for(i=0;; i++){
if(i >= NELEM(argv)) if(i >= NELEM(argv))
return -1; return -1;
if(fetchint(proc, uargv+4*i, (int*)&uarg) < 0) if(fetchint(uargv+4*i, (int*)&uarg) < 0)
return -1; return -1;
if(uarg == 0){ if(uarg == 0){
argv[i] = 0; argv[i] = 0;
break; break;
} }
if(fetchstr(proc, uarg, &argv[i]) < 0) if(fetchstr(uarg, &argv[i]) < 0)
return -1; return -1;
} }
return exec(path, argv); return exec(path, argv);