AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
October 1994

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



Thread

1994.10.21 15:50 "Problems catching write errors in tiff library (v3.3beta021)", by Ben Griffin
1994.10.21 17:12 "Re: Problems catching write errors in tiff library (v3.3beta021)", by Dan Mccoy
1994.10.21 18:53 "Re: Problems catching write errors in tiff library (v3.3beta021)", by John Bradley
1994.10.21 18:32 "Re: Problems catching write errors in tiff library (v3.3beta021)", by Richard Minner
1994.10.21 19:13 "Re: Problems catching write errors in tiff library (v3.3beta021)", by Sam Leffler
1994.10.21 19:16 "Re: Problems catching write errors in tiff library (v3.3beta021)", by Sam Leffler

1994.10.21 15:50 "Problems catching write errors in tiff library (v3.3beta021)", by Ben Griffin

Version: 3.3beta021  Host: Sparc Solaris 2.3  

There seems to have an incongruity in the return types of the tiff_encoderow
functions as follows.  

   TIFFNoRowEncode returns -1 on failure.
   DumpModeEncode  returns -1 on failure.
   Fax3Encode      returns  0 on failure.
   Fax4Encode      returns  0 on failure.
   LZWEncode       returns  0 on failure.
   PackBitsEncode  returns -1 on failure.
  
