Skip to content

Bugfix: Avoid crash in updateControlsAndPlaylist on mal-formatted JSON#1490

Open
wutschel wants to merge 1 commit into
xbmc:masterfrom
wutschel:fix_selector_crash
Open

Bugfix: Avoid crash in updateControlsAndPlaylist on mal-formatted JSON#1490
wutschel wants to merge 1 commit into
xbmc:masterfrom
wutschel:fix_selector_crash

Conversation

@wutschel

@wutschel wutschel commented Jun 6, 2026

Copy link
Copy Markdown
Collaborator

Description

Crash report from AppStore points to a crash processing mal-formatted JSON, ending up in "unrecognized selector".

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Reason: -[NSNull boolValue]: unrecognized selector sent to instance 0x1f144e448
Termination Reason: SIGNAL 6 Abort trap: 6
Terminating Process: Kodi Remote [63131]

Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                	0x1852c8964 0x185203000 + 809316
1   libobjc.A.dylib               	0x1821dd814 0x1821ac000 + 202772
2   CoreFoundation                	0x1853632c0 0x185203000 + 1442496
3   CoreFoundation                	0x18524835c 0x185203000 + 283484
4   CoreFoundation                	0x185250200 0x185203000 + 315904
5   Kodi Remote                   	0x100ee91e8 -[NowPlaying updateControlsAndPlaylist:] + 180 (NowPlaying.m:563)
6   Kodi Remote                   	0x100eea2a0 __33-[NowPlaying getPlayerProperties]_block_invoke + 184 (NowPlaying.m:794)
7   Kodi Remote                   	0x100f002d0 -[DSJSONRPC URLSession:task:didCompleteWithError:] + 1596 (DSJSONRPC.m:0)

To make the code more robust, an early return is added if selectors are not supported.

Summary for release notes

Bugfix: Avoid crash in updateControlsAndPlaylist on mal-formatted JSON

@wutschel wutschel added the bugfix label Jun 6, 2026
@kodiai

kodiai Bot commented Jun 6, 2026

Copy link
Copy Markdown

Decision: APPROVE

Issues: none

Evidence:

  • Review prompt covered 1 changed file.
  • Review scope note: output was scoped by prompt budget limits; Review Details include bounded counts only.
