fix: Git for Windows crashes when clone Japanese multibyte repository. Reproduce condition: - Japanese Base Encoding is Shift-JIS. - It happens Japanese multibyte directory name and too-long directory path - Linux(ex. Ubuntu 13.04 amd64) can clone normally. - example repository is here: git clone https://github.com/wnoguchi/mingw-checkout-crash.git - The reproduce crash repository contains following file only. - following directory and file name is encoded for this commit log. - actually file name is decoded.] %E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%201-long-long-long-dirname/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%202-long-long-long-dirname/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%203-long-long-long-dirname/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%204-long-long-long-dirname/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%205-long-long-long-dirname/%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB%E3%81%8A%E8%AA%AD%E3%81%BF%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84.txt - only one commit. Cause: - convert_attrs() in convert.c: if (!ccheck[0].attr) but ccheck[0].attr always not NULL. thus git_check_attr() in attr.c (check[i].attr->attr_nr) cause access violation. - checkout_entry() in entry.c: static char path[PATH_MAX + 1]; declared. But its size is 261 on MinGW environment. This length is Windows full path limits. But for relative path is too short. This commit fixes: - convert_attrs() in convert.c: initialize ccheck[0].attr with NULL. - git-compat-util.h: redifine PATH_MAX value to 4096 when MinGW environment. Signed-off-by: Wataru Noguchi <wnoguchi.0727@xxxxxxxxx> --- convert.c | 5 +++++ git-compat-util.h | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/convert.c b/convert.c index 11a95fc..5eaa206 100644 --- a/convert.c +++ b/convert.c @@ -724,6 +724,11 @@ static void convert_attrs(struct conv_attrs *ca, const char *path) { int i; static struct git_attr_check ccheck[NUM_CONV_ATTRS]; + + if (NUM_CONV_ATTRS != 0) { + ccheck[0].attr = NULL; + ccheck[0].value = NULL; + } if (!ccheck[0].attr) { for (i = 0; i < NUM_CONV_ATTRS; i++) diff --git a/git-compat-util.h b/git-compat-util.h index a31127f..ba02c69 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -237,6 +237,16 @@ extern char *gitbasename(char *); #ifndef PATH_MAX #define PATH_MAX 4096 #endif +#ifdef GIT_WINDOWS_NATIVE +/* Git for Windows checkout PATH_MAX is reduce to 260. + * but if checkout relative long path name, its length too short. + * thus, expand length. + */ +#ifdef PATH_MAX +#undef PATH_MAX +#endif +#define PATH_MAX 4096 +#endif #ifndef PRIuMAX #define PRIuMAX "llu" -- 1.8.1.2 -- 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