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