Skip to content
This repository was archived by the owner on May 20, 2025. It is now read-only.

Commit ddfafff

Browse files
author
dbeard
committed
Guard against NSError null pointer dereferences
1 parent 60a5588 commit ddfafff

File tree

3 files changed

+90
-76
lines changed

3 files changed

+90
-76
lines changed

ios/CodePush/CodePush.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ failCallback:(void (^)(NSError *err))failCallback;
128128

129129
+ (NSString *)getPackageFolderPath:(NSString *)packageHash;
130130

131-
+ (void)installPackage:(NSDictionary *)updatePackage
131+
+ (BOOL)installPackage:(NSDictionary *)updatePackage
132132
removePendingUpdate:(BOOL)removePendingUpdate
133133
error:(NSError **)error;
134134

@@ -153,7 +153,7 @@ failCallback:(void (^)(NSError *err))failCallback;
153153

154154
@interface CodePushUpdateUtils : NSObject
155155

156-
+ (void)copyEntriesInFolder:(NSString *)sourceFolder
156+
+ (BOOL)copyEntriesInFolder:(NSString *)sourceFolder
157157
destFolder:(NSString *)destFolder
158158
error:(NSError **)error;
159159

ios/CodePush/CodePushPackage.m

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -293,25 +293,25 @@ + (NSString *)getCodePushPath
293293
+ (NSDictionary *)getCurrentPackage:(NSError **)error
294294
{
295295
NSString *packageHash = [CodePushPackage getCurrentPackageHash:error];
296-
if (*error || !packageHash) {
296+
if (!packageHash) {
297297
return nil;
298298
}
299-
299+
300300
return [CodePushPackage getPackage:packageHash error:error];
301301
}
302302

303303
+ (NSString *)getCurrentPackageBundlePath:(NSError **)error
304304
{
305305
NSString *packageFolder = [self getCurrentPackageFolderPath:error];
306306

307-
if(*error) {
308-
return NULL;
307+
if (!packageFolder) {
308+
return nil;
309309
}
310310

311311
NSDictionary *currentPackage = [self getCurrentPackage:error];
312312

313-
if(*error) {
314-
return NULL;
313+
if (!currentPackage) {
314+
return nil;
315315
}
316316

317317
NSString *relativeBundlePath = [currentPackage objectForKey:RelativeBundlePathKey];
@@ -325,7 +325,7 @@ + (NSString *)getCurrentPackageBundlePath:(NSError **)error
325325
+ (NSString *)getCurrentPackageHash:(NSError **)error
326326
{
327327
NSDictionary *info = [self getCurrentPackageInfo:error];
328-
if (*error || !info) {
328+
if (!info) {
329329
return nil;
330330
}
331331

@@ -336,14 +336,14 @@ + (NSString *)getCurrentPackageFolderPath:(NSError **)error
336336
{
337337
NSDictionary *info = [self getCurrentPackageInfo:error];
338338

339-
if (*error) {
340-
return NULL;
339+
if (!info) {
340+
return nil;
341341
}
342342

343343
NSString *packageHash = info[@"currentPackage"];
344344

345345
if (!packageHash) {
346-
return NULL;
346+
return nil;
347347
}
348348

349349
return [self getPackageFolderPath:packageHash];
@@ -359,15 +359,15 @@ + (NSMutableDictionary *)getCurrentPackageInfo:(NSError **)error
359359
NSString *content = [NSString stringWithContentsOfFile:statusFilePath
360360
encoding:NSUTF8StringEncoding
361361
error:error];
362-
if (*error) {
362+
if (!content) {
363363
return nil;
364364
}
365365

366366
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
367367
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data
368368
options:kNilOptions
369369
error:error];
370-
if (*error) {
370+
if (!json) {
371371
return nil;
372372
}
373373

@@ -392,8 +392,7 @@ + (NSDictionary *)getPackage:(NSString *)packageHash
392392
NSString *updateMetadataString = [NSString stringWithContentsOfFile:updateMetadataFilePath
393393
encoding:NSUTF8StringEncoding
394394
error:error];
395-
396-
if (*error) {
395+
if (!updateMetadataString) {
397396
return nil;
398397
}
399398

@@ -411,7 +410,7 @@ + (NSString *)getPackageFolderPath:(NSString *)packageHash
411410
+ (NSDictionary *)getPreviousPackage:(NSError **)error
412411
{
413412
NSString *packageHash = [self getPreviousPackageHash:error];
414-
if (*error || !packageHash) {
413+
if (!packageHash) {
415414
return nil;
416415
}
417416

@@ -421,7 +420,7 @@ + (NSDictionary *)getPreviousPackage:(NSError **)error
421420
+ (NSString *)getPreviousPackageHash:(NSError **)error
422421
{
423422
NSDictionary *info = [self getCurrentPackageInfo:error];
424-
if (*error) {
423+
if (!info) {
425424
return nil;
426425
}
427426

@@ -438,25 +437,25 @@ + (NSString *)getUnzippedFolderPath
438437
return [[self getCodePushPath] stringByAppendingPathComponent:UnzippedFolderName];
439438
}
440439

441-
+ (void)installPackage:(NSDictionary *)updatePackage
440+
+ (BOOL)installPackage:(NSDictionary *)updatePackage
442441
removePendingUpdate:(BOOL)removePendingUpdate
443442
error:(NSError **)error
444443
{
445444
NSString *packageHash = updatePackage[@"packageHash"];
446445
NSMutableDictionary *info = [self getCurrentPackageInfo:error];
447446

448-
if (*error) {
449-
return;
447+
if (!info) {
448+
return NO;
450449
}
451450

452451
if (packageHash && [packageHash isEqualToString:info[@"currentPackage"]]) {
453452
// The current package is already the one being installed, so we should no-op.
454-
return;
453+
return YES;
455454
}
456455

457456
if (removePendingUpdate) {
458457
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:error];
459-
if (!*error && currentPackageFolderPath) {
458+
if (currentPackageFolderPath) {
460459
// Error in deleting pending package will not cause the entire operation to fail.
461460
NSError *deleteError;
462461
[[NSFileManager defaultManager] removeItemAtPath:currentPackageFolderPath
@@ -467,7 +466,7 @@ + (void)installPackage:(NSDictionary *)updatePackage
467466
}
468467
} else {
469468
NSString *previousPackageHash = [self getPreviousPackageHash:error];
470-
if (!*error && previousPackageHash && ![previousPackageHash isEqualToString:packageHash]) {
469+
if (previousPackageHash && ![previousPackageHash isEqualToString:packageHash]) {
471470
NSString *previousPackageFolderPath = [self getPackageFolderPath:previousPackageHash];
472471
// Error in deleting old package will not cause the entire operation to fail.
473472
NSError *deleteError;
@@ -481,31 +480,30 @@ + (void)installPackage:(NSDictionary *)updatePackage
481480
}
482481

483482
[info setValue:packageHash forKey:@"currentPackage"];
484-
485-
[self updateCurrentPackageInfo:info
486-
error:error];
483+
return [self updateCurrentPackageInfo:info
484+
error:error];
487485
}
488486

489487
+ (void)rollbackPackage
490488
{
491489
NSError *error;
492490
NSMutableDictionary *info = [self getCurrentPackageInfo:&error];
493-
if (error) {
491+
if (!info) {
494492
CPLog(@"Error getting current package info: %@", error);
495493
return;
496494
}
497495

498-
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:&error];
499-
if (error) {
496+
NSString *currentPackageFolderPath = [self getCurrentPackageFolderPath:&error];
497+
if (!currentPackageFolderPath) {
500498
CPLog(@"Error getting current package folder path: %@", error);
501499
return;
502500
}
503501

504502
NSError *deleteError;
505-
[[NSFileManager defaultManager] removeItemAtPath:currentPackageFolderPath
503+
BOOL result = [[NSFileManager defaultManager] removeItemAtPath:currentPackageFolderPath
506504
error:&deleteError];
507-
if (deleteError) {
508-
CPLog(@"Error deleting current package contents at %@", currentPackageFolderPath);
505+
if (!result) {
506+
CPLog(@"Error deleting current package contents at %@ error %@", currentPackageFolderPath, deleteError);
509507
}
510508

511509
[info setValue:info[@"previousPackage"] forKey:@"currentPackage"];
@@ -514,18 +512,27 @@ + (void)rollbackPackage
514512
[self updateCurrentPackageInfo:info error:&error];
515513
}
516514

517-
+ (void)updateCurrentPackageInfo:(NSDictionary *)packageInfo
515+
+ (BOOL)updateCurrentPackageInfo:(NSDictionary *)packageInfo
518516
error:(NSError **)error
519517
{
520518
NSData *packageInfoData = [NSJSONSerialization dataWithJSONObject:packageInfo
521519
options:0
522520
error:error];
521+
if (!packageInfoData) {
522+
return NO;
523+
}
524+
523525
NSString *packageInfoString = [[NSString alloc] initWithData:packageInfoData
524526
encoding:NSUTF8StringEncoding];
525-
[packageInfoString writeToFile:[self getStatusFilePath]
527+
BOOL result = [packageInfoString writeToFile:[self getStatusFilePath]
526528
atomically:YES
527529
encoding:NSUTF8StringEncoding
528530
error:error];
531+
532+
if (!result) {
533+
return NO;
534+
}
535+
return YES;
529536
}
530537

531538
@end

0 commit comments

Comments
 (0)