Skip to content

Fix NullPointerException in v2 backup creation for classic attachments#14882

Open
nathangiovannini99 wants to merge 1 commit into
signalapp:mainfrom
nathangiovannini99:14875
Open

Fix NullPointerException in v2 backup creation for classic attachments#14882
nathangiovannini99 wants to merge 1 commit into
signalapp:mainfrom
nathangiovannini99:14875

Conversation

@nathangiovannini99

Copy link
Copy Markdown

This PR fixes a NullPointerException that occurred when users with older accounts attempted to create v2 backups.
Root Cause: Older attachments encrypted using the "Classic" scheme have a NULL value in the DATA_RANDOM column of the attachment table. The current implementation of getLocalArchivableAttachments used requireNonNullBlob(DATA_RANDOM), which triggered a crash when encountering these legacy records.
Changes:

  1. Model Nullability: Updated LocalArchivableAttachment, DataFileInfo, and ThumbnailFileInfo in AttachmentTable.kt to allow a nullable random field.

  2. Decryption Fallback: Updated getDataStream and getThumbnailStream to check for the presence and length of the random bytes. If random is null or not 32 bytes, the logic now correctly falls back to ClassicDecryptingPartInputStream.

  3. CursorExtensions Fix: While investigating, I found that readToList and readToSet in CursorExtensions.kt were invoking the mapper function twice per row (once for the predicate and once for the list addition). This has been fixed to only invoke the mapper once.

Fixes: #14875

- Updated LocalArchivableAttachment and DataFileInfo models to support
  nullable random bytes, allowing legacy "classic" attachments to be
  included in v2 backups.
- Modified getDataStream and getThumbnailStream to fallback to
  ClassicDecryptingPartInputStream when random is null or invalid.
- Fixed a performance bug in CursorExtensions.readToList and readToSet
  where the mapper was being invoked twice per row.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cannot create v2 backups: NullPointerException in requireNonNullBlob()

1 participant