Bulletproof the debugger.

Michael Stefaniuc mstefani at redhat.de
Wed Dec 26 05:36:12 CST 2001


Hello,

please do not apply the previous patch, i did something very stupid. Use
the attached patch instead (makes also better use of the C99 style
return value).

bye
	michael

On Wed, Dec 26, 2001 at 01:09:06AM +0100, Michael Stefaniuc wrote:
[snip]
> I did a short check with
> camus:~/work/wine$ grep -r -I -C snprintf ./ | less
> and this is what I found:
> - most of the time the return value of *snprintf isn't checked
> - if the return value is checked it's mostly checked for C89 and C99
>   style
> - the attached patch should fix all the remaining cases.
> 
Changelog:
   Michael Stefaniuc <mstefani at redhat.com>
   check the return value of *snprintf for C99 style overflow reporting

-- 
Michael Stefaniuc               Tel.: +49-711-96437-199
System Administration           Fax.: +49-711-96437-111
Red Hat GmbH                    Email: mstefani at redhat.de
Hauptstaetterstr. 58            http://www.redhat.de/
D-70178 Stuttgart
-------------- next part --------------
Index: dlls/kernel/format_msg.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/format_msg.c,v
retrieving revision 1.19
diff -u -r1.19 format_msg.c
--- dlls/kernel/format_msg.c	2001/10/10 02:51:24	1.19
+++ dlls/kernel/format_msg.c	2001/12/26 09:46:29
@@ -265,6 +265,7 @@
                             strcpy( fmtstr, "%s" );
                         }
                         if (args) {
+			    int ret;
                             int sz;
                             LPSTR b;
 
@@ -282,8 +283,9 @@
                                 b = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz = 100);
                                 /* CMF - This makes a BIG assumption about va_list */
                                 TRACE("A BIG assumption\n");
-                                while (vsnprintf(b, sz, fmtstr, (va_list) argliststart) < 0) {
-                                    b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz += 100);
+                                while ((ret = vsnprintf(b, sz, fmtstr, (va_list) argliststart) < 0) || (ret >= sz)) {
+				    sz = (ret == -1 ? sz + 100 : ret + 1);
+                                    b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz);
                                 }
                             }
                             for (x=b; *x; x++) ADD_TO_T(*x);
Index: dlls/user/lstr.c
===================================================================
RCS file: /home/wine/wine/dlls/user/lstr.c,v
retrieving revision 1.18
diff -u -r1.18 lstr.c
--- dlls/user/lstr.c	2001/10/17 17:50:02	1.18
+++ dlls/user/lstr.c	2001/12/26 09:46:30
@@ -683,14 +683,16 @@
                         strcpy( fmtstr, "%s" );
                     }
 		    if (args) {
+			int	ret;
 		        int	sz;
 			LPSTR	b = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz = 100);
 			
 			argliststart=args+insertnr-1;
 		       
 			/* CMF - This makes a BIG assumption about va_list */
-			while (vsnprintf(b, sz, fmtstr, (va_list) argliststart) < 0) {
-			    b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz += 100);
+			while ((ret = vsnprintf(b, sz, fmtstr, (va_list) argliststart) < 0) || (ret >= sz)) {
+			    sz = (ret == -1 ? sz + 100 : ret + 1);
+			    b = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, b, sz);
 			}
 			for (x=b; *x; x++) ADD_TO_T(*x);
 		    } else {
Index: programs/wineconsole/wineconsole.c
===================================================================
RCS file: /home/wine/wine/programs/wineconsole/wineconsole.c,v
retrieving revision 1.4
diff -u -r1.4 wineconsole.c
--- programs/wineconsole/wineconsole.c	2001/12/04 20:46:54	1.4
+++ programs/wineconsole/wineconsole.c	2001/12/26 09:46:36
@@ -22,7 +22,7 @@
     len = vsnprintf(buf, sizeof(buf), format, valist);
     va_end(valist);
  
-    if (len <= -1) 
+    if ((len <= -1) || (len >= sizeof(buf)))
     {
         len = sizeof(buf) - 1;
         buf[len] = 0;
Index: win32/console.c
===================================================================
RCS file: /home/wine/wine/win32/console.c,v
retrieving revision 1.84
diff -u -r1.84 console.c
--- win32/console.c	2001/12/21 20:29:10	1.84
+++ win32/console.c	2001/12/26 09:46:38
@@ -62,6 +62,7 @@
 static	BOOL	start_console_renderer(void)
 {
     char		buffer[256];
+    int			ret;
     STARTUPINFOA	si;
     PROCESS_INFORMATION	pi;
     HANDLE		hEvent = 0;
@@ -85,14 +86,16 @@
     /* first try environment variable */
     if ((p = getenv("WINECONSOLE")) != NULL)
     {
-	if (snprintf(buffer, sizeof(buffer), "%s -- --use-event=%d", p, hEvent) > 0 &&
+	ret = snprintf(buffer, sizeof(buffer), "%s -- --use-event=%d", p, hEvent);
+	if ((ret > -1) && (ret < sizeof(buffer)) &&
 	    CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi))
 	    goto succeed;
 	ERR("Couldn't launch Wine console from WINECONSOLE env var... trying default access\n");
     }
 
     /* then the regular installation dir */
-    if (snprintf(buffer, sizeof(buffer), "%s -- --use-event=%d", BINDIR "/wineconsole", hEvent) > 0 &&
+    ret = snprintf(buffer, sizeof(buffer), "%s -- --use-event=%d", BINDIR "/wineconsole", hEvent);
+    if ((ret > -1) && (ret < sizeof(buffer)) &&
 	CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi))
 	goto succeed;
 


More information about the wine-patches mailing list