Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[Bug] Mantle update breaks Squirrel update deserialization in SQRLShipItRequest #49977

@VerteDinde

Description

@VerteDinde

Preflight Checklist

Electron Version

41.0.0

What operating system(s) are you using?

macOS

Operating System Version

MacOS all

What arch are you using?

arm64 (including Apple Silicon)

Last Known Working Electron version

40.4.1

Does the issue also appear in Chromium / Google Chrome?

No

Expected Behavior

Apps should be able to update using Squirrel.Mac without issue.

Actual Behavior

Currently, our signed app is failing to update with the following errors:

Detected this as an install request
ERROR: Unrecognized attribute string flag '?' in attribute string "T@"NSString",?,R,C" for property debugDescription
ERROR: Unrecognized attribute string flag '?' in attribute string "T@"NSString",?,R,C" for property debugDescription
Installation error: Error Domain=SQRLShipItRequestErrorDomain Code=2 "Could not read update request" UserInfo={NSLocalizedDescription=Could not read update request, NSUnderlyingError=0x60000174aac0 {Error Domain=SQRLShipItRequestErrorDomain Code=1 "Missing required value" UserInfo={NSLocalizedDescription=Missing required value, NSLocalizedRecoverySuggestion="targetBundleURL" must not be set to nil.}}}
ShipIt quitting

Testcase Gist URL

No response

Additional Information

Ref #38437, which I think contains the breaking change.

My current theory is that the Mantle roll from 78d3966 → 2a8e212 changes how we're handling deserialization, and also pulled in a new bug here (Mantle/Mantle#899) - shout out to @CliftonH for the find!
One or both of the following are what I'm looking into:

  1. +propertyKeys behavior changed: The old Mantle included all properties except readonly ones. The new Mantle delegates to +storageBehaviorForPropertyWithKey:, which adds instancesRespondToSelector: checks and recursive superclass lookups that can change which properties are included/excluded for Squirrel's SQRLShipItRequest.
  2. NSCoding decode changed: -decodeValueForKey:withCoder:modelVersion: switched from NSInvocation-based dispatch to direct IMP calling, which could cause issues if method signatures don't match exactly.

The result is that targetBundleURL deserializes as nil, which is a required field, causing ShipIt to reject the update request and exit.

This was discovered while testing an Electron 40 → 41 upgrade. We currently don't test the updater with code-signed binaries, which is likely why this wasn't caught sooner.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    Status

    👀 Unsorted Items

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions