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@gmail.com> --- convert.c | 5 +++++ git-compat-util.h | 10 ++++++++++ 2 files changed, 15 insertions(+)
Show changes to 2 files +15 −0
convert.c, git-compat-util.h
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 -- -- *** Please reply-to-all at all times *** *** (do not pretend to know who is subscribed and who is not) *** *** Please avoid top-posting. *** The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free. You received this message because you are subscribed to the Google Groups "msysGit" group. To post to this group, send email to msysgit@googlegroups.com To unsubscribe from this group, send email to msysgit+unsubscribe@googlegroups.com For more options, and view previous threads, visit this group at http://groups.google.com/group/msysgit?hl=en_US?hl=en --- You received this message because you are subscribed to the Google Groups "msysGit" group. To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.