diff --git a/graphics/giflib/Makefile b/graphics/giflib/Makefile index 0e46ed90404c..586413ebb248 100644 --- a/graphics/giflib/Makefile +++ b/graphics/giflib/Makefile @@ -1,44 +1,44 @@ PORTNAME= giflib -PORTVERSION= 5.2.2 +PORTVERSION= 6.1.3 CATEGORIES= graphics -MASTER_SITES= SF/${PORTNAME} +MASTER_SITES= SF/${PORTNAME}/giflib-6.x MAINTAINER= desktop@FreeBSD.org COMMENT= Tools and library routines for working with GIF images WWW= https://sourceforge.net/projects/giflib/ LICENSE= MIT LICENSE_FILE= ${WRKSRC}/COPYING TEST_DEPENDS= ghead:sysutils/coreutils USES= cpe gmake CPE_VENDOR= giflib_project USE_LDCONFIG= yes MAKE_ARGS= CC=${CC} \ LDFLAGS="${LDFLAGS}" \ OFLAGS="${CFLAGS}" \ PREFIX="${PREFIX}" TEST_TARGET= check CFLAGS+= -DHAVE_REALLOCARRAY CONFLICTS_INSTALL= giftool OPTIONS_DEFINE= DOCS -do-install-DOCS-on: - ${MKDIR} ${STAGEDIR}${DOCSDIR} - cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR} \ - "! ( -name Makefile -o -name *\.[17] -o -name *\.xml )" - ${MV} ${STAGEDIR}${DOCSDIR}/index.html.in ${STAGEDIR}${DOCSDIR}/index.html - -pre-build: +post-extract: ${CP} ${FILESDIR}/giflib-logo.gif ${WRKSRC}/doc post-install: ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/* ${STRIP_CMD} --strip-unneeded ${STAGEDIR}${PREFIX}/lib/libgif.so.7.2.0 +post-install-DOCS-on: + ${MKDIR} ${STAGEDIR}${DOCSDIR} + cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR} \ + "! ( -name Makefile -o -name *\.[17] -o -name *\.xml )" + ${MV} ${STAGEDIR}${DOCSDIR}/index.html.in ${STAGEDIR}${DOCSDIR}/index.html + .include diff --git a/graphics/giflib/distinfo b/graphics/giflib/distinfo index 6cefa7643dcb..833ff3d86532 100644 --- a/graphics/giflib/distinfo +++ b/graphics/giflib/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1714225271 -SHA256 (giflib-5.2.2.tar.gz) = be7ffbd057cadebe2aa144542fd90c6838c6a083b5e8a9048b8ee3b66b29d5fb -SIZE (giflib-5.2.2.tar.gz) = 447175 +TIMESTAMP = 1784658362 +SHA256 (giflib-6.1.3.tar.gz) = b65b66b99f0424b93525f987386f22fc5efb9da2bfc92ad4a532249aaffbab0e +SIZE (giflib-6.1.3.tar.gz) = 470579 diff --git a/graphics/giflib/files/patch-CVE-2026-26740 b/graphics/giflib/files/patch-CVE-2026-26740 new file mode 100644 index 000000000000..08a6d9e241f8 --- /dev/null +++ b/graphics/giflib/files/patch-CVE-2026-26740 @@ -0,0 +1,31 @@ +commit 061605081115bbfd7019bafc119a13b6f17fcf25 +Author: Anthony Hurtado +Date: Mon Jun 1 15:40:48 2026 -0500 + + Fix CVE-2026-26740: heap OOB write in EGifGCBToSavedExtension + + EGifGCBToSavedExtension calls EGifGCBToExtension which unconditionally + writes 4 bytes into ep->Bytes without checking ep->ByteCount. If the + extension block was allocated with fewer than 4 bytes, this results in + a heap buffer overflow. + + The read-side counterpart DGifExtensionToGCB already validates that + GifExtensionLength == 4 before reading. Add the symmetric check on + the write side: return GIF_ERROR when ep->ByteCount < 4. + + Signed-off-by: Anthony Hurtado + +diff --git egif_lib.c egif_lib.c +index f1141a2..d74e8df 100644 +--- egif_lib.c ++++ egif_lib.c +@@ -690,6 +690,9 @@ int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB, + ExtensionBlock *ep = + &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; + if (ep->Function == GRAPHICS_EXT_FUNC_CODE) { ++ if (ep->ByteCount < 4) { ++ return GIF_ERROR; ++ } + EGifGCBToExtension(GCB, ep->Bytes); + return GIF_OK; + } diff --git a/graphics/giflib/files/patch-Makefile b/graphics/giflib/files/patch-Makefile deleted file mode 100644 index 4fc7a7f5c3df..000000000000 --- a/graphics/giflib/files/patch-Makefile +++ /dev/null @@ -1,33 +0,0 @@ ---- Makefile.orig 2024-02-19 01:01:50 UTC -+++ Makefile -@@ -64,13 +64,14 @@ MANUAL_PAGES = \ - LDLIBS=libgif.a -lm - - MANUAL_PAGES = \ -- doc/gif2rgb.xml \ -- doc/gifbuild.xml \ -- doc/gifclrmp.xml \ -- doc/giffix.xml \ -- doc/giflib.xml \ -- doc/giftext.xml \ -- doc/giftool.xml -+ doc/gif2rgb.1 \ -+ doc/gifbuild.1 \ -+ doc/gifclrmp.1 \ -+ doc/giffix.1 \ -+ doc/giftext.1 \ -+ doc/giftool.1 -+MAN7_PAGES= \ -+ doc/giflib.7 - - SOEXTENSION = so - LIBGIFSO = libgif.$(SOEXTENSION) -@@ -150,6 +151,8 @@ install-man: - install-man: - $(INSTALL) -d "$(DESTDIR)$(MANDIR)/man1" - $(INSTALL) -m 644 $(MANUAL_PAGES) "$(DESTDIR)$(MANDIR)/man1" -+ $(INSTALL) -d "$(DESTDIR)$(MANDIR)/man7" -+ $(INSTALL) -m 644 $(MAN7_PAGES) "$(DESTDIR)$(MANDIR)/man7" - uninstall: uninstall-man uninstall-include uninstall-lib uninstall-bin - uninstall-bin: - cd "$(DESTDIR)$(BINDIR)" && rm -f $(INSTALLABLE) diff --git a/graphics/giflib/files/patch-issue203 b/graphics/giflib/files/patch-issue203 new file mode 100644 index 000000000000..bbd8f72eabd1 --- /dev/null +++ b/graphics/giflib/files/patch-issue203 @@ -0,0 +1,21 @@ +commit 8abe475b7dde75961ea46b9cb69aa7d658d002f3 +Author: Eric S. Raymond +Date: Wed Jun 10 17:00:29 2026 -0400 + + Resolve ticket #203: GifUnionColorMap NULL Pointer Dereference + +diff --git gifalloc.c gifalloc.c +index 886907d..e36684b 100644 +--- gifalloc.c ++++ gifalloc.c +@@ -114,6 +114,10 @@ ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, + int i, j, CrntSlot, RoundUpTo, NewGifBitSize; + ColorMapObject *ColorUnion; + ++ if (ColorIn1 == NULL || ColorIn2 == NULL) { ++ return (NULL); ++ } ++ + /* + * We don't worry about duplicates within either color map; if + * the caller wants to resolve those, he can perform unions diff --git a/graphics/giflib/files/patch-overflows b/graphics/giflib/files/patch-overflows new file mode 100644 index 000000000000..7d7b935fe99b --- /dev/null +++ b/graphics/giflib/files/patch-overflows @@ -0,0 +1,225 @@ +commit 4a731eacbb1861e866e84024aba201f1cbf0f22f +Author: Anthony Hurtado +Date: Mon Jun 1 15:41:11 2026 -0500 + + Fix integer overflow and type safety issues across giflib + + Multiple integer overflow vulnerabilities exist in giflib's pixel count + and dimension arithmetic. On 32-bit platforms where long and int are + 32 bits, these overflow to negative values or wrap around, causing + heap buffer overflows, incorrect loop bounds, and undefined behavior. + + dgif_lib.c: + - PixelCount: cast to (unsigned long) instead of signed (long) to + prevent signed overflow UB on 32-bit platforms. + - LZW CodeSize: reject BitsPerPixel < 2 (CodeSize 0 and 1 create + degenerate LZW states where ClearCode/EOFCode are unreachable). + + egif_lib.c: + - PixelCount: same (unsigned long) fix as dgif_lib.c. + - EGifSpew: cast j to (size_t) in pointer arithmetic j * SavedWidth + to prevent int*int overflow in raster offset computation. + + gifalloc.c: + - GifApplyTranslation: use size_t for RasterSize and loop counter + instead of int to prevent Height*Width overflow. + - GifMakeSavedImage: cast Height to (size_t) in reallocarray nmemb + and memcpy size to prevent int*int overflow before reaching + reallocarray's internal overflow check. + + quantize.c: + - Compute PixelCount as (size_t)Width * Height with division-based + overflow guard. Use size_t loop counter for pixel iteration. + - Replace signed (long) cast of pixel count with (unsigned long). + + All 51 regression tests pass. Compiles with zero warnings under + -Wall -O2. + + Signed-off-by: Anthony Hurtado + +diff --git dgif_lib.c dgif_lib.c +index cec94c1..a022bb6 100644 +--- dgif_lib.c ++++ dgif_lib.c +@@ -416,7 +416,8 @@ int DGifGetImageHeader(GifFileType *GifFile) { + } + + Private->PixelCount = +- (long)GifFile->Image.Width * (long)GifFile->Image.Height; ++ (unsigned long)GifFile->Image.Width * ++ (unsigned long)GifFile->Image.Height; + + /* Reset decompress algorithm parameters. */ + return DGifSetupDecompress(GifFile); +@@ -824,7 +825,7 @@ static int DGifSetupDecompress(GifFileType *GifFile) { + BitsPerPixel = CodeSize; + + /* this can only happen on a severely malformed GIF */ +- if (BitsPerPixel > 8) { ++ if (BitsPerPixel < 2 || BitsPerPixel > 8) { + GifFile->Error = + D_GIF_ERR_READ_FAILED; /* somewhat bogus error code */ + return GIF_ERROR; /* Failed to read Code size. */ +diff --git egif_lib.c egif_lib.c +index d74e8df..6f7c9b6 100644 +--- egif_lib.c ++++ egif_lib.c +@@ -448,7 +448,8 @@ int EGifPutImageDesc(GifFileType *GifFile, const int Left, const int Top, + + /* Mark this file as has screen descriptor: */ + Private->FileState |= FILE_STATE_IMAGE; +- Private->PixelCount = (long)Width * (long)Height; ++ Private->PixelCount = ++ (unsigned long)Width * (unsigned long)Height; + + /* Reset compress algorithm parameters. */ + (void)EGifSetupCompress(GifFile); +@@ -1154,7 +1155,7 @@ int EGifSpew(GifFileType *GifFileOut, int *ErrorCode) { + j += InterlacedJumps[k]) { + if (EGifPutLine( + GifFileOut, +- sp->RasterBits + j * SavedWidth, ++ sp->RasterBits + (size_t)j * SavedWidth, + SavedWidth) == GIF_ERROR) { + status = GIF_ERROR; + err = GifFileOut->Error; +@@ -1165,7 +1166,7 @@ int EGifSpew(GifFileType *GifFileOut, int *ErrorCode) { + } else { + for (j = 0; j < SavedHeight; j++) { + if (EGifPutLine(GifFileOut, +- sp->RasterBits + j * SavedWidth, ++ sp->RasterBits + (size_t)j * SavedWidth, + SavedWidth) == GIF_ERROR) { + status = GIF_ERROR; + err = GifFileOut->Error; +diff --git gifalloc.c gifalloc.c +index 3d897ab..886907d 100644 +--- gifalloc.c ++++ gifalloc.c +@@ -210,9 +210,9 @@ ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, + Apply a given color translation to the raster bits of an image + *******************************************************************************/ + void GifApplyTranslation(SavedImage *Image, const GifPixelType Translation[]) { +- register int i; +- register int RasterSize = +- Image->ImageDesc.Height * Image->ImageDesc.Width; ++ size_t i; ++ size_t RasterSize = ++ (size_t)Image->ImageDesc.Height * Image->ImageDesc.Width; + + for (i = 0; i < RasterSize; i++) { + Image->RasterBits[i] = Translation[Image->RasterBits[i]]; +@@ -371,17 +371,17 @@ SavedImage *GifMakeSavedImage(GifFileType *GifFile, + /* next, the raster */ + sp->RasterBits = (unsigned char *)reallocarray( + NULL, +- (CopyFrom->ImageDesc.Height * +- CopyFrom->ImageDesc.Width), ++ (size_t)CopyFrom->ImageDesc.Height * ++ CopyFrom->ImageDesc.Width, + sizeof(GifPixelType)); + if (sp->RasterBits == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + memcpy(sp->RasterBits, CopyFrom->RasterBits, +- sizeof(GifPixelType) * +- CopyFrom->ImageDesc.Height * +- CopyFrom->ImageDesc.Width); ++ (size_t)CopyFrom->ImageDesc.Height * ++ CopyFrom->ImageDesc.Width * ++ sizeof(GifPixelType)); + + /* finally, the extension blocks */ + if (CopyFrom->ExtensionBlocks != NULL) { +diff --git quantize.c quantize.c +index 160a29b..4ea44ce 100644 +--- quantize.c ++++ quantize.c +@@ -71,6 +71,7 @@ int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + long Red, Green, Blue; + NewColorMapType NewColorSubdiv[256]; + QuantizedColorType *ColorArrayEntries, *QuantizedColor; ++ size_t k, PixelCount; + + ColorArrayEntries = (QuantizedColorType *)malloc( + sizeof(QuantizedColorType) * COLOR_ARRAY_SIZE); +@@ -78,6 +79,12 @@ int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + return GIF_ERROR; + } + ++ PixelCount = (size_t)Width * Height; ++ if (Width != 0 && PixelCount / Width != Height) { ++ free((char *)ColorArrayEntries); ++ return GIF_ERROR; ++ } ++ + for (i = 0; i < COLOR_ARRAY_SIZE; i++) { + ColorArrayEntries[i].RGB[0] = i >> (2 * BITS_PER_PRIM_COLOR); + ColorArrayEntries[i].RGB[1] = +@@ -87,12 +94,12 @@ int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + } + + /* Sample the colors and their distribution: */ +- for (i = 0; i < (int)(Width * Height); i++) { +- Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) ++ for (k = 0; k < PixelCount; k++) { ++ Index = ((RedInput[k] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + +- ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) ++ ((GreenInput[k] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + +- (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); ++ (BlueInput[k] >> (8 - BITS_PER_PRIM_COLOR)); + ColorArrayEntries[Index].Count++; + } + +@@ -127,7 +134,7 @@ int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + + NewColorSubdiv[0].NumEntries = + NumOfEntries; /* Different sampled colors */ +- NewColorSubdiv[0].Count = ((long)Width) * Height; /* Pixels */ ++ NewColorSubdiv[0].Count = (unsigned long)PixelCount; /* Pixels */ + NewColorMapSize = 1; + if (SubdivColorMap(NewColorSubdiv, *ColorMapSize, &NewColorMapSize) != + GIF_OK) { +@@ -167,28 +174,28 @@ int GifQuantizeBuffer(unsigned int Width, unsigned int Height, + /* Finally scan the input buffer again and put the mapped index in the + * output buffer. */ + MaxRGBError[0] = MaxRGBError[1] = MaxRGBError[2] = 0; +- for (i = 0; i < (int)(Width * Height); i++) { +- Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) ++ for (k = 0; k < PixelCount; k++) { ++ Index = ((RedInput[k] >> (8 - BITS_PER_PRIM_COLOR)) + << (2 * BITS_PER_PRIM_COLOR)) + +- ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) ++ ((GreenInput[k] >> (8 - BITS_PER_PRIM_COLOR)) + << BITS_PER_PRIM_COLOR) + +- (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); ++ (BlueInput[k] >> (8 - BITS_PER_PRIM_COLOR)); + Index = ColorArrayEntries[Index].NewColorIndex; +- OutputBuffer[i] = Index; ++ OutputBuffer[k] = Index; + if (MaxRGBError[0] < +- ABS(OutputColorMap[Index].Red - RedInput[i])) { ++ ABS(OutputColorMap[Index].Red - RedInput[k])) { + MaxRGBError[0] = +- ABS(OutputColorMap[Index].Red - RedInput[i]); ++ ABS(OutputColorMap[Index].Red - RedInput[k]); + } + if (MaxRGBError[1] < +- ABS(OutputColorMap[Index].Green - GreenInput[i])) { ++ ABS(OutputColorMap[Index].Green - GreenInput[k])) { + MaxRGBError[1] = +- ABS(OutputColorMap[Index].Green - GreenInput[i]); ++ ABS(OutputColorMap[Index].Green - GreenInput[k]); + } + if (MaxRGBError[2] < +- ABS(OutputColorMap[Index].Blue - BlueInput[i])) { ++ ABS(OutputColorMap[Index].Blue - BlueInput[k])) { + MaxRGBError[2] = +- ABS(OutputColorMap[Index].Blue - BlueInput[i]); ++ ABS(OutputColorMap[Index].Blue - BlueInput[k]); + } + } + diff --git a/graphics/giflib/files/patch-tests_makefile b/graphics/giflib/files/patch-tests_makefile index dbabec4d495a..77a41e082f31 100644 --- a/graphics/giflib/files/patch-tests_makefile +++ b/graphics/giflib/files/patch-tests_makefile @@ -1,15 +1,14 @@ ---- tests/makefile.orig 2019-03-28 17:05:25 UTC +--- tests/makefile.orig 2026-04-12 17:17:27 UTC +++ tests/makefile -@@ -104,10 +106,10 @@ giffilter-regress: +@@ -106,9 +106,9 @@ giffix-rebuild: giffix-rebuild: @echo "Rebuilding giffix test." - @head --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d >giffixed.ico + @ghead --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d >giffixed.ico giffix-regress: - @echo "giffix: Testing giffix behavior" -- @head --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d | diff -u giffixed.ico - -+ @ghead --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d | diff -u giffixed.ico - +- @head --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d | ./tapdiffer "giffix: Testing giffix behavior" giffixed.ico ++ @ghead --bytes=-20 <$(PICS)/treescap.gif | $(UTILS)/giffix 2>/dev/null | $(UTILS)/gifbuild -d | ./tapdiffer "giffix: Testing giffix behavior" giffixed.ico gifinto-regress: - @echo "gifinto: Checking behavior on short files." + @rm -f $@.giflib.tmp diff --git a/graphics/giflib/pkg-plist b/graphics/giflib/pkg-plist index d36ad8b139db..a8b86b6d861c 100644 --- a/graphics/giflib/pkg-plist +++ b/graphics/giflib/pkg-plist @@ -1,76 +1,93 @@ -bin/gif2rgb bin/gifbuild bin/gifclrmp bin/giffix bin/giftext bin/giftool include/gif_lib.h lib/libgif.a lib/libgif.so lib/libgif.so.7 lib/libgif.so.7.2.0 %%PORTDOCS%%%%DOCSDIR%%/00README %%PORTDOCS%%%%DOCSDIR%%/gif2rgb.html %%PORTDOCS%%%%DOCSDIR%%/gif_lib.html %%PORTDOCS%%%%DOCSDIR%%/gifbg.html %%PORTDOCS%%%%DOCSDIR%%/gifbuild.html %%PORTDOCS%%%%DOCSDIR%%/gifclrmp.html %%PORTDOCS%%%%DOCSDIR%%/gifcolor.html %%PORTDOCS%%%%DOCSDIR%%/gifecho.html %%PORTDOCS%%%%DOCSDIR%%/giffilter.html %%PORTDOCS%%%%DOCSDIR%%/giffix.html %%PORTDOCS%%%%DOCSDIR%%/gifhisto.html %%PORTDOCS%%%%DOCSDIR%%/gifinto.html %%PORTDOCS%%%%DOCSDIR%%/giflib-logo.gif %%PORTDOCS%%%%DOCSDIR%%/giflib.html %%PORTDOCS%%%%DOCSDIR%%/gifsponge.html %%PORTDOCS%%%%DOCSDIR%%/gifstandard/GIF89a.html %%PORTDOCS%%%%DOCSDIR%%/gifstandard/LZW-and-GIF-explained.html %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif-1over100.png %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif-1over64.png %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif-aspectratio.png %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif87.txt %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif89.txt %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif89a.css %%PORTDOCS%%%%DOCSDIR%%/gifstandard/gif89a.js %%PORTDOCS%%%%DOCSDIR%%/gifstandard/main.css %%PORTDOCS%%%%DOCSDIR%%/giftext.html %%PORTDOCS%%%%DOCSDIR%%/giftool.html %%PORTDOCS%%%%DOCSDIR%%/gifwedge.html +%%PORTDOCS%%%%DOCSDIR%%/html/gif2rgb.html +%%PORTDOCS%%%%DOCSDIR%%/html/gif_lib.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifbg.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifbuild.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifclrmp.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifcolor.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifecho.html +%%PORTDOCS%%%%DOCSDIR%%/html/giffilter.html +%%PORTDOCS%%%%DOCSDIR%%/html/giffix.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifhisto.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifinto.html +%%PORTDOCS%%%%DOCSDIR%%/html/giflib-logo.gif +%%PORTDOCS%%%%DOCSDIR%%/html/giflib.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifsponge.html +%%PORTDOCS%%%%DOCSDIR%%/html/giftext.html +%%PORTDOCS%%%%DOCSDIR%%/html/giftool.html +%%PORTDOCS%%%%DOCSDIR%%/html/gifwedge.html +%%PORTDOCS%%%%DOCSDIR%%/html/index.html +%%PORTDOCS%%%%DOCSDIR%%/html/intro.html %%PORTDOCS%%%%DOCSDIR%%/index.html %%PORTDOCS%%%%DOCSDIR%%/intro.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/animation_and_transparency.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/bits_and_bytes.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/comment_ext.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/gif_file_stream.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/global_color_table.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/graphic_control_ext.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/header_block.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/image_data_block.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/image_descriptor_block.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/index.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/logical_screen_desc_block.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/lzw_decoding_bytes.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/lzw_encoding_codes.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/lzw_image_data.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/lzw_image_data_code_table.html %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_1.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_1_enlarged.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_1_trans.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_1_trans_blue.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_1_trans_red.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_animation.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_animation_green.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_animation_red.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_animation_yellow.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_green_large.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_green_yellow_diff.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/sample_2_yellow_large.gif %%PORTDOCS%%%%DOCSDIR%%/whatsinagif/trailer_block.gif -share/man/man1/gif2rgb.1.gz share/man/man1/gifbuild.1.gz share/man/man1/gifclrmp.1.gz share/man/man1/giffix.1.gz share/man/man1/giftext.1.gz share/man/man1/giftool.1.gz share/man/man7/giflib.7.gz