crt: exe: Check for memory allocation failure in duplicate_ppstrings() Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/crt/crtexe.c b/mingw-w64-crt/crt/crtexe.c index 834149b..4134b94 100644 --- a/mingw-w64-crt/crt/crtexe.c +++ b/mingw-w64-crt/crt/crtexe.c
@@ -58,7 +58,7 @@ extern void _pei386_runtime_relocator (void); long CALLBACK _gnu_exception_handler (EXCEPTION_POINTERS * exception_data); -static void duplicate_ppstrings (int ac, _TCHAR ***av); +static int duplicate_ppstrings (int ac, _TCHAR ***av); extern int _MINGW_INSTALL_DEBUG_MATHERR; @@ -215,7 +215,9 @@ if (ret < 0) _amsg_exit (8); /* _RT_SPACEARG */ - duplicate_ppstrings (argc, &argv); + ret = duplicate_ppstrings (argc, &argv); + if (ret != 0) + _amsg_exit (8); /* _RT_SPACEARG */ _initterm (__xc_a, __xc_z); __main (); /* C++ initialization. */ @@ -286,21 +288,24 @@ return 0; } -static void duplicate_ppstrings (int ac, _TCHAR ***av) +static int duplicate_ppstrings (int ac, _TCHAR ***av) { _TCHAR **avl; int i; _TCHAR **n = (_TCHAR **) malloc (sizeof (_TCHAR *) * (ac + 1)); + if (!n) return 1; avl=*av; for (i=0; i < ac; i++) { size_t l = sizeof (_TCHAR) * (_tcslen (avl[i]) + 1); n[i] = (_TCHAR *) malloc (l); + if (!n[i]) return 1; memcpy (n[i], avl[i], l); } n[i] = NULL; *av = n; + return 0; } int __cdecl atexit (_PVFV func)