ref: 61aa3a693762b7c0dab08cf455b7cbe9043ce064
parent: 3e46a7f62a98666c171d103b58a95f94cc2779ed
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);
--
⑨