From: Brilliantov Kirill Vladimirovich <brilliantov@xxxxxxxx> Signed-off-by: Brilliantov Kirill Vladimirovich <brilliantov@xxxxxxxx> --- archive-tar.c | 15 +++++++++------ archive-zip.c | 7 +++++-- archive.c | 3 ++- builtin/add.c | 3 ++- builtin/am.c | 8 +++++--- builtin/apply.c | 6 ++++-- builtin/archive.c | 4 +++- builtin/clone.c | 7 ++++--- builtin/config.c | 4 +++- builtin/index-pack.c | 7 +++++-- builtin/init-db.c | 5 +++-- builtin/log.c | 4 +++- builtin/mailsplit.c | 3 ++- builtin/merge.c | 9 +++++---- builtin/notes.c | 4 +++- builtin/replace.c | 3 ++- builtin/tag.c | 3 ++- builtin/worktree.c | 3 ++- cache.h | 6 ++++-- compat/mingw.c | 4 ++-- compat/stat.c | 21 ++++++++++----------- config.c | 9 +++++++-- copy.c | 4 +++- diff-no-index.c | 3 ++- entry.c | 12 +++++++----- fast-import.c | 9 +++++---- file-access.h | 27 +++++++++++++++++++++++++++ http.c | 8 +++++--- lockfile.c | 3 ++- merge-recursive.c | 7 ++++--- notes-merge.c | 3 ++- refs.c | 7 ++++--- rerere.c | 3 ++- sequencer.c | 5 +++-- server-info.c | 3 ++- setup.c | 5 +++-- sha1_file.c | 13 +++++++------ test-delta.c | 3 ++- trace.c | 4 +++- wrapper.c | 3 ++- 40 files changed, 172 insertions(+), 88 deletions(-) create mode 100644 file-access.h diff --git a/archive-tar.c b/archive-tar.c index 0d1e6bd..94caa30 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -6,6 +6,7 @@ #include "archive.h" #include "streaming.h" #include "run-command.h" +#include "file-access.h" #define RECORDSIZE (512) #define BLOCKSIZE (RECORDSIZE * 20) @@ -167,7 +168,8 @@ static void prepare_header(struct archiver_args *args, struct ustar_header *header, unsigned int mode, unsigned long size) { - sprintf(header->mode, "%07o", mode & 07777); + sprintf(header->mode, "%07o", + mode & (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL)); sprintf(header->size, "%011lo", S_ISREG(mode) ? size : 0); sprintf(header->mtime, "%011lo", (unsigned long) args->time); @@ -192,7 +194,7 @@ static int write_extended_header(struct archiver_args *args, unsigned int mode; memset(&header, 0, sizeof(header)); *header.typeflag = TYPEFLAG_EXT_HEADER; - mode = 0100666; + mode = S_IFREG | FILE_RW_ALL; sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1)); prepare_header(args, &header, mode, size); write_blocked(&header, sizeof(header)); @@ -216,13 +218,14 @@ static int write_tar_entry(struct archiver_args *args, if (S_ISDIR(mode) || S_ISGITLINK(mode)) { *header.typeflag = TYPEFLAG_DIR; - mode = (mode | 0777) & ~tar_umask; + mode = (mode | DIRECTORY_RW_ALL) & ~tar_umask; } else if (S_ISLNK(mode)) { *header.typeflag = TYPEFLAG_LNK; - mode |= 0777; + mode |= DIRECTORY_RW_ALL; } else if (S_ISREG(mode)) { *header.typeflag = TYPEFLAG_REG; - mode = (mode | ((mode & 0100) ? 0777 : 0666)) & ~tar_umask; + mode = (mode | ((mode & S_IXUSR) + ? DIRECTORY_RW_ALL : FILE_RW_ALL)) & ~tar_umask; } else { return error("unsupported file mode: 0%o (SHA1: %s)", mode, sha1_to_hex(sha1)); @@ -300,7 +303,7 @@ static int write_global_extended_header(struct archiver_args *args) strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40); memset(&header, 0, sizeof(header)); *header.typeflag = TYPEFLAG_GLOBAL_HEADER; - mode = 0100666; + mode = S_IFREG | FILE_RW_ALL; strcpy(header.name, "pax_global_header"); prepare_header(args, &header, mode, ext_header.len); write_blocked(&header, sizeof(header)); diff --git a/archive-zip.c b/archive-zip.c index ae3d67f..791c002 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -7,6 +7,7 @@ #include "utf8.h" #include "userdiff.h" #include "xdiff-interface.h" +#include "file-access.h" static int zip_date; static int zip_time; @@ -249,8 +250,10 @@ static int write_zip_entry(struct archiver_args *args, enum object_type type = sha1_object_info(sha1, &size); method = 0; - attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) : - (mode & 0111) ? ((mode) << 16) : 0; + attr2 = S_ISLNK(mode) + ? ((mode | DIRECTORY_RW_ALL) << 16) + : (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) + ? ((mode) << 16) : 0; if (S_ISREG(mode) && args->compression_level != 0 && size > 0) method = 8; diff --git a/archive.c b/archive.c index 01b0899..f248b64 100644 --- a/archive.c +++ b/archive.c @@ -7,6 +7,7 @@ #include "parse-options.h" #include "unpack-trees.h" #include "dir.h" +#include "file-access.h" static char const * const archive_usage[] = { N_("git archive [<options>] <tree-ish> [<path>...]"), @@ -241,7 +242,7 @@ int write_archive_entries(struct archiver_args *args, if (args->verbose) fprintf(stderr, "%.*s\n", (int)len, args->base); err = write_entry(args, args->tree->object.sha1, args->base, - len, 040777); + len, S_IFDIR | DIRECTORY_RW_ALL); if (err) return err; } diff --git a/builtin/add.c b/builtin/add.c index b2a5c57..e76946b 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -17,6 +17,7 @@ #include "revision.h" #include "bulk-checkin.h" #include "argv-array.h" +#include "file-access.h" static const char * const builtin_add_usage[] = { N_("git add [<options>] [--] <pathspec>..."), @@ -200,7 +201,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix) rev.diffopt.output_format = DIFF_FORMAT_PATCH; rev.diffopt.use_color = 0; DIFF_OPT_SET(&rev.diffopt, IGNORE_DIRTY_SUBMODULES); - out = open(file, O_CREAT | O_WRONLY, 0666); + out = open(file, O_CREAT | O_WRONLY, FILE_RW_ALL); if (out < 0) die(_("Could not open '%s' for writing."), file); rev.diffopt.file = xfdopen(out, "w"); diff --git a/builtin/am.c b/builtin/am.c index 1399c8d..006f753 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -26,6 +26,7 @@ #include "notes-utils.h" #include "rerere.h" #include "prompt.h" +#include "file-access.h" /** * Returns 1 if the file is empty or does not exist, 0 otherwise. @@ -391,7 +392,7 @@ static void write_commit_msg(const struct am_state *state) int fd; const char *filename = am_path(state, "final-commit"); - fd = xopen(filename, O_WRONLY | O_CREAT, 0666); + fd = xopen(filename, O_WRONLY | O_CREAT, FILE_RW_ALL); if (write_in_full(fd, state->msg, state->msg_len) < 0) die_errno(_("could not write to %s"), filename); close(fd); @@ -983,7 +984,7 @@ static void am_setup(struct am_state *state, enum patch_format patch_format, exit(128); } - if (mkdir(state->dir, 0777) < 0 && errno != EEXIST) + if (mkdir(state->dir, DIRECTORY_RW_ALL) < 0 && errno != EEXIST) die_errno(_("failed to create directory '%s'"), state->dir); if (split_mail(state, patch_format, paths, keep_cr) < 0) { @@ -1207,7 +1208,8 @@ static int parse_mail(struct am_state *state, const char *mail) cp.git_cmd = 1; cp.in = xopen(mail, O_RDONLY, 0); - cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT, 0777); + cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT, + DIRECTORY_RW_ALL); argv_array_push(&cp.args, "mailinfo"); argv_array_push(&cp.args, state->utf8 ? "-u" : "-n"); diff --git a/builtin/apply.c b/builtin/apply.c index 54aba4e..db8e572 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -20,6 +20,7 @@ #include "xdiff-interface.h" #include "ll-merge.h" #include "rerere.h" +#include "file-access.h" /* * --check turns on checking that the working tree matches the @@ -4102,7 +4103,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf, struct stat st; if (!lstat(path, &st) && S_ISDIR(st.st_mode)) return 0; - return mkdir(path, 0777); + return mkdir(path, DIRECTORY_RW_ALL); } if (has_symlinks && S_ISLNK(mode)) @@ -4111,7 +4112,8 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf, */ return symlink(buf, path); - fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666); + fd = open(path, O_CREAT | O_EXCL | O_WRONLY, + (mode & S_IXUSR) ? DIRECTORY_RW_ALL : FILE_RW_ALL); if (fd < 0) return -1; diff --git a/builtin/archive.c b/builtin/archive.c index a1e3b94..2f4109a 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -9,10 +9,12 @@ #include "parse-options.h" #include "pkt-line.h" #include "sideband.h" +#include "file-access.h" static void create_output_file(const char *output_file) { - int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666); + int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, + FILE_RW_ALL); if (output_fd < 0) die_errno(_("could not create archive file '%s'"), output_file); if (output_fd != 1) { diff --git a/builtin/clone.c b/builtin/clone.c index 303a3a7..681fa71 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -24,6 +24,7 @@ #include "remote.h" #include "run-command.h" #include "connected.h" +#include "file-access.h" /* * Overall FIXMEs: @@ -305,7 +306,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, if (!dir) die_errno(_("failed to open '%s'"), src->buf); - if (mkdir(dest->buf, 0777)) { + if (mkdir(dest->buf, DIRECTORY_RW_ALL)) { if (errno != EEXIST) die_errno(_("failed to create directory '%s'"), dest->buf); else if (stat(dest->buf, &buf)) @@ -350,7 +351,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest, die_errno(_("failed to create link '%s'"), dest->buf); option_no_hardlinks = 1; } - if (copy_file_with_time(dest->buf, src->buf, 0666)) + if (copy_file_with_time(dest->buf, src->buf, FILE_RW_ALL)) die_errno(_("failed to copy file to '%s'"), dest->buf); } closedir(dir); @@ -844,7 +845,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (safe_create_leading_directories_const(work_tree) < 0) die_errno(_("could not create leading directories of '%s'"), work_tree); - if (!dest_exists && mkdir(work_tree, 0777)) + if (!dest_exists && mkdir(work_tree, DIRECTORY_RW_ALL)) die_errno(_("could not create work tree dir '%s'"), work_tree); junk_work_tree = work_tree; diff --git a/builtin/config.c b/builtin/config.c index 7188405..e918bdf 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -3,6 +3,7 @@ #include "color.h" #include "parse-options.h" #include "urlmatch.h" +#include "file-access.h" static const char *const builtin_config_usage[] = { N_("git config [<options>]"), @@ -576,7 +577,8 @@ int cmd_config(int argc, const char **argv, const char *prefix) config_file = xstrdup(given_config_source.file ? given_config_source.file : git_path("config")); if (use_global_config) { - int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666); + int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, + FILE_RW_ALL); if (fd) { char *content = default_user_config(); write_str_in_full(fd, content); diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 3f10840..833b39d 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -11,6 +11,7 @@ #include "exec_cmd.h" #include "streaming.h" #include "thread-utils.h" +#include "file-access.h" static const char index_pack_usage[] = "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; @@ -308,7 +309,8 @@ static const char *open_pack_file(const char *pack_name) "pack/tmp_pack_XXXXXX"); pack_name = xstrdup(tmp_file); } else - output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600); + output_fd = open(pack_name, O_CREAT | O_EXCL | O_RDWR, + FILE_RW_USER); if (output_fd < 0) die_errno(_("unable to create '%s'"), pack_name); nothread_data.pack_fd = output_fd; @@ -1397,7 +1399,8 @@ static void final(const char *final_pack_name, const char *curr_pack_name, if (!keep_name) keep_fd = odb_pack_keep(name, sizeof(name), sha1); else - keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600); + keep_fd = open(keep_name, O_RDWR | O_CREAT | O_EXCL, + FILE_RW_USER); if (keep_fd < 0) { if (errno != EEXIST) diff --git a/builtin/init-db.c b/builtin/init-db.c index 49df78d..e3e5c35 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -8,6 +8,7 @@ #include "builtin.h" #include "exec_cmd.h" #include "parse-options.h" +#include "file-access.h" #ifndef DEFAULT_GIT_TEMPLATE_DIR #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates" @@ -26,7 +27,7 @@ static const char *git_link; static void safe_create_dir(const char *dir, int share) { - if (mkdir(dir, 0777) < 0) { + if (mkdir(dir, DIRECTORY_RW_ALL) < 0) { if (errno != EEXIST) { perror(dir); exit(1); @@ -542,7 +543,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) break; } shared_repository = saved; - if (mkdir(argv[0], 0777) < 0) + if (mkdir(argv[0], DIRECTORY_RW_ALL) < 0) die_errno(_("cannot mkdir %s"), argv[0]); mkdir_tried = 1; goto retry; diff --git a/builtin/log.c b/builtin/log.c index b50ef75..832343d 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -26,6 +26,7 @@ #include "version.h" #include "mailmap.h" #include "gpg-interface.h" +#include "file-access.h" /* Set a default date-time format for git log ("log.date" config variable) */ static const char *default_date_mode = NULL; @@ -1387,7 +1388,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (output_directory) { if (use_stdout) die(_("standard output, or directory, which one?")); - if (mkdir(output_directory, 0777) < 0 && errno != EEXIST) + if (mkdir(output_directory, DIRECTORY_RW_ALL) < 0 && + errno != EEXIST) die_errno(_("Could not create directory '%s'"), output_directory); } diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c index 8e02ea1..3818860 100644 --- a/builtin/mailsplit.c +++ b/builtin/mailsplit.c @@ -8,6 +8,7 @@ #include "builtin.h" #include "string-list.h" #include "strbuf.h" +#include "file-access.h" static const char git_mailsplit_usage[] = "git mailsplit [-d<prec>] [-f<n>] [-b] [--keep-cr] -o<directory> [(<mbox>|<Maildir>)...]"; @@ -62,7 +63,7 @@ static int split_one(FILE *mbox, const char *name, int allow_bare) fprintf(stderr, "corrupt mailbox\n"); exit(1); } - fd = open(name, O_WRONLY | O_CREAT | O_EXCL, 0666); + fd = open(name, O_WRONLY | O_CREAT | O_EXCL, FILE_RW_ALL); if (fd < 0) die_errno("cannot open output file '%s'", name); output = xfdopen(fd, "w"); diff --git a/builtin/merge.c b/builtin/merge.c index 85c54dc..1a3a28e 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -30,6 +30,7 @@ #include "fmt-merge-msg.h" #include "gpg-interface.h" #include "sequencer.h" +#include "file-access.h" #define DEFAULT_TWOHEAD (1<<0) #define DEFAULT_OCTOPUS (1<<1) @@ -339,7 +340,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead printf(_("Squash commit -- not updating HEAD\n")); filename = git_path("SQUASH_MSG"); - fd = open(filename, O_WRONLY | O_CREAT, 0666); + fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL); if (fd < 0) die_errno(_("Could not write to '%s'"), filename); @@ -755,7 +756,7 @@ static void add_strategies(const char *string, unsigned attr) static void write_merge_msg(struct strbuf *msg) { const char *filename = git_path("MERGE_MSG"); - int fd = open(filename, O_WRONLY | O_CREAT, 0666); + int fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL); if (fd < 0) die_errno(_("Could not open '%s' for writing"), filename); @@ -968,7 +969,7 @@ static void write_merge_state(struct commit_list *remoteheads) strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1)); } filename = git_path("MERGE_HEAD"); - fd = open(filename, O_WRONLY | O_CREAT, 0666); + fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL); if (fd < 0) die_errno(_("Could not open '%s' for writing"), filename); if (write_in_full(fd, buf.buf, buf.len) != buf.len) @@ -978,7 +979,7 @@ static void write_merge_state(struct commit_list *remoteheads) write_merge_msg(&merge_msg); filename = git_path("MERGE_MODE"); - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL); if (fd < 0) die_errno(_("Could not open '%s' for writing"), filename); strbuf_reset(&buf); diff --git a/builtin/notes.c b/builtin/notes.c index 63f95fc..3119336 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -19,6 +19,7 @@ #include "string-list.h" #include "notes-merge.h" #include "notes-utils.h" +#include "file-access.h" static const char * const git_notes_usage[] = { N_("git notes [--ref <notes-ref>] [list [<object>]]"), @@ -168,7 +169,8 @@ static void prepare_note_data(const unsigned char *object, struct note_data *d, /* write the template message before editing: */ d->edit_path = git_pathdup("NOTES_EDITMSG"); - fd = open(d->edit_path, O_CREAT | O_TRUNC | O_WRONLY, 0600); + fd = open(d->edit_path, O_CREAT | O_TRUNC | O_WRONLY, + FILE_RW_USER); if (fd < 0) die_errno(_("could not create file '%s'"), d->edit_path); diff --git a/builtin/replace.c b/builtin/replace.c index 6b3c469..70fe7b9 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -14,6 +14,7 @@ #include "parse-options.h" #include "run-command.h" #include "tag.h" +#include "file-access.h" static const char * const git_replace_usage[] = { N_("git replace [-f] <object> <replacement>"), @@ -203,7 +204,7 @@ static void export_object(const unsigned char *sha1, enum object_type type, struct child_process cmd = CHILD_PROCESS_INIT; int fd; - fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL); if (fd < 0) die_errno("unable to open %s for writing", filename); diff --git a/builtin/tag.c b/builtin/tag.c index cccca99..c489ad1 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -17,6 +17,7 @@ #include "gpg-interface.h" #include "sha1-array.h" #include "column.h" +#include "file-access.h" static const char * const git_tag_usage[] = { N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"), @@ -472,7 +473,7 @@ static void create_tag(const unsigned char *object, const char *tag, /* write the template message before editing: */ path = git_pathdup("TAG_EDITMSG"); - fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600); + fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, FILE_RW_USER); if (fd < 0) die_errno(_("could not create file '%s'"), path); diff --git a/builtin/worktree.c b/builtin/worktree.c index 430b51e..c53d837 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -8,6 +8,7 @@ #include "run-command.h" #include "sigchain.h" #include "refs.h" +#include "file-access.h" static const char * const worktree_usage[] = { N_("git worktree add [<options>] <path> <branch>"), @@ -228,7 +229,7 @@ static int add_worktree(const char *path, const char *refname, atexit(remove_junk); sigchain_push_common(remove_junk_on_signal); - if (mkdir(sb_repo.buf, 0777)) + if (mkdir(sb_repo.buf, DIRECTORY_RW_ALL)) die_errno(_("could not create directory of '%s'"), sb_repo.buf); junk_git_dir = xstrdup(sb_repo.buf); is_junk = 1; diff --git a/cache.h b/cache.h index 6bb7119..99e88e1 100644 --- a/cache.h +++ b/cache.h @@ -9,6 +9,7 @@ #include "convert.h" #include "trace.h" #include "string-list.h" +#include "file-access.h" #include SHA1_HEADER #ifndef git_SHA_CTX @@ -242,7 +243,8 @@ static inline unsigned create_ce_flags(unsigned stage) #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE) #define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE) -#define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644) +#define ce_permissions(mode) \ + (((mode) & S_IXUSR) ? DIRECTORY_RW_USER_R_ALL : FILE_RW_USER_R_ALL) static inline unsigned int create_ce_mode(unsigned int mode) { if (S_ISLNK(mode)) @@ -261,7 +263,7 @@ static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce, if (!trust_executable_bit && S_ISREG(mode)) { if (ce && S_ISREG(ce->ce_mode)) return ce->ce_mode; - return create_ce_mode(0666); + return create_ce_mode(FILE_RW_ALL); } return create_ce_mode(mode); } diff --git a/compat/mingw.c b/compat/mingw.c index 496e6f8..55e2aef 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -208,7 +208,7 @@ int mingw_unlink(const char *pathname) return -1; /* read-only files cannot be removed */ - _wchmod(wpathname, 0666); + _wchmod(wpathname, FILE_RW_ALL); while ((ret = _wunlink(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) { if (!is_file_in_use_error(GetLastError())) break; @@ -650,7 +650,7 @@ int mkstemp(char *template) char *filename = mktemp(template); if (filename == NULL) return -1; - return open(filename, O_RDWR | O_CREAT, 0600); + return open(filename, O_RDWR | O_CREAT, FILE_RW_USER); } int gettimeofday(struct timeval *tv, void *tz) diff --git a/compat/stat.c b/compat/stat.c index a2d3931..f040b25 100644 --- a/compat/stat.c +++ b/compat/stat.c @@ -1,24 +1,23 @@ -#define _POSIX_C_SOURCE 200112L -#include <sys/stat.h> /* *stat, S_IS* */ -#include <sys/types.h> /* mode_t */ +#include "../file-access.h" static inline mode_t mode_native_to_git(mode_t native_mode) { - mode_t perm_bits = native_mode & 07777; + mode_t perm_bits = + native_mode & (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL); if (S_ISREG(native_mode)) - return 0100000 | perm_bits; + return S_IFREG | perm_bits; if (S_ISDIR(native_mode)) - return 0040000 | perm_bits; + return S_IFDIR | perm_bits; if (S_ISLNK(native_mode)) - return 0120000 | perm_bits; + return S_IFLNK | perm_bits; if (S_ISBLK(native_mode)) - return 0060000 | perm_bits; + return S_IFBLK | perm_bits; if (S_ISCHR(native_mode)) - return 0020000 | perm_bits; + return S_IFCHR | perm_bits; if (S_ISFIFO(native_mode)) - return 0010000 | perm_bits; + return S_IFIFO | perm_bits; if (S_ISSOCK(native_mode)) - return 0140000 | perm_bits; + return S_IFSOCK | perm_bits; /* Non-standard type bits were given. */ return perm_bits; } diff --git a/config.c b/config.c index 9fd275f..1f01eb5 100644 --- a/config.c +++ b/config.c @@ -13,6 +13,7 @@ #include "hashmap.h" #include "string-list.h" #include "utf8.h" +#include "file-access.h" struct config_source { struct config_source *prev; @@ -2066,7 +2067,9 @@ int git_config_set_multivar_in_file(const char *config_filename, } close(in_fd); - if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) { + if (chmod(lock->filename.buf, + st.st_mode & + (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL)) < 0) { error("chmod on %s failed: %s", lock->filename.buf, strerror(errno)); ret = CONFIG_NO_WRITE; @@ -2252,7 +2255,9 @@ int git_config_rename_section_in_file(const char *config_filename, fstat(fileno(config_file), &st); - if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) { + if (chmod(lock->filename.buf, + st.st_mode & + (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL)) < 0) { ret = error("chmod on %s failed: %s", lock->filename.buf, strerror(errno)); goto out; diff --git a/copy.c b/copy.c index 574fa1f..c2116b9 100644 --- a/copy.c +++ b/copy.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "file-access.h" int copy_fd(int ifd, int ofd) { @@ -32,7 +33,8 @@ int copy_file(const char *dst, const char *src, int mode) { int fdi, fdo, status; - mode = (mode & 0111) ? 0777 : 0666; + mode = (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) + ? DIRECTORY_RW_ALL : FILE_RW_ALL; if ((fdi = open(src, O_RDONLY)) < 0) return fdi; if ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) { diff --git a/diff-no-index.c b/diff-no-index.c index 0320605..0f30018 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -16,6 +16,7 @@ #include "builtin.h" #include "string-list.h" #include "dir.h" +#include "file-access.h" static int read_directory_contents(const char *path, struct string_list *list) { @@ -51,7 +52,7 @@ static int get_mode(const char *path, int *mode) *mode = 0; #endif else if (path == file_from_standard_input) - *mode = create_ce_mode(0666); + *mode = create_ce_mode(FILE_RW_ALL); else if (lstat(path, &st)) return error("Could not access '%s'", path); else diff --git a/entry.c b/entry.c index 1eda8e9..f8359f1 100644 --- a/entry.c +++ b/entry.c @@ -2,6 +2,7 @@ #include "blob.h" #include "dir.h" #include "streaming.h" +#include "file-access.h" static void create_directories(const char *path, int path_len, const struct checkout *state) @@ -34,9 +35,10 @@ static void create_directories(const char *path, int path_len, * there, therefore we then try to unlink it and try * one more time to create the directory. */ - if (mkdir(buf, 0777)) { + if (mkdir(buf, DIRECTORY_RW_ALL)) { if (errno == EEXIST && state->force && - !unlink_or_warn(buf) && !mkdir(buf, 0777)) + !unlink_or_warn(buf) && + !mkdir(buf, DIRECTORY_RW_ALL)) continue; die_errno("cannot create directory at '%s'", buf); } @@ -75,7 +77,7 @@ static void remove_subtree(struct strbuf *path) static int create_file(const char *path, unsigned int mode) { - mode = (mode & 0100) ? 0777 : 0666; + mode = (mode & S_IXUSR) ? DIRECTORY_RW_ALL : FILE_RW_ALL; return open(path, O_WRONLY | O_CREAT | O_EXCL, mode); } @@ -100,7 +102,7 @@ static int open_output_fd(char *path, const struct cache_entry *ce, int to_tempf ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX"); return mkstemp(path); } else { - return create_file(path, !symlink ? ce->ce_mode : 0666); + return create_file(path, !symlink ? ce->ce_mode : FILE_RW_ALL); } } @@ -201,7 +203,7 @@ static int write_entry(struct cache_entry *ce, case S_IFGITLINK: if (to_tempfile) return error("cannot create temporary submodule %s", path); - if (mkdir(path, 0777) < 0) + if (mkdir(path, DIRECTORY_RW_ALL) < 0) return error("cannot create submodule directory %s", path); break; default: diff --git a/fast-import.c b/fast-import.c index 2ad4fee..b082b46 100644 --- a/fast-import.c +++ b/fast-import.c @@ -166,6 +166,7 @@ Format of STDIN stream: #include "quote.h" #include "exec_cmd.h" #include "dir.h" +#include "file-access.h" #define PACK_ID_BITS 16 #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1) @@ -2303,11 +2304,11 @@ static void file_change_m(const char *p, struct branch *b) if (!p) die("Corrupt mode: %s", command_buf.buf); switch (mode) { - case 0644: - case 0755: + case FILE_RW_USER_R_ALL: + case DIRECTORY_RW_USER_R_ALL: mode |= S_IFREG; - case S_IFREG | 0644: - case S_IFREG | 0755: + case S_IFREG | FILE_RW_USER_R_ALL: + case S_IFREG | DIRECTORY_RW_USER_R_ALL: case S_IFLNK: case S_IFDIR: case S_IFGITLINK: diff --git a/file-access.h b/file-access.h new file mode 100644 index 0000000..ef5585e --- /dev/null +++ b/file-access.h @@ -0,0 +1,27 @@ +#ifndef FILE_ACCESS_H +#define FILE_ACCESS_H + +#include <sys/stat.h> + +/* rwxr-xr-x (0755) */ +#define DIRECTORY_RW_USER_R_ALL \ + (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) + +/* rwxrwxrwx (0777) */ +#define DIRECTORY_RW_ALL (S_IRWXU | S_IRWXG | S_IRWXO) + +/* rw------- (0600) */ +#define FILE_RW_USER (S_IRUSR | S_IWUSR) + +/* rw-r--r-- (0644) */ +#define FILE_RW_USER_R_ALL (FILE_RW_USER | S_IRGRP | S_IROTH) + +/* r--r--r-- (0444) */ +#define FILE_R_ALL (S_IRUSR | S_IRGRP | S_IROTH) + +/* rw-rw-rw- (0666) */ +#define FILE_RW_ALL (FILE_RW_USER | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) + +#endif /* FILE_ACCESS_H */ + +/* vim: set ts=8 sw=8 noet */ diff --git a/http.c b/http.c index e9c6fdd..ef0dc2b 100644 --- a/http.c +++ b/http.c @@ -9,6 +9,7 @@ #include "version.h" #include "pkt-line.h" #include "gettext.h" +#include "file-access.h" int active_requests; int http_is_verbose; @@ -1643,7 +1644,7 @@ struct http_object_request *new_http_object_request(const char *base_url, if (freq->localfile != -1) error("fd leakage in start: %d", freq->localfile); freq->localfile = open(freq->tmpfile, - O_WRONLY | O_CREAT | O_EXCL, 0666); + O_WRONLY | O_CREAT | O_EXCL, FILE_RW_ALL); /* * This could have failed due to the "lazy directory creation"; * try to mkdir the last path component. @@ -1652,11 +1653,12 @@ struct http_object_request *new_http_object_request(const char *base_url, char *dir = strrchr(freq->tmpfile, '/'); if (dir) { *dir = 0; - mkdir(freq->tmpfile, 0777); + mkdir(freq->tmpfile, DIRECTORY_RW_ALL); *dir = '/'; } freq->localfile = open(freq->tmpfile, - O_WRONLY | O_CREAT | O_EXCL, 0666); + O_WRONLY | O_CREAT | O_EXCL, + FILE_RW_ALL); } if (freq->localfile < 0) { diff --git a/lockfile.c b/lockfile.c index 993bb82..5abd046 100644 --- a/lockfile.c +++ b/lockfile.c @@ -4,6 +4,7 @@ #include "cache.h" #include "lockfile.h" #include "sigchain.h" +#include "file-access.h" static struct lock_file *volatile lock_file_list; @@ -140,7 +141,7 @@ static int lock_file(struct lock_file *lk, const char *path, int flags) } strbuf_addstr(&lk->filename, LOCK_SUFFIX); - lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666); + lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, FILE_RW_ALL); if (lk->fd < 0) { strbuf_reset(&lk->filename); return -1; diff --git a/merge-recursive.c b/merge-recursive.c index 44d85be..60e355e 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -22,6 +22,7 @@ #include "merge-recursive.h" #include "dir.h" #include "submodule.h" +#include "file-access.h" static struct tree *shift_tree_object(struct tree *one, struct tree *two, const char *subtree_shift) @@ -779,10 +780,10 @@ static void update_file_flags(struct merge_options *o, } if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) { int fd; - if (mode & 0100) - mode = 0777; + if (mode & S_IXUSR) + mode = DIRECTORY_RW_ALL; else - mode = 0666; + mode = FILE_RW_ALL; fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); if (fd < 0) die_errno(_("failed to open '%s'"), path); diff --git a/notes-merge.c b/notes-merge.c index 0b2b82c..014d14c 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -10,6 +10,7 @@ #include "notes-merge.h" #include "strbuf.h" #include "notes-utils.h" +#include "file-access.h" struct notes_merge_pair { unsigned char obj[20], base[20], local[20], remote[20]; @@ -301,7 +302,7 @@ static void write_buf_to_worktree(const unsigned char *obj, if (file_exists(path)) die("found existing file at '%s'", path); - fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666); + fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, FILE_RW_ALL); if (fd < 0) die_errno("failed to open '%s'", path); diff --git a/refs.c b/refs.c index 2db2975..294d521 100644 --- a/refs.c +++ b/refs.c @@ -5,6 +5,7 @@ #include "tag.h" #include "dir.h" #include "string-list.h" +#include "file-access.h" struct ref_lock { char *ref_name; @@ -3163,7 +3164,7 @@ static int log_ref_setup(const char *refname, struct strbuf *sb_logfile, struct oflags |= O_CREAT; } - logfd = open(logfile, oflags, 0666); + logfd = open(logfile, oflags, FILE_RW_ALL); if (logfd < 0) { if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR)) return 0; @@ -3174,7 +3175,7 @@ static int log_ref_setup(const char *refname, struct strbuf *sb_logfile, struct "'%s'", logfile); return -1; } - logfd = open(logfile, oflags, 0666); + logfd = open(logfile, oflags, FILE_RW_ALL); } if (logfd < 0) { @@ -3406,7 +3407,7 @@ int create_symref(const char *ref_target, const char *refs_heads_master, goto error_free_return; } lockpath = mkpath("%s.lock", git_HEAD); - fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666); + fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, FILE_RW_ALL); if (fd < 0) { error("Unable to open %s for writing", lockpath); goto error_free_return; diff --git a/rerere.c b/rerere.c index 94aea9a..af225c0 100644 --- a/rerere.c +++ b/rerere.c @@ -8,6 +8,7 @@ #include "ll-merge.h" #include "attr.h" #include "pathspec.h" +#include "file-access.h" #define RESOLVED 0 #define PUNTED 1 @@ -559,7 +560,7 @@ static int do_plain_rerere(struct string_list *rr, int fd) continue; fprintf(stderr, "Recorded resolution for '%s'.\n", path); - copy_file(rerere_path(name, "postimage"), path, 0666); + copy_file(rerere_path(name, "postimage"), path, FILE_RW_ALL); mark_resolved: rr->items[i].util = NULL; } diff --git a/sequencer.c b/sequencer.c index c4f4b7d..375c032 100644 --- a/sequencer.c +++ b/sequencer.c @@ -15,6 +15,7 @@ #include "merge-recursive.h" #include "refs.h" #include "argv-array.h" +#include "file-access.h" #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION" @@ -167,7 +168,7 @@ static void write_cherry_pick_head(struct commit *commit, const char *pseudoref) strbuf_addf(&buf, "%s\n", sha1_to_hex(commit->object.sha1)); filename = git_path("%s", pseudoref); - fd = open(filename, O_WRONLY | O_CREAT, 0666); + fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL); if (fd < 0) die_errno(_("Could not open '%s' for writing"), filename); if (write_in_full(fd, buf.buf, buf.len) != buf.len || close(fd)) @@ -843,7 +844,7 @@ static int create_seq_dir(void) advise(_("try \"git cherry-pick (--continue | --quit | --abort)\"")); return -1; } - else if (mkdir(seq_dir, 0777) < 0) + else if (mkdir(seq_dir, DIRECTORY_RW_ALL) < 0) die_errno(_("Could not create sequencer directory %s"), seq_dir); return 0; } diff --git a/server-info.c b/server-info.c index c82e9ee..86d13bf 100644 --- a/server-info.c +++ b/server-info.c @@ -3,6 +3,7 @@ #include "object.h" #include "commit.h" #include "tag.h" +#include "file-access.h" /* * Create the file "path" by writing to a temporary file and renaming @@ -17,7 +18,7 @@ static int update_info_file(char *path, int (*generate)(FILE *)) FILE *fp = NULL; safe_create_leading_directories(path); - fd = git_mkstemp_mode(tmp, 0666); + fd = git_mkstemp_mode(tmp, FILE_RW_ALL); if (fd < 0) goto out; fp = fdopen(fd, "w"); diff --git a/setup.c b/setup.c index 5f9f07d..ac1c6ea 100644 --- a/setup.c +++ b/setup.c @@ -1,6 +1,7 @@ #include "cache.h" #include "dir.h" #include "string-list.h" +#include "file-access.h" static int inside_git_dir = -1; static int inside_work_tree = -1; @@ -915,7 +916,7 @@ int git_config_perm(const char *var, const char *value) /* A filemode value was given: 0xxx */ - if ((i & 0600) != 0600) + if ((i & FILE_RW_USER) != FILE_RW_USER) die("Problem with core.sharedRepository filemode value " "(0%.3o).\nThe owner of files must always have " "read and write permissions.", i); @@ -924,7 +925,7 @@ int git_config_perm(const char *var, const char *value) * Mask filemode value. Others can not get write permission. * x flags for directories are handled separately. */ - return -(i & 0666); + return -(i & FILE_RW_ALL); } int check_repository_format_version(const char *var, const char *value, void *cb) diff --git a/sha1_file.c b/sha1_file.c index 1cee438..db4052d 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -23,6 +23,7 @@ #include "bulk-checkin.h" #include "streaming.h" #include "dir.h" +#include "file-access.h" #ifndef O_NOATIME #if defined(__linux__) && (defined(__i386__) || defined(__PPC__)) @@ -82,7 +83,7 @@ static struct cached_object *find_cached_object(const unsigned char *sha1) int mkdir_in_gitdir(const char *path) { - if (mkdir(path, 0777)) { + if (mkdir(path, DIRECTORY_RW_ALL)) { int saved_errno = errno; struct stat st; struct strbuf sb = STRBUF_INIT; @@ -99,7 +100,7 @@ int mkdir_in_gitdir(const char *path) if (lstat(path, &st) || !S_ISLNK(st.st_mode) || strbuf_readlink(&sb, path, st.st_size) || !is_absolute_path(sb.buf) || - mkdir(sb.buf, 0777)) { + mkdir(sb.buf, DIRECTORY_RW_ALL)) { strbuf_release(&sb); errno = saved_errno; return -1; @@ -136,7 +137,7 @@ enum scld_error safe_create_leading_directories(char *path) /* path exists */ if (!S_ISDIR(st.st_mode)) ret = SCLD_EXISTS; - } else if (mkdir(path, 0777)) { + } else if (mkdir(path, DIRECTORY_RW_ALL)) { if (errno == EEXIST && !stat(path, &st) && S_ISDIR(st.st_mode)) ; /* somebody created it since we checked */ @@ -3003,19 +3004,19 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename) } memcpy(buffer, filename, dirlen); strcpy(buffer + dirlen, "tmp_obj_XXXXXX"); - fd = git_mkstemp_mode(buffer, 0444); + fd = git_mkstemp_mode(buffer, FILE_R_ALL); if (fd < 0 && dirlen && errno == ENOENT) { /* Make sure the directory exists */ memcpy(buffer, filename, dirlen); buffer[dirlen-1] = 0; - if (mkdir(buffer, 0777) && errno != EEXIST) + if (mkdir(buffer, DIRECTORY_RW_ALL) && errno != EEXIST) return -1; if (adjust_shared_perm(buffer)) return -1; /* Try again */ strcpy(buffer + dirlen - 1, "/tmp_obj_XXXXXX"); - fd = git_mkstemp_mode(buffer, 0444); + fd = git_mkstemp_mode(buffer, FILE_R_ALL); } return fd; } diff --git a/test-delta.c b/test-delta.c index 4595cd6..faf1d67 100644 --- a/test-delta.c +++ b/test-delta.c @@ -11,6 +11,7 @@ #include "git-compat-util.h" #include "delta.h" #include "cache.h" +#include "file-access.h" static const char usage_str[] = "test-delta (-d|-p) <from_file> <data_file> <out_file>"; @@ -68,7 +69,7 @@ int main(int argc, char *argv[]) return 1; } - fd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666); + fd = open (argv[4], O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL); if (fd < 0 || write_in_full(fd, out_buf, out_size) != out_size) { perror(argv[4]); return 1; diff --git a/trace.c b/trace.c index 7393926..da312a5 100644 --- a/trace.c +++ b/trace.c @@ -24,6 +24,7 @@ #include "cache.h" #include "quote.h" +#include "file-access.h" /* Get a trace file descriptor from "key" env variable. */ static int get_trace_fd(struct trace_key *key) @@ -49,7 +50,8 @@ static int get_trace_fd(struct trace_key *key) else if (strlen(trace) == 1 && isdigit(*trace)) key->fd = atoi(trace); else if (is_absolute_path(trace)) { - int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT, 0666); + int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT, + FILE_RW_ALL); if (fd == -1) { fprintf(stderr, "Could not open '%s' for tracing: %s\n" diff --git a/wrapper.c b/wrapper.c index e451463..33c394b 100644 --- a/wrapper.c +++ b/wrapper.c @@ -2,6 +2,7 @@ * Various trivial helper wrappers around standard functions */ #include "cache.h" +#include "file-access.h" static void do_nothing(size_t size) { @@ -625,7 +626,7 @@ int write_file(const char *path, int fatal, const char *fmt, ...) { struct strbuf sb = STRBUF_INIT; va_list params; - int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666); + int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, FILE_RW_ALL); if (fd < 0) { if (fatal) die_errno(_("could not open %s for writing"), path); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html