fix buffer overrun problem with error/warning report in non-console win32 builds (popups) (#2293)

This commit is contained in:
Frank Warmerdam 2011-02-09 18:05:00 +00:00
parent addab4c8aa
commit 1b73b3d840
2 changed files with 23 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2011-02-09 Frank Warmerdam <warmerdam@pobox.com>
* libtiff/tif_win32.c: avoid error/warning buffer overrun problem
with non-console (popup message) builds on win32.
http://bugzilla.maptools.org/show_bug.cgi?id=2293
2011-01-24 Olivier Paquet <olivier.paquet@gmail.com> 2011-01-24 Olivier Paquet <olivier.paquet@gmail.com>
* libtiff/{tif_dir.{h,c}, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c, * libtiff/{tif_dir.{h,c}, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c,

View File

@ -1,4 +1,4 @@
/* $Id: tif_win32.c,v 1.37 2010-06-21 19:09:26 bfriesen Exp $ */ /* $Id: tif_win32.c,v 1.38 2011-02-09 18:05:00 fwarmerdam Exp $ */
/* /*
* Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1988-1997 Sam Leffler
@ -364,6 +364,10 @@ _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
#if (_MSC_VER < 1500)
# define vsnprintf _vsnprintf
#endif
static void static void
Win32WarningHandler(const char* module, const char* fmt, va_list ap) Win32WarningHandler(const char* module, const char* fmt, va_list ap)
{ {
@ -373,14 +377,17 @@ Win32WarningHandler(const char* module, const char* fmt, va_list ap)
LPCTSTR szTitleText = "%s Warning"; LPCTSTR szTitleText = "%s Warning";
LPCTSTR szDefaultModule = "LIBTIFF"; LPCTSTR szDefaultModule = "LIBTIFF";
LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module;
if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmpModule) + int nBufSize = (strlen(szTmpModule) +
strlen(szTitleText) + strlen(fmt) + 128)*sizeof(char))) == NULL) strlen(szTitleText) + strlen(fmt) + 256)*sizeof(char);
if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, nBufSize)) == NULL)
return; return;
sprintf(szTitle, szTitleText, szTmpModule); sprintf(szTitle, szTitleText, szTmpModule);
szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char);
vsprintf(szTmp, fmt, ap); vsnprintf(szTmp, nBufSize-(strlen(szTitle)+2)*sizeof(char), fmt, ap);
MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION); MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION);
LocalFree(szTitle); LocalFree(szTitle);
return; return;
#else #else
if (module != NULL) if (module != NULL)
@ -401,12 +408,14 @@ Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
LPCTSTR szTitleText = "%s Error"; LPCTSTR szTitleText = "%s Error";
LPCTSTR szDefaultModule = "LIBTIFF"; LPCTSTR szDefaultModule = "LIBTIFF";
LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module; LPCTSTR szTmpModule = (module == NULL) ? szDefaultModule : module;
if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (strlen(szTmpModule) + int nBufSize = (strlen(szTmpModule) +
strlen(szTitleText) + strlen(fmt) + 128)*sizeof(char))) == NULL) strlen(szTitleText) + strlen(fmt) + 256)*sizeof(char);
if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, nBufSize)) == NULL)
return; return;
sprintf(szTitle, szTitleText, szTmpModule); sprintf(szTitle, szTitleText, szTmpModule);
szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char); szTmp = szTitle + (strlen(szTitle)+2)*sizeof(char);
vsprintf(szTmp, fmt, ap); vsnprintf(szTmp, nBufSize-(strlen(szTitle)+2)*sizeof(char), fmt, ap);
MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION); MessageBoxA(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION);
LocalFree(szTitle); LocalFree(szTitle);
return; return;