From 93d54c8f844b50fa9bd8ce8c1fa32d0d2133e13a Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Tue, 3 Mar 2026 16:15:44 +0100 Subject: [PATCH] Fix multi-part RAR: get first stream via callback, track current volume name Two bugs in SevenZipVolumeCallback caused multi-part RAR extraction to fail: 1. getProperty(NAME) always returned firstFileName instead of tracking the last opened volume name. 7z-JBinding needs this to compute subsequent volume filenames. 2. The first IInStream was created separately instead of through the callback's getStream() method, so the volume name tracker was not properly initialized. Verified with real multi-part RAR5 test archives (3 parts, WinRAR 7.01). Co-Authored-By: Claude Opus 4.6 --- ...ExtractorMain$SevenZipVolumeCallback.class | Bin 3729 -> 3742 bytes .../extractor/JBindExtractorMain.class | Bin 20463 -> 20639 bytes .../extractor/JBindExtractorMain.java | 53 ++++++++++-------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$SevenZipVolumeCallback.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain$SevenZipVolumeCallback.class index c97127d1ec733e14e3ac707fba5a690a1e8068d9..4e1cd8a092af00e74f40b4d76032258a9d95756c 100644 GIT binary patch delta 323 zcmWMh$x4Dz7(KV+5dObbV3CGI16Gz11n#1_l~9?@EmF${OiNN|qYw>NWW%kfjhkpL zFr7y?XSnwto53t=YZkLDD1 z`K$Gb9qHBGA|r#kN9@Y1{ylsE8xK**BRF`B7M`Gur|RiEdU%E*o@0cU7^OszSBUc( qY2ILmx7g<$a*E5dAor{#$Gw{S05_jh!XrF delta 305 zcmWNMT`R+J9L3MinTPHF-{wYb(;_r1B+7--D0W3-)MQ(>nlXlAt#%=iX_&FTZrm)7 zSEy-kz$@_@+`3SHSEoLwb2_Kyt$ORn%4$z%4i0m{Otw*0`8M{VPyVc((rt@$gka$U zoLq#5OXy)3qgtfPeqxR})CDRglIBTQqQn+R|V^V~+5JBTrhICtgS@F=JJ8q+E#lcrA4r!6`HW${V1lm_cg*|)j9Ec5 diff --git a/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain.class b/resources/extractor-jvm/classes/com/sucukdeluxe/extractor/JBindExtractorMain.class index 7b8993edb44640d08a4ab3623633cd281711fdc9..a6fa276959891ba0f5fe8c8a5c3619ea02444491 100644 GIT binary patch delta 5975 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 openRafs = new HashMap(); + // Must track the LAST opened volume name — 7z-JBinding queries this via + // getProperty(NAME) to compute the next volume filename. + private volatile String currentVolumeName; SevenZipVolumeCallback(File archiveFile, String password) { this.archiveDir = archiveFile.getAbsoluteFile().getParentFile(); - this.firstFileName = archiveFile.getName(); + this.currentVolumeName = archiveFile.getName(); this.password = password == null ? "" : password; } @Override public Object getProperty(PropID propID) { if (propID == PropID.NAME) { - return firstFileName; + return currentVolumeName; } return null; } @@ -872,6 +874,9 @@ public final class JBindExtractorMain { openRafs.put(key, raf); } raf.seek(0L); + // Update current volume name so getProperty(NAME) returns the + // correct value when 7z-JBinding computes the next volume. + currentVolumeName = filename; return new RandomAccessFileInStream(raf); } catch (IOException error) { throw new SevenZipException("Volume konnte nicht geoffnet werden: " + filename, error);