PATCH: wine_dbgstr_an()
Johan Gill
johane at lysator.liu.se
Tue Oct 16 15:58:01 CDT 2001
Relay tracing would crash if it came upon a function call with an invalid
pointer as a parameter.
/Johan Gill, johane at lysator.liu.se
-------------- next part --------------
Index: wine/dlls/ntdll/debugtools.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/debugtools.c,v
retrieving revision 1.10
diff -u -r1.10 debugtools.c
--- wine/dlls/ntdll/debugtools.c 2001/07/17 00:56:37 1.10
+++ wine/dlls/ntdll/debugtools.c 2001/10/16 19:13:59
@@ -10,6 +10,7 @@
#include <ctype.h>
#include "debugtools.h"
+#include "wine/exception.h"
#include "thread.h"
#include "winbase.h"
#include "winnt.h"
@@ -72,6 +73,15 @@
/***********************************************************************
* wine_dbgstr_an (NTDLL.@)
*/
+
+/* filter for page-fault exceptions */
+static WINE_EXCEPTION_FILTER(page_fault)
+{
+ if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
+ return EXCEPTION_EXECUTE_HANDLER;
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
const char *wine_dbgstr_an( const char *src, int n )
{
char *dst, *res;
@@ -87,35 +97,42 @@
else if (n > 200) n = 200;
dst = res = gimme1 (n * 4 + 6);
*dst++ = '"';
- while (n-- > 0 && *src)
- {
- unsigned char c = *src++;
- switch (c)
+ __TRY {
+ while (n-- > 0 && *src)
{
- case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
- case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
- case '\t': *dst++ = '\\'; *dst++ = 't'; break;
- case '"': *dst++ = '\\'; *dst++ = '"'; break;
- case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
- default:
- if (c >= ' ' && c <= 126)
- *dst++ = c;
- else
- {
- *dst++ = '\\';
- *dst++ = '0' + ((c >> 6) & 7);
- *dst++ = '0' + ((c >> 3) & 7);
- *dst++ = '0' + ((c >> 0) & 7);
- }
- }
+ unsigned char c = *src++;
+ switch (c)
+ {
+ case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
+ case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
+ case '\t': *dst++ = '\\'; *dst++ = 't'; break;
+ case '"': *dst++ = '\\'; *dst++ = '"'; break;
+ case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
+ default:
+ if (c >= ' ' && c <= 126)
+ *dst++ = c;
+ else
+ {
+ *dst++ = '\\';
+ *dst++ = '0' + ((c >> 6) & 7);
+ *dst++ = '0' + ((c >> 3) & 7);
+ *dst++ = '0' + ((c >> 0) & 7);
+ }
+ }
+ }
+ *dst++ = '"';
+ if (*src)
+ {
+ *dst++ = '.';
+ *dst++ = '.';
+ *dst++ = '.';
+ }
}
- *dst++ = '"';
- if (*src)
- {
- *dst++ = '.';
- *dst++ = '.';
- *dst++ = '.';
+ __EXCEPT(page_fault) {
+ release( dst );
+ return "(invalid)";
}
+ __ENDTRY
*dst++ = '\0';
release( dst );
return res;
More information about the wine-patches
mailing list