From e1e441091dfecc73b1cc9ab695edc9a71db9d524 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 16 May 2018 11:44:49 +0300 Subject: [PATCH] - fixed potential crash on startup, Windows only At least one version of Windows SDK (10.0.17134.0) has broken _pgmptr/_get_pgmptr() It points to an empty string for multi-byte character set applications GetModuleFileName() is now used instead regardless of compiler/toolchain Added extra guard against unexpected program paths to avoid crashes https://forum.zdoom.org/viewtopic.php?t=60598 --- src/win32/i_main.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 7ade6eb7a..21b758094 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -915,23 +915,20 @@ void DoMain (HINSTANCE hInstance) atterm (I_Quit); // Figure out what directory the program resides in. - char *program; - -#ifdef _MSC_VER - if (_get_pgmptr(&program) != 0) + char progbuff[1024]; + if (GetModuleFileName(nullptr, progbuff, sizeof progbuff) == 0) { I_FatalError("Could not determine program location."); } -#else - char progbuff[1024]; - GetModuleFileName(0, progbuff, sizeof(progbuff)); progbuff[1023] = '\0'; - program = progbuff; -#endif + char *program = progbuff; progdir = program; program = progdir.LockBuffer(); - *(strrchr(program, '\\') + 1) = '\0'; + if (char *lastsep = strrchr(program, '\\')) + { + lastsep[1] = '\0'; + } FixPathSeperator(program); progdir.Truncate((long)strlen(program)); progdir.UnlockBuffer();