When checking if we can write to a file, use access() instead of a
manual permission check based on stat output. Also, get rid of the executability check since it is not used. MFC after: 2 weeks
This commit is contained in:
parent
59d5849208
commit
68cc62cec1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=194493
@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
#define TEST_FILE 0x04
|
#define TEST_FILE 0x04
|
||||||
#define TEST_READABLE 0x08
|
#define TEST_READABLE 0x08
|
||||||
#define TEST_WRITABLE 0x10
|
#define TEST_WRITABLE 0x10
|
||||||
#define TEST_EXECUTABLE 0x20
|
|
||||||
|
|
||||||
static int verbose; /* -v flag: be verbose with warnings */
|
static int verbose; /* -v flag: be verbose with warnings */
|
||||||
static int pretend; /* -n, -p flags: print out what would be done
|
static int pretend; /* -n, -p flags: print out what would be done
|
||||||
@ -92,9 +91,6 @@ static const char *locale_device[] = {
|
|||||||
#define GZCAT_CMD "z"
|
#define GZCAT_CMD "z"
|
||||||
enum Ziptype {NONE, BZIP, GZIP};
|
enum Ziptype {NONE, BZIP, GZIP};
|
||||||
|
|
||||||
static uid_t uid;
|
|
||||||
static gid_t gids[NGROUPS_MAX];
|
|
||||||
static int ngids;
|
|
||||||
static int starting_dir;
|
static int starting_dir;
|
||||||
static char tmp_file[MAXPATHLEN];
|
static char tmp_file[MAXPATHLEN];
|
||||||
struct stat test_st;
|
struct stat test_st;
|
||||||
@ -320,23 +316,10 @@ test_path(char *name, time_t *mod_time)
|
|||||||
result |= TEST_DIR;
|
result |= TEST_DIR;
|
||||||
else if (S_ISREG(test_st.st_mode))
|
else if (S_ISREG(test_st.st_mode))
|
||||||
result |= TEST_FILE;
|
result |= TEST_FILE;
|
||||||
if (test_st.st_uid == uid) {
|
if (access(name, R_OK))
|
||||||
test_st.st_mode >>= 6;
|
|
||||||
} else {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < ngids; i++) {
|
|
||||||
if (test_st.st_gid == gids[i]) {
|
|
||||||
test_st.st_mode >>= 3;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (test_st.st_mode & S_IROTH)
|
|
||||||
result |= TEST_READABLE;
|
result |= TEST_READABLE;
|
||||||
if (test_st.st_mode & S_IWOTH)
|
if (access(name, W_OK))
|
||||||
result |= TEST_WRITABLE;
|
result |= TEST_WRITABLE;
|
||||||
if (test_st.st_mode & S_IXOTH)
|
|
||||||
result |= TEST_EXECUTABLE;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,14 +742,6 @@ main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
if ((uid = getuid()) == 0) {
|
|
||||||
fprintf(stderr, "don't run %s as root, use:\n echo", argv[0]);
|
|
||||||
for (optind = 0; optind < argc; optind++) {
|
|
||||||
fprintf(stderr, " %s", argv[optind]);
|
|
||||||
}
|
|
||||||
fprintf(stderr, " | nice -5 su -m man\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
while ((opt = getopt(argc, argv, "vnfLrh")) != -1) {
|
while ((opt = getopt(argc, argv, "vnfLrh")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'f':
|
case 'f':
|
||||||
@ -789,7 +764,6 @@ main(int argc, char **argv)
|
|||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ngids = getgroups(NGROUPS_MAX, gids);
|
|
||||||
if ((starting_dir = open(".", 0)) < 0) {
|
if ((starting_dir = open(".", 0)) < 0) {
|
||||||
err(1, ".");
|
err(1, ".");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user