Some implicit dirs were not having the umask correctly

applied to their permissions.  Just calculate the
default dir mode once and use it consistently, rather than
trying to remember to calculate it everywhere it's needed.
This commit is contained in:
Tim Kientzle 2004-06-28 14:12:09 +00:00
parent 77d2ac4af5
commit 88c3541690
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=131240

View file

@ -71,6 +71,7 @@ struct fixup_entry {
struct extract {
mode_t umask;
mode_t default_dir_mode;
struct archive_string mkdirpath;
struct fixup_entry *fixup_list;
@ -157,6 +158,7 @@ archive_read_extract(struct archive *a, struct archive_entry *entry, int flags)
}
extract = a->extract;
umask(extract->umask = umask(0)); /* Read the current umask. */
extract->default_dir_mode = DEFAULT_DIR_MODE & ~extract->umask;
extract->pst = NULL;
restore_pwd = -1;
@ -385,6 +387,7 @@ extract_dir(struct archive *a, struct archive_entry *entry, int flags)
const struct stat *st;
char *p;
size_t len;
mode_t mode;
extract = a->extract;
@ -399,8 +402,12 @@ extract_dir(struct archive *a, struct archive_entry *entry, int flags)
p[--len] = '\0'; /* Remove trailing "/" */
/* Recursively try to build the path. */
st = archive_entry_stat(entry);
mode = st->st_mode;
/* Obey umask unless ARCHIVE_EXTRACT_PERM for explicit dirs. */
if ((flags & ARCHIVE_EXTRACT_PERM) == 0)
mode &= ~extract->umask;
extract->pst = NULL; /* Invalidate cached stat data. */
if (mkdirpath_recursive(a, p, st, st->st_mode, flags))
if (mkdirpath_recursive(a, p, st, mode, flags))
return (ARCHIVE_WARN);
archive_entry_set_mode(entry, 0700);
return (restore_metadata(a, entry, flags));
@ -428,7 +435,7 @@ mkdirpath(struct archive *a, const char *path)
/* Recursively try to build the path. */
if (mkdirpath_recursive(a, extract->mkdirpath.s,
NULL, DEFAULT_DIR_MODE, 0))
NULL, extract->default_dir_mode, 0))
return (ARCHIVE_WARN);
return (ARCHIVE_OK);
}
@ -463,7 +470,7 @@ mkdirpath_recursive(struct archive *a, char *path,
le->name = strdup(path);
if (mode != writable_mode) {
le->mode = mode & ~extract->umask;
le->mode = mode;
le->fixup |= FIXUP_MODE;
mode = writable_mode;
}
@ -522,7 +529,9 @@ mkdirpath_recursive(struct archive *a, char *path,
p = strrchr(path, '/');
if (p != NULL) {
*p = '\0'; /* Terminate path name. */
r = mkdirpath_recursive(a, path, NULL, DEFAULT_DIR_MODE, 0);
/* Note that implicit dirs always obey the umask. */
r = mkdirpath_recursive(a, path, NULL,
extract->default_dir_mode, 0);
*p = '/'; /* Restore the '/' we just overwrote. */
if (r != ARCHIVE_OK)
return (r);