diff -dupr zip30-old/fileio.c zip30/fileio.c --- a/fileio.c +++ b/fileio.c @@ -3502,7 +3502,7 @@ zwchar *local_to_wide_string(local_strin if ((wc_string = (wchar_t *)malloc((wsize + 1) * sizeof(wchar_t))) == NULL) { ZIPERR(ZE_MEM, "local_to_wide_string"); } - wsize = mbstowcs(wc_string, local_string, strlen(local_string) + 1); + wsize = mbstowcs(wc_string, local_string, wsize + 1); wc_string[wsize] = (wchar_t) 0; /* in case wchar_t is not zwchar */ diff -dupr zip30-old/zipfile.c zip30/zipfile.c --- a/zipfile.c +++ b/zipfile.c @@ -5406,7 +5406,9 @@ int putlocal(z, rewrite) if (z->flg & UTF8_BIT) { /* If this flag is set, then restore UTF-8 as path name */ use_uname = 1; + tempzn -= nam; nam = strlen(z->uname); + tempzn += nam; } else { /* use extra field */ add_Unicode_Path_local_extra_field(z); @@ -5647,7 +5650,9 @@ int putcentral(z) if (z->flg & UTF8_BIT) { /* If this flag is set, then restore UTF-8 as path name */ use_uname = 1; + tempzn -= nam; nam = strlen(z->uname); + tempzn += nam; } else { add_Unicode_Path_cen_extra_field(z); } diff -dupr zip30/zipnote.c zip30/zipnote.c --- a/zipnote.c +++ b/zipnote.c @@ -575,6 +575,13 @@ char **argv; /* command line strcpy(z->iname, a+2); #endif +#ifdef UNICODE_SUPPORT +#define UTF8_BIT (1 << 11) + if (using_utf8) { + z->uname = z->iname; + } +#endif + /* * Don't update z->nam here, we need the old value a little later..... * The update is handled in zipcopy(). @@ -661,7 +668,7 @@ char **argv; /* command line if ((r = zipcopy(z)) != ZE_OK) ziperr(r, "was copying an entry"); } - fclose(x); + fclose(in_file); /* Write central directory and end of central directory with new comments */ if ((c = zftello(y)) == (zoff_t)-1) /* get start of central */