[PATCH 2/6] [DbgHelp]: correctly setup the Unix regular expression for matching file names in SymEnumLines
Eric Pouech
eric.pouech at orange.fr
Sat Sep 6 15:19:53 CDT 2008
- plug a potential memory leak as well
A+
---
dlls/dbghelp/source.c | 58 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/dlls/dbghelp/source.c b/dlls/dbghelp/source.c
index 14a48cc..d02a392 100644
--- a/dlls/dbghelp/source.c
+++ b/dlls/dbghelp/source.c
@@ -154,6 +154,55 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask,
return TRUE;
}
+static inline void re_append(char** mask, unsigned* len, char ch)
+{
+ *mask = HeapReAlloc(GetProcessHeap(), 0, *mask, ++(*len));
+ (*mask)[*len - 2] = ch;
+}
+
+static BOOL compile_regex(regex_t* re, const char* srcfile)
+{
+ char* mask;
+ unsigned len = 1;
+
+ mask = HeapAlloc(GetProcessHeap(), 0, 1);
+ re_append(&mask, &len, '^');
+ if (!srcfile || !*srcfile) re_append(&mask, &len, '*');
+ else while (*srcfile)
+ {
+ switch (*srcfile)
+ {
+ case '\\':
+ case '/':
+ re_append(&mask, &len, '[');
+ re_append(&mask, &len, '\\');
+ re_append(&mask, &len, '\\');
+ re_append(&mask, &len, '/');
+ re_append(&mask, &len, ']');
+ break;
+ case '.':
+ re_append(&mask, &len, '\\');
+ re_append(&mask, &len, '.');
+ break;
+ default:
+ re_append(&mask, &len, *srcfile);
+ break;
+ }
+ srcfile++;
+ }
+ re_append(&mask, &len, '$');
+ mask[len - 1] = '\0';
+ len = regcomp(re, mask, REG_NOSUB);
+ HeapFree(GetProcessHeap(), 0, mask);
+ if (len)
+ {
+ FIXME("Couldn't compile %s\n", mask);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ return TRUE;
+}
+
/******************************************************************
* SymEnumLines (DBGHELP.@)
*
@@ -172,17 +221,13 @@ BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
if (!cb) return FALSE;
if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE;
- if (regcomp(&re, srcfile, REG_NOSUB))
- {
- FIXME("Couldn't compile %s\n", srcfile);
- SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
+
pair.pcs = process_find_by_handle(hProcess);
if (!pair.pcs) return FALSE;
if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland);
pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN);
if (!module_get_debug(&pair)) return FALSE;
+ if (!compile_regex(&re, srcfile)) return FALSE;
sci.SizeOfStruct = sizeof(sci);
sci.ModBase = base;
@@ -215,6 +260,7 @@ BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
}
}
}
+ regfree(&re);
return TRUE;
}
More information about the wine-patches
mailing list