[PATCH 4/4] Test in git-init-db if the filemode can be trusted
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Oct 25, 2005, 23:43 UTC
- Message-ID
- <Pine.LNX.4.63.0510260141220.30576@wbgn013.biozentrum.uni-wuerzburg.de>
... and if not, write an appropriate .git/config. Of course, that happens only if no config file was yet created (by a template or a hook).
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
This might be a bit controversial, as we probably need a way to write to .git/config anyway. Until there are such functions, I'll live with this patch.
init-db.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-)
applies-to: 047019cf0b103c8350c6b4da7836b15795c69498 64ca59712d766e8264f9208d70b8f5c811dfd3ea
diff --git a/init-db.c b/init-db.c index 2c27e18..b242fbf 100644 --- a/init-db.c +++ b/init-db.c @@ -196,6 +196,43 @@ static void create_default_files(const c } path[len] = 0; copy_templates(path, len, template_path); + + /* + * Find out if we can trust the executable bit. + */ + safe_create_dir(path); + strcpy(path + len, "config"); + if (access(path, R_OK) < 0) { + static const char contents[] = + "#\n" + "# This is the config file\n" + "#\n" + "\n" + "; core variables\n" + "[core]\n" + " ; Don't trust file modes\n" + " filemode = false\n" + "\n"; + FILE *config = fopen(path, "w"); + struct stat st; + + if (!config) + die("Can not write to %s?", path); + + fwrite(contents, sizeof(contents)-1, 1, config); + + fclose(config); + + if (!lstat(path, &st)) { + struct stat st2; + if (!chmod(path, st.st_mode ^ S_IXUSR) && + !lstat(path, &st2) && + st.st_mode != st2.st_mode) + unlink(path); + else + fprintf(stderr, "Ignoring file modes\n"); + } + } } static const char init_db_usage[] = --- 0.99.8.GIT