Review Details
  • Review plan: ready hash=361e6d6304d8 route=tiny-diff task=review.small-diff files=1 lines=9(local-diff) budget=na/669s gates=3/3 publish=canonical-visible-surface graph=skipped candidates=preferred doctrine=disabled/0/0/0 reasons=disabled

  • Review reducer: ready input=3 kept=3 suppressed=0 rewritten=0 deprioritized=0 lowConfidence=0 auditEvents=0 severityDemoted=0 graphValidated=0 graphUncertain=0 doctrine=disabled/0/0/0 reasons=disabled

  • Review candidates: shadow recorded=3 rejected=0 errors=0 artifact=present repo=xbmc-Official-Kodi-Remote-iOS pr=1490 key=kodiai-review-output:v1:inst-109141824:xbmc-official-kodi-remote-ios:pr-1490:act delivery=e055c970-6181-11f1-80b1-c54df85d5179

  • Review candidate publication: mode=blocked approved=3 rewritten=0 publishable=0 nonPublishable=3 fixBlocked=3 published=0 directFallback=0 reasons=fix-eligibility-blocked movedToDetails=0 detailsOmitted=0 buckets=blocked:3:fix-eligibility-blocked+missing-replacement

  • M072 candidate publication bridge: status=denied; bridgeVersion=candidate-publication-bridge.v1; bridgeId=candidate-publication-record:a1e1e5f39d3ceddbb013121b8780ad53; recordKey=candidate-publication-record:a1e1e5f39d3ceddbb013121b8780ad53; correlationKey=candidate-publication-bridge:8f82427447f2ecd9d4cdce2679b397db; source=review-handler-publication; candidateRef=candidate-publication-summary-f22d6b3b; verification=none; counts=candidateCount:0,evidenceCount:0,verifiedCount:0,partiallyVerifiedCount:0,unverifiedCount:0,disprovenCount:0,publicationEligibleCount:0,malformedRecordCount:0,unsafeInputFieldCount:0; reasons=no-evidence,publication-ineligible; malformed=none; presence=deliveryId:y,reviewOutputKey:y,upstreamCorrelationKey:y,policyCorrelationKey:y; handoffOwner=available; redaction=privateOnly:y,rawPayloads:n,publicationFields:n,evidencePayloads:n,githubCommentBody:n,reducerRawPayload:n,discardedRawPayload:n,discardedPublicationFields:n,discardedEvidencePayloads:n

  • Review finding lifecycle: status=normalized; counts=input:3,recorded:3,rejected:0,unsafeInputFields:0; correlation=repo:y,pull:y,reviewOutputKey:y,deliveryId:y,commit:y; statuses=detected:3,open:3,suggested:0,validated:0,revalidated:0,resolved:0,blocked:0,degraded:0; severity=critical:0,major:2,medium:1,minor:0; actionability=actionable:0,needs-human-review:3,needs-reproduction:0,blocked:0,not-actionable:0; reasons=automatic-detected,automatic-open,automatic-review; rejected=none; redaction=privateOnly:y,rawPrompts:n,rawModelOutput:n,candidateBodies:n,toolPayloads:n,secretLike:n,diffs:n,unboundedArrays:n,unsafeFields:0

  • Review validation truth: status=normalized; counts=detected:3,suggested:0,validated:0,revalidated:0,resolved:0,blocked:0,degraded:0,open:3,uncertain:0,inputFindings:3,unsafeInputFields:0; evidence=fresh:0,stale:0,missingValidation:3,missingRevalidation:3; reasons=validation-missing:3; refs=rfl-4f9c30d17ee3d8eb:open:validation-missing:fix:n:validation:n:revalidation:n,rfl-32e33449f3451a62:open:validation-missing:fix:n:validation:n:revalidation:n,rfl-9ab7386971745242:open:validation-missing:fix:n:validation:n:revalidation:n; correlation=reviewOutputKey:y,deliveryId:y; redaction=privateOnly:y,rawPrompts:n,rawModelOutput:n,candidateBodies:n,replacementText:n,toolPayloads:n,secretLike:n,diffs:n,unboundedArrays:n,unsafeFields:0

  • Files reviewed: 1

  • Findings: 0 critical, 0 major, 0 medium, 0 minor

  • Lines changed: +9 -0

  • Profile: strict (auto, lines changed: 9)

  • Contributor experience: profile-backed (using linked contributor profile guidance)

  • Shadow specialist: lane=docs-config-truth status=skipped reason=no-operator-truth-paths candidateCount=0 decisionCount=0 decisionCounts=candidate:0,duplicate:0,disagreement:0,dismissed:0,unclassifiable:0 duplicateCount=0 disagreementCount=0 dismissedCount=0 unclassifiableCount=0 truncatedCandidateCount=0 metricAvailability=token:n,cost:n,latency:n visiblePublicationDenied=true approvalPublicationDenied=true privateOnly=true shadowOnly=true redacted=raw:n,publication:n,approval:n,unsafe:0 correlationKey=1e11353cc4f13ac3 deliveryId=e055c970-6181-11f1-80b1-c54df85… reviewOutputKey=kodiai-review-output:v1:inst-10…

  • Review completed: 2026-06-06T08:35:56.308Z

  • Total wall-clock: 6m 8s

  • Phase timings:

    • queue wait: 0ms
    • workspace preparation: 5.9s
    • retrieval/context assembly: 3.8s
    • executor handoff: 56s
    • remote runtime: 4m 57s
    • publication: 2.7s
  • Tokens: 104 in / 9,950 out | 0.3386

  • Keyword parsing: No keywords detected

  • Budget behavior: scoped (prompt-budget-limited).

  • Prompt budget: 6 sections, 1 trimmed, 0 bypassed, 367 trimmed tokens.

  • Cache behavior: 2 observations, 1 hits, 1 misses, 0 degraded, 0 bypassed.

  • Continuation behavior: 0 observations, 0 compacted, 0 fallback, 0 degraded, 0 bypassed.

@wutschel wutschel force-pushed the fix_selector_crash branch from 1a83584 to c07f4d9 Compare June 16, 2026 04:58
Avoids (reported) potential app crashes.
@wutschel wutschel force-pushed the fix_selector_crash branch from c07f4d9 to 92ef9ce Compare June 16, 2026 17:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant