Eric Pouech : msvcrt: In undname helpers, allow str_array_push to return errors (instead of asserting).
Alexandre Julliard
julliard at winehq.org
Mon Nov 16 11:43:57 CST 2009
Module: wine
Branch: master
Commit: c65106e1d57882e94cb0816f19c69c6eeecebdcf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c65106e1d57882e94cb0816f19c69c6eeecebdcf
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Sun Nov 15 22:07:38 2009 +0100
msvcrt: In undname helpers, allow str_array_push to return errors (instead of asserting).
---
dlls/msvcrt/undname.c | 31 +++++++++++++++++++------------
1 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c
index d825cfc..119b44d 100644
--- a/dlls/msvcrt/undname.c
+++ b/dlls/msvcrt/undname.c
@@ -181,12 +181,13 @@ static void str_array_init(struct array* a)
* 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)
{
assert(ptr);
assert(a);
- assert(a->num < MAX_ARRAY_ELTS);
+ if (a->num >= MAX_ARRAY_ELTS) return FALSE;
+
if (len == -1) len = strlen(ptr);
a->elts[a->num] = und_alloc(sym, len + 1);
assert(a->elts[a->num]);
@@ -205,6 +206,8 @@ static void str_array_push(struct parsed_symbol* sym, const char* ptr, int len,
TRACE("%p\t%d%c %s\n", a, i, c, a->elts[i]);
}
}
+
+ return TRUE;
}
/******************************************************************
@@ -365,8 +368,9 @@ static char* get_args(struct parsed_symbol* sym, struct array* pmt_ref, BOOL z_t
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
@@ -496,7 +500,8 @@ static char* get_literal_string(struct parsed_symbol* sym)
}
} 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);
}
@@ -564,17 +569,17 @@ static BOOL get_class(struct parsed_symbol* sym)
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;
@@ -918,8 +923,9 @@ static BOOL demangle_datatype(struct parsed_symbol* sym, struct datatype_t* ct,
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:
@@ -1334,7 +1340,8 @@ static BOOL symbol_demangle(struct parsed_symbol* sym)
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;
}
}
More information about the wine-cvs
mailing list