Skip to content

Commit e1ca7cb

Browse files
committed
Breakpoint APIs don't verify current context
The JsDiag APIs for breakpoints use the `GlobalAPIWrapper_NoRecord` wrapper which does not validate that there's a current context. During the function they then get the current context and attempt to use it without checking whether it's `nullptr`. The fix is to use `ContextAPIWrapper_NoRecord` instead which will ensure that there's a current context.
1 parent 46611d3 commit e1ca7cb

File tree

1 file changed

+18
-30
lines changed

1 file changed

+18
-30
lines changed

lib/Jsrt/JsrtDiag.cpp

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -263,17 +263,12 @@ CHAKRA_API JsDiagGetBreakpoints(
263263
#ifndef ENABLE_SCRIPT_DEBUGGING
264264
return JsErrorCategoryUsage;
265265
#else
266-
return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode {
267-
266+
return ContextAPIWrapper_NoRecord<false>([&](Js::ScriptContext* scriptContext) -> JsErrorCode {
268267
PARAM_NOT_NULL(breakpoints);
269-
270268
*breakpoints = JS_INVALID_REFERENCE;
271269

272-
JsrtContext *currentContext = JsrtContext::GetCurrent();
273-
274-
Js::JavascriptArray* bpsArray = currentContext->GetScriptContext()->GetLibrary()->CreateArray();
275-
276-
JsrtRuntime * runtime = currentContext->GetRuntime();
270+
JsrtContext* currentContext = JsrtContext::GetCurrent();
271+
JsrtRuntime* runtime = currentContext->GetRuntime();
277272

278273
ThreadContextScope scope(runtime->GetThreadContext());
279274

@@ -283,18 +278,18 @@ CHAKRA_API JsDiagGetBreakpoints(
283278
}
284279

285280
JsrtDebugManager* jsrtDebugManager = runtime->GetJsrtDebugManager();
286-
287281
VALIDATE_IS_DEBUGGING(jsrtDebugManager);
288282

289-
for (Js::ScriptContext *scriptContext = runtime->GetThreadContext()->GetScriptContextList();
290-
scriptContext != nullptr && !scriptContext->IsClosed();
291-
scriptContext = scriptContext->next)
283+
Js::JavascriptArray* bpsArray = currentContext->GetScriptContext()->GetLibrary()->CreateArray();
284+
285+
for (Js::ScriptContext* currentScriptContext = runtime->GetThreadContext()->GetScriptContextList();
286+
currentScriptContext != nullptr && !currentScriptContext->IsClosed();
287+
currentScriptContext = currentScriptContext->next)
292288
{
293-
jsrtDebugManager->GetBreakpoints(&bpsArray, scriptContext);
289+
jsrtDebugManager->GetBreakpoints(&bpsArray, currentScriptContext);
294290
}
295291

296292
*breakpoints = bpsArray;
297-
298293
return JsNoError;
299294
});
300295
#endif
@@ -309,15 +304,12 @@ CHAKRA_API JsDiagSetBreakpoint(
309304
#ifndef ENABLE_SCRIPT_DEBUGGING
310305
return JsErrorCategoryUsage;
311306
#else
312-
return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode {
313-
307+
return ContextAPIWrapper_NoRecord<false>([&](Js::ScriptContext* scriptContext) -> JsErrorCode {
314308
PARAM_NOT_NULL(breakpoint);
315-
316309
*breakpoint = JS_INVALID_REFERENCE;
317310

318-
JsrtContext *currentContext = JsrtContext::GetCurrent();
319-
320-
JsrtRuntime * runtime = currentContext->GetRuntime();
311+
JsrtContext* currentContext = JsrtContext::GetCurrent();
312+
JsrtRuntime* runtime = currentContext->GetRuntime();
321313

322314
ThreadContextScope scope(runtime->GetThreadContext());
323315

@@ -330,11 +322,11 @@ CHAKRA_API JsDiagSetBreakpoint(
330322

331323
Js::Utf8SourceInfo* utf8SourceInfo = nullptr;
332324

333-
for (Js::ScriptContext *scriptContext = runtime->GetThreadContext()->GetScriptContextList();
334-
scriptContext != nullptr && utf8SourceInfo == nullptr && !scriptContext->IsClosed();
335-
scriptContext = scriptContext->next)
325+
for (Js::ScriptContext* currentScriptContext = runtime->GetThreadContext()->GetScriptContextList();
326+
currentScriptContext != nullptr && utf8SourceInfo == nullptr && !currentScriptContext->IsClosed();
327+
currentScriptContext = currentScriptContext->next)
336328
{
337-
scriptContext->MapScript([&](Js::Utf8SourceInfo* sourceInfo) -> bool
329+
currentScriptContext->MapScript([&](Js::Utf8SourceInfo* sourceInfo) -> bool
338330
{
339331
if (sourceInfo->GetSourceInfoId() == scriptId)
340332
{
@@ -348,7 +340,6 @@ CHAKRA_API JsDiagSetBreakpoint(
348340
if (utf8SourceInfo != nullptr && utf8SourceInfo->HasDebugDocument())
349341
{
350342
JsrtDebugManager* jsrtDebugManager = runtime->GetJsrtDebugManager();
351-
352343
Js::DynamicObject* bpObject = jsrtDebugManager->SetBreakPoint(currentContext->GetScriptContext(), utf8SourceInfo, lineNumber, columnNumber);
353344

354345
if(bpObject != nullptr)
@@ -371,10 +362,8 @@ CHAKRA_API JsDiagRemoveBreakpoint(
371362
#ifndef ENABLE_SCRIPT_DEBUGGING
372363
return JsErrorCategoryUsage;
373364
#else
374-
return GlobalAPIWrapper_NoRecord([&]() -> JsErrorCode {
375-
376-
JsrtContext *currentContext = JsrtContext::GetCurrent();
377-
365+
return ContextAPIWrapper_NoRecord<false>([&](Js::ScriptContext* scriptContext) -> JsErrorCode {
366+
JsrtContext* currentContext = JsrtContext::GetCurrent();
378367
JsrtRuntime* runtime = currentContext->GetRuntime();
379368

380369
ThreadContextScope scope(runtime->GetThreadContext());
@@ -385,7 +374,6 @@ CHAKRA_API JsDiagRemoveBreakpoint(
385374
}
386375

387376
JsrtDebugManager* jsrtDebugManager = runtime->GetJsrtDebugManager();
388-
389377
VALIDATE_IS_DEBUGGING(jsrtDebugManager);
390378

391379
if (!jsrtDebugManager->RemoveBreakpoint(breakpointId))

0 commit comments

Comments
 (0)