bug=422348 r,a1.9=shaver proper overflow error reporting

This commit is contained in:
igor@mir2.org 2008-03-12 16:07:47 -07:00
Родитель ede5a5be83
Коммит 3165f48061
10 изменённых файлов: 34 добавлений и 13 удалений

Просмотреть файл

@ -85,7 +85,7 @@ MSG_DEF(JSMSG_INACTIVE, 2, 0, JSEXN_INTERNALERR, "nothing active
MSG_DEF(JSMSG_MORE_ARGS_NEEDED, 3, 3, JSEXN_TYPEERR, "{0} requires more than {1} argument{2}")
MSG_DEF(JSMSG_BAD_CHAR, 4, 1, JSEXN_INTERNALERR, "invalid format character {0}")
MSG_DEF(JSMSG_BAD_TYPE, 5, 1, JSEXN_TYPEERR, "unknown type {0}")
MSG_DEF(JSMSG_UNUSED6, 6, 0, JSEXN_NONE, "")
MSG_DEF(JSMSG_ALLOC_OVERFLOW, 6, 0, JSEXN_INTERNALERR, "allocation size overflow")
MSG_DEF(JSMSG_CANT_UNLOCK, 7, 0, JSEXN_INTERNALERR, "can't unlock memory")
MSG_DEF(JSMSG_INCOMPATIBLE_PROTO, 8, 3, JSEXN_TYPEERR, "{0}.prototype.{1} called on incompatible {2}")
MSG_DEF(JSMSG_NO_CONSTRUCTOR, 9, 1, JSEXN_TYPEERR, "{0} has no constructor")

Просмотреть файл

@ -5524,6 +5524,12 @@ JS_ReportOutOfMemory(JSContext *cx)
js_ReportOutOfMemory(cx);
}
JS_PUBLIC_API(void)
JS_ReportAllocationOverflow(JSContext *cx)
{
js_ReportAllocationOverflow(cx);
}
JS_PUBLIC_API(JSErrorReporter)
JS_SetErrorReporter(JSContext *cx, JSErrorReporter er)
{

Просмотреть файл

@ -2467,6 +2467,12 @@ JS_ReportErrorFlagsAndNumberUC(JSContext *cx, uintN flags,
extern JS_PUBLIC_API(void)
JS_ReportOutOfMemory(JSContext *cx);
/*
* Complain when an allocation size overflows the maximum supported limit.
*/
extern JS_PUBLIC_API(void)
JS_ReportAllocationOverflow(JSContext *cx);
struct JSErrorReport {
const char *filename; /* source file name, URL, etc., or null */
uintN lineno; /* source line number */

Просмотреть файл

@ -329,7 +329,7 @@ ResizeSlots(JSContext *cx, JSObject *obj, uint32 oldlen, uint32 len)
}
if (len > ~(uint32)0 / sizeof(jsval)) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
@ -1798,7 +1798,7 @@ array_sort(JSContext *cx, uintN argc, jsval *vp)
*/
#if JS_BITS_PER_WORD == 32
if ((size_t)len > ~(size_t)0 / (2 * sizeof(jsval))) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
#endif
@ -1902,7 +1902,7 @@ array_sort(JSContext *cx, uintN argc, jsval *vp)
*/
#if JS_BITS_PER_WORD == 32
if ((size_t)newlen > ~(size_t)0 / (4 * sizeof(jsval))) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
ok = JS_FALSE;
goto out;
}

Просмотреть файл

@ -929,6 +929,12 @@ js_ReportOverRecursed(JSContext *cx)
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_OVER_RECURSED);
}
void
js_ReportAllocationOverflow(JSContext *cx)
{
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_ALLOC_OVERFLOW);
}
JSBool
js_ReportErrorVA(JSContext *cx, uintN flags, const char *format, va_list ap)
{

Просмотреть файл

@ -993,6 +993,9 @@ js_ReportOutOfScriptQuota(JSContext *cx);
extern void
js_ReportOverRecursed(JSContext *cx);
extern void
js_ReportAllocationOverflow(JSContext *cx);
#define JS_CHECK_RECURSION(cx, onerror) \
JS_BEGIN_MACRO \
int stackDummy_; \

Просмотреть файл

@ -296,7 +296,7 @@ InitExnPrivate(JSContext *cx, JSObject *exnObject, JSString *message,
overflow |= (valueCount > ((size_t)-1 - size) / sizeof(jsval));
size += valueCount * sizeof(jsval);
if (overflow) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
priv = (JSExnPrivate *)JS_malloc(cx, size);

Просмотреть файл

@ -1801,7 +1801,7 @@ Function(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
old_args_length = args_length;
args_length = old_args_length + JSSTRING_LENGTH(arg);
if (args_length < old_args_length) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
}
@ -1811,7 +1811,7 @@ Function(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
args_length = old_args_length + n - 1;
if (args_length < old_args_length ||
args_length >= ~(size_t)0 / sizeof(jschar)) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}

Просмотреть файл

@ -352,13 +352,13 @@ js_str_escape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
* most 5 on each iteration.
*/
if (newlength < length) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
}
if (newlength >= ~(size_t)0 / sizeof(jschar)) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
@ -2068,7 +2068,7 @@ tagify(JSContext *cx, const char *begin, JSString *param, const char *end,
taglen += JSSTRING_LENGTH(str) + 2 + endlen + 1; /* 'str</end>' */
if (taglen >= ~(size_t)0 / sizeof(jschar)) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return JS_FALSE;
}
@ -2461,7 +2461,7 @@ js_NewString(JSContext *cx, jschar *chars, size_t length)
JSString *str;
if (length > JSSTRING_LENGTH_MASK) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return NULL;
}

Просмотреть файл

@ -2367,7 +2367,7 @@ EscapeElementValue(JSContext *cx, JSStringBuffer *sb, JSString *str)
newlength += 4;
if (newlength < length) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return NULL;
}
}
@ -2424,7 +2424,7 @@ EscapeAttributeValue(JSContext *cx, JSStringBuffer *sb, JSString *str,
newlength += 4;
if (newlength < length) {
JS_ReportOutOfMemory(cx);
js_ReportAllocationOverflow(cx);
return NULL;
}
}