Use snwprintf instead of swprintf in rts/Linker.c.
authorGintautas Miliauskas <gintautas.miliauskas@gmail.com>
Thu, 30 Oct 2014 04:13:31 +0000 (23:13 -0500)
committerAustin Seipp <austin@well-typed.com>
Thu, 30 Oct 2014 04:13:32 +0000 (23:13 -0500)
Summary:
swprintf has different signatures in mingw32, where it does not include the
buffer size, and in mingw-w64, where it does. That of course breaks the code
as mingw-w64 treats the pointer to the format string as a size_t.

snwprintf is available in both environments and is consistent, so use that
instead.

Reviewers: simonmar, austin

Reviewed By: austin

Subscribers: #ghc_windows_task_force, thomie, carter, simonmar

Differential Revision: https://phabricator.haskell.org/D372

GHC Trac Issues: #9726

rts/Linker.c

index 35cee2c..7d029c6 100644 (file)
@@ -1968,18 +1968,19 @@ addDLL( pathchar *dll_name )
         point character (.) to indicate that the module name has no
         extension. */
 
-   buf = stgMallocBytes((pathlen(dll_name) + 10) * sizeof(wchar_t), "addDLL");
-   swprintf(buf, L"%s.DLL", dll_name);
+   size_t bufsize = pathlen(dll_name) + 10;
+   buf = stgMallocBytes(bufsize * sizeof(wchar_t), "addDLL");
+   snwprintf(buf, bufsize, L"%s.DLL", dll_name);
    instance = LoadLibraryW(buf);
    if (instance == NULL) {
        if (GetLastError() != ERROR_MOD_NOT_FOUND) goto error;
        // KAA: allow loading of drivers (like winspool.drv)
-       swprintf(buf, L"%s.DRV", dll_name);
+       snwprintf(buf, bufsize, L"%s.DRV", dll_name);
        instance = LoadLibraryW(buf);
        if (instance == NULL) {
            if (GetLastError() != ERROR_MOD_NOT_FOUND) goto error;
            // #1883: allow loading of unix-style libfoo.dll DLLs
-           swprintf(buf, L"lib%s.DLL", dll_name);
+           snwprintf(buf, bufsize, L"lib%s.DLL", dll_name);
            instance = LoadLibraryW(buf);
            if (instance == NULL) {
                goto error;