Index: utils/ofzip/OFZIP.m ================================================================== --- utils/ofzip/OFZIP.m +++ utils/ofzip/OFZIP.m @@ -30,10 +30,12 @@ #import "OFZIPArchiveEntry.h" #import "OFCreateDirectoryFailedException.h" #import "OFInvalidFormatException.h" #import "OFOpenFileFailedException.h" +#import "OFReadFailedException.h" +#import "OFWriteFailedException.h" #import "autorelease.h" #import "macros.h" #define BUFFER_SIZE 4096 @@ -211,10 +213,14 @@ @try { archive = [OFZIPArchive archiveWithPath: path]; } @catch (OFOpenFileFailedException *e) { [of_stderr writeFormat: @"Failed to open file %@: %s\n", [e path], strerror([e errNo])]; + [OFApplication terminateWithStatus: 1]; + } @catch (OFReadFailedException *e) { + [of_stderr writeFormat: @"Failed to read file %@: %s\n", + path, strerror([e errNo])]; [OFApplication terminateWithStatus: 1]; } @catch (OFInvalidFormatException *e) { [of_stderr writeFormat: @"File %@ is not a valid archive!\n", path]; [OFApplication terminateWithStatus: 1]; @@ -387,14 +393,35 @@ output = [OFFile fileWithPath: outFileName mode: @"wb"]; setPermissions(outFileName, entry); while (![stream isAtEndOfStream]) { - size_t length = [stream readIntoBuffer: buffer - length: BUFFER_SIZE]; - [output writeBuffer: buffer - length: length]; + size_t length; + + @try { + length = [stream readIntoBuffer: buffer + length: BUFFER_SIZE]; + } @catch (OFReadFailedException *e) { + [of_stderr writeFormat: + @"\rFailed to read file %@: %s\n", + fileName, strerror([e errNo])]; + + _exitStatus = 1; + goto outer_loop_end; + } + + @try { + [output writeBuffer: buffer + length: length]; + } @catch (OFWriteFailedException *e) { + [of_stderr writeFormat: + @"\rFailed to write file %@: %s\n", + fileName, strerror([e errNo])]; + + _exitStatus = 1; + goto outer_loop_end; + } written += length; newPercent = (written == size ? 100 : (int_fast8_t)(written * 100 / size)); @@ -409,10 +436,11 @@ if (_outputLevel >= 0) [of_stdout writeFormat: @"\rExtracting %@... done\n", fileName]; +outer_loop_end: objc_autoreleasePoolPop(pool); } if ([missing count] > 0) { OFString *file;