From 3f435240eb116552e4c24c930af1a5dc6504194a Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 27 Jun 2025 00:24:59 +0300 Subject: [PATCH 1/3] fix(ios): prevent crash when printing images without internet connection - Add validation checks in ImageManager.m to handle nil data and invalid image dimensions - Add error handling in ThePrinter.m to return EPOS2_ERR_PARAM instead of crashing - Prevent UIGraphicsBeginImageContext crash with invalid size parameters - Fix division by zero in getImageCGSize when image width is 0 Fixes crash: UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={472, 0} --- package/ios/ImageManager.m | 14 +++++++++++++- package/ios/ThePrinter.m | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/package/ios/ImageManager.m b/package/ios/ImageManager.m index bbedc3b..741d881 100644 --- a/package/ios/ImageManager.m +++ b/package/ios/ImageManager.m @@ -6,6 +6,10 @@ @implementation ImageManager: NSObject + (UIImage *)scaleImage:(UIImage *)image size:(CGSize)size { + if (!image || image.size.width <= 0 || image.size.height <= 0 || size.width <= 0 || size.height <= 0) { + return nil; + } + CGFloat scale = MAX(size.width/image.size.width, size.height/image.size.height); CGFloat width = image.size.width * scale; CGFloat height = image.size.height * scale; @@ -25,6 +29,10 @@ + (UIImage *)scaleImage:(UIImage *)image + (CGSize)getImageCGSize:(UIImage *)imageData width:(int)width { + if (!imageData || imageData.size.width <= 0 || imageData.size.height <= 0 || width <= 0) { + return CGSizeZero; + } + NSInteger imgHeight = imageData.size.height; NSInteger imagWidth = imageData.size.width; @@ -38,7 +46,11 @@ + (UIImage *)getImageFromDictionarySource:(NSDictionary *)imageObj if([urlString hasPrefix: @"http"] || [urlString hasPrefix: @"https"]) { NSURL *url = [NSURL URLWithString: urlString]; NSData *data = [NSData dataWithContentsOfURL:url]; - imageData = [[UIImage alloc] initWithData:data]; + if (data && data.length > 0) { + imageData = [[UIImage alloc] initWithData:data]; + } else { + imageData = nil; + } } else { imageData = [RCTConvert UIImage:imageObj]; } diff --git a/package/ios/ThePrinter.m b/package/ios/ThePrinter.m index 4d90909..d76465a 100644 --- a/package/ios/ThePrinter.m +++ b/package/ios/ThePrinter.m @@ -387,8 +387,22 @@ -(int) addImage: (NSDictionary *)source return EPOS2_ERR_MEMORY; } UIImage *data = [ImageManager getImageFromDictionarySource:source]; + // Check if image loading failed (e.g., due to network issues) + if (data == nil) { + return EPOS2_ERR_PARAM; + } + CGSize size = [ImageManager getImageCGSize:data width:width]; + // Check if size calculation failed (e.g., invalid image dimensions) + if (size.width <= 0 || size.height <= 0) { + return EPOS2_ERR_PARAM; + } + UIImage *scaledImage = [ImageManager scaleImage:data size:size]; + // Check if image scaling failed + if (scaledImage == nil) { + return EPOS2_ERR_PARAM; + } int result = [epos2Printer_ addImage: scaledImage x:0 y:0 width:size.width height:size.height color:color mode:mode halftone:halftone brightness:brightness compress:compress]; return result; From b69844ce43491b071f1afe7021a83545df12f6b4 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 27 Jun 2025 12:04:21 +0300 Subject: [PATCH 2/3] fix: review comments --- package/ios/ImageManager.m | 8 -------- package/ios/ThePrinter.m | 9 --------- 2 files changed, 17 deletions(-) diff --git a/package/ios/ImageManager.m b/package/ios/ImageManager.m index 741d881..0958cc2 100644 --- a/package/ios/ImageManager.m +++ b/package/ios/ImageManager.m @@ -6,10 +6,6 @@ @implementation ImageManager: NSObject + (UIImage *)scaleImage:(UIImage *)image size:(CGSize)size { - if (!image || image.size.width <= 0 || image.size.height <= 0 || size.width <= 0 || size.height <= 0) { - return nil; - } - CGFloat scale = MAX(size.width/image.size.width, size.height/image.size.height); CGFloat width = image.size.width * scale; CGFloat height = image.size.height * scale; @@ -29,10 +25,6 @@ + (UIImage *)scaleImage:(UIImage *)image + (CGSize)getImageCGSize:(UIImage *)imageData width:(int)width { - if (!imageData || imageData.size.width <= 0 || imageData.size.height <= 0 || width <= 0) { - return CGSizeZero; - } - NSInteger imgHeight = imageData.size.height; NSInteger imagWidth = imageData.size.width; diff --git a/package/ios/ThePrinter.m b/package/ios/ThePrinter.m index d76465a..f328114 100644 --- a/package/ios/ThePrinter.m +++ b/package/ios/ThePrinter.m @@ -393,16 +393,7 @@ -(int) addImage: (NSDictionary *)source } CGSize size = [ImageManager getImageCGSize:data width:width]; - // Check if size calculation failed (e.g., invalid image dimensions) - if (size.width <= 0 || size.height <= 0) { - return EPOS2_ERR_PARAM; - } - UIImage *scaledImage = [ImageManager scaleImage:data size:size]; - // Check if image scaling failed - if (scaledImage == nil) { - return EPOS2_ERR_PARAM; - } int result = [epos2Printer_ addImage: scaledImage x:0 y:0 width:size.width height:size.height color:color mode:mode halftone:halftone brightness:brightness compress:compress]; return result; From cae6c339804d3f3809906f91d9de10b5b806602c Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 27 Jun 2025 12:05:46 +0300 Subject: [PATCH 3/3] fix: error code returned --- package/ios/ThePrinter.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/ios/ThePrinter.m b/package/ios/ThePrinter.m index f328114..b711f89 100644 --- a/package/ios/ThePrinter.m +++ b/package/ios/ThePrinter.m @@ -389,7 +389,7 @@ -(int) addImage: (NSDictionary *)source UIImage *data = [ImageManager getImageFromDictionarySource:source]; // Check if image loading failed (e.g., due to network issues) if (data == nil) { - return EPOS2_ERR_PARAM; + return EPOS2_ERR_FAILURE; } CGSize size = [ImageManager getImageCGSize:data width:width];