This can cause TIFFWriteScanLine to return a non -1 value (0) which
does not indicate an error.  I discovered this after running disk full
tests with our app which uses the tiff library.
I guess you are safe if you check for a success return value (1) from
TIFFWriteScanLine, but I happend to be checking for the failure which
is -1 according to the man page (I guess that is why it's beta eh?).

The fix (kludge) I put in tif_write to aleviate this is:
line 155:  (second to last line in TIFFWriteScanLine)
  if ( status == 0 ) status = -1;


Other areas that could cause uncaught errors:

   o TIFFClose should return an error value. 
     Now it only a void, but a TIFFFlushData can happen during the call
     so it should return the results of that.

     I'm not sure if it is ok to assume that -1 is failure from TIFFCloseFile()
     since that might not always be the unix close command.

   o In tif_fax3.h the Fax3FlushBits macro calls TIFFFlushData1
     without checking return value. Then each function that uses Fax3FlushBits
     should return a value.

Here are the diffs for my fixes:

cvs diff: Diffing .
===================================================================
RCS file: tif_close.c,v
retrieving revision 1.2
diff -r1.2 tif_close.c
32c32
< void
---
> int
34a35
>    int status = 1;
39c40
<               TIFFFlush(tif);
---
>       if (!TIFFFlush(tif)) status = 0;
47c48
<       (void) TIFFCloseFile(tif);
---
>       if (TIFFCloseFile(tif)==-1) status = 0;
48a50
>    return status;
===================================================================
RCS file: tif_fax3.c,v
retrieving revision 1.3
diff -r1.3 tif_fax3.c
703c703
< void
---
> int
718a719
>    return 1;
724c725
< static void
---
> static int
727c728
<       Fax3PutBits(tif, te->code, te->length);
---
>       return Fax3PutBits(tif, te->code, te->length);
736c737
< static void
---

> static int
741c742
<               putcode(tif, te);
---
>               if (!putcode(tif, te)) return 0;
747c748
<               putcode(tif, te);
---
>               if (!putcode(tif, te)) return 0;
750c751
<       putcode(tif, &tab[span]);
---
>       return putcode(tif, &tab[span]);
759c760
< void
---
> int
776c777
<                       Fax3PutBits(tif, 0, align);
---
>                       if (!Fax3PutBits(tif, 0, align))return 0;
779c780
<       Fax3PutBits(tif, EOL, 12);
---
>       if (!Fax3PutBits(tif, EOL, 12))return 0;
781c782,783
<               Fax3PutBits(tif, sp->tag == G3_1D, 1);
---
>               if (!Fax3PutBits(tif, sp->tag == G3_1D, 1))return 0;
>    return 1;
878c880
<               putspan(tif, span, TIFFFaxWhiteCodes);
---
>               if ( !putspan(tif, span, TIFFFaxWhiteCodes)) return 0;
883c885
<               putspan(tif, span, TIFFFaxBlackCodes);
---
>               if (!putspan(tif, span, TIFFFaxBlackCodes)) return 0;
889c891
<               Fax3PutBits(tif, 0, sp->b.bit);
---
>               if (!Fax3PutBits(tif, 0, sp->b.bit)) return 0;
891c893
<                       Fax3PutBits(tif, 0, 8);
---
>                       if (!Fax3PutBits(tif, 0, 8))return 0;
929c931
<                               putcode(tif, &horizcode);
---
>                               if (!putcode(tif, &horizcode)) return 0;
931,932c933,934
<                                       putspan(tif, a1-a0, TIFFFaxWhiteCodes);
<                                       putspan(tif, a2-a1, TIFFFaxBlackCodes);
---
>                                       if (!putspan(tif, a1-a0, TIFFFaxWhiteCodes))return 0;
>                                       if (!putspan(tif, a2-a1, TIFFFaxBlackCodes))return 0;
934,935c936,937

<                                       putspan(tif, a1-a0, TIFFFaxBlackCodes);
<                                       putspan(tif, a2-a1, TIFFFaxWhiteCodes);
---
>                                       if (!putspan(tif, a1-a0, TIFFFaxBlackCodes))return 0;
>                                       if (!putspan(tif, a2-a1, TIFFFaxWhiteCodes))return 0;
939c941
<                               putcode(tif, &vcodes[d+3]);
---
>                               if (!putcode(tif, &vcodes[d+3])) return 0;
943c945
<                       putcode(tif, &passcode);
---
>                       if (!putcode(tif, &passcode)) return 0;
966c968
<                       Fax3PutEOL(tif);
---
>                       if (!Fax3PutEOL(tif))return 0;
1004c1006
< static void
---
> static int
1010c1012
<                   Fax3PutBits(tif, EOL, 12);
---
>                   if (!Fax3PutBits(tif, EOL, 12))return 0;
1012c1014
<                           Fax3PutBits(tif, 1, 1);
---
>                           if (!Fax3PutBits(tif, 1, 1))return 0;
1015a1018
>    return 1;
===================================================================
RCS file: tif_fax3.h,v
retrieving revision 1.2
diff -r1.2 tif_fax3.h
58,59c58,59
< extern        void Fax3PutBits(TIFF*, u_int, u_int);
< extern        void Fax3PutEOL(TIFF*);
---
> extern        int Fax3PutBits(TIFF*, u_int, u_int);
> extern        int Fax3PutEOL(TIFF*);
64c64
<               (void) TIFFFlushData1(tif);             \
---
>       if ( TIFFFlushData1(tif) == 0 ) return 0;               \
===================================================================
RCS file: tif_fax4.c,v
retrieving revision 1.2
diff -r1.2 tif_fax4.c
80c80
< static
---
> static int
86,87c86,87
<       Fax3PutBits(tif, EOL, 12);
<       Fax3PutBits(tif, EOL, 12);
---
>       if ( !Fax3PutBits(tif, EOL, 12))return 0;
>       if ( !Fax3PutBits(tif, EOL, 12))return 0;
===================================================================
RCS file: tif_write.c,v
retrieving revision 1.2
diff -r1.2 tif_write.c
154a155
>    if ( status == 0 ) status = -1;
===================================================================
RCS file: tiffio.h,v
retrieving revision 1.2
diff -r1.2 tiffio.h
117c117
< extern        void TIFFClose(TIFF*);
---
> extern        int TIFFClose(TIFF*);



===================================================================

On another subject, there was some talk earlier about rewriting
the tiff library in C++.  Any progress on this?  Want any help ?


Ben Griffin
Harris Criminal Justice Products
griffin@sur1a.hisd.hpsc.harris.com