Author: gschneider Date: Wed Dec 23 18:48:27 2009 New Revision: 44742
URL: http://svn.reactos.org/svn/reactos?rev=44742&view=rev Log: [msvcrt] Update c++ symbol demangling to Wine 1.1.35 (msvcrt:cpp test buffer overrun)
Modified: trunk/reactos/lib/sdk/crt/wine/undname.c
Modified: trunk/reactos/lib/sdk/crt/wine/undname.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/wine/undname.c?... ============================================================================== --- trunk/reactos/lib/sdk/crt/wine/undname.c [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/wine/undname.c [iso-8859-1] Wed Dec 23 18:48:27 2009 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#define __WINE_DEBUG_CHANNEL__ @@ -70,13 +70,13 @@ * */
-#define MAX_ARRAY_ELTS 32 struct array { unsigned start; /* first valid reference in array */ unsigned num; /* total number of used elts */ unsigned max; - char* elts[MAX_ARRAY_ELTS]; + unsigned alloc; + char** elts; };
/* Structure holding a parsed symbol */ @@ -110,7 +110,7 @@ * where we use a poor-man allocator. It's fast, and since all * allocation is pool, memory management is easy (esp. freeing). */ -static void* und_alloc(struct parsed_symbol* sym, size_t len) +static void* und_alloc(struct parsed_symbol* sym, unsigned int len) { void* ptr;
@@ -171,19 +171,36 @@ */ static void str_array_init(struct array* a) { - a->start = a->num = a->max = 0; + a->start = a->num = a->max = a->alloc = 0; + a->elts = NULL; }
/****************************************************************** * str_array_push * Adding a new string to an array */ -static void str_array_push(struct parsed_symbol* sym, const char* ptr, int len, +static BOOL str_array_push(struct parsed_symbol* sym, const char* ptr, int len, struct array* a) { + char** new; + assert(ptr); assert(a); - assert(a->num < MAX_ARRAY_ELTS); + + if (!a->alloc) + { + new = und_alloc(sym, (a->alloc = 32) * sizeof(a->elts[0])); + if (!new) return FALSE; + a->elts = new; + } + else if (a->max >= a->alloc) + { + new = und_alloc(sym, (a->alloc * 2) * sizeof(a->elts[0])); + if (!new) return FALSE; + memcpy(new, a->elts, a->alloc * sizeof(a->elts[0])); + a->alloc *= 2; + a->elts = new; + } if (len == -1) len = strlen(ptr); a->elts[a->num] = und_alloc(sym, len + 1); assert(a->elts[a->num]); @@ -202,6 +219,8 @@ TRACE("%p\t%d%c %s\n", a, i, c, a->elts[i]); } } + + return TRUE; }
/****************************************************************** @@ -230,11 +249,11 @@ */ static char* str_printf(struct parsed_symbol* sym, const char* format, ...) { - va_list args; - size_t len = 1, i, sz; - char* tmp; - char* p; - char* t; + va_list args; + unsigned int len = 1, i, sz; + char* tmp; + char* p; + char* t;
va_start(args, format); for (i = 0; format[i]; i++) @@ -316,7 +335,7 @@ } else if (*sym->current >= 'A' && *sym->current <= 'P') { - long ret = 0; + int ret = 0;
while (*sym->current >= 'A' && *sym->current <= 'P') { @@ -326,7 +345,7 @@ if (*sym->current != '@') return NULL;
ptr = und_alloc(sym, 17); - sprintf(ptr, "%s%ld", sgn ? "-" : "", ret); + sprintf(ptr, "%s%d", sgn ? "-" : "", ret); sym->current++; } else return NULL; @@ -345,6 +364,7 @@ struct datatype_t ct; struct array arg_collect; char* args_str = NULL; + char* last; unsigned int i;
str_array_init(&arg_collect); @@ -362,8 +382,9 @@ return NULL; /* 'void' terminates an argument list in a function */ if (z_term && !strcmp(ct.left, "void")) break; - str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1, - &arg_collect); + if (!str_array_push(sym, str_printf(sym, "%s%s", ct.left, ct.right), -1, + &arg_collect)) + return NULL; if (!strcmp(ct.left, "...")) break; } /* Functions are always terminated by 'Z'. If we made it this far and @@ -379,7 +400,8 @@ args_str = str_printf(sym, "%s,%s", args_str, arg_collect.elts[i]); }
- if (close_char == '>' && args_str && args_str[strlen(args_str) - 1] == '>') + last = args_str ? args_str : arg_collect.elts[0]; + if (close_char == '>' && last[strlen(last) - 1] == '>') args_str = str_printf(sym, "%c%s%s %c", open_char, arg_collect.elts[0], args_str, close_char); else @@ -493,7 +515,8 @@ } } while (*++sym->current != '@'); sym->current++; - str_array_push(sym, ptr, sym->current - 1 - ptr, &sym->names); + if (!str_array_push(sym, ptr, sym->current - 1 - ptr, &sym->names)) + return NULL;
return str_array_get_ref(&sym->names, sym->names.num - sym->names.start - 1); } @@ -561,17 +584,17 @@ if (*++sym->current == '$') { sym->current++; - if ((name = get_template_name(sym))) - str_array_push(sym, name, -1, &sym->names); + if ((name = get_template_name(sym)) && + !str_array_push(sym, name, -1, &sym->names)) + return FALSE; } break; default: name = get_literal_string(sym); break; } - if (!name) + if (!name || !str_array_push(sym, name, -1, &sym->stack)) return FALSE; - str_array_push(sym, name, -1, &sym->stack); } sym->current++; return TRUE; @@ -584,9 +607,9 @@ */ static char* get_class_string(struct parsed_symbol* sym, int start) { - int i; - size_t len, sz; - char* ret; + int i; + unsigned int len, sz; + char* ret; struct array *a = &sym->stack;
for (len = 0, i = start; i < a->num; i++) @@ -915,8 +938,9 @@ if (add_pmt && pmt_ref && in_args) { /* left and right are pushed as two separate strings */ - str_array_push(sym, ct->left ? ct->left : "", -1, pmt_ref); - str_array_push(sym, ct->right ? ct->right : "", -1, pmt_ref); + if (!str_array_push(sym, ct->left ? ct->left : "", -1, pmt_ref) || + !str_array_push(sym, ct->right ? ct->right : "", -1, pmt_ref)) + return FALSE; } done:
@@ -1323,15 +1347,16 @@ switch (do_after) { case 1: case 2: - sym->stack.num = sym->stack.max = 1; - sym->stack.elts[0] = dashed_null; + if (!str_array_push(sym, dashed_null, -1, &sym->stack)) + return FALSE; break; case 4: sym->result = (char*)function_name; ret = TRUE; goto done; default: - str_array_push(sym, function_name, -1, &sym->stack); + if (!str_array_push(sym, function_name, -1, &sym->stack)) + return FALSE; break; } }