Skip to content

Commit 881e0ec

Browse files
PaulTaykaloAurelien HUGELE
and
Aurelien HUGELE
authored
Fix a major memory leak in CSBzip2Handle (#158)
* Added a unit test to ease memory leak analysis * Core Bzip2 memory leak fix --------- Co-authored-by: Aurelien HUGELE <[email protected]>
1 parent b75c05b commit 881e0ec

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

CSBzip2Handle.m

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ -(void)resetStream
5858

5959
if(inited) BZ2_bzDecompressEnd(&bzs);
6060
memset(&bzs,0,sizeof(bzs));
61-
BZ2_bzDecompressInit(&bzs,0,0);
62-
61+
inited=(BZ2_bzDecompressInit(&bzs,0,0)==BZ_OK);
6362
checksumcorrect=YES;
6463
}
6564

@@ -103,7 +102,7 @@ -(int)streamAtMost:(int)num toBuffer:(void *)buffer
103102
}
104103

105104
BZ2_bzDecompressEnd(&bzs);
106-
BZ2_bzDecompressInit(&bzs,0,0);
105+
inited=(BZ2_bzDecompressInit(&bzs,0,0)==BZ_OK);
107106
}
108107
else if(err!=BZ_OK)
109108
{

XADMaster.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,6 +1419,8 @@
14191419
73DA3468206B6BF1006ADB42 /* XADPlatformOSXTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 73DA3467206B6BF1006ADB42 /* XADPlatformOSXTests.m */; };
14201420
73DA346A206B6BF1006ADB42 /* XADMaster.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* XADMaster.framework */; };
14211421
DF05DCF92806F104001E9C52 /* XADMaster.h in Headers */ = {isa = PBXBuildFile; fileRef = DF05DCF52806EF40001E9C52 /* XADMaster.h */; settings = {ATTRIBUTES = (Public, ); }; };
1422+
C4C3241827AC25E9007919DB /* XADZippedBzip2LeakTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C3241727AC25E9007919DB /* XADZippedBzip2LeakTests.m */; };
1423+
C4C3241A27AC2655007919DB /* eicar.bz in Resources */ = {isa = PBXBuildFile; fileRef = C4C3241927AC2655007919DB /* eicar.bz */; };
14221424
E424FB4721CAE11D00E1C950 /* XADArchiveParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E424FB4621CAE11D00E1C950 /* XADArchiveParserTests.m */; };
14231425
E424FB4E21CAEC0300E1C950 /* XADZipParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E424FB4D21CAEC0300E1C950 /* XADZipParserTests.m */; };
14241426
E46E6296225DC2DE00D44E0A /* XADSFXDetectionParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E46E6295225DC2DE00D44E0A /* XADSFXDetectionParserTests.m */; };
@@ -2144,7 +2146,9 @@
21442146
73DA3467206B6BF1006ADB42 /* XADPlatformOSXTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADPlatformOSXTests.m; sourceTree = "<group>"; };
21452147
73DA3469206B6BF1006ADB42 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
21462148
8DC2EF5B0486A6940098B216 /* XADMaster.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XADMaster.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2149+
C4C3241727AC25E9007919DB /* XADZippedBzip2LeakTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADZippedBzip2LeakTests.m; sourceTree = "<group>"; };
21472150
DF05DCF52806EF40001E9C52 /* XADMaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XADMaster.h; sourceTree = "<group>"; };
2151+
C4C3241927AC2655007919DB /* eicar.bz */ = {isa = PBXFileReference; lastKnownFileType = file; path = eicar.bz; sourceTree = "<group>"; };
21482152
E424FB4621CAE11D00E1C950 /* XADArchiveParserTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADArchiveParserTests.m; sourceTree = "<group>"; };
21492153
E424FB4D21CAEC0300E1C950 /* XADZipParserTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADZipParserTests.m; sourceTree = "<group>"; };
21502154
E46E6295225DC2DE00D44E0A /* XADSFXDetectionParserTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADSFXDetectionParserTests.m; sourceTree = "<group>"; };
@@ -3262,6 +3266,8 @@
32623266
E424FB4D21CAEC0300E1C950 /* XADZipParserTests.m */,
32633267
7378D98A21CCD04000A4B11F /* CRCCalculationTests.m */,
32643268
E46E6295225DC2DE00D44E0A /* XADSFXDetectionParserTests.m */,
3269+
C4C3241727AC25E9007919DB /* XADZippedBzip2LeakTests.m */,
3270+
C4C3241927AC2655007919DB /* eicar.bz */,
32653271
);
32663272
path = XADMasterTests;
32673273
sourceTree = "<group>";
@@ -3995,6 +4001,7 @@
39954001
isa = PBXResourcesBuildPhase;
39964002
buildActionMask = 2147483647;
39974003
files = (
4004+
C4C3241A27AC2655007919DB /* eicar.bz in Resources */,
39984005
73032E6E2626DB7C000C2751 /* WARCFixtures in Resources */,
39994006
);
40004007
runOnlyForDeploymentPostprocessing = 0;
@@ -4757,6 +4764,7 @@
47574764
7378D98B21CCD04000A4B11F /* CRCCalculationTests.m in Sources */,
47584765
73032E6C2626D3DD000C2751 /* XADWARCParserTests.m in Sources */,
47594766
73DA3468206B6BF1006ADB42 /* XADPlatformOSXTests.m in Sources */,
4767+
C4C3241827AC25E9007919DB /* XADZippedBzip2LeakTests.m in Sources */,
47604768
7318A41D248C67E400D327B9 /* XADRARParserTests.m in Sources */,
47614769
1737C872BD5877C5DFDA3D99 /* XADRAR5ParserTests.m in Sources */,
47624770
E424FB4E21CAEC0300E1C950 /* XADZipParserTests.m in Sources */,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// XADZippedBzip2LeakTests.m
3+
// XADMasterTests
4+
//
5+
// Created by aure on 03/02/2022.
6+
//
7+
8+
#import <XCTest/XCTest.h>
9+
10+
#import "../CSMemoryHandle.h"
11+
#import "../XADZipParser.h"
12+
#import "../XADBzip2Parser.h"
13+
14+
15+
@interface XADZippedBzip2LeakTests : XCTestCase
16+
17+
@end
18+
19+
@implementation XADZippedBzip2LeakTests
20+
21+
- (void)testNoLeak {
22+
23+
NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"eicar" ofType:@"bz"];
24+
25+
XADError error;
26+
XADArchiveParser *parser = [XADArchiveParser archiveParserForPath:path error:&error];
27+
NSLog(@"Parser for eicar.bz: %@", parser);
28+
XADHandle *handle = [parser handleForEntryWithDictionary:[parser properties] wantChecksum:NO];
29+
NSLog(@"handle eicar.bz: %@", handle);
30+
31+
// to get the total size, just seek to end and reset offset to 0. Should be 68
32+
[handle seekToEndOfFile];
33+
off_t size = [handle offsetInFile];
34+
[handle seekToFileOffset:0];
35+
36+
NSData *data = [handle readDataOfLengthAtMost:(int)size];
37+
NSLog(@"read data:%@",data);
38+
39+
sleep(10); // to ensure leaks analysis occured in Instruments.
40+
}
41+
42+
43+
44+
@end

XADMasterTests/eicar.bz

107 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)