git/compat/precompose_utf8.h
Jeff King fdf729661a 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>
2015-10-05 11:06:49 -07:00

46 lines
1.3 KiB
C

#ifndef PRECOMPOSE_UNICODE_H
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <iconv.h>
typedef struct dirent_prec_psx {
ino_t d_ino; /* Posix */
size_t max_name_len; /* See below */
unsigned char d_type; /* available on all systems git runs on */
/*
* See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html
* NAME_MAX + 1 should be enough, but some systems have
* NAME_MAX=255 and strlen(d_name) may return 508 or 510
* Solution: allocate more when needed, see precompose_utf8_readdir()
*/
char d_name[NAME_MAX+1];
} dirent_prec_psx;
typedef struct {
iconv_t ic_precompose;
DIR *dirp;
struct dirent_prec_psx *dirent_nfc;
} PREC_DIR;
void precompose_argv(int argc, const char **argv);
void probe_utf8_pathname_composition(void);
PREC_DIR *precompose_utf8_opendir(const char *dirname);
struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *dirp);
int precompose_utf8_closedir(PREC_DIR *dirp);
#ifndef PRECOMPOSE_UNICODE_C
#define dirent dirent_prec_psx
#define opendir(n) precompose_utf8_opendir(n)
#define readdir(d) precompose_utf8_readdir(d)
#define closedir(d) precompose_utf8_closedir(d)
#define DIR PREC_DIR
#endif /* PRECOMPOSE_UNICODE_C */
#define PRECOMPOSE_UNICODE_H
#endif /* PRECOMPOSE_UNICODE_H */