Ticket #40696

MSVCRT.DLL's _pgmptr variable is uninitialized by MinGW start-up code

Eröffnet am: 2020-09-01 07:32 Letztes Update: 2020-09-03 00:15

Auswertung:
Verantwortlicher:
Typ:
Status:
Offen [Owner assigned]
Komponente:
Meilenstein:
(Keine)
Priorität:
5 - Mittel
Schweregrad:
5 - Mittel
Lösung:
Gefixt
Datei:
1
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

According to Microsoft's GetModuleFileNameA() function documentation:

The global variable _pgmptr is automatically initialized to the full path of the executable file,
and can be used to retrieve the full path name of an executable file.
It appears that this global variable initialization occurs, only if the run-time start-up code calls Microsoft's __getmainargs() function, but that exhibits defective globbing of wild-card patterns, and MinGW has not used it, as a default start-up hook, since the release of mingwrt-3.21, in December 2014. Consequently, references to _pgmptr, in code linked against mingwrt-3.21 (and later), are likely to dereference a NULL pointer.

Ticket-Verlauf (3/9 Historien)

2020-09-01 07:32 Aktualisiert von: keith
  • New Ticket "MSVCRT.DLL's _pgmptr variable is unitialized by MinGW start-up code" created
2020-09-01 07:33 Aktualisiert von: keith
  • Details Updated
2020-09-01 07:35 Aktualisiert von: keith
  • Summary Updated
2020-09-02 04:31 Aktualisiert von: keith
Kommentar

The following (trivial) program illustrates the issue:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #ifdef _CRT_GLOB
  4. int _CRT_glob = _CRT_GLOB;
  5. #endif
  6. int main()
  7. { printf( "_pgmptr = '%s'\n", _pgmptr );
  8. return 0;
  9. }
If I compile this, with default settings for _CRT_glob, link with current mingwrt, and run it (under MSYS) on a Win7, or WinXP VM, I see:
$ mingw32-gcc t-pgmptr.c -o pgmptr.exe
$ ./pgmptr.exe
_pgmptr = '(null)'
OTOH, if I compile it with -D_CRT_GLOB=1, or with -D_CRT_GLOB=0, either of which causes the mingwrt start-up code to call Microsoft's __getmainargs(), I see (as expected):
$ mingw32-gcc -D_CRT_GLOB=1 t-pgmptr.c -o pgmptr.exe
$ ./pgmptr.exe
_pgmptr = 'e:\sandbox\pgmptr.exe'

Curiously, I didn't notice the anomalous default behaviour previously, (testing on GNU/Linux, under Wine), because Wine's implementation of MSVCRT.DLL appears to initialize _pgmptr without __getmainargs() having been called.

2020-09-02 05:24 Aktualisiert von: keith
  • Details Updated
2020-09-03 00:11 Aktualisiert von: keith
  • File pgmptr-initialization.patch (File ID: 5664) is attached
2020-09-03 00:12 Aktualisiert von: keith
  • File pgmptr-initialization.patch (File ID: 5664) is deleted
2020-09-03 00:15 Aktualisiert von: keith
  • Lösung Update from Keine to Gefixt
Kommentar

The attached patch resolves the anomaly. I will include it in the next mingwrt release.

Dateianhangliste

Bearbeiten

Please login to add comment to this ticket » Anmelden