Package: unar
Followup-For: Bug #853034
Control: tags -1 + patch
Dear Maintainer,
I have refreshed the package repo's fix-crashes.patch to fully
include an upstream commit 59f5a49.
Then I have created two patches on top of those upstream fixes.
Now the uploaded files on the upstream issue page seems to work well.
BTW debian/rules calls some test programs with no arguments,
which actually do nothing.
Are you planning to include test archive files in the source package?
Regards,
--
YOSHINO Yoshihito <[email protected]>
Description: Import upstream's commits to fix crashes.
Forwarded: https://bitbucket.org/WAHa_06x36/theunarchiver/issues/933
Origin: upstream,
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/59f5a493ecfde7a74ab5cabce26e4ff6403eedc3
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/0dd444080021fc1e0d1af535a877298071bd8e97
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/c2df329bab6e9c8cffcefd19bad809c2b957d3fd
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/01766d7c47f38e9ef0af18d12fdd16ab1a051ced
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/411668fd77ee7b66bbdf33d84978c18ff550a9a9
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/b63593e649bd0d39d084890cbc9259be7e60f017
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/93d9c87ef611c4f466003b72fa55d9d9e449867d
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/80b6388262fa3d384b3754b1ff8ede142edff5eb
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/f022d13ea2a8ee23ccd6a35eb87be2346da3a9dc
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/a434c35e79717527ecaa9e1fec5d70dff1eb4fa7
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/9acc5e4d54c37cea95db65e3de70077535735d92
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/e6551148652ad44dfe0837bac29f6aa6caa78c60
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/424343b088321c23004b6bd13583736c5464b2c3
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/2dfc5d31f51b24237bedb8b4189d7aae5f730a4e
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/648b1b192113c98dbf191475c0ab5b6aed7bd119
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/cc0a3fde4f4f065e475fb0bab4c1ab64fa2f5ccd
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/dc791d9d4cb02b557885af8d13ec0522dc5274ae
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/a77f14b715c014a15ee6d4a6d42546d8d033eabd
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/f1a42c132896d9ce6d20a23b0939e4812ca09db3
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/893ff8545db7288523457d1d37aedd2c127c9e88
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/9e39d2c1e7dbe4a1e994bb3983660ead375077b4
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/a88d8d1f045ec895a083d98702f93242a45de210
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/cbd4c03ed01b942925fa051a325ee69b0e4811be
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/2529baec38b5621654abde299d19a34c50de26ea
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/c1c49487cb5ed571fa4ed834188538b0121f4a8f
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/a393f6d75b899a1fb3a220d9b002de3ce313763d
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/b42e91a8226986b1dc5f8f334a161b9d02f57c91
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/7eb8da6f1b2d68c483f2f123102cc3b3fcf1612e
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/8b5b9b93d1d2767c0444cb92e90477b921592b00
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/929cbd9124b70b7c5d4ad8c98085f9bd24823976
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/ebb43bc5ec0e31daee223dd729bbd5b1c69cf16d
https://bitbucket.org/WAHa_06x36/theunarchiver/commits/da4adab4b9cf62b1766f3a72dd3f00a5a74d7701
Last-Update: 2017-03-23
Index: unar-1.10.1/UniversalDetector/universalchardet/Big5Freq.tab
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/Big5Freq.tab
+++ unar-1.10.1/UniversalDetector/universalchardet/Big5Freq.tab
@@ -55,9 +55,6 @@
#define BIG5_TYPICAL_DISTRIBUTION_RATIO (float)0.75
-//Char to FreqOrder table ,
-#define BIG5_TABLE_SIZE 5376
-
static const PRInt16 Big5CharToFreqOrder[] =
{
1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16
Index: unar-1.10.1/UniversalDetector/universalchardet/CharDistribution.cpp
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/CharDistribution.cpp
+++ unar-1.10.1/UniversalDetector/universalchardet/CharDistribution.cpp
@@ -70,42 +70,42 @@ float CharDistributionAnalysis::GetConfi
EUCTWDistributionAnalysis::EUCTWDistributionAnalysis()
{
mCharToFreqOrder = EUCTWCharToFreqOrder;
- mTableSize = EUCTW_TABLE_SIZE;
+ mTableSize = sizeof(EUCTWCharToFreqOrder)/sizeof(EUCTWCharToFreqOrder[0]);
mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO;
}
EUCKRDistributionAnalysis::EUCKRDistributionAnalysis()
{
mCharToFreqOrder = EUCKRCharToFreqOrder;
- mTableSize = EUCKR_TABLE_SIZE;
+ mTableSize = sizeof(EUCKRCharToFreqOrder)/sizeof(EUCKRCharToFreqOrder[0]);
mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO;
}
GB2312DistributionAnalysis::GB2312DistributionAnalysis()
{
mCharToFreqOrder = GB2312CharToFreqOrder;
- mTableSize = GB2312_TABLE_SIZE;
+ mTableSize = sizeof(GB2312CharToFreqOrder)/sizeof(GB2312CharToFreqOrder[0]);
mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO;
}
Big5DistributionAnalysis::Big5DistributionAnalysis()
{
mCharToFreqOrder = Big5CharToFreqOrder;
- mTableSize = BIG5_TABLE_SIZE;
+ mTableSize = sizeof(Big5CharToFreqOrder)/sizeof(Big5CharToFreqOrder[0]);
mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO;
}
SJISDistributionAnalysis::SJISDistributionAnalysis()
{
mCharToFreqOrder = JISCharToFreqOrder;
- mTableSize = JIS_TABLE_SIZE;
+ mTableSize = sizeof(JISCharToFreqOrder)/sizeof(JISCharToFreqOrder[0]);
mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO;
}
EUCJPDistributionAnalysis::EUCJPDistributionAnalysis()
{
mCharToFreqOrder = JISCharToFreqOrder;
- mTableSize = JIS_TABLE_SIZE;
+ mTableSize = sizeof(JISCharToFreqOrder)/sizeof(JISCharToFreqOrder[0]);
mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO;
}
Index: unar-1.10.1/UniversalDetector/universalchardet/EUCKRFreq.tab
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/EUCKRFreq.tab
+++ unar-1.10.1/UniversalDetector/universalchardet/EUCKRFreq.tab
@@ -52,9 +52,6 @@
#define EUCKR_TYPICAL_DISTRIBUTION_RATIO (float) 6.0
-#define EUCKR_TABLE_SIZE 2352
-
-//Char to FreqOrder table ,
static const PRInt16 EUCKRCharToFreqOrder[] =
{
13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87,
Index: unar-1.10.1/UniversalDetector/universalchardet/EUCTWFreq.tab
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/EUCTWFreq.tab
+++ unar-1.10.1/UniversalDetector/universalchardet/EUCTWFreq.tab
@@ -56,9 +56,6 @@
#define EUCTW_TYPICAL_DISTRIBUTION_RATIO (float)0.75
-//Char to FreqOrder table ,
-#define EUCTW_TABLE_SIZE 8102
-
static const PRInt16 EUCTWCharToFreqOrder[] =
{
1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742
Index: unar-1.10.1/UniversalDetector/universalchardet/GB2312Freq.tab
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/GB2312Freq.tab
+++ unar-1.10.1/UniversalDetector/universalchardet/GB2312Freq.tab
@@ -53,8 +53,6 @@
#define GB2312_TYPICAL_DISTRIBUTION_RATIO (float)0.9
-#define GB2312_TABLE_SIZE 3760
-
static const PRInt16 GB2312CharToFreqOrder[] =
{
1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
Index: unar-1.10.1/UniversalDetector/universalchardet/JISFreq.tab
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/JISFreq.tab
+++ unar-1.10.1/UniversalDetector/universalchardet/JISFreq.tab
@@ -55,10 +55,6 @@
#define JIS_TYPICAL_DISTRIBUTION_RATIO (float) 3.0
-
-//Char to FreqOrder table ,
-#define JIS_TABLE_SIZE 4368
-
static const PRInt16 JISCharToFreqOrder[] =
{
40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, // 16
Index: unar-1.10.1/UniversalDetector/universalchardet/nsMBCSGroupProber.cpp
===================================================================
--- unar-1.10.1.orig/UniversalDetector/universalchardet/nsMBCSGroupProber.cpp
+++ unar-1.10.1/UniversalDetector/universalchardet/nsMBCSGroupProber.cpp
@@ -156,7 +156,7 @@ nsProbingState nsMBCSGroupProber::Handle
{
if (!mIsActive[i])
continue;
- st = mProbers[i]->HandleData(aBuf + start, aLen + 1 - start);
+ st = mProbers[i]->HandleData(aBuf + start, aLen - start);
if (st == eFoundIt)
{
mBestGuess = i;
Index: unar-1.10.1/XADMaster/BWT.c
===================================================================
--- unar-1.10.1.orig/XADMaster/BWT.c
+++ unar-1.10.1/XADMaster/BWT.c
@@ -38,7 +38,7 @@ void UnsortBWT(uint8_t *dest,uint8_t *sr
}
}
-void UnsortST4(uint8_t *dest,uint8_t *src,int blocklen,int firstindex,uint32_t *transform)
+bool UnsortST4(uint8_t *dest,uint8_t *src,int blocklen,int firstindex,uint32_t *transform)
{
int counts[256];
for(int i=0;i<256;i++) counts[i]=0;
@@ -115,20 +115,26 @@ void UnsortST4(uint8_t *dest,uint8_t *sr
{
if(tval&0x800000)
{
- index=transform[tval&0x7fffff]&0x7fffff;
- transform[tval&0x7fffff]++;
+ int newindex=tval&0x7fffff;
+ if(newindex>=blocklen) { free(array2); return false; } // TODO: Is it a bug that this can happen, or not?
+ index=transform[newindex]&0x7fffff;
+ transform[newindex]++;
}
else
{
+ if(index>=blocklen) { free(array2); return false; }
transform[index]++;
index=tval&0x7fffff;
}
+ if(index>=blocklen) { free(array2); return false; }
tval=transform[index];
dest[i]=tval>>24;
}
free(array2);
+
+ return true;
}
/*void UnsortBWTStuffItX(uint8_t *dest,int blocklen,int firstindex,uint8_t *src,uint32_t *transform)
Index: unar-1.10.1/XADMaster/BWT.h
===================================================================
--- unar-1.10.1.orig/XADMaster/BWT.h
+++ unar-1.10.1/XADMaster/BWT.h
@@ -2,11 +2,12 @@
#define __BWT_H__
#include <stdint.h>
+#include <stdbool.h>
void CalculateInverseBWT(uint32_t *transform,uint8_t *block,int blocklen);
void UnsortBWT(uint8_t *dest,uint8_t *src,int blocklen,int firstindex,uint32_t *transformbuf);
-void UnsortST4(uint8_t *dest,uint8_t *src,int blocklen,int firstindex,uint32_t *transformbuf);
+bool UnsortST4(uint8_t *dest,uint8_t *src,int blocklen,int firstindex,uint32_t *transformbuf);
typedef struct MTFState
{
Index: unar-1.10.1/XADMaster/CSInputBuffer.h
===================================================================
--- unar-1.10.1.orig/XADMaster/CSInputBuffer.h
+++ unar-1.10.1/XADMaster/CSInputBuffer.h
@@ -56,7 +56,9 @@ void _CSInputFillBuffer(CSInputBuffer *s
static inline void _CSInputBufferRaiseEOF(CSInputBuffer *self)
{
- [self->parent _raiseEOF];
+ if(self->parent) [self->parent _raiseEOF];
+ else [NSException raise:CSEndOfFileException
+ format:@"Attempted to read past the end of memory buffer."];
}
static inline int _CSInputBytesLeftInBuffer(CSInputBuffer *self)
Index: unar-1.10.1/XADMaster/CSInputBuffer.m
===================================================================
--- unar-1.10.1.orig/XADMaster/CSInputBuffer.m
+++ unar-1.10.1/XADMaster/CSInputBuffer.m
@@ -181,6 +181,8 @@ void _CSInputFillBits(CSInputBuffer *sel
// shift-=8;
// }
+ if(startoffset+numbytes>_CSInputBytesLeftInBuffer(self)) _CSInputBufferRaiseEOF(self);
+
switch(numbytes)
{
case 4:
Index: unar-1.10.1/XADMaster/LZSS.c
===================================================================
--- unar-1.10.1.orig/XADMaster/LZSS.c
+++ unar-1.10.1/XADMaster/LZSS.c
@@ -3,7 +3,7 @@
#include <stdlib.h>
#include <string.h>
-bool InitializeLZSS(LZSS *self,int windowsize)
+bool InitializeLZSS(LZSS *self,size_t windowsize)
{
self->window=malloc(windowsize);
if(!self->window) return false;
@@ -28,7 +28,7 @@ void RestartLZSS(LZSS *self)
void CopyBytesFromLZSSWindow(LZSS *self,uint8_t *buffer,int64_t startpos,int length)
{
- int windowoffs=LZSSWindowOffsetForPosition(self,startpos);
+ size_t windowoffs=LZSSWindowOffsetForPosition(self,startpos);
if(windowoffs+length<=LZSSWindowSize(self)) // Request fits inside window
{
@@ -36,7 +36,7 @@ void CopyBytesFromLZSSWindow(LZSS *self,
}
else // Request wraps around window
{
- int firstpart=LZSSWindowSize(self)-windowoffs;
+ size_t firstpart=LZSSWindowSize(self)-windowoffs;
memcpy(&buffer[0],&self->window[windowoffs],firstpart);
memcpy(&buffer[firstpart],&self->window[0],length-firstpart);
}
Index: unar-1.10.1/XADMaster/LZSS.h
===================================================================
--- unar-1.10.1.orig/XADMaster/LZSS.h
+++ unar-1.10.1/XADMaster/LZSS.h
@@ -3,17 +3,18 @@
#include <stdint.h>
#include <stdbool.h>
+#include <stdlib.h>
typedef struct LZSS
{
uint8_t *window;
- int mask;
+ size_t mask;
int64_t position;
} LZSS;
-bool InitializeLZSS(LZSS *self,int windowsize);
+bool InitializeLZSS(LZSS *self,size_t windowsize);
void CleanupLZSS(LZSS *self);
void RestartLZSS(LZSS *self);
@@ -21,17 +22,17 @@ void RestartLZSS(LZSS *self);
static inline int64_t LZSSPosition(LZSS *self) { return self->position; }
-static inline int LZSSWindowMask(LZSS *self) { return self->mask; }
+static inline size_t LZSSWindowMask(LZSS *self) { return self->mask; }
-static inline int LZSSWindowSize(LZSS *self) { return self->mask+1; }
+static inline size_t LZSSWindowSize(LZSS *self) { return self->mask+1; }
static inline uint8_t *LZSSWindowPointer(LZSS *self) { return self->window; }
-static inline int LZSSWindowOffsetForPosition(LZSS *self,int64_t pos) { return pos&self->mask; }
+static inline size_t LZSSWindowOffsetForPosition(LZSS *self,int64_t pos) { return pos&self->mask; }
static inline uint8_t *LZSSWindowPointerForPosition(LZSS *self,int64_t pos) { return &self->window[LZSSWindowOffsetForPosition(self,pos)]; }
-static inline int CurrentLZSSWindowOffset(LZSS *self) { return LZSSWindowOffsetForPosition(self,self->position); }
+static inline size_t CurrentLZSSWindowOffset(LZSS *self) { return LZSSWindowOffsetForPosition(self,self->position); }
static inline uint8_t *CurrentLZSSWindowPointer(LZSS *self) { return LZSSWindowPointerForPosition(self,self->position); }
Index: unar-1.10.1/XADMaster/LZW.c
===================================================================
--- unar-1.10.1.orig/XADMaster/LZW.c
+++ unar-1.10.1/XADMaster/LZW.c
@@ -4,7 +4,9 @@
LZW *AllocLZW(int maxsymbols,int reservedsymbols)
{
LZW *self=(LZW *)malloc(sizeof(LZW)+sizeof(LZWTreeNode)*maxsymbols);
- if(!self) return 0;
+ if(!self) return NULL;
+
+ if(maxsymbols<256+self->reservedsymbols) return NULL;
self->maxsymbols=maxsymbols;
self->reservedsymbols=reservedsymbols;
Index: unar-1.10.1/XADMaster/Makefile.common
===================================================================
--- unar-1.10.1.orig/XADMaster/Makefile.common
+++ unar-1.10.1/XADMaster/Makefile.common
@@ -221,15 +221,15 @@ LIBRARY_C_FILES = BWT.c \
LIBRARY_CXX_FILES =
-XADTEST2_OBJC_FILES = XADTest2.m
+XADTEST2_OBJC_FILES = XADTest2.m XADTestUtilities.m
-XADTEST3_OBJC_FILES = XADTest3.m
+XADTEST3_OBJC_FILES = XADTest3.m XADTestUtilities.m
-XADTEST4_OBJC_FILES = XADTest4.m
+XADTEST4_OBJC_FILES = XADTest4.m XADTestUtilities.m
-XADTEST5_OBJC_FILES = XADTest5.m
+XADTEST5_OBJC_FILES = XADTest5.m XADTestUtilities.m
-XADTEST6_OBJC_FILES = XADTest6.m
+XADTEST6_OBJC_FILES = XADTest6.m XADTestUtilities.m
UNAR_OBJC_FILES = unar.m
Index: unar-1.10.1/XADMaster/PPMd/VariantG.c
===================================================================
--- unar-1.10.1.orig/XADMaster/PPMd/VariantG.c
+++ unar-1.10.1/XADMaster/PPMd/VariantG.c
@@ -2,7 +2,7 @@
#include <string.h>
-static void RestartModel(PPMdModelVariantG *self);
+static bool RestartModel(PPMdModelVariantG *self);
static void UpdateModel(PPMdModelVariantG *self);
static bool MakeRoot(PPMdModelVariantG *self,unsigned int SkipCount,PPMdState *state);
@@ -13,7 +13,7 @@ static void DecodeSymbol2VariantG(PPMdCo
static int NumberOfStates(PPMdContext *self) { return self->Flags?0:self->LastStateIndex+1; }
-void StartPPMdModelVariantG(PPMdModelVariantG *self,
+bool StartPPMdModelVariantG(PPMdModelVariantG *self,
PPMdReadFunction *readfunc,void *inputcontext,
PPMdSubAllocator *alloc,int maxorder,bool brimstone)
{
@@ -39,10 +39,10 @@ PPMdSubAllocator *alloc,int maxorder,boo
self->DummySEE2Cont.Shift=PERIOD_BITS;
- RestartModel(self);
+ return RestartModel(self);
}
-static void RestartModel(PPMdModelVariantG *self)
+static bool RestartModel(PPMdModelVariantG *self)
{
InitSubAllocator(self->core.alloc);
@@ -52,10 +52,12 @@ static void RestartModel(PPMdModelVarian
self->core.OrderFall=1;
self->MaxContext=NewPPMdContext(&self->core);
+ if(!self->MaxContext) return false;
self->MaxContext->LastStateIndex=255;
if(self->Brimstone) self->MaxContext->SummFreq=385;
else self->MaxContext->SummFreq=257;
self->MaxContext->States=AllocUnits(self->core.alloc,256/2);
+ if(!self->MaxContext->States) return false;
PPMdState *maxstates=PPMdContextStates(self->MaxContext,&self->core);
for(int i=0;i<256;i++)
@@ -71,6 +73,7 @@ static void RestartModel(PPMdModelVarian
{
//PPMdState firststate={0,1};
self->MaxContext=NewPPMdContextAsChildOf(&self->core,self->MaxContext,state,/*&firststate*/NULL);
+ if(!self->MaxContext) return false;
if(i==self->MaxOrder) break;
state=PPMdContextOneState(self->MaxContext);
state->Symbol=0;
@@ -96,6 +99,8 @@ static void RestartModel(PPMdModelVarian
for(int i=0;i<43;i++)
for(int k=0;k<8;k++)
self->SEE2Cont[i][k]=MakeSEE2(4*i+10,3);
+
+ return true;
}
@@ -103,6 +108,7 @@ static void RestartModel(PPMdModelVarian
int NextPPMdVariantGByte(PPMdModelVariantG *self)
{
if(!self->MinContext) return -1;
+ if(setjmp(self->errorjmp)) return -2;
if(NumberOfStates(self->MinContext)!=1) DecodeSymbol1VariantG(self->MinContext,self);
else DecodeBinSymbolVariantG(self->MinContext,self);
@@ -272,6 +278,7 @@ static void UpdateModel(PPMdModelVariant
}
self->MedContext=self->MinContext;
+ if(!Successor) longjmp(self->errorjmp,1);
self->MaxContext=Successor;
return;
@@ -308,6 +315,7 @@ static bool MakeRoot(PPMdModelVariantG *
do
{
context=PPMdContextSuffix(context,&self->core);
+ if(!context) longjmp(self->errorjmp,1);
if(NumberOfStates(context)!=1)
{
state=PPMdContextStates(context,&self->core);
Index: unar-1.10.1/XADMaster/PPMd/VariantG.h
===================================================================
--- unar-1.10.1.orig/XADMaster/PPMd/VariantG.h
+++ unar-1.10.1/XADMaster/PPMd/VariantG.h
@@ -2,6 +2,7 @@
#define __PPMD_VARIANT_G_H__
#include "Context.h"
+#include <setjmp.h>
// PPMd Variant G. Used (slightly modified) by StuffIt X.
@@ -15,9 +16,11 @@ typedef struct PPMdModelVariantG
SEE2Context SEE2Cont[43][8],DummySEE2Cont;
uint8_t NS2BSIndx[256],NS2Indx[256];
uint16_t BinSumm[128][16]; // binary SEE-contexts
+
+ jmp_buf errorjmp;
} PPMdModelVariantG;
-void StartPPMdModelVariantG(PPMdModelVariantG *self,
+bool StartPPMdModelVariantG(PPMdModelVariantG *self,
PPMdReadFunction *readfunc,void *inputcontext,
PPMdSubAllocator *alloc,int maxorder,bool brimstone);
int NextPPMdVariantGByte(PPMdModelVariantG *self);
Index: unar-1.10.1/XADMaster/RARVirtualMachine.c
===================================================================
--- unar-1.10.1.orig/XADMaster/RARVirtualMachine.c
+++ unar-1.10.1/XADMaster/RARVirtualMachine.c
@@ -46,6 +46,7 @@ void SetRAROpcodeOperand2(RAROpcode *opc
bool IsProgramTerminated(RAROpcode *opcodes,int numopcodes)
{
+ if(numopcodes==0) return false;
return RARInstructionIsUnconditionalJump(opcodes[numopcodes-1].instruction);
}
Index: unar-1.10.1/XADMaster/StuffItXUtilities.m
===================================================================
--- unar-1.10.1.orig/XADMaster/StuffItXUtilities.m
+++ unar-1.10.1/XADMaster/StuffItXUtilities.m
@@ -1,9 +1,11 @@
#import "StuffItXUtilities.h"
+#import "XADException.h"
uint64_t ReadSitxP2(CSHandle *fh)
{
int n=1;
- while([fh readBitsLE:1]==1) n++;
+ while([fh readBitsLE:1]==1 && n<64) n++;
+ if(n>=64) [XADException raiseDecrunchException];
uint64_t value=0;
uint64_t bit=1;
Index: unar-1.10.1/XADMaster/XADARCDistillHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADARCDistillHandle.m
+++ unar-1.10.1/XADMaster/XADARCDistillHandle.m
@@ -47,8 +47,10 @@ static const int offsetcodes[0x40]=
[super dealloc];
}
-static void BuildCodeFromTree(XADPrefixCode *code,int *tree,int node,int numnodes)
+static void BuildCodeFromTree(XADPrefixCode *code,int *tree,int node,int numnodes,int depth)
{
+ if(depth>64) [XADException raiseDecrunchException];
+
if(node>=numnodes)
{
[code makeLeafWithValue:node-numnodes];
@@ -56,9 +58,9 @@ static void BuildCodeFromTree(XADPrefixC
else
{
[code startZeroBranch];
- BuildCodeFromTree(code,tree,tree[node],numnodes);
+ BuildCodeFromTree(code,tree,tree[node],numnodes,depth+1);
[code startOneBranch];
- BuildCodeFromTree(code,tree,tree[node+1],numnodes);
+ BuildCodeFromTree(code,tree,tree[node+1],numnodes,depth+1);
[code finishBranches];
}
}
@@ -68,8 +70,7 @@ static void BuildCodeFromTree(XADPrefixC
int numnodes=CSInputNextUInt16LE(input);
int codelength=CSInputNextByte(input);
- analyser_assert(numnodes>=2);
-
+ if(numnodes<2) [XADException raiseDecrunchException];
if(numnodes>0x274) [XADException raiseDecrunchException];
int nodes[numnodes];
@@ -79,7 +80,7 @@ static void BuildCodeFromTree(XADPrefixC
maincode=[XADPrefixCode new];
[maincode startBuildingTree];
- BuildCodeFromTree(maincode,nodes,numnodes-2,numnodes);
+ BuildCodeFromTree(maincode,nodes,numnodes-2,numnodes,0);
}
-(void)expandFromPosition:(off_t)pos
Index: unar-1.10.1/XADMaster/XADCABParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADCABParser.m
+++ unar-1.10.1/XADMaster/XADCABParser.m
@@ -227,8 +227,10 @@ static CSHandle *FindHandleForName(NSDat
XADCABBlockReader *blocks=[[file objectForKey:XADSolidObjectKey] objectForKey:@"BlockReader"];
off_t streamcompsize=[blocks compressedLength];
off_t streamuncompsize=[blocks uncompressedLength];
+ off_t compsize=0;
+ if(streamuncompsize!=0) compsize=filesize*streamcompsize/streamuncompsize;
- [file setObject:[NSNumber numberWithLongLong:filesize*streamcompsize/streamuncompsize] forKey:XADCompressedSizeKey];
+ [file setObject:[NSNumber numberWithLongLong:compsize] forKey:XADCompressedSizeKey];
[self addEntryWithDictionary:file];
[files removeObjectAtIndex:0];
Index: unar-1.10.1/XADMaster/XADCFBFParser.h
===================================================================
--- unar-1.10.1.orig/XADMaster/XADCFBFParser.h
+++ unar-1.10.1/XADMaster/XADCFBFParser.h
@@ -8,6 +8,7 @@
int numsectors,numminisectors;
uint32_t *sectable,*minisectable;
+ bool *secvisitedtable;
}
+(int)requiredHeaderSize;
Index: unar-1.10.1/XADMaster/XADCFBFParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADCFBFParser.m
+++ unar-1.10.1/XADMaster/XADCFBFParser.m
@@ -36,7 +36,6 @@
{
CSHandle *fh=[self handle];
-
// Read header
[fh skipBytes:30];
@@ -63,6 +62,7 @@
numsectors=numtablesecs*idspersec;
sectable=malloc(numsectors*sizeof(uint32_t));
+ secvisitedtable=calloc(numsectors*sizeof(bool),1);
for(int i=0;i<numtablesecs;i++)
{
@@ -109,6 +109,8 @@
uint32_t dirsec=firstdirsec;
while(dirsec!=0xfffffffe)
{
+ if(secvisitedtable[dirsec]) [XADException raiseIllegalDataException];
+ secvisitedtable[dirsec]=true;
[self seekToSector:dirsec];
for(int i=0;i<secsize;i+=128)
{
Index: unar-1.10.1/XADMaster/XADCompressHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADCompressHandle.m
+++ unar-1.10.1/XADMaster/XADCompressHandle.m
@@ -13,7 +13,11 @@
if((self=[super initWithInputBufferForHandle:handle length:length]))
{
blockmode=(compressflags&0x80)!=0;
- lzw=AllocLZW(1<<(compressflags&0x1f),blockmode?1:0);
+
+ int maxsymbols=1<<(compressflags&0x1f);
+ if(maxsymbols<=256) [XADException raiseDecrunchException];
+
+ lzw=AllocLZW(maxsymbols,blockmode?1:0);
}
return self;
}
Index: unar-1.10.1/XADMaster/XADCrunchHandles.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADCrunchHandles.m
+++ unar-1.10.1/XADMaster/XADCrunchHandles.m
@@ -268,6 +268,7 @@ static xadUINT8 CRUNCHdecode(struct Crun
stackp = cd->stack;
while(ep > cd->table + 255) /* i.e. code not atomic */
{
+ if(stackp - cd->stack >= sizeof(cd->stack)) return 0; // TODO: Should throw error
*(stackp++) = ep->suffix;
ep = cd->table + (ep->predecessor&0xFFF);
}
@@ -294,7 +295,7 @@ xadINT32 CRUNCHuncrunch(struct xadInOut
if(mode)
{
xadUINT8 *stackp, *stacke; /* byte string stack pointer */
- struct CrunchEntry *ep;
+ struct CrunchEntry *ep = NULL;
stackp = cd->stack;
stacke = cd->stack+CRUNCH_TABLE_SIZE-2;
@@ -320,7 +321,23 @@ xadINT32 CRUNCHuncrunch(struct xadInOut
if(pred == 0) /* end-of-file code */
break; /* all lzw codes read */
- ep = cd->table + (cd->table[pred].predecessor == CRUNCH_EMPTY ? cd->lastpr : pred);
+ if(pred >= CRUNCH_TABLE_SIZE)
+ {
+ cd->io->xio_Error = XADERR_DECRUNCH;
+ break;
+ }
+
+ if(cd->table[pred].predecessor == CRUNCH_EMPTY)
+ {
+ pred = cd->lastpr;
+ if(pred >= CRUNCH_TABLE_SIZE)
+ {
+ cd->io->xio_Error = XADERR_DECRUNCH;
+ break;
+ }
+ }
+
+ ep = cd->table + pred;
/* walk back the lzw table starting with this code */
while(ep->predecessor < CRUNCH_TABLE_SIZE)
Index: unar-1.10.1/XADMaster/XADLZXHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADLZXHandle.m
+++ unar-1.10.1/XADMaster/XADLZXHandle.m
@@ -152,6 +152,7 @@
length=(lengths[i]+17-newval)%17;
}
+ if(i+n>count) [XADException raiseDecrunchException];
for(int j=0;j<n;j++) lengths[i+j]=length;
i+=n;
}
Index: unar-1.10.1/XADMaster/XADLZXParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADLZXParser.m
+++ unar-1.10.1/XADMaster/XADLZXParser.m
@@ -133,10 +133,10 @@
NSMutableDictionary *dict;
while((dict=[enumerator nextObject]))
{
+ off_t compsize=0;
+ if(solidsize!=0) compsize=([[dict objectForKey:XADFileSizeKey] longLongValue]*(off_t)compsize)/solidsize;
[dict setObject:solidobj forKey:XADSolidObjectKey];
- [dict setObject:[NSNumber numberWithLongLong:
- ([[dict objectForKey:XADFileSizeKey] longLongValue]*(off_t)compsize)/solidsize]
- forKey:XADCompressedSizeKey];
+ [dict setObject:[NSNumber numberWithLongLong:compsize] forKey:XADCompressedSizeKey];
[self addEntryWithDictionary:dict];
}
Index: unar-1.10.1/XADMaster/XADPPMdHandles.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADPPMdHandles.m
+++ unar-1.10.1/XADMaster/XADPPMdHandles.m
@@ -1,4 +1,5 @@
#import "XADPPMdHandles.h"
+#import "XADException.h"
@@ -26,13 +27,20 @@
[super dealloc];
}
--(void)resetByteStream { StartPPMdModelVariantG(&model,(PPMdReadFunction *)CSInputNextByte,input,&alloc->core,max,NO); }
+-(void)resetByteStream
+{
+ if(!StartPPMdModelVariantG(&model,(PPMdReadFunction *)CSInputNextByte,input,&alloc->core,max,NO))
+ {
+ [XADException raiseDecrunchException];
+ }
+}
-(uint8_t)produceByteAtOffset:(off_t)pos
{
int byte=NextPPMdVariantGByte(&model);
- if(byte<0) CSByteStreamEOF(self);
- return byte;
+ if(byte==-1) CSByteStreamEOF(self);
+ else if(byte==-2) { [XADException raiseDecrunchException]; return 0; }
+ else return byte;
}
@end
@@ -101,7 +109,11 @@
[super dealloc];
}
--(void)resetByteStream { StartPPMdModelVariantI(&model,(PPMdReadFunction *)CSInputNextByte,input,alloc,max,method); }
+-(void)resetByteStream
+{
+ if(max<2) [XADException raiseNotSupportedException];
+ StartPPMdModelVariantI(&model,(PPMdReadFunction *)CSInputNextByte,input,alloc,max,method);
+}
-(uint8_t)produceByteAtOffset:(off_t)pos
{
@@ -138,7 +150,13 @@
[super dealloc];
}
--(void)resetByteStream { StartPPMdModelVariantG(&model,(PPMdReadFunction *)CSInputNextByte,input,&alloc->core,max,YES); }
+-(void)resetByteStream
+{
+ if(!StartPPMdModelVariantG(&model,(PPMdReadFunction *)CSInputNextByte,input,&alloc->core,max,YES))
+ {
+ [XADException raiseDecrunchException];
+ }
+}
-(uint8_t)produceByteAtOffset:(off_t)pos
{
Index: unar-1.10.1/XADMaster/XADPrefixCode.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADPrefixCode.m
+++ unar-1.10.1/XADMaster/XADPrefixCode.m
@@ -341,7 +341,11 @@ static void MakeTable(XADPrefixCode *cod
{
int currtablesize=1<<(maxdepth-depth);
- if(IsLeafNode(code,node))
+ if(IsInvalidNode(code,node))
+ {
+ for(int i=0;i<currtablesize;i++) table[i].length=-1;
+ }
+ else if(IsLeafNode(code,node))
{
for(int i=0;i<currtablesize;i++)
{
@@ -349,10 +353,6 @@ static void MakeTable(XADPrefixCode *cod
table[i].value=LeafValue(code,node);
}
}
- else if(IsInvalidNode(code,node))
- {
- for(int i=0;i<currtablesize;i++) table[i].length=-1;
- }
else
{
if(depth==maxdepth)
@@ -373,7 +373,11 @@ static void MakeTableLE(XADPrefixCode *c
int currtablesize=1<<(maxdepth-depth);
int currstride=1<<depth;
- if(IsLeafNode(code,node))
+ if(IsInvalidNode(code,node))
+ {
+ for(int i=0;i<currtablesize;i++) table[i*currstride].length=-1;
+ }
+ else if(IsLeafNode(code,node))
{
for(int i=0;i<currtablesize;i++)
{
@@ -381,10 +385,6 @@ static void MakeTableLE(XADPrefixCode *c
table[i*currstride].value=LeafValue(code,node);
}
}
- else if(IsInvalidNode(code,node))
- {
- for(int i=0;i<currtablesize;i++) table[i*currstride].length=-1;
- }
else
{
if(depth==maxdepth)
Index: unar-1.10.1/XADMaster/XADRAR30Handle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADRAR30Handle.m
+++ unar-1.10.1/XADMaster/XADRAR30Handle.m
@@ -576,7 +576,7 @@
if(isnew)
{
int length=CSInputNextRARVMNumber(filterinput);
- if(length==0||length>0x10000) [XADException raiseIllegalDataException];
+ if(length<=0||length>0x10000) [XADException raiseIllegalDataException];
uint8_t bytecode[length];
for(int i=0;i<length;i++) bytecode[i]=CSInputNextBitString(filterinput,8);
Index: unar-1.10.1/XADMaster/XADRAR50Handle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADRAR50Handle.m
+++ unar-1.10.1/XADMaster/XADRAR50Handle.m
@@ -20,7 +20,7 @@ static uint32_t ReadFilterInteger(CSInpu
[self setInputBuffer:buf];
uint64_t dictsize=[[dict objectForKey:@"RAR5DictionarySize"] unsignedLongLongValue];
- InitializeLZSS(&lzss,dictsize);
+ if(!InitializeLZSS(&lzss,dictsize)) [XADException raiseOutOfMemoryException];
maincode=nil;
offsetcode=nil;
Index: unar-1.10.1/XADMaster/XADRPMParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADRPMParser.m
+++ unar-1.10.1/XADMaster/XADRPMParser.m
@@ -17,7 +17,7 @@
return NO;
}
-static int FindStringLength(const uint8_t *buffer,int size,int offset)
+static int FindStringLength(const uint8_t *buffer,size_t size,size_t offset)
{
int len=0;
while(offset+len<size&&buffer[offset+len]) len++;
@@ -91,6 +91,7 @@ static int FindStringLength(const uint8_
}
int headentries=[fh readUInt32BE];
+ if(headentries>=0x10000000) [XADException raiseDecrunchException];
int headbytes=[fh readUInt32BE];
NSData *entrydata=[fh readDataOfLength:headentries*16];
@@ -99,7 +100,6 @@ static int FindStringLength(const uint8_
const uint8_t *entries=[entrydata bytes];
const uint8_t *storage=[storagedata bytes];
-
for(int i=0;i<headentries;i++)
{
uint32_t tag=CSUInt32BE(entries+i*16+0);
Index: unar-1.10.1/XADMaster/XADSqueezeHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADSqueezeHandle.m
+++ unar-1.10.1/XADMaster/XADSqueezeHandle.m
@@ -24,20 +24,26 @@
}
-static void BuildCodeFromTree(XADPrefixCode *code,int *tree,int node,int numnodes)
+static void BuildCodeFromTree(XADPrefixCode *code,int *tree,int node,int numnodes,int depth)
{
+ if(depth>64) [XADException raiseDecrunchException];
+
if(node<0)
{
[code makeLeafWithValue:-(node+1)];
}
- else
+ else if(2*node+1<numnodes)
{
[code startZeroBranch];
- BuildCodeFromTree(code,tree,tree[2*node],numnodes);
+ BuildCodeFromTree(code,tree,tree[2*node],numnodes,depth+1);
[code startOneBranch];
- BuildCodeFromTree(code,tree,tree[2*node+1],numnodes);
+ BuildCodeFromTree(code,tree,tree[2*node+1],numnodes,depth+1);
[code finishBranches];
}
+ else
+ {
+ [XADException raiseDecrunchException];
+ }
}
-(void)resetByteStream
@@ -54,7 +60,7 @@ static void BuildCodeFromTree(XADPrefixC
code=[XADPrefixCode new];
[code startBuildingTree];
- BuildCodeFromTree(code,nodes,0,numnodes);
+ BuildCodeFromTree(code,nodes,0,numnodes,0);
}
-(uint8_t)produceByteAtOffset:(off_t)pos
Index: unar-1.10.1/XADMaster/XADStuffItSplitParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADStuffItSplitParser.m
+++ unar-1.10.1/XADMaster/XADStuffItSplitParser.m
@@ -129,7 +129,7 @@
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:
[self XADPathWithData:namedata separators:XADNoPathSeparator],XADFileNameKey,
[NSNumber numberWithLongLong:rsrclength],XADFileSizeKey,
- [NSNumber numberWithLongLong:curroffset*rsrclength/(datalength+rsrclength)],XADCompressedSizeKey,
+ [NSNumber numberWithLongLong:curroffset*rsrclength/((off_t)datalength+(off_t)rsrclength)],XADCompressedSizeKey,
[NSNumber numberWithLongLong:0],XADSkipOffsetKey,
[NSNumber numberWithLongLong:rsrclength],XADSkipLengthKey,
[NSNumber numberWithUnsignedInt:type],XADFileTypeKey,
@@ -150,7 +150,7 @@
NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithObjectsAndKeys:
[self XADPathWithData:namedata separators:XADNoPathSeparator],XADFileNameKey,
[NSNumber numberWithLongLong:datalength],XADFileSizeKey,
- [NSNumber numberWithLongLong:datalength?curroffset*datalength/(datalength+rsrclength):0],XADCompressedSizeKey,
+ [NSNumber numberWithLongLong:datalength?curroffset*datalength/((off_t)datalength+(off_t)rsrclength):0],XADCompressedSizeKey,
[NSNumber numberWithLongLong:rsrclength],XADSkipOffsetKey,
[NSNumber numberWithLongLong:datalength],XADSkipLengthKey,
[NSNumber numberWithUnsignedInt:type],XADFileTypeKey,
Index: unar-1.10.1/XADMaster/XADStuffItXBlockHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADStuffItXBlockHandle.m
+++ unar-1.10.1/XADMaster/XADStuffItXBlockHandle.m
@@ -1,5 +1,6 @@
#import "XADStuffItXBlockHandle.h"
#import "StuffItXUtilities.h"
+#import "XADException.h"
@implementation XADStuffItXBlockHandle
@@ -27,13 +28,14 @@
-(int)produceBlockAtOffset:(off_t)pos
{
- int size=(int)ReadSitxP2(parent);
+ unsigned int size=(unsigned int)ReadSitxP2(parent);
if(!size) return -1;
if(size>currsize)
{
free(buffer);
buffer=malloc(size);
+ if(!buffer) [XADException raiseOutOfMemoryException];
currsize=size;
[self setBlockPointer:buffer];
}
Index: unar-1.10.1/XADMaster/XADStuffItXIronHandle.h
===================================================================
--- unar-1.10.1.orig/XADMaster/XADStuffItXIronHandle.h
+++ unar-1.10.1/XADMaster/XADStuffItXIronHandle.h
@@ -8,9 +8,9 @@
int st4transform,fancymtf;
- int maxfreq1,maxfreq2,maxfreq3;
- int byteshift1,byteshift2,byteshift3;
- int countshift1,countshift2,countshift3;
+ unsigned int maxfreq1,maxfreq2,maxfreq3;
+ unsigned int byteshift1,byteshift2,byteshift3;
+ unsigned int countshift1,countshift2,countshift3;
}
-(id)initWithHandle:(CSHandle *)handle length:(off_t)length;
Index: unar-1.10.1/XADMaster/XADStuffItXIronHandle.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADStuffItXIronHandle.m
+++ unar-1.10.1/XADMaster/XADStuffItXIronHandle.m
@@ -59,12 +59,12 @@ static int NextBitWithDoubleWeights(Carr
maxfreq2=1<<CSInputNextSitxP2(input);
maxfreq3=1<<CSInputNextSitxP2(input);
- byteshift1=(int)CSInputNextSitxP2(input);
- byteshift2=(int)CSInputNextSitxP2(input);
- byteshift3=(int)CSInputNextSitxP2(input);
- countshift1=(int)CSInputNextSitxP2(input);
- countshift2=(int)CSInputNextSitxP2(input);
- countshift3=(int)CSInputNextSitxP2(input);
+ byteshift1=(unsigned int)CSInputNextSitxP2(input);
+ byteshift2=(unsigned int)CSInputNextSitxP2(input);
+ byteshift3=(unsigned int)CSInputNextSitxP2(input);
+ countshift1=(unsigned int)CSInputNextSitxP2(input);
+ countshift2=(unsigned int)CSInputNextSitxP2(input);
+ countshift3=(unsigned int)CSInputNextSitxP2(input);
}
-(int)produceBlockAtOffset:(off_t)pos
@@ -73,12 +73,13 @@ static int NextBitWithDoubleWeights(Carr
if(CSInputNextBitLE(input)==1) return -1;
- int blocksize=(int)CSInputNextSitxP2(input);
+ unsigned int blocksize=(unsigned int)CSInputNextSitxP2(input);
if(blocksize>currsize)
{
free(block);
block=malloc(blocksize*6);
+ if(!block) [XADException raiseOutOfMemoryException];
sorted=block+blocksize;
table=(uint32_t *)(block+2*blocksize);
currsize=blocksize;
@@ -86,7 +87,8 @@ static int NextBitWithDoubleWeights(Carr
if(CSInputNextBitLE(input)==0) // compressed
{
- int firstindex=(int)CSInputNextSitxP2(input);
+ unsigned int firstindex=(int)CSInputNextSitxP2(input);
+ if(firstindex>=blocksize) [XADException raiseDecrunchException];
CSInputSkipToByteBoundary(input);
@@ -94,7 +96,7 @@ static int NextBitWithDoubleWeights(Carr
if(st4transform)
{
- UnsortST4(block,sorted,blocksize,firstindex,table);
+ if(!UnsortST4(block,sorted,blocksize,firstindex,table)) [XADException raiseDecrunchException];
}
else
{
Index: unar-1.10.1/XADMaster/XADStuffItXParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADStuffItXParser.m
+++ unar-1.10.1/XADMaster/XADStuffItXParser.m
@@ -16,7 +16,7 @@
typedef struct StuffItXElement
{
- int something,type;
+ unsigned int something,type;
int64_t attribs[10];
int64_t alglist[6];
int64_t alglist3_extra;
@@ -36,11 +36,11 @@ static void ReadElement(CSHandle *fh,Stu
element->alglist3_extra=-1;
element->something=[fh readBitsLE:1];
- element->type=(int)ReadSitxP2(fh);
+ element->type=(unsigned int)ReadSitxP2(fh);
for(;;)
{
- int type=(int)ReadSitxP2(fh);
+ unsigned int type=(unsigned int)ReadSitxP2(fh);
if(type==0) break;
uint64_t value=ReadSitxP2(fh);
if(type<=10) element->attribs[type-1]=value;
@@ -49,7 +49,7 @@ static void ReadElement(CSHandle *fh,Stu
for(;;)
{
- int type=(int)ReadSitxP2(fh);
+ unsigned int type=(unsigned int)ReadSitxP2(fh);
if(type==0) break;
uint64_t value=ReadSitxP2(fh);
if(type<=6) element->alglist[type-1]=value;
@@ -120,7 +120,9 @@ static CSHandle *HandleForElement(XADStu
case 0: // Brimstone/PPMd
{
- int allocsize=1<<[handle readUInt8];
+ int exponent=[handle readUInt8];
+ if(exponent>31) [XADException raiseDecrunchException];
+ int allocsize=1<<exponent;
int order=[handle readUInt8];
handle=[[[XADStuffItXBrimstoneHandle alloc] initWithHandle:handle
length:uncompressedlength maxOrder:order subAllocSize:allocsize] autorelease];
@@ -614,7 +616,7 @@ static CSHandle *HandleForElement(XADStu
{
for(;;)
{
- int key=(int)ReadSitxP2(fh);
+ unsigned int key=(unsigned int)ReadSitxP2(fh);
if(!key) break;
switch(key)
@@ -673,7 +675,7 @@ static CSHandle *HandleForElement(XADStu
case 7:
{
- int val=(int)ReadSitxP2(fh);
+ unsigned int val=(unsigned int)ReadSitxP2(fh);
NSLog(@"7: %d",val);
}
break;
@@ -693,7 +695,7 @@ static CSHandle *HandleForElement(XADStu
case 10:
{
- int num=(int)ReadSitxP2(fh);
+ unsigned int num=(unsigned int)ReadSitxP2(fh);
for(int i=0;i<num;i++)
NSLog(@"10: %@",[self XADStringWithData:ReadSitxString(fh)]);
}
Index: unar-1.10.1/XADMaster/XADTest2.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADTest2.m
+++ unar-1.10.1/XADMaster/XADTest2.m
@@ -1,4 +1,5 @@
#import "XADArchiveParser.h"
+#import "XADTestUtilities.h"
#import "CRC.h"
@interface TestDelegate:NSObject
@@ -60,27 +61,13 @@
@end
-NSString *FigureOutPassword(NSString *filename)
-{
- const char *envpass=getenv("XADTestPassword");
- if(envpass) return [NSString stringWithUTF8String:envpass];
-
- NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
- if(matches) return [matches objectAtIndex:1];
-
- matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
- if(matches) return [matches objectAtIndex:1];
-
- return nil;
-}
-
int main(int argc,char **argv)
{
- for(int i=1;i<argc;i++)
+ NSString *filename;
+ NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
+ while(filename=[enumerator nextObject])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
-
- NSString *filename=[NSString stringWithUTF8String:argv[i]];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
NSLog(@"Parsing file \"%@\" with parser \"%@\".",filename,[parser formatName]);
Index: unar-1.10.1/XADMaster/XADTest3.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADTest3.m
+++ unar-1.10.1/XADMaster/XADTest3.m
@@ -1,4 +1,5 @@
#import "XADArchiveParser.h"
+#import "XADTestUtilities.h"
NSString *EscapeString(NSString *str)
{
@@ -126,29 +127,16 @@ NSString *EscapeString(NSString *str)
@end
-NSString *FigureOutPassword(NSString *filename)
-{
- const char *envpass=getenv("XADTestPassword");
- if(envpass) return [NSString stringWithUTF8String:envpass];
-
- NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
- if(matches) return [matches objectAtIndex:1];
-
- matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
- if(matches) return [matches objectAtIndex:1];
-
- return nil;
-}
-
int main(int argc,char **argv)
{
- for(int i=1;i<argc;i++)
+ NSString *filename;
+ NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
+ while(filename=[enumerator nextObject])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
- printf("Testing %s...\n",argv[i]);
+ printf("Testing %s...\n",[filename UTF8String]);
- NSString *filename=[NSString stringWithUTF8String:argv[i]];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
[parser setDelegate:[[[ArchiveTester alloc] initWithIndentLevel:2] autorelease]];
Index: unar-1.10.1/XADMaster/XADTest4.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADTest4.m
+++ unar-1.10.1/XADMaster/XADTest4.m
@@ -1,4 +1,5 @@
#import "XADArchiveParser.h"
+#import "XADTestUtilities.h"
@interface ArchiveTester:NSObject
{
@@ -76,27 +77,15 @@
@end
-NSString *FigureOutPassword(NSString *filename)
-{
- const char *envpass=getenv("XADTestPassword");
- if(envpass) return [NSString stringWithUTF8String:envpass];
-
- NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
- if(matches) return [matches objectAtIndex:1];
-
- matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
- if(matches) return [matches objectAtIndex:1];
-
- return nil;
-}
-
int main(int argc,char **argv)
{
- for(int i=1;i<argc;i++)
+ NSString *filename;
+ NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
+ while(filename=[enumerator nextObject])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
- printf("Testing %s...\n",argv[i]);
+ printf("Testing %s...\n",[filename UTF8String]);
NSString *filename=[NSString stringWithUTF8String:argv[i]];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
Index: unar-1.10.1/XADMaster/XADTest5.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADTest5.m
+++ unar-1.10.1/XADMaster/XADTest5.m
@@ -1,4 +1,5 @@
#import "XADArchiveParser.h"
+#import "XADTestUtilities.h"
#import "CSFileHandle.h"
#import "XADRegex.h"
@@ -34,20 +35,6 @@ off_t correctlength;
-NSString *FigureOutPassword(NSString *filename)
-{
- const char *envpass=getenv("XADTestPassword");
- if(envpass) return [NSString stringWithUTF8String:envpass];
-
- NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
- if(matches) return [matches objectAtIndex:1];
-
- matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
- if(matches) return [matches objectAtIndex:1];
-
- return nil;
-}
-
int main(int argc,char **argv)
{
NSAutoreleasePool *pool=[NSAutoreleasePool new];
Index: unar-1.10.1/XADMaster/XADTest6.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADTest6.m
+++ unar-1.10.1/XADMaster/XADTest6.m
@@ -1,4 +1,5 @@
#import "XADArchiveParser.h"
+#import "XADTestUtilities.h"
#import "NSStringPrinting.h"
NSMutableArray *reasons;
@@ -56,30 +57,16 @@ findsFileInterestingForReason:(NSString
@end
-NSString *FigureOutPassword(NSString *filename)
-{
- const char *envpass=getenv("XADTestPassword");
- if(envpass) return [NSString stringWithUTF8String:envpass];
-
- NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
- if(matches) return [matches objectAtIndex:1];
-
- matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
- if(matches) return [matches objectAtIndex:1];
-
- return nil;
-}
-
int main(int argc,char **argv)
{
int res=0;
- for(int i=1;i<argc;i++)
+ NSString *filename;
+ NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
+ while(filename=[enumerator nextObject])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
- NSString *filename=[NSString stringWithUTF8String:argv[i]];
-
reasons=[NSMutableArray array];
failed=0;
Index: unar-1.10.1/XADMaster/XADTestUtilities.h
===================================================================
--- /dev/null
+++ unar-1.10.1/XADMaster/XADTestUtilities.h
@@ -0,0 +1,4 @@
+#import <Foundation/Foundation.h>
+
+NSString *FigureOutPassword(NSString *filename);
+NSArray *FilesForArgs(int argc,char **argv);
Index: unar-1.10.1/XADMaster/XADTestUtilities.m
===================================================================
--- /dev/null
+++ unar-1.10.1/XADMaster/XADTestUtilities.m
@@ -0,0 +1,58 @@
+#import "XADTestUtilities.h"
+#import "XADRegex.h"
+
+NSString *FigureOutPassword(NSString *filename)
+{
+ const char *envpass=getenv("XADTestPassword");
+ if(envpass) return [NSString stringWithUTF8String:envpass];
+
+ NSArray *matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[pP][aA][rR][tT][0-9]+\\.[rR][aA][rR]$"];
+ if(matches) return [matches objectAtIndex:1];
+
+ matches=[filename substringsCapturedByPattern:@"_pass_(.+)\\.[^.]+$"];
+ if(matches) return [matches objectAtIndex:1];
+
+ return nil;
+}
+
+NSArray *FilesForArgs(int argc,char **argv)
+{
+ NSMutableArray *files=[NSMutableArray array];
+
+ for(int i=1;i<argc;i++)
+ {
+ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
+
+ NSString *filename=[NSString stringWithUTF8String:argv[i]];
+ NSURL *url=[NSURL fileURLWithPath:filename];
+
+ NSNumber *isdir;
+ [url getResourceValue:&isdir forKey:NSURLIsDirectoryKey error:NULL];
+ if(isdir.boolValue)
+ {
+ NSDirectoryEnumerator *enumerator=[[NSFileManager defaultManager] enumeratorAtURL:url
+ includingPropertiesForKeys:@[]
+ options:NSDirectoryEnumerationSkipsHiddenFiles
+ errorHandler:nil];
+ NSURL *url;
+ while(url=[enumerator nextObject])
+ {
+ NSNumber *isfile;
+ [url getResourceValue:&isfile forKey:NSURLIsRegularFileKey error:NULL];
+ if(isfile.boolValue)
+ {
+ [files addObject:url.path];
+ }
+ }
+ }
+ else
+ {
+ [files addObject:filename];
+ }
+
+
+ [pool release];
+ }
+
+ return [NSArray arrayWithArray:files];
+}
Index: unar-1.10.1/XADMaster/XADZipParser.m
===================================================================
--- unar-1.10.1.orig/XADMaster/XADZipParser.m
+++ unar-1.10.1/XADMaster/XADZipParser.m
@@ -128,13 +128,13 @@
off_t centraloffs=end-numbytes+pos;
// Find zip64 end of central directory locator
- while(pos>=0)
+ if(pos>=20 && buf[pos-20]=='P' && buf[pos-19]=='K' && buf[pos-18]==6 && buf[pos-17]==7)
{
- if(buf[pos]=='P'&&buf[pos+1]=='K'&&buf[pos+2]==6&&buf[pos+3]==7) break;
- pos--;
+ // Found a zip64 end of central directory locator.
+ off_t zip64offs=end-numbytes+pos-20;
+ [self parseWithCentralDirectoryAtOffset:centraloffs zip64Offset:zip64offs];
}
-
- if(pos<0)
+ else
{
// Could not find a zip64 end of central directory locator.
if(end>0x100000000)
@@ -150,12 +150,6 @@
[self parseWithCentralDirectoryAtOffset:centraloffs zip64Offset:-1];
}
}
- else
- {
- // Found a zip64 end of central directory locator.
- off_t zip64offs=end-numbytes+pos;
- [self parseWithCentralDirectoryAtOffset:centraloffs zip64Offset:zip64offs];
- }
}
Index: unar-1.10.1/XADMaster/libxad/clients/AMPK.c
===================================================================
--- unar-1.10.1.orig/XADMaster/libxad/clients/AMPK.c
+++ unar-1.10.1/XADMaster/libxad/clients/AMPK.c
@@ -614,7 +614,7 @@ static xadINT32 ARCunsqueeze(struct xadI
{
/* follow bit stream in tree to a leaf */
i = 0;
- while(i >= 0 && !io->xio_Error)
+ while(i >= 0 && 2 * i + 1 < numnodes && !io->xio_Error)
i = node[2*i + xadIOGetBitsLow(io, 1)];
i = -(i + 1); /* decode fake node index to original data value */
@@ -934,59 +934,69 @@ XADGETINFO(AMPK)
}
break;
case AMPKENTRYTYPE_NEWDIR:
- if(!(err = xadHookAccess(XADM XADAC_READ, et.NameSize, dirname+dirnamesize, ai)))
+ if(dirnamesize + et.NameSize + 1 <= sizeof(dirname))
{
- dirnamesize += et.NameSize;
- if((fi = (struct xadFileInfo *) xadAllocObject(XADM XADOBJ_FILEINFO,
- XAD_OBJNAMESIZE, dirnamesize+1, TAG_DONE)))
+ if(!(err = xadHookAccess(XADM XADAC_READ, et.NameSize, dirname+dirnamesize, ai)))
{
- fi->xfi_Flags = XADFIF_DIRECTORY|XADFIF_NODATE;
- xadConvertDates(XADM XAD_DATECURRENTTIME, 1, XAD_GETDATEXADDATE,
- &fi->xfi_Date, TAG_DONE);
- for(i = 0; i < dirnamesize; ++i)
- fi->xfi_FileName[i] = dirname[i];
- err = xadAddFileEntry(XADM fi, ai, XAD_SETINPOS, ai->xai_InPos, TAG_DONE);
+ dirnamesize += et.NameSize;
+ if((fi = (struct xadFileInfo *) xadAllocObject(XADM XADOBJ_FILEINFO,
+ XAD_OBJNAMESIZE, dirnamesize+1, TAG_DONE)))
+ {
+ fi->xfi_Flags = XADFIF_DIRECTORY|XADFIF_NODATE;
+ xadConvertDates(XADM XAD_DATECURRENTTIME, 1, XAD_GETDATEXADDATE,
+ &fi->xfi_Date, TAG_DONE);
+ for(i = 0; i < dirnamesize; ++i)
+ fi->xfi_FileName[i] = dirname[i];
+ err = xadAddFileEntry(XADM fi, ai, XAD_SETINPOS, ai->xai_InPos, TAG_DONE);
+ }
+ else
+ err = XADERR_NOMEMORY;
+ dirname[dirnamesize++] = '/';
}
- else
- err = XADERR_NOMEMORY;
- dirname[dirnamesize++] = '/';
}
+ else
+ err = XADERR_SHORTBUFFER;
break;
case AMPKENTRYTYPE_FILE:
- if(!(err = xadHookAccess(XADM XADAC_READ, et.NameSize, dirname+dirnamesize, ai)))
+ if(dirnamesize + et.NameSize <= sizeof(dirname))
{
- if(!(err = xadHookAccess(XADM XADAC_READ, AMPKFile_TRUESIZE, &fl, ai)))
+ if(!(err = xadHookAccess(XADM XADAC_READ, et.NameSize, dirname+dirnamesize, ai)))
{
- xadUINT32 size = EndGetM32(fl.Size);
- xadUINT32 crunchedSize = EndGetM32(fl.CrunchedSize);
- xadUINT32 protection = EndGetM32(fl.Protection);
- if((fi = (struct xadFileInfo *) xadAllocObject(XADM XADOBJ_FILEINFO,
- XAD_OBJNAMESIZE, dirnamesize+et.NameSize+1, fl.CommentSize ? XAD_OBJCOMMENTSIZE :
- TAG_DONE, fl.CommentSize+1, TAG_DONE)))
+ if(!(err = xadHookAccess(XADM XADAC_READ, AMPKFile_TRUESIZE, &fl, ai)))
{
- if(!fl.CommentSize || !(err = xadHookAccess(XADM XADAC_READ, fl.CommentSize, fi->xfi_Comment, ai)))
+ xadUINT32 size = EndGetM32(fl.Size);
+ xadUINT32 crunchedSize = EndGetM32(fl.CrunchedSize);
+ xadUINT32 protection = EndGetM32(fl.Protection);
+ if((fi = (struct xadFileInfo *) xadAllocObject(XADM XADOBJ_FILEINFO,
+ XAD_OBJNAMESIZE, dirnamesize+et.NameSize+1, fl.CommentSize ? XAD_OBJCOMMENTSIZE :
+ TAG_DONE, fl.CommentSize+1, TAG_DONE)))
{
- fi->xfi_DataPos = ai->xai_InPos;
- fi->xfi_PrivateInfo = (xadPTR)(uintptr_t) fl.CrunchType;
- fi->xfi_EntryInfo = ampktype[fl.CrunchType];
- for(i = 0; i < dirnamesize + et.NameSize; ++i)
- fi->xfi_FileName[i] = dirname[i];
- fi->xfi_CrunchSize = fl.CrunchType ? crunchedSize : size;
- fi->xfi_Size = size;
- fi->xfi_Flags = XADFIF_NODATE|XADFIF_SEEKDATAPOS|XADFIF_EXTRACTONBUILD;
- xadConvertDates(XADM XAD_DATECURRENTTIME, 1, XAD_GETDATEXADDATE,
- &fi->xfi_Date, TAG_DONE);
- fi->xfi_Protection = protection;
- skip = crunchedSize - (xadUINT32)fi->xfi_CrunchSize;
- err = xadAddFileEntry(XADM fi, ai, XAD_SETINPOS, ai->xai_InPos+fi->xfi_CrunchSize, TAG_DONE);
+ if(!fl.CommentSize || !(err = xadHookAccess(XADM XADAC_READ, fl.CommentSize, fi->xfi_Comment, ai)))
+ {
+ fi->xfi_DataPos = ai->xai_InPos;
+ fi->xfi_PrivateInfo = (xadPTR)(uintptr_t) fl.CrunchType;
+ fi->xfi_EntryInfo = ampktype[fl.CrunchType];
+ for(i = 0; i < dirnamesize + et.NameSize; ++i)
+ fi->xfi_FileName[i] = dirname[i];
+ fi->xfi_CrunchSize = fl.CrunchType ? crunchedSize : size;
+ fi->xfi_Size = size;
+ fi->xfi_Flags = XADFIF_NODATE|XADFIF_SEEKDATAPOS|XADFIF_EXTRACTONBUILD;
+ xadConvertDates(XADM XAD_DATECURRENTTIME, 1, XAD_GETDATEXADDATE,
+ &fi->xfi_Date, TAG_DONE);
+ fi->xfi_Protection = protection;
+ skip = crunchedSize - (xadUINT32)fi->xfi_CrunchSize;
+ err = xadAddFileEntry(XADM fi, ai, XAD_SETINPOS, ai->xai_InPos+fi->xfi_CrunchSize, TAG_DONE);
+ }
+ else
+ xadFreeObjectA(XADM fi, 0);
}
else
- xadFreeObjectA(XADM fi, 0);
+ err = XADERR_NOMEMORY;
}
- else
- err = XADERR_NOMEMORY;
}
}
+ else
+ err = XADERR_SHORTBUFFER;
break;
} /* switch */
}
@@ -1648,7 +1658,7 @@ XADUNARCHIVE(LHWARP)
lhw.oldmode = ofs;
j = EndGetM32(lhw.crsize);
l = EndGetM32(lhw.datasize);
- if(l > 22*(512+16))
+ if(l > 22*(512+16) || l < 0)
err = XADERR_ILLEGALDATA;
else if(l) /* ignore empty store blocks */
{
--- unar-1.10.1.orig/XADMaster/XADTestUtilities.m
+++ unar-1.10.1/XADMaster/XADTestUtilities.m
@@ -26,6 +26,33 @@ NSArray *FilesForArgs(int argc,char **ar
NSString *filename=[NSString stringWithUTF8String:argv[i]];
NSURL *url=[NSURL fileURLWithPath:filename];
+#ifdef GNUSTEP
+ NSFileManager *manager=[NSFileManager defaultManager];
+
+ BOOL isdir;
+ [manager fileExistsAtPath:filename isDirectory:&isdir];
+ if(isdir)
+ {
+ NSUInteger fs=[[manager fileAttributesAtPath:filename traverseLink:NO] fileSystemNumber];
+ NSDirectoryEnumerator *enumerator=[manager enumeratorAtPath:filename];
+ NSString *path;
+ while(path=[enumerator nextObject])
+ {
+ NSURL *u=[NSURL URLWithString:path relativeToURL:url];
+ NSDictionary *attrs=[enumerator fileAttributes];
+ if([attrs fileExtensionHidden]) continue;
+ if(fs!=[attrs fileSystemNumber] && [[attrs fileType] isEqualToString:NSFileTypeDirectory]) [enumerator skipDescendents];
+ if([[attrs fileType] isEqualToString:NSFileTypeRegular])
+ {
+ [files addObject:u.path];
+ }
+ }
+ }
+ else
+ {
+ [files addObject:filename];
+ }
+#else
NSNumber *isdir;
[url getResourceValue:&isdir forKey:NSURLIsDirectoryKey error:NULL];
if(isdir.boolValue)
@@ -49,6 +76,7 @@ NSArray *FilesForArgs(int argc,char **ar
{
[files addObject:filename];
}
+#endif
[pool release];
--- unar-1.10.1.orig/XADMaster/XADTest2.m
+++ unar-1.10.1/XADMaster/XADTest2.m
@@ -63,11 +63,12 @@
int main(int argc,char **argv)
{
+ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
+
NSString *filename;
NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
while(filename=[enumerator nextObject])
{
- NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
NSLog(@"Parsing file \"%@\" with parser \"%@\".",filename,[parser formatName]);
@@ -80,8 +81,9 @@ int main(int argc,char **argv)
NSLog(@"Archive format: \"%@\", properties: %@",[parser formatName],[parser properties]);
[parser parse];
NSLog(@"Archive format: \"%@\", properties: %@",[parser formatName],[parser properties]);
-
- [pool release];
}
+
+ [pool release];
+
return 0;
}
--- unar-1.10.1.orig/XADMaster/XADTest3.m
+++ unar-1.10.1/XADMaster/XADTest3.m
@@ -129,12 +129,12 @@ NSString *EscapeString(NSString *str)
int main(int argc,char **argv)
{
+ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
+
NSString *filename;
NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
while(filename=[enumerator nextObject])
{
- NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
-
printf("Testing %s...\n",[filename UTF8String]);
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
@@ -149,8 +149,9 @@ int main(int argc,char **argv)
} @catch(id e) {
printf("*** Exception: %s\n",[[e description] UTF8String]);
}
-
- [pool release];
}
+
+ [pool release];
+
return 0;
}
--- unar-1.10.1.orig/XADMaster/XADTest4.m
+++ unar-1.10.1/XADMaster/XADTest4.m
@@ -79,15 +79,14 @@
int main(int argc,char **argv)
{
+ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
+
NSString *filename;
NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
while(filename=[enumerator nextObject])
{
- NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
-
printf("Testing %s...\n",[filename UTF8String]);
- NSString *filename=[NSString stringWithUTF8String:argv[i]];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
ArchiveTester *tester=[[[ArchiveTester alloc] initWithIndentLevel:2] autorelease];
[parser setDelegate:tester];
@@ -97,8 +96,9 @@ int main(int argc,char **argv)
[parser parse];
[tester done:parser];
-
- [pool release];
}
+
+ [pool release];
+
return 0;
}
--- unar-1.10.1.orig/XADMaster/XADTest6.m
+++ unar-1.10.1/XADMaster/XADTest6.m
@@ -59,14 +59,14 @@ findsFileInterestingForReason:(NSString
int main(int argc,char **argv)
{
+ NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
+
int res=0;
NSString *filename;
NSEnumerator *enumerator=[FilesForArgs(argc,argv) objectEnumerator];
while(filename=[enumerator nextObject])
{
- NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
-
reasons=[NSMutableArray array];
failed=0;
@@ -117,9 +117,9 @@ int main(int argc,char **argv)
res|=2;
}
-
- [pool release];
}
+ [pool release];
+
return res;
}