diff options
author | wtchang%redhat.com <devnull@localhost> | 2005-01-12 01:47:32 +0000 |
---|---|---|
committer | wtchang%redhat.com <devnull@localhost> | 2005-01-12 01:47:32 +0000 |
commit | 5416f9bd9eca079ab5185c641cf075c02de1b1d3 (patch) | |
tree | f050d05d3885064b46324eee726ff85123b8826f /pr/src/md/beos/bfile.c | |
parent | a7800d2ed43f0b2db9faefd62f4cf3417bd21faa (diff) | |
download | nspr-hg-5416f9bd9eca079ab5185c641cf075c02de1b1d3.tar.gz |
Bugzilla Bug 276587: use stat to implement _MD_access because access is
broken. The patch is contributed by tqh <thesuckiestemail@yahoo.se>. r=wtc
Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH
Diffstat (limited to 'pr/src/md/beos/bfile.c')
-rw-r--r-- | pr/src/md/beos/bfile.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/pr/src/md/beos/bfile.c b/pr/src/md/beos/bfile.c index 19492a42..b67c97f1 100644 --- a/pr/src/md/beos/bfile.c +++ b/pr/src/md/beos/bfile.c @@ -484,31 +484,38 @@ PRInt32 _MD_access (const char *name, PRIntn how) { PRInt32 rv, err; -int amode; +int checkFlags; +struct stat buf; switch (how) { case PR_ACCESS_WRITE_OK: - amode = W_OK; + checkFlags = S_IWUSR | S_IWGRP | S_IWOTH; break; + case PR_ACCESS_READ_OK: - amode = R_OK; + checkFlags = S_IRUSR | S_IRGRP | S_IROTH; break; + case PR_ACCESS_EXISTS: - amode = F_OK; + /* we don't need to examine st_mode. */ break; + default: PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); - rv = -1; - goto done; + return -1; + } + + rv = stat(name, &buf); + if (rv == 0 && how != PR_ACCESS_EXISTS && (!(buf.st_mode & checkFlags))) { + PR_SetError(PR_NO_ACCESS_RIGHTS_ERROR, 0); + return -1; } - rv = access(name, amode); if (rv < 0) { err = _MD_ERRNO(); - _PR_MD_MAP_ACCESS_ERROR(err); + _PR_MD_MAP_STAT_ERROR(err); } -done: return(rv); } |