diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-03 18:47:41 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-03 18:47:41 +0100 |
commit | 4661934e31d3eee9414eb44ffc5a7e355326bc31 (patch) | |
tree | a9b4bbcb3a85a89d1a5f8311c4d7e3afcaa776d2 /sys/src/ape | |
parent | 52b9a0689603622fe9f2b7610e428c125e4acbb7 (diff) |
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().
Diffstat (limited to 'sys/src/ape')
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_envsetup.c | 4 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_fdinfo.c | 2 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/_getpw.c | 15 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/access.c | 24 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/getppid.c | 8 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/rename.c | 6 | ||||
-rw-r--r-- | sys/src/ape/lib/ap/plan9/time.c | 2 |
7 files changed, 34 insertions, 27 deletions
diff --git a/sys/src/ape/lib/ap/plan9/_envsetup.c b/sys/src/ape/lib/ap/plan9/_envsetup.c index 11f53dc81..21d6be3f4 100644 --- a/sys/src/ape/lib/ap/plan9/_envsetup.c +++ b/sys/src/ape/lib/ap/plan9/_envsetup.c @@ -44,7 +44,7 @@ _envsetup(void) 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 @@ _envsetup(void) } 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] = '='; diff --git a/sys/src/ape/lib/ap/plan9/_fdinfo.c b/sys/src/ape/lib/ap/plan9/_fdinfo.c index 51d034898..0252fb6d1 100644 --- a/sys/src/ape/lib/ap/plan9/_fdinfo.c +++ b/sys/src/ape/lib/ap/plan9/_fdinfo.c @@ -41,7 +41,7 @@ readprocfdinit(void) 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); diff --git a/sys/src/ape/lib/ap/plan9/_getpw.c b/sys/src/ape/lib/ap/plan9/_getpw.c index 151d7f3c8..2c6a740a7 100644 --- a/sys/src/ape/lib/ap/plan9/_getpw.c +++ b/sys/src/ape/lib/ap/plan9/_getpw.c @@ -153,20 +153,19 @@ _grpmems(char *list) 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; diff --git a/sys/src/ape/lib/ap/plan9/access.c b/sys/src/ape/lib/ap/plan9/access.c index c51b37d6c..c96db0228 100644 --- a/sys/src/ape/lib/ap/plan9/access.c +++ b/sys/src/ape/lib/ap/plan9/access.c @@ -24,8 +24,6 @@ access(const char *name, int mode) 2, 2 }; - char tname[1024]; - if(mode == 0){ db = _dirstat(name); if(db == nil){ @@ -48,13 +46,23 @@ access(const char *name, int mode) 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; } diff --git a/sys/src/ape/lib/ap/plan9/getppid.c b/sys/src/ape/lib/ap/plan9/getppid.c index 6d40a3cc9..ad38e2c7b 100644 --- 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 @@ getppid(void) 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); } diff --git a/sys/src/ape/lib/ap/plan9/rename.c b/sys/src/ape/lib/ap/plan9/rename.c index dddfea328..73d051b11 100644 --- a/sys/src/ape/lib/ap/plan9/rename.c +++ b/sys/src/ape/lib/ap/plan9/rename.c @@ -49,13 +49,13 @@ rename(const char *from, const char *to) 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; diff --git a/sys/src/ape/lib/ap/plan9/time.c b/sys/src/ape/lib/ap/plan9/time.c index 85a1e72b2..2a8463334 100644 --- a/sys/src/ape/lib/ap/plan9/time.c +++ b/sys/src/ape/lib/ap/plan9/time.c @@ -15,7 +15,7 @@ time(time_t *tp) 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); |