ref: 4661934e31d3eee9414eb44ffc5a7e355326bc31
parent: 52b9a0689603622fe9f2b7610e428c125e4acbb7
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon Dec 3 13:47:41 EST 2012
ape: fix _grpmems(), access(), getppid(), cleanup _grpmems() was broken tokenizing group list in place. we have to copy it to status buffer before tokenizing. dynamically alloc path for test file to check write permission on directory and add pid to the name to prevent races. use _OPEN instead of ape open to read /dev/ppid in getppid(). use mode enums instead of numeric constants for _OPEN() and _CREATE().
--- a/sys/src/ape/lib/ap/plan9/_envsetup.c
+++ b/sys/src/ape/lib/ap/plan9/_envsetup.c
@@ -44,7 +44,7 @@
nohandle = 0;
fdinited = 0;
cnt = 0;
- dfd = _OPEN("/env", 0);+ dfd = _OPEN("/env", OREAD);if(dfd < 0)
goto done;
psize = Envhunk;
@@ -63,7 +63,7 @@
}
strcpy(p, "/env/");
memcpy(p+5, d9->name, n+1);
- f = _OPEN(p, 0);
+ f = _OPEN(p, OREAD);
memset(p, 0, n+6);
memcpy(p, d9->name, n);
p[n] = '=';
--- a/sys/src/ape/lib/ap/plan9/_fdinfo.c
+++ b/sys/src/ape/lib/ap/plan9/_fdinfo.c
@@ -41,7 +41,7 @@
strcpy(buf, "/proc/");
_ultoa(buf+6, getpid());
strcat(buf, "/fd");
- pfd = _OPEN(buf, 0);
+ pfd = _OPEN(buf, OREAD);
if(pfd < 0)
return -1;
memset(buf, 0, sizeof buf);
--- a/sys/src/ape/lib/ap/plan9/_getpw.c
+++ b/sys/src/ape/lib/ap/plan9/_getpw.c
@@ -153,20 +153,19 @@
char **v;
char *p;
static char *holdvec[200];
- static char holdlist[1000];
+ static char holdlist[1024];
- p = list;
v = holdvec;
- if(p) {- strncpy(holdlist, list, sizeof(holdlist));
+ if(list != 0){+ memset(holdlist, 0, sizeof(holdlist));
+ strncpy(holdlist, list, sizeof(holdlist)-1);
+ p = holdlist;
while(v< &holdvec[sizeof(holdvec)]-1 && *p){*v++ = p;
p = strchr(p, ',');
- if(p){- p++;
- *p = 0;
- }else
+ if(p == 0)
break;
+ *p++ = 0;
}
}
*v = 0;
--- a/sys/src/ape/lib/ap/plan9/access.c
+++ b/sys/src/ape/lib/ap/plan9/access.c
@@ -24,8 +24,6 @@
2,
2
};
- char tname[1024];
-
if(mode == 0){db = _dirstat(name);
if(db == nil){@@ -48,13 +46,23 @@
close(fd);
}
if(mode & W_OK){- strncpy(tname, name, sizeof(tname)-9);
- strcat(tname, "/_AcChAcK");
- fd = creat(tname, 0666);
- if(fd < 0)
+ char *tname;
+ int nname;
+ nname = strlen(name);
+ tname = malloc(nname+32);
+ if(tname == 0)
return -1;
- close(fd);
- _REMOVE(tname);
+ memset(tname, 0, nname+32);
+ memcpy(tname, name, n);
+ memcpy(tname+nname, "/_AcChAcK", 9);
+ _ultoa(tname+nname+9, getpid());
+ fd = _CREATE(tname, ORCLOSE, 0666);
+ if(fd < 0){+ free(tname);
+ return -1;
+ }
+ _CLOSE(fd);
+ free(tname);
}
return 0;
}
--- a/sys/src/ape/lib/ap/plan9/getppid.c
+++ b/sys/src/ape/lib/ap/plan9/getppid.c
@@ -3,7 +3,7 @@
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
-#include <errno.h>
+#include <string.h>
#include "sys9.h"
pid_t
@@ -13,10 +13,10 @@
int f;
memset(b, 0, sizeof(b));
- f = open("/dev/ppid", 0);+ f = _OPEN("/dev/ppid", OREAD); if(f >= 0) {- read(f, b, sizeof(b));
- close(f);
+ _PREAD(f, b, sizeof(b), 0);
+ _CLOSE(f);
}
return atol(b);
}
--- a/sys/src/ape/lib/ap/plan9/rename.c
+++ b/sys/src/ape/lib/ap/plan9/rename.c
@@ -49,13 +49,13 @@
int ffd, tfd;
char buf[8192];
- if((ffd = _OPEN(from, 0)) < 0 ||
- (tfd = _CREATE(to, 1, d->mode)) < 0){+ if((ffd = _OPEN(from, OREAD)) < 0 ||
+ (tfd = _CREATE(to, OWRITE, d->mode)) < 0){_CLOSE(ffd);
_syserrno();
n = -1;
}
- while(n>=0 && (n = _READ(ffd, buf, 8192)) > 0)
+ while(n>=0 && (n = _READ(ffd, buf, sizeof(buf))) > 0)
if(_WRITE(tfd, buf, n) != n){_syserrno();
n = -1;
--- a/sys/src/ape/lib/ap/plan9/time.c
+++ b/sys/src/ape/lib/ap/plan9/time.c
@@ -15,7 +15,7 @@
time_t t;
memset(b, 0, sizeof(b));
- f = _OPEN("/dev/time", 0);+ f = _OPEN("/dev/time", OREAD); if(f >= 0) {_PREAD(f, b, sizeof(b), 0);
_CLOSE(f);
--
⑨