Skip to content

Commit 05c2f13

Browse files
committed
fix(apple-network): retain response to avoid it getting deallocated
1 parent 805699a commit 05c2f13

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

src/network.m

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,20 @@ NETWORK_RESULT network_receive_buffer(network_data *data, const char *endpoint,
147147
}
148148

149149
__block NSData *responseData = nil;
150-
__block NSError *responseError = nil;
150+
__block NSString *responseError = nil;
151151
__block NSInteger statusCode = 0;
152+
__block NSInteger errorCode = 0;
152153

153154
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
154155

155156
NSURLSession *session = [NSURLSession sharedSession];
156157
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
157-
responseData = data;
158-
responseError = error;
158+
// Retain data to not get it deallocated, release it before returning
159+
responseData = [data retain];
160+
if (error) {
161+
responseError = [error localizedDescription];
162+
errorCode = [error code];
163+
}
159164
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
160165
statusCode = [(NSHTTPURLResponse *)response statusCode];
161166
}
@@ -168,7 +173,10 @@ NETWORK_RESULT network_receive_buffer(network_data *data, const char *endpoint,
168173
if (!responseError && (statusCode >= 200 && statusCode < 300)) {
169174
size_t len = [responseData length];
170175
// check if OK should be returned
171-
if (len == 0) return (NETWORK_RESULT){CLOUDSYNC_NETWORK_OK, NULL, 0, NULL, NULL};
176+
if (len == 0) {
177+
[responseData release];
178+
return (NETWORK_RESULT){CLOUDSYNC_NETWORK_OK, NULL, 0, NULL, NULL};
179+
}
172180

173181
// otherwise return a buffer
174182
NETWORK_RESULT result = {};
@@ -183,19 +191,21 @@ NETWORK_RESULT network_receive_buffer(network_data *data, const char *endpoint,
183191
}
184192
result.blen = len;
185193
result.xfree = network_buffer_cleanup;
194+
195+
[responseData release];
186196
return result;
187197
}
188198

189199
// return error
190200
NETWORK_RESULT result = {};
191-
NSString *msg;
201+
NSString *msg = nil;
192202
if (responseError) {
193-
msg = [responseError localizedDescription];
203+
msg = responseError;
194204
} else if (responseData && [responseData length] > 0) {
195205
// Use the actual response body as the error message
196206
msg = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
197207
if (!msg) {
198-
msg = [NSString stringWithCString:"Invalid error response encoding" encoding:NSUTF8StringEncoding];
208+
msg = [NSString stringWithFormat:@"HTTP %ld error", (long)statusCode];
199209
}
200210
} else {
201211
msg = [NSString stringWithFormat:@"HTTP %ld error", (long)statusCode];
@@ -204,6 +214,8 @@ NETWORK_RESULT network_receive_buffer(network_data *data, const char *endpoint,
204214
result.buffer = (char *)msg.UTF8String;
205215
result.xdata = (void *)CFBridgingRetain(msg);
206216
result.xfree = network_buffer_cleanup;
207-
result.blen = (responseError) ? (size_t)responseError.code : (size_t)statusCode;
217+
result.blen = responseError ? (size_t)errorCode : (size_t)statusCode;
218+
219+
[responseData release];
208220
return result;
209221
}

0 commit comments

Comments
 (0)