mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 687102 - Check line2pc, pc2line argument range (r=cdleary)
--HG-- extra : rebase_source : a746956e36e1ecb24b540c25f3e5716e67fee152
This commit is contained in:
parent
b4a44ef015
commit
d6f2210311
@ -1609,31 +1609,33 @@ SetDebug(JSContext *cx, uintN argc, jsval *vp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static JSBool
|
static JSBool
|
||||||
GetTrapArgs(JSContext *cx, uintN argc, jsval *argv, JSScript **scriptp,
|
GetScriptAndPCArgs(JSContext *cx, uintN argc, jsval *argv, JSScript **scriptp,
|
||||||
int32 *ip)
|
int32 *ip)
|
||||||
{
|
{
|
||||||
jsval v;
|
JSScript *script = JS_GetFrameScript(cx, JS_GetScriptedCaller(cx, NULL));
|
||||||
uintN intarg;
|
|
||||||
JSScript *script;
|
|
||||||
|
|
||||||
*scriptp = JS_GetFrameScript(cx, JS_GetScriptedCaller(cx, NULL));
|
|
||||||
*ip = 0;
|
*ip = 0;
|
||||||
if (argc != 0) {
|
if (argc != 0) {
|
||||||
v = argv[0];
|
jsval v = argv[0];
|
||||||
intarg = 0;
|
uintN intarg = 0;
|
||||||
if (!JSVAL_IS_PRIMITIVE(v) &&
|
if (!JSVAL_IS_PRIMITIVE(v) &&
|
||||||
JS_GET_CLASS(cx, JSVAL_TO_OBJECT(v)) == Jsvalify(&FunctionClass)) {
|
JS_GET_CLASS(cx, JSVAL_TO_OBJECT(v)) == Jsvalify(&FunctionClass)) {
|
||||||
script = ValueToScript(cx, v);
|
script = ValueToScript(cx, v);
|
||||||
if (!script)
|
if (!script)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
*scriptp = script;
|
|
||||||
intarg++;
|
intarg++;
|
||||||
}
|
}
|
||||||
if (argc > intarg) {
|
if (argc > intarg) {
|
||||||
if (!JS_ValueToInt32(cx, argv[intarg], ip))
|
if (!JS_ValueToInt32(cx, argv[intarg], ip))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
|
if ((uint32)*ip >= script->length) {
|
||||||
|
JS_ReportError(cx, "Invalid PC");
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*scriptp = script;
|
||||||
|
|
||||||
return JS_TRUE;
|
return JS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1678,7 +1680,7 @@ Trap(JSContext *cx, uintN argc, jsval *vp)
|
|||||||
if (!str)
|
if (!str)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
argv[argc] = STRING_TO_JSVAL(str);
|
argv[argc] = STRING_TO_JSVAL(str);
|
||||||
if (!GetTrapArgs(cx, argc, argv, &script, &i))
|
if (!GetScriptAndPCArgs(cx, argc, argv, &script, &i))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
if (uint32(i) >= script->length) {
|
if (uint32(i) >= script->length) {
|
||||||
JS_ReportErrorNumber(cx, my_GetErrorMessage, NULL, JSSMSG_TRAP_USAGE);
|
JS_ReportErrorNumber(cx, my_GetErrorMessage, NULL, JSSMSG_TRAP_USAGE);
|
||||||
@ -1694,7 +1696,7 @@ Untrap(JSContext *cx, uintN argc, jsval *vp)
|
|||||||
JSScript *script;
|
JSScript *script;
|
||||||
int32 i;
|
int32 i;
|
||||||
|
|
||||||
if (!GetTrapArgs(cx, argc, JS_ARGV(cx, vp), &script, &i))
|
if (!GetScriptAndPCArgs(cx, argc, JS_ARGV(cx, vp), &script, &i))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
JS_ClearTrap(cx, script, script->code + i, NULL, NULL);
|
JS_ClearTrap(cx, script, script->code + i, NULL, NULL);
|
||||||
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
JS_SET_RVAL(cx, vp, JSVAL_VOID);
|
||||||
@ -1750,8 +1752,8 @@ static JSBool
|
|||||||
LineToPC(JSContext *cx, uintN argc, jsval *vp)
|
LineToPC(JSContext *cx, uintN argc, jsval *vp)
|
||||||
{
|
{
|
||||||
JSScript *script;
|
JSScript *script;
|
||||||
int32 i;
|
int32 lineArg = 0;
|
||||||
uintN lineno;
|
uint32 lineno;
|
||||||
jsbytecode *pc;
|
jsbytecode *pc;
|
||||||
|
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
@ -1759,9 +1761,17 @@ LineToPC(JSContext *cx, uintN argc, jsval *vp)
|
|||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
}
|
}
|
||||||
script = JS_GetFrameScript(cx, JS_GetScriptedCaller(cx, NULL));
|
script = JS_GetFrameScript(cx, JS_GetScriptedCaller(cx, NULL));
|
||||||
if (!GetTrapArgs(cx, argc, JS_ARGV(cx, vp), &script, &i))
|
jsval v = JS_ARGV(cx, vp)[0];
|
||||||
|
if (!JSVAL_IS_PRIMITIVE(v) &&
|
||||||
|
JS_GET_CLASS(cx, JSVAL_TO_OBJECT(v)) == Jsvalify(&FunctionClass))
|
||||||
|
{
|
||||||
|
script = ValueToScript(cx, v);
|
||||||
|
if (!script)
|
||||||
|
return JS_FALSE;
|
||||||
|
lineArg++;
|
||||||
|
}
|
||||||
|
if (!JS_ValueToECMAUint32(cx, JS_ARGV(cx, vp)[lineArg], &lineno))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
lineno = (i == 0) ? script->lineno : (uintN)i;
|
|
||||||
pc = JS_LineNumberToPC(cx, script, lineno);
|
pc = JS_LineNumberToPC(cx, script, lineno);
|
||||||
if (!pc)
|
if (!pc)
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
@ -1776,7 +1786,7 @@ PCToLine(JSContext *cx, uintN argc, jsval *vp)
|
|||||||
int32 i;
|
int32 i;
|
||||||
uintN lineno;
|
uintN lineno;
|
||||||
|
|
||||||
if (!GetTrapArgs(cx, argc, JS_ARGV(cx, vp), &script, &i))
|
if (!GetScriptAndPCArgs(cx, argc, JS_ARGV(cx, vp), &script, &i))
|
||||||
return JS_FALSE;
|
return JS_FALSE;
|
||||||
lineno = JS_PCToLineNumber(cx, script, script->code + i);
|
lineno = JS_PCToLineNumber(cx, script, script->code + i);
|
||||||
if (!lineno)
|
if (!lineno)
|
||||||
|
Loading…
Reference in New Issue
Block a user