From 07818e9356fcb37059e203d9ef64542ffb0faac4 Mon Sep 17 00:00:00 2001 From: Andrey Kiselev Date: Mon, 14 Apr 2008 09:05:25 +0000 Subject: [PATCH] Get rid of some of "dereferencing type-punned" warnings by converting tdir_offset field of TIFFDirEntry structure into union. --- libtiff/tif_dirread.c | 38 ++++++++++++++++---------------------- libtiff/tif_dirwrite.c | 8 ++++---- libtiff/tiffiop.h | 8 ++++++-- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/libtiff/tif_dirread.c b/libtiff/tif_dirread.c index 605e4829..6eab9c7b 100644 --- a/libtiff/tif_dirread.c +++ b/libtiff/tif_dirread.c @@ -1,4 +1,4 @@ -/* $Id: tif_dirread.c,v 1.140 2008-04-09 08:58:11 dron Exp $ */ +/* $Id: tif_dirread.c,v 1.141 2008-04-14 09:05:25 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -751,8 +751,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* d else { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data); @@ -770,8 +769,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* d else { enum TIFFReadDirEntryErr err; - uint64 offset; - offset=direntry->tdir_offset; + uint64 offset = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(&offset); err=TIFFReadDirEntryData(tif,offset,(tmsize_t)datasize,data); @@ -2757,7 +2755,8 @@ static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8 static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value) { - *value=*(uint16*)(&direntry->tdir_offset); + *value = direntry->tdir_offset.toff_short; + //*value=*(uint16*)(&direntry->tdir_offset); if (tif->tif_flags&TIFF_SWAB) TIFFSwabShort(value); } @@ -2788,8 +2787,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirE if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); @@ -2797,7 +2795,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirE return(err); } else - *value=direntry->tdir_offset; + *value = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8(value); return(TIFFReadDirEntryErrOk); @@ -2808,8 +2806,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDir if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); @@ -2832,8 +2829,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFD if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,m); @@ -2841,7 +2837,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFD return(err); } else - *(uint64*)m=direntry->tdir_offset; + *(uint64*)m = direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m,2); if (m[0]==0) @@ -2861,8 +2857,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFF if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,m); @@ -2870,7 +2865,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFF return(err); } else - *(uint64*)m=direntry->tdir_offset; + *(uint64*)m=direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabArrayOfLong(m,2); if ((int32)m[0]==0) @@ -2896,8 +2891,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDir if (!(tif->tif_flags&TIFF_BIGTIFF)) { enum TIFFReadDirEntryErr err; - uint32 offset; - offset=*(uint32*)(&direntry->tdir_offset); + uint32 offset = direntry->tdir_offset.toff_long; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong(&offset); err=TIFFReadDirEntryData(tif,offset,8,value); @@ -2905,7 +2899,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDir return(err); } else - *(uint64*)value=direntry->tdir_offset; + *(uint64*)value=direntry->tdir_offset.toff_long8; if (tif->tif_flags&TIFF_SWAB) TIFFSwabLong8((uint64*)value); return(TIFFReadDirEntryErrOk); @@ -4526,7 +4520,7 @@ TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, TIFFSwabLong8((uint64*)ma); mb->tdir_count=*(uint64*)ma; ma+=sizeof(uint64); - mb->tdir_offset=*(uint64*)ma; + mb->tdir_offset.toff_long8=*(uint64*)ma; ma+=sizeof(uint64); } mb++; @@ -5252,7 +5246,7 @@ TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir) } else { - *(uint64*)m=dir->tdir_offset; + *(uint64*)m=dir->tdir_offset.toff_long8; err=TIFFReadDirEntryErrOk; } } diff --git a/libtiff/tif_dirwrite.c b/libtiff/tif_dirwrite.c index e94770a6..2fdf944d 100644 --- a/libtiff/tif_dirwrite.c +++ b/libtiff/tif_dirwrite.c @@ -1,4 +1,4 @@ -/* $Id: tif_dirwrite.c,v 1.66 2008-04-10 11:08:48 dron Exp $ */ +/* $Id: tif_dirwrite.c,v 1.67 2008-04-14 09:05:26 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -2120,7 +2120,7 @@ TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag dir[m].tdir_tag=tag; dir[m].tdir_type=datatype; dir[m].tdir_count=count; - dir[m].tdir_offset=0; + dir[m].tdir_offset.toff_long8 = 0; if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U)) _TIFFmemcpy(&dir[m].tdir_offset,data,datalength); else @@ -2159,9 +2159,9 @@ TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag } else { - dir[m].tdir_offset=na; + dir[m].tdir_offset.toff_long8 = na; if (tif->tif_flags&TIFF_SWAB) - TIFFSwabLong8(&dir[m].tdir_offset); + TIFFSwabLong8(&dir[m].tdir_offset.toff_long8); } } (*ndir)++; diff --git a/libtiff/tiffiop.h b/libtiff/tiffiop.h index fb2f4381..d05fcbf7 100644 --- a/libtiff/tiffiop.h +++ b/libtiff/tiffiop.h @@ -1,4 +1,4 @@ -/* $Id: tiffiop.h,v 1.72 2008-04-10 11:08:48 dron Exp $ */ +/* $Id: tiffiop.h,v 1.73 2008-04-14 09:05:26 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -86,7 +86,11 @@ typedef struct { uint16 tdir_tag; /* see below */ uint16 tdir_type; /* data type; see below */ uint64 tdir_count; /* number of items; length in spec */ - uint64 tdir_offset; + union { + uint16 toff_short; + uint32 toff_long; + uint64 toff_long8; + } tdir_offset; /* either offset or the data itself if fits */ } TIFFDirEntry; typedef struct client_info {