GraphicsMagick: Fixes based on Coverity analysis.
GraphicsMagick Commits <[email protected]>
| Newsgroups | gmane.comp.video.graphicsmagick.cvs |
|---|---|
| Message-ID | <mailman.11467.1648821920.1506.graphicsmagick-commit@lists.sourceforge.net> |
changeset 8c5fdda5297d in /hg/GraphicsMagick details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=8c5fdda5297d summary: Fixes based on Coverity analysis. diffstat: ChangeLog | 22 ++++++++++++++ Makefile.am | 8 +++-- Makefile.in | 8 +++-- VisualMagick/installer/inc/version.isx | 4 +- coders/jp2.c | 25 ++++++++++++---- magick/error.c | 32 ++++++++++++++++---- magick/gradient.c | 8 ++++- magick/locale.c | 4 +- magick/magick_types.h.in | 51 ++++++++++++++++++++------------- magick/render.c | 6 ++-- magick/resize.c | 3 +- magick/version.h | 4 +- magick/xwindow.c | 9 +++++- www/Changelog.html | 18 ++++++++++++ www/Changes.html | 2 +- www/Changes.rst | 2 +- www/links.html | 7 ++++ www/links.rst | 3 ++ 18 files changed, 163 insertions(+), 53 deletions(-) diffs (truncated from 525 to 500 lines): diff -r 230c7f549ba5 -r 8c5fdda5297d ChangeLog --- a/ChangeLog Sat Mar 26 13:22:31 2022 -0500 +++ b/ChangeLog Fri Apr 01 09:04:54 2022 -0500 @@ -1,3 +1,25 @@ +2022-04-01 Bob Friesenhahn <[email protected]> + + * magick/error.c (ThrowLoggedException): Silence Coverity 376912 + "Dereference after null check (FORWARD_NULL)". + + * coders/jp2.c (ReadJP2Image): Silence Coverity 264883 "Division + or modulo by float zero (DIVIDE_BY_ZERO)". + (ReadJP2Image): Fix Coverity 376911 "Improper use of negative + value (NEGATIVE_RETURNS)". + + * magick/xwindow.c (MagickXMakeMagnifyImage): Fix Coverity 376906 + "Division or modulo by zero (DIVIDE_BY_ZERO)". + + * magick/resize.c (ScaleImage): Fix Coverity 376908 "Resource leak + (RESOURCE_LEAK)". + + * magick/locale.c (GetLocaleMessageFromTag): Fix Coverity 376907 + "Out-of-bounds read (OVERRUN)". + + * magick/render.c (DrawPrimitive): Fix Coverity 376904 + "Out-of-bounds access (OVERRUN)". + 2022-03-26 Bob Friesenhahn <[email protected]> * version.sh: Prepare for 1.3.38 release. diff -r 230c7f549ba5 -r 8c5fdda5297d Makefile.am --- a/Makefile.am Sat Mar 26 13:22:31 2022 -0500 +++ b/Makefile.am Fri Apr 01 09:04:54 2022 -0500 @@ -1,4 +1,4 @@ -# Copyright (C) 2004-2021 GraphicsMagick Group +# Copyright (C) 2004-2022 GraphicsMagick Group # # This program is covered by multiple licenses, which are described in # Copyright.txt. You should have received a copy of Copyright.txt with this @@ -425,12 +425,13 @@ COVERITY_TARBALL=GraphicsMagick.xz COVERITY_VERSION=snapshot-@PACKAGE_CHANGE_DATE@ COVERITY_DESCRIPTION='Ubuntu Q@QuantumDepth@' -# New URL is https://brb.synopsys.com/?project=GraphicsMagick +COVERITY_COV_INT='cov-int' +# New URL is https://scan.coverity.com/projects/graphicsmagick?tab=overview coverity: $(MAKE) clean cov-build --dir cov-int $(MAKE) tar caf $(COVERITY_TARBALL) cov-int - curl --limit-rate 50K \ + curl --limit-rate 34K \ --form token=`cat $$HOME/.coverity_key_gm` \ --form email=$(COVERITY_EMAIL) \ --form file=@$(COVERITY_TARBALL) \ @@ -438,6 +439,7 @@ --form description=$(COVERITY_DESCRIPTION) \ https://scan.coverity.com/builds?project=GraphicsMagick $(RM) $(COVERITY_TARBALL) + $(RM) -rf $(COVERITY_COV_INT) # Rules for a profiled build (according to Paolo Bonzini <[email protected]>) #.PHONY: profile diff -r 230c7f549ba5 -r 8c5fdda5297d Makefile.in --- a/Makefile.in Sat Mar 26 13:22:31 2022 -0500 +++ b/Makefile.in Fri Apr 01 09:04:54 2022 -0500 @@ -14,7 +14,7 @@ @SET_MAKE@ -# Copyright (C) 2004-2021 GraphicsMagick Group +# Copyright (C) 2004-2022 GraphicsMagick Group # # This program is covered by multiple licenses, which are described in # Copyright.txt. You should have received a copy of Copyright.txt with this @@ -4927,6 +4927,7 @@ COVERITY_TARBALL = GraphicsMagick.xz COVERITY_VERSION = snapshot-@PACKAGE_CHANGE_DATE@ COVERITY_DESCRIPTION = 'Ubuntu Q@QuantumDepth@' +COVERITY_COV_INT = 'cov-int' # Rules for a profiled build (according to Paolo Bonzini <[email protected]>) #.PHONY: profile @@ -11445,12 +11446,12 @@ @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@ done @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@ cp $(top_srcdir)/ChangeLog $(SNAPSHOT_DIRECTORY)/ChangeLog.txt @HasGRAPHICSMAGICK_SNAPSHOT_COPY_FALSE@ cp $(top_srcdir)/www/Changelog.html $(SNAPSHOT_DIRECTORY)/ChangeLog.html -# New URL is https://brb.synopsys.com/?project=GraphicsMagick +# New URL is https://scan.coverity.com/projects/graphicsmagick?tab=overview coverity: $(MAKE) clean cov-build --dir cov-int $(MAKE) tar caf $(COVERITY_TARBALL) cov-int - curl --limit-rate 50K \ + curl --limit-rate 34K \ --form token=`cat $$HOME/.coverity_key_gm` \ --form email=$(COVERITY_EMAIL) \ --form file=@$(COVERITY_TARBALL) \ @@ -11458,6 +11459,7 @@ --form description=$(COVERITY_DESCRIPTION) \ https://scan.coverity.com/builds?project=GraphicsMagick $(RM) $(COVERITY_TARBALL) + $(RM) -rf $(COVERITY_COV_INT) # Build symbols files to add 'gm' prefix to functions gmsymbols: diff -r 230c7f549ba5 -r 8c5fdda5297d VisualMagick/installer/inc/version.isx --- a/VisualMagick/installer/inc/version.isx Sat Mar 26 13:22:31 2022 -0500 +++ b/VisualMagick/installer/inc/version.isx Fri Apr 01 09:04:54 2022 -0500 @@ -10,5 +10,5 @@ #define public MagickPackageName "GraphicsMagick" #define public MagickPackageVersion "1.4" -#define public MagickPackageVersionAddendum ".020220326" -#define public MagickPackageReleaseDate "snapshot-20220326" +#define public MagickPackageVersionAddendum ".020220401" +#define public MagickPackageReleaseDate "snapshot-20220401" diff -r 230c7f549ba5 -r 8c5fdda5297d coders/jp2.c --- a/coders/jp2.c Sat Mar 26 13:22:31 2022 -0500 +++ b/coders/jp2.c Fri Apr 01 09:04:54 2022 -0500 @@ -725,6 +725,10 @@ /* Get current seek position (normally 0) */ pos=TellBlob(image); + if (pos < 0) + { + ThrowJP2ReaderException(BlobError,UnableToObtainOffset,image); + } /* Read header */ if ((magick_length=ReadBlob(image,sizeof(magick),magick)) != sizeof(magick)) @@ -1007,23 +1011,32 @@ */ for (component=0; component < (long) number_components; component++) { - unsigned long + double + scale_to_quantum; + + unsigned int component_depth, i, max_value; - double - scale_to_quantum; - component_depth=jas_image_cmptprec(jp2_image,components[component]); - max_value=MaxValueGivenBits(component_depth); + if ((0 == component_depth) || (component_depth > 16)) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + "Component %u depth is %u!", + component, component_depth); + ThrowJP2ReaderException(CorruptImageError,ImproperImageHeader,image); + } + max_value=(unsigned int) MaxValueGivenBits(component_depth); + if ((0 == max_value) || (max_value > 65535)) + ThrowJP2ReaderException(CorruptImageError,ImproperImageHeader,image); scale_to_quantum=MaxRGBDouble/max_value; (void) LogMagickEvent(CoderEvent,GetMagickModule(), "Channel %d scale is %g", component, scale_to_quantum); channel_lut[component]=MagickAllocateResourceLimitedArray(Quantum *, (size_t) max_value+1,sizeof(Quantum)); if (channel_lut[component] == (Quantum *) NULL) ThrowJP2ReaderException(ResourceLimitError,MemoryAllocationFailed,image); - for(i=0; i <= max_value; i++) + for (i=0; i <= max_value; i++) (channel_lut[component])[i]=scale_to_quantum*i+0.5; } diff -r 230c7f549ba5 -r 8c5fdda5297d magick/error.c --- a/magick/error.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/error.c Fri Apr 01 09:04:54 2022 -0500 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003-2019 GraphicsMagick Group +% Copyright (C) 2003-2022 GraphicsMagick Group % Copyright (C) 2002 ImageMagick Studio % Copyright 1991-1999 E. I. du Pont de Nemours and Company % @@ -1030,15 +1030,24 @@ if (reason) { if (description) - (void) LogMagickEvent(severity,module,function,line,"Ignored: %.1024s (%.1024s)", + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line,"Ignored: %.1024s (%.1024s)", reason,description); else - (void) LogMagickEvent(severity,module,function,line,"Ignored: %.1024s", + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line,"Ignored: %.1024s", reason); } else { - (void) LogMagickEvent(severity,module,function,line, + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line, "Ignored: exception contains no reason!"); } ignore=MagickTrue; @@ -1085,15 +1094,24 @@ if (exception->reason) { if (exception->description) - (void) LogMagickEvent(severity,module,function,line,"%.1024s (%.1024s)", + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line,"%.1024s (%.1024s)", exception->reason,exception->description ); else - (void) LogMagickEvent(severity,module,function,line,"%.1024s", + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line,"%.1024s", exception->reason); } else { - (void) LogMagickEvent(severity,module,function,line, + (void) LogMagickEvent(severity, + module != NULL ? module : "", + function != NULL ? function : "", + line, "exception contains no reason!"); } } diff -r 230c7f549ba5 -r 8c5fdda5297d magick/gradient.c --- a/magick/gradient.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/gradient.c Fri Apr 01 09:04:54 2022 -0500 @@ -189,7 +189,13 @@ ThrowBinaryException(ResourceLimitError,MemoryAllocationFailed, image->filename); if (span <= MaxColormapSize) - AllocateImageColormap(image,(unsigned long) span); + if (!AllocateImageColormap(image,(unsigned long) span)) + { + MagickFreeMemory(pixel_packets); + ThrowException3(&image->exception, ResourceLimitError,MemoryAllocationFailed, + UnableToConstituteImage); + return MagickFail; + } /* Generate gradient pixels using alpha blending diff -r 230c7f549ba5 -r 8c5fdda5297d magick/locale.c --- a/magick/locale.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/locale.c Fri Apr 01 09:04:54 2022 -0500 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003, 2004 GraphicsMagick Group +% Copyright (C) 2003 - 2022 GraphicsMagick Group % % This program is covered by multiple licenses, which are described in % Copyright.txt. You should have received a copy of Copyright.txt with this @@ -198,7 +198,7 @@ (void) strlcpy(category,tag,MaxTextExtent); ChopLocaleComponents(category,2); - for (k=0; k < ArraySize(category_map); k++) + for (k=0; k < ArraySize(category_map)-1; k++) { if (LocaleCompare(category,category_map[k].name) == 0) { diff -r 230c7f549ba5 -r 8c5fdda5297d magick/magick_types.h.in --- a/magick/magick_types.h.in Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/magick_types.h.in Fri Apr 01 09:04:54 2022 -0500 @@ -113,36 +113,47 @@ #else /* The following typedefs are subtituted when using Unixish configure */ - typedef @INT8_T@ magick_int8_t; - typedef @UINT8_T@ magick_uint8_t; + typedef @INT8_T@ magick_int8_t; /* int8_t */ + typedef @UINT8_T@ magick_uint8_t; /* uint8_t */ - typedef @INT16_T@ magick_int16_t; - typedef @UINT16_T@ magick_uint16_t; + typedef @INT16_T@ magick_int16_t; /* int16_t */ + typedef @UINT16_T@ magick_uint16_t; /* uint16_t */ - typedef @INT32_T@ magick_int32_t; - typedef @UINT32_T@ magick_uint32_t; + typedef @INT32_T@ magick_int32_t; /* int32_t */ + typedef @UINT32_T@ magick_uint32_t; /* uint32_t */ - typedef @INT64_T@ magick_int64_t; - typedef @UINT64_T@ magick_uint64_t; + typedef @INT64_T@ magick_int64_t; /* int64_t */ + typedef @UINT64_T@ magick_uint64_t; /* uint64_t */ # if defined(MAGICK_IMPLEMENTATION) -# define MAGICK_INT32_F @INT32_F@ -# define MAGICK_UINT32_F @UINT32_F@ -# define MAGICK_INT64_F @INT64_F@ -# define MAGICK_UINT64_F @UINT64_F@ +# define MAGICK_INT32_F @INT32_F@ /* %PRId32 */ +# define MAGICK_UINT32_F @UINT32_F@ /* %PRIu32 */ +# define MAGICK_INT64_F @INT64_F@ /* %PRId64 */ +# define MAGICK_UINT64_F @UINT64_F@ /* %PRIu64 */ - typedef @UINTMAX_T@ magick_uintmax_t; -# define MAGICK_UINTMAX_F @UINTMAX_F@ + /* + C99 special size specifiers: - typedef @UINTPTR_T@ magick_uintptr_t; -# define MAGICK_UINTPTR_F @UINTPTR_F@ + hh - signed char / unsigned char + h - short / unsigned short + ll - long long / unsigned long long + j - intmax_t / uintmax_t + z - signed size_t / size_t + t - ptrdiff_t / unsigned ptrdiff_t + */ -# define MAGICK_SIZE_T_F @MAGICK_SIZE_T_F@ -# define MAGICK_SIZE_T @MAGICK_SIZE_T@ + typedef @UINTMAX_T@ magick_uintmax_t; /* uintmax_t */ +# define MAGICK_UINTMAX_F @UINTMAX_F@ /* %ju */ + + typedef @UINTPTR_T@ magick_uintptr_t; /* uintptr_t */ +# define MAGICK_UINTPTR_F @UINTPTR_F@ /* %tu */ -# define MAGICK_SSIZE_T_F @MAGICK_SSIZE_T_F@ -# define MAGICK_SSIZE_T @MAGICK_SSIZE_T@ +# define MAGICK_SIZE_T_F @MAGICK_SIZE_T_F@ /* %zu */ +# define MAGICK_SIZE_T @MAGICK_SIZE_T@ /* size_t */ + +# define MAGICK_SSIZE_T_F @MAGICK_SSIZE_T_F@ /* %zd */ +# define MAGICK_SSIZE_T @MAGICK_SSIZE_T@ /* ssize_t */ #endif /* defined(MAGICK_IMPLEMENTATION) */ diff -r 230c7f549ba5 -r 8c5fdda5297d magick/render.c --- a/magick/render.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/render.c Fri Apr 01 09:04:54 2022 -0500 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003-2020 GraphicsMagick Group +% Copyright (C) 2003-2022 GraphicsMagick Group % Copyright (C) 2002 ImageMagick Studio % Copyright 1991-1999 E. I. du Pont de Nemours and Company % @@ -5907,7 +5907,7 @@ dvalue=ceil(primitive_info->point.x-0.5); if (MAGICK_ISNAN(dvalue) || ((dvalue < DTOLONG_MIN)) || (dvalue > DTOLONG_MAX)) { - char double_str[18]; + char double_str[MaxTextExtent]; FormatString(double_str,"%g",dvalue); ThrowException(&image->exception,DrawError,PrimitiveArithmeticOverflow,double_str); return MagickFail; @@ -5916,7 +5916,7 @@ dvalue=ceil(primitive_info->point.y-0.5); if (MAGICK_ISNAN(dvalue) || ((dvalue < DTOLONG_MIN)) || (dvalue > DTOLONG_MAX)) { - char double_str[18]; + char double_str[MaxTextExtent]; FormatString(double_str,"%g",dvalue); ThrowException(&image->exception,DrawError,PrimitiveArithmeticOverflow,double_str); return MagickFail; diff -r 230c7f549ba5 -r 8c5fdda5297d magick/resize.c --- a/magick/resize.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/resize.c Fri Apr 01 09:04:54 2022 -0500 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003 - 2019 GraphicsMagick Group +% Copyright (C) 2003 - 2022 GraphicsMagick Group % Copyright (C) 2002 ImageMagick Studio % % This program is covered by multiple licenses, which are described in @@ -1805,6 +1805,7 @@ MagickFreeMemory(scale_scanline); MagickFreeMemory(x_vector); MagickFreeMemory(y_vector); + MagickFreeMemory(y_volumes); DestroyImage(scale_image); ThrowImageException3(ResourceLimitError,MemoryAllocationFailed, UnableToScaleImage); diff -r 230c7f549ba5 -r 8c5fdda5297d magick/version.h --- a/magick/version.h Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/version.h Fri Apr 01 09:04:54 2022 -0500 @@ -38,8 +38,8 @@ #define MagickLibVersion 0x272400 #define MagickLibVersionText "1.4" #define MagickLibVersionNumber 27,24,0 -#define MagickChangeDate "20220326" -#define MagickReleaseDate "snapshot-20220326" +#define MagickChangeDate "20220401" +#define MagickReleaseDate "snapshot-20220401" /* The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines diff -r 230c7f549ba5 -r 8c5fdda5297d magick/xwindow.c --- a/magick/xwindow.c Sat Mar 26 13:22:31 2022 -0500 +++ b/magick/xwindow.c Fri Apr 01 09:04:54 2022 -0500 @@ -1,5 +1,5 @@ /* -% Copyright (C) 2003 - 2020 GraphicsMagick Group +% Copyright (C) 2003 - 2022 GraphicsMagick Group % Copyright (C) 2002 ImageMagick Studio % % This program is covered by multiple licenses, which are described in @@ -7195,6 +7195,13 @@ magnify>>=1; while (magnify > windows->magnify.height) magnify>>=1; + if (magnify == 0) + { + if (previous_magnify != 0) + magnify = previous_magnify; + else + magnify = 1; + } if (magnify != previous_magnify) { unsigned int diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changelog.html --- a/www/Changelog.html Sat Mar 26 13:22:31 2022 -0500 +++ b/www/Changelog.html Fri Apr 01 09:04:54 2022 -0500 @@ -35,8 +35,26 @@ <div class="document"> +<p>2022-04-01 Bob Friesenhahn <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></p> +<blockquote> +<p>* magick/error.c (ThrowLoggedException): Silence Coverity 376912 +"Dereference after null check (FORWARD_NULL)".</p> +<p>* coders/jp2.c (ReadJP2Image): Silence Coverity 264883 "Division +or modulo by float zero (DIVIDE_BY_ZERO)". +(ReadJP2Image): Fix Coverity 376911 "Improper use of negative +value (NEGATIVE_RETURNS)".</p> +<p>* magick/xwindow.c (MagickXMakeMagnifyImage): Fix Coverity 376906 +"Division or modulo by zero (DIVIDE_BY_ZERO)".</p> +<p>* magick/resize.c (ScaleImage): Fix Coverity 376908 "Resource leak +(RESOURCE_LEAK)".</p> +<p>* magick/locale.c (GetLocaleMessageFromTag): Fix Coverity 376907 +"Out-of-bounds read (OVERRUN)".</p> +<p>* magick/render.c (DrawPrimitive): Fix Coverity 376904 +"Out-of-bounds access (OVERRUN)".</p> +</blockquote> <p>2022-03-26 Bob Friesenhahn <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></p> <blockquote> +<p>* version.sh: Prepare for 1.3.38 release.</p> <p>* Makefile.am (release, snapshot): Generate SHA-256 checksums as a by-product of 'make snapshot' or 'make release'.</p> <p>* www/download.rst: Add documentation regaring SHA-256 checksums.</p> diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changes.html --- a/www/Changes.html Sat Mar 26 13:22:31 2022 -0500 +++ b/www/Changes.html Fri Apr 01 09:04:54 2022 -0500 @@ -43,7 +43,7 @@ <p>The following are the <tt class="docutils literal">GraphicsMagick</tt> change logs since 2001:</p> <blockquote> <ul class="simple"> -<li><a class="reference external" href="Changelog.html">2022</a> (nothing released yet)</li> +<li><a class="reference external" href="Changelog.html">2022</a> (1.3.38 released)</li> <li><a class="reference external" href="ChangeLog-2021.html">2021</a> (1.3.37 released)</li> <li><a class="reference external" href="ChangeLog-2020.html">2020</a> (1.3.35, 1.3.36 released)</li> <li><a class="reference external" href="ChangeLog-2019.html">2019</a> (1.3.32, 1.3.33, 1.3.34 released)</li> diff -r 230c7f549ba5 -r 8c5fdda5297d www/Changes.rst --- a/www/Changes.rst Sat Mar 26 13:22:31 2022 -0500 +++ b/www/Changes.rst Fri Apr 01 09:04:54 2022 -0500 @@ -46,7 +46,7 @@ The following are the ``GraphicsMagick`` change logs since 2001: - * 2022_ (nothing released yet) + * 2022_ (1.3.38 released) * 2021_ (1.3.37 released) diff -r 230c7f549ba5 -r 8c5fdda5297d www/links.html --- a/www/links.html Sat Mar 26 13:22:31 2022 -0500 +++ b/www/links.html Fri Apr 01 09:04:54 2022 -0500 @@ -67,6 +67,7 @@ <p>Debian <a class="reference external" href="http://packages.debian.org/search?keywords=GraphicsMagick&amp;searchon=names&amp;suite=all&amp;section=main">GraphicsMagick packages</a>.</p> <p><a class="reference external" href="http://en.wikipedia.org/wiki/GraphicsMagick">WikiPedia</a> GraphicsMagick Entry.</p> <p><a class="reference external" href="https://www.openhub.net/p/graphics_magick">Black Duck | Open HUB</a> GraphicsMagick Entry.</p> +<p><a href="#id21"><span class="problematic" id="id22">`Repology <https://repology.org/project/graphicsmagick/versions`_</span></a> GraphicsMagick Package Versions in OS distributions.</p> <p><a class="reference external" href="https://sourceforge.net/projects/graphicsmagick/">SourceForge</a> GraphicsMagick Entry.</p> <p><a class="reference external" href="http://stackoverflow.com/questions/tagged/graphicsmagick?">GraphicsMagick questions on StackOverflow</a>.</p> <p><a class="reference external" href="https://abi-laboratory.pro/tracker/timeline/graphicsmagick/">GraphicsMagick ABI/API Changes</a>.</p> @@ -201,6 +202,12 @@ <h1><a class="toc-backref" href="#id20">Stock Photos</a></h1> <p><a class="reference external" href="https://morguefile.com/">MorgueFile</a>, Free high-resolution stock photo images.</p> </div> +<div class="system-messages section"> +<h1>Docutils System Messages</h1> +<div class="system-message" id="id21"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">/home/bfriesen/src/GM/www/links.rst</tt>, line 30); <em><a href="#id22">backlink</a></em></p>