probe_utf8_pathname_composition: use internal strbuf
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>
This commit is contained in:
committed by
Junio C Hamano
parent
e2b021eb5b
commit
fdf729661a
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user