From 7a19c40b0f116341b9f71e528c3ea4016cb3afbf Mon Sep 17 00:00:00 2001 From: Dishit Date: Mon, 4 May 2026 12:13:21 +0530 Subject: [PATCH 1/2] fix(patch): prevent NullPointerException crash in react-native-zip-archive Null ex.getMessage() calls in RNZipArchiveModule were crashing the app instead of rejecting the promise. Added null-safe fallbacks on all four affected reject sites and a safeReject helper as a last-resort guard. Also fixes a double switch on an uncast double in getCompressionLevel. --- patches/react-native-zip-archive+7.1.0.patch | 62 +++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/patches/react-native-zip-archive+7.1.0.patch b/patches/react-native-zip-archive+7.1.0.patch index 80baa640b..bb5367250 100644 --- a/patches/react-native-zip-archive+7.1.0.patch +++ b/patches/react-native-zip-archive+7.1.0.patch @@ -1,8 +1,49 @@ diff --git a/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java b/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java -index 14bd68f..cccbd99 100644 +index 14bd68f..e381579 100644 --- a/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java +++ b/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java -@@ -470,7 +470,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -174,7 +174,12 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { + } + } catch (Exception ex) { + updateProgress(0, 1, zipFilePath); // force 0% +- promise.reject("RNZipArchiveError", "Failed to extract file " + ex.getLocalizedMessage()); ++ safeReject( ++ promise, ++ "RNZipArchiveError", ++ "Failed to extract file " + (ex.getLocalizedMessage() != null ? ex.getLocalizedMessage() : "unknown error"), ++ ex ++ ); + } + } + }).start(); +@@ -342,7 +347,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { + processZip(filesOrDirectory, destFile, parameters, promise, password.toCharArray()); + + } catch (Exception ex) { +- promise.reject("RNZipArchiveError", ex.getMessage()); ++ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); + return; + } + } +@@ -356,7 +361,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { + processZip(filesOrDirectory, destFile, parameters, promise, null); + + } catch (Exception ex) { +- promise.reject("RNZipArchiveError", ex.getMessage()); ++ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); + return; + } + } +@@ -413,7 +418,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { + } + promise.resolve(destFile); + } catch (Exception ex) { +- promise.reject("RNZipArchiveError", ex.getMessage()); ++ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); + return; + } + } +@@ -470,7 +475,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { } private static CompressionLevel getCompressionLevel(double compressionLevel) { @@ -11,3 +52,20 @@ index 14bd68f..cccbd99 100644 case -1: return CompressionLevel.NORMAL; case 0: +@@ -499,6 +504,16 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { + } + } + ++ private void safeReject(Promise promise, String code, String message, Throwable throwable) { ++ String safeCode = code != null ? code : "RNZipArchiveError"; ++ String safeMessage = message != null ? message : "Zip operation failed"; ++ try { ++ promise.reject(safeCode, safeMessage, throwable); ++ } catch (NullPointerException npe) { ++ Log.w(TAG, "Failed to reject promise", npe); ++ } ++ } ++ + /** + * Returns the exception stack trace as a string + */ From 869ddd9cad03cf52d3dde46ef50804691cd2c297 Mon Sep 17 00:00:00 2001 From: Dishit Date: Mon, 4 May 2026 15:20:31 +0530 Subject: [PATCH 2/2] fix(android): prevent NullPointerException crash in react-native-zip-archive All promise.reject sites now use safeReject helper to guard against null exception messages crashing the React Native bridge on Android. --- patches/react-native-zip-archive+7.1.0.patch | 28 +++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/patches/react-native-zip-archive+7.1.0.patch b/patches/react-native-zip-archive+7.1.0.patch index bb5367250..cd030c62e 100644 --- a/patches/react-native-zip-archive+7.1.0.patch +++ b/patches/react-native-zip-archive+7.1.0.patch @@ -1,8 +1,16 @@ diff --git a/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java b/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java -index 14bd68f..e381579 100644 +index 14bd68f..bfae10e 100644 --- a/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java +++ b/node_modules/react-native-zip-archive/android/src/main/java/com/rnziparchive/RNZipArchiveModule.java -@@ -174,7 +174,12 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -44,6 +44,7 @@ import java.nio.charset.Charset; + + public class RNZipArchiveModule extends ReactContextBaseJavaModule { + private static final String TAG = RNZipArchiveModule.class.getSimpleName(); ++ private static final String ERROR_CODE = "RNZipArchiveError"; + + private static final String PROGRESS_EVENT_NAME = "zipArchiveProgressEvent"; + private static final String EVENT_KEY_FILENAME = "filePath"; +@@ -174,7 +175,12 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { } } catch (Exception ex) { updateProgress(0, 1, zipFilePath); // force 0% @@ -16,34 +24,34 @@ index 14bd68f..e381579 100644 } } }).start(); -@@ -342,7 +347,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -342,7 +348,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { processZip(filesOrDirectory, destFile, parameters, promise, password.toCharArray()); } catch (Exception ex) { - promise.reject("RNZipArchiveError", ex.getMessage()); -+ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); ++ safeReject(promise, ERROR_CODE, ex.getMessage() != null ? ex.getMessage() : "unknown error", ex); return; } } -@@ -356,7 +361,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -356,7 +362,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { processZip(filesOrDirectory, destFile, parameters, promise, null); } catch (Exception ex) { - promise.reject("RNZipArchiveError", ex.getMessage()); -+ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); ++ safeReject(promise, ERROR_CODE, ex.getMessage() != null ? ex.getMessage() : "unknown error", ex); return; } } -@@ -413,7 +418,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -413,7 +419,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { } promise.resolve(destFile); } catch (Exception ex) { - promise.reject("RNZipArchiveError", ex.getMessage()); -+ promise.reject("RNZipArchiveError", ex.getMessage() != null ? ex.getMessage() : "unknown error"); ++ safeReject(promise, ERROR_CODE, ex.getMessage() != null ? ex.getMessage() : "unknown error", ex); return; } } -@@ -470,7 +475,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -470,7 +476,7 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { } private static CompressionLevel getCompressionLevel(double compressionLevel) { @@ -52,7 +60,7 @@ index 14bd68f..e381579 100644 case -1: return CompressionLevel.NORMAL; case 0: -@@ -499,6 +504,16 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { +@@ -499,6 +505,16 @@ public class RNZipArchiveModule extends ReactContextBaseJavaModule { } }