probe_utf8_pathname_composition: use internal strbuf
authorJeff King <peff@peff.net>
Mon, 5 Oct 2015 03:45:26 +0000 (23:45 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Oct 2015 18:06:49 +0000 (11:06 -0700)
When we are initializing a .git directory, we may call
probe_utf8_pathname_composition to detect utf8 mangling. We
pass in a path buffer for it to use, and it blindly
strcpy()s into it, not knowing whether the buffer is large
enough to hold the result or not.

In practice this isn't a big deal, because the buffer we
pass in already contains "$GIT_DIR/config", and we append
only a few extra bytes to it. But we can easily do the right
thing just by calling git_path_buf ourselves. Technically
this results in a different pathname (before we appended our
utf8 characters to the "config" path, and now they get their
own files in $GIT_DIR), but that should not matter for our
purposes.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/init-db.c
compat/precompose_utf8.c
compat/precompose_utf8.h
git-compat-util.h
index e7d0e31f46e9890a267fa508fa43d184d563afed..89addda4fd078c59d109ea6bdf3e99ed7ac1837e 100644 (file)
@@ -312,7 +312,7 @@ static int create_default_files(const char *template_path)
                strcpy(path + len, "CoNfIg");
                if (!access(path, F_OK))
                        git_config_set("core.ignorecase", "true");
-               probe_utf8_pathname_composition(path, len);
+               probe_utf8_pathname_composition();
        }
 
        return reinit;
index 044c68617bb4666167de85efa94ded6feac6e2c4..079070ff1d4bd629712eff5f6f6e239898640963 100644 (file)
@@ -36,24 +36,26 @@ static size_t has_non_ascii(const char *s, size_t maxlen, size_t *strlen_c)
 }
 
 
-void probe_utf8_pathname_composition(char *path, int len)
+void probe_utf8_pathname_composition(void)
 {
+       struct strbuf path = STRBUF_INIT;
        static const char *auml_nfc = "\xc3\xa4";
        static const char *auml_nfd = "\x61\xcc\x88";
        int output_fd;
        if (precomposed_unicode != -1)
                return; /* We found it defined in the global config, respect it */
-       strcpy(path + len, auml_nfc);
-       output_fd = open(path, O_CREAT|O_EXCL|O_RDWR, 0600);
+       git_path_buf(&path, "%s", auml_nfc);
+       output_fd = open(path.buf, O_CREAT|O_EXCL|O_RDWR, 0600);
        if (output_fd >= 0) {
                close(output_fd);
-               strcpy(path + len, auml_nfd);
-               precomposed_unicode = access(path, R_OK) ? 0 : 1;
+               git_path_buf(&path, "%s", auml_nfd);
+               precomposed_unicode = access(path.buf, R_OK) ? 0 : 1;
                git_config_set("core.precomposeunicode", precomposed_unicode ? "true" : "false");
-               strcpy(path + len, auml_nfc);
-               if (unlink(path))
-                       die_errno(_("failed to unlink '%s'"), path);
+               git_path_buf(&path, "%s", auml_nfc);
+               if (unlink(path.buf))
+                       die_errno(_("failed to unlink '%s'"), path.buf);
        }
+       strbuf_release(&path);
 }
 
 
index 3b73585fc5d8c1f40f1c467829b67f439bca3483..a94e7c43422d87ae062842ae2c2aad430c4b13e4 100644 (file)
@@ -27,7 +27,7 @@ typedef struct {
 } PREC_DIR;
 
 void precompose_argv(int argc, const char **argv);
-void probe_utf8_pathname_composition(char *, int);
+void probe_utf8_pathname_composition(void);
 
 PREC_DIR *precompose_utf8_opendir(const char *dirname);
 struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *dirp);
index 348b9dcc1ccd81d5cdaebeca6f801b4aa9701f25..9a3e5591cb4fd032ed9447ef09873b5da2f32266 100644 (file)
@@ -229,7 +229,7 @@ typedef unsigned long uintptr_t;
 #else
 #define precompose_str(in,i_nfd2nfc)
 #define precompose_argv(c,v)
-#define probe_utf8_pathname_composition(a,b)
+#define probe_utf8_pathname_composition()
 #endif
 
 #ifdef MKDIR_WO_TRAILING_SLASH