On Sat Aug 1 21:40:18 EDT 2009, [email protected] wrote:
> diff -c /n/dump/2009/0801/sys/src/9/port/sysproc.c sysproc.c
> /n/dump/2009/0801/sys/src/9/port/sysproc.c:234,247 - sysproc.c:234,248
ready. shoot. aim.
sorry. i sent the wrong patch.
i also should have mentioned that this patch is not as aggressive
about checking for arguments changing underfoot as russ'. so
we can all anticipate the next program that'll be posted.
i do agree with charles that part of the solution is to ease fault386 to
only panic on addresses that obviously could have never been
valid, like 0, addresses in pci space, etc.
- erik
diffy -c sysproc.c chan.c
diff -c /n/dump/2009/0801/sys/src/9/port/sysproc.c sysproc.c
/n/dump/2009/0801/sys/src/9/port/sysproc.c:223,229 - sysproc.c:223,229
int i;
Chan *tc;
char **argv, **argp;
- char *a, *charp, *args, *file;
+ char *a, *charp, *args, *file, *file0;
char *progarg[sizeof(Exec)/2+1], *elem, progelem[64];
ulong ssize, spage, nargs, nbytes, n, bssend;
int indir;
/n/dump/2009/0801/sys/src/9/port/sysproc.c:234,247 - sysproc.c:234,248
ulong magic, text, entry, data, bss;
Tos *tos;
- validaddr(arg[0], 1, 0);
- file = (char*)arg[0];
+ file = nil;
indir = 0;
elem = nil;
if(waserror()){
free(elem);
+ free(file);
nexterror();
}
+ file = file0 = validnamedup((char*)arg[0], 1);
for(;;){
tc = namec(file, Aopen, OEXEC, 0);
if(waserror()){
/n/dump/2009/0801/sys/src/9/port/sysproc.c:375,380 - sysproc.c:376,382
charp += n;
}
+ free(file0);
free(up->text);
up->text = elem;
elem = nil; /* so waserror() won't free elem */
diff -c /n/dump/2009/0801/sys/src/9/port/chan.c chan.c
/n/dump/2009/0801/sys/src/9/port/chan.c:1689,1701 - chan.c:1689,1698
if((ulong)name < KZERO){
validaddr((ulong)name, 1, 0);
if(!dup)
- print("warning: validname called from %lux with user
pointer", pc);
+ print("warning: validname called from %#p with user
pointer", pc);
p = name;
t = BY2PG-((ulong)p&(BY2PG-1));
- while((ename=vmemchr(p, 0, t)) == nil){
- p += t;
- t = BY2PG;
- }
+ ename = vmemchr(name, 0, 1<<16);
}else
ename = memchr(name, 0, (1<<16));
- erik