I have been doing some heavy testing with the new FLAC version, and I found that CreateFile function in grabbag had been left out of UTF-8 treatment at some point. This causes re-encoding an existing flac to the same name to break the file if it contains non-ascii characters. Attached patch fixes this.

diff --git a/include/share/win_utf8_io.h b/include/share/win_utf8_io.h
index b48e85e..b689db0 100644
--- a/include/share/win_utf8_io.h
+++ b/include/share/win_utf8_io.h
@@ -10,7 +10,7 @@ extern "C" {
 #include <stdio.h>
 #include <sys/stat.h>
 #include <stdarg.h>
-
+#include <windows.h>
 
 int get_utf8_argv(int *argc, char ***argv);
 
@@ -25,6 +25,7 @@ int chmod_utf8(const char *filename, int pmode);
 int utime_utf8(const char *filename, struct utimbuf *times);
 int unlink_utf8(const char *filename);
 int rename_utf8(const char *oldname, const char *newname);
+HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, 
DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD 
dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/src/share/grabbag/file.c b/src/share/grabbag/file.c
index dd2880c..a3706f1 100644
--- a/src/share/grabbag/file.c
+++ b/src/share/grabbag/file.c
@@ -127,8 +127,8 @@ FLAC__bool grabbag__file_are_same(const char *f1, const 
char *f2)
        BY_HANDLE_FILE_INFORMATION info1, info2;
        HANDLE h1, h2;
        BOOL ok = 1;
-       h1 = CreateFile(f1, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL, NULL);
-       h2 = CreateFile(f2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL, NULL);
+       h1 = CreateFile_utf8(f1, GENERIC_READ, FILE_SHARE_READ, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+       h2 = CreateFile_utf8(f2, GENERIC_READ, FILE_SHARE_READ, NULL, 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(h1 == INVALID_HANDLE_VALUE || h2 == INVALID_HANDLE_VALUE)
                ok = 0;
        ok &= GetFileInformationByHandle(h1, &info1);
diff --git a/src/share/win_utf8_io/win_utf8_io.c 
b/src/share/win_utf8_io/win_utf8_io.c
index d7d1dbd..d2288d9 100644
--- a/src/share/win_utf8_io/win_utf8_io.c
+++ b/src/share/win_utf8_io/win_utf8_io.c
@@ -262,3 +262,16 @@ int rename_utf8(const char *oldname, const char *newname)
 
        return ret;
 }
+
+HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, 
DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD 
dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
+{
+       wchar_t *wname;
+       HANDLE handle = INVALID_HANDLE_VALUE;
+
+       if ((wname = wchar_from_utf8(lpFileName)) != NULL) {
+               handle = CreateFileW(wname, dwDesiredAccess, dwShareMode, 
lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, 
hTemplateFile);
+               free(wname);
+       }
+
+       return handle;
+}
_______________________________________________
flac-dev mailing list
flac-dev@xiph.org
http://lists.xiph.org/mailman/listinfo/flac-dev

Reply via email to