Ticket #40696

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

Date d'ouverture: 2020-09-01 07:32 Dernière mise à jour: 2020-09-03 00:15

Rapporteur:
Propriétaire:
Type:
État:
Ouvert [Owner assigned]
Composant:
Jalon:
(Aucun)
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Fixed
Fichier:
1
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Détails

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 History (3/9 Histories)

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

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 Updated by: keith
  • Details Updated
2020-09-03 00:11 Updated by: keith
  • File pgmptr-initialization.patch (File ID: 5664) is attached
2020-09-03 00:12 Updated by: keith
  • File pgmptr-initialization.patch (File ID: 5664) is deleted
2020-09-03 00:15 Updated by: keith
  • Résolution Update from Aucun to Fixed
Commentaire

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

Attachment File List

Modifier

Please login to add comment to this ticket » Connexion