From b55c751358fa405aab64ec6095c50763d3082f51 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Tue, 12 Nov 2019 14:19:50 +1100 Subject: [PATCH] Fix contact sync message parsing --- SignalServiceKit/src/Devices/OWSChunkedOutputStream.h | 1 + SignalServiceKit/src/Devices/OWSChunkedOutputStream.m | 5 +++++ SignalServiceKit/src/Devices/OWSContactsOutputStream.m | 2 +- SignalServiceKit/src/Loki/Messaging/ContactParser.swift | 8 +++++--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h index 537a40f15..c02a79864 100644 --- a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h +++ b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.h @@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN // Returns NO on error. - (BOOL)writeData:(NSData *)data; +- (BOOL)writeUInt32:(UInt32)value; - (BOOL)writeVariableLengthUInt32:(UInt32)value; @end diff --git a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m index 16b42e9ee..c10caeae0 100644 --- a/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSChunkedOutputStream.m @@ -63,6 +63,11 @@ NS_ASSUME_NONNULL_BEGIN return YES; } +- (BOOL)writeUInt32:(UInt32)value { + NSData *data = [[NSData alloc] initWithBytes:&value length:sizeof(value)]; + return [self writeData:data]; +} + - (BOOL)writeVariableLengthUInt32:(UInt32)value { while (YES) { diff --git a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m index b9a3eef2b..c4211a873 100644 --- a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m @@ -94,7 +94,7 @@ disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration } uint32_t contactDataLength = (uint32_t)contactData.length; - [self writeVariableLengthUInt32:contactDataLength]; + [self writeUInt32:contactDataLength]; [self writeData:contactData]; /* diff --git a/SignalServiceKit/src/Loki/Messaging/ContactParser.swift b/SignalServiceKit/src/Loki/Messaging/ContactParser.swift index 106f8234c..f863491b9 100644 --- a/SignalServiceKit/src/Loki/Messaging/ContactParser.swift +++ b/SignalServiceKit/src/Loki/Messaging/ContactParser.swift @@ -10,11 +10,13 @@ var index = 0 var result: [String] = [] while index < data.endIndex { - let uncheckedSize: Int? = try? data[index..<(index+1)].withUnsafeBytes { $0.pointee } + let uncheckedSize: UInt32? = try? data[index..<(index+4)].withUnsafeBytes { $0.pointee } guard let size = uncheckedSize else { break } - index += 1 - let protoAsData = data[index..<(index+size)] + let sizeAsInt = Int(size) + index += 4 + let protoAsData = data[index..<(index+sizeAsInt)] guard let proto = try? SSKProtoContactDetails.parseData(protoAsData) else { break } + index += sizeAsInt result.append(proto.number) } return result