@@ -86,14 +86,14 @@ static void InitCompressorZlib(CompressorState *cs, int level);
8686static void DeflateCompressorZlib (ArchiveHandle * AH ,CompressorState * cs ,
8787bool flush );
8888static void ReadDataFromArchiveZlib (ArchiveHandle * AH ,ReadFunc readF );
89- static size_t WriteDataToArchiveZlib (ArchiveHandle * AH ,CompressorState * cs ,
89+ static void WriteDataToArchiveZlib (ArchiveHandle * AH ,CompressorState * cs ,
9090const char * data ,size_t dLen );
9191static void EndCompressorZlib (ArchiveHandle * AH ,CompressorState * cs );
9292#endif
9393
9494/* Routines that support uncompressed data I/O */
9595static void ReadDataFromArchiveNone (ArchiveHandle * AH ,ReadFunc readF );
96- static size_t WriteDataToArchiveNone (ArchiveHandle * AH ,CompressorState * cs ,
96+ static void WriteDataToArchiveNone (ArchiveHandle * AH ,CompressorState * cs ,
9797const char * data ,size_t dLen );
9898
9999/*
@@ -179,7 +179,7 @@ ReadDataFromArchive(ArchiveHandle *AH, int compression, ReadFunc readF)
179179/*
180180 * Compress and write data to the output stream (via writeF).
181181 */
182- size_t
182+ void
183183WriteDataToArchive (ArchiveHandle * AH ,CompressorState * cs ,
184184const void * data ,size_t dLen )
185185{
@@ -190,14 +190,16 @@ WriteDataToArchive(ArchiveHandle *AH, CompressorState *cs,
190190{
191191case COMPR_ALG_LIBZ :
192192#ifdef HAVE_LIBZ
193- return WriteDataToArchiveZlib (AH ,cs ,data ,dLen );
193+ WriteDataToArchiveZlib (AH ,cs ,data ,dLen );
194194#else
195195exit_horribly (modulename ,"not built with zlib support\n" );
196196#endif
197+ break ;
197198case COMPR_ALG_NONE :
198- return WriteDataToArchiveNone (AH ,cs ,data ,dLen );
199+ WriteDataToArchiveNone (AH ,cs ,data ,dLen );
200+ break ;
199201}
200- return 0 ; /* keep compiler quiet */
202+ return ;
201203}
202204
203205/*
@@ -298,10 +300,7 @@ DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs, bool flush)
298300 */
299301size_t len = cs -> zlibOutSize - zp -> avail_out ;
300302
301- if (cs -> writeF (AH ,out ,len )!= len )
302- exit_horribly (modulename ,
303- "could not write to output file: %s\n" ,
304- strerror (errno ));
303+ cs -> writeF (AH ,out ,len );
305304}
306305zp -> next_out = (void * )out ;
307306zp -> avail_out = cs -> zlibOutSize ;
@@ -312,19 +311,15 @@ DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs, bool flush)
312311}
313312}
314313
315- static size_t
314+ static void
316315WriteDataToArchiveZlib (ArchiveHandle * AH ,CompressorState * cs ,
317316const char * data ,size_t dLen )
318317{
319318cs -> zp -> next_in = (void * )data ;
320319cs -> zp -> avail_in = dLen ;
321320DeflateCompressorZlib (AH ,cs , false);
322321
323- /*
324- * we have either succeeded in writing dLen bytes or we have called
325- * exit_horribly()
326- */
327- return dLen ;
322+ return ;
328323}
329324
330325static void
@@ -427,19 +422,12 @@ ReadDataFromArchiveNone(ArchiveHandle *AH, ReadFunc readF)
427422free (buf );
428423}
429424
430- static size_t
425+ static void
431426WriteDataToArchiveNone (ArchiveHandle * AH ,CompressorState * cs ,
432427const char * data ,size_t dLen )
433428{
434- /*
435- * Any write function should do its own error checking but to make sure we
436- * do a check here as well...
437- */
438- if (cs -> writeF (AH ,data ,dLen )!= dLen )
439- exit_horribly (modulename ,
440- "could not write to output file: %s\n" ,
441- strerror (errno ));
442- return dLen ;
429+ cs -> writeF (AH ,data ,dLen );
430+ return ;
443431}
444432
445433
@@ -573,12 +561,27 @@ cfopen(const char *path, const char *mode, int compression)
573561int
574562cfread (void * ptr ,int size ,cfp * fp )
575563{
564+ int ret ;
565+
566+ if (size == 0 )
567+ return 0 ;
568+
576569#ifdef HAVE_LIBZ
577570if (fp -> compressedfp )
578- return gzread (fp -> compressedfp ,ptr ,size );
571+ {
572+ ret = gzread (fp -> compressedfp ,ptr ,size );
573+ if (ret != size && !gzeof (fp -> compressedfp ))
574+ exit_horribly (modulename ,
575+ "could not read from input file: %s\n" ,strerror (errno ));
576+ }
579577else
580578#endif
581- return fread (ptr ,1 ,size ,fp -> uncompressedfp );
579+ {
580+ ret = fread (ptr ,1 ,size ,fp -> uncompressedfp );
581+ if (ret != size && !feof (fp -> uncompressedfp ))
582+ READ_ERROR_EXIT (fp -> uncompressedfp );
583+ }
584+ return ret ;
582585}
583586
584587int
@@ -595,12 +598,31 @@ cfwrite(const void *ptr, int size, cfp *fp)
595598int
596599cfgetc (cfp * fp )
597600{
601+ int ret ;
602+
598603#ifdef HAVE_LIBZ
599604if (fp -> compressedfp )
600- return gzgetc (fp -> compressedfp );
605+ {
606+ ret = gzgetc (fp -> compressedfp );
607+ if (ret == EOF )
608+ {
609+ if (!gzeof (fp -> compressedfp ))
610+ exit_horribly (modulename ,
611+ "could not read from input file: %s\n" ,strerror (errno ));
612+ else
613+ exit_horribly (modulename ,
614+ "could not read from input file: end of file\n" );
615+ }
616+ }
601617else
602618#endif
603- return fgetc (fp -> uncompressedfp );
619+ {
620+ ret = fgetc (fp -> uncompressedfp );
621+ if (ret == EOF )
622+ READ_ERROR_EXIT (fp -> uncompressedfp );
623+ }
624+
625+ return ret ;
604626}
605627
606628char *