[libpng17] Simplified and future-proofed png_user_version_check().

This commit is contained in:
Glenn Randers-Pehrson 2014-11-05 15:08:31 -06:00
parent e5d462d829
commit 41547820e8
3 changed files with 37 additions and 32 deletions

View File

@ -1,5 +1,5 @@
Libpng 1.7.0beta40 - November 4, 2014 Libpng 1.7.0beta40 - November 5, 2014
This is not intended to be a public release. It will be replaced This is not intended to be a public release. It will be replaced
within a few weeks by a public version or by another test version. within a few weeks by a public version or by another test version.
@ -620,9 +620,13 @@ Version 1.7.0beta38 [October 17, 2014]
Version 1.7.0beta39 [November 1, 2014] Version 1.7.0beta39 [November 1, 2014]
Ported cosmetic changes from libpng-1.6.15beta02. Ported cosmetic changes from libpng-1.6.15beta02.
Version 1.7.0beta40 [November 4, 2014] Version 1.7.0beta40 [November 5, 2014]
Made a one-line revision to configure.ac to support ARM on aarch64 Made a one-line revision to configure.ac to support ARM on aarch64
(bug report by Marcin Juszkiewicz, fix by John Bowler). (bug report by Marcin Juszkiewicz, fix by John Bowler).
Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
example.c, pngtest.c, and applications in the contrib directory.
Avoid out-of-bounds memory access in png_user_version_check().
Simplified and future-proofed png_user_version_check().
Send comments/corrections/commendations to png-mng-implement at lists.sf.net Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit (subscription required; visit

View File

@ -4909,9 +4909,13 @@ Version 1.7.0beta38 [October 17, 2014]
Version 1.7.0beta39 [November 1, 2014] Version 1.7.0beta39 [November 1, 2014]
Ported cosmetic changes from libpng-1.6.15beta02. Ported cosmetic changes from libpng-1.6.15beta02.
Version 1.7.0beta40 [November 4, 2014] Version 1.7.0beta40 [November 5, 2014]
Made a one-line revision to configure.ac to support ARM on aarch64 Made a one-line revision to configure.ac to support ARM on aarch64
(bug report by Marcin Juszkiewicz, fix by John Bowler). (bug report by Marcin Juszkiewicz, fix by John Bowler).
Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
example.c, pngtest.c, and applications in the contrib directory.
Avoid out-of-bounds memory access in png_user_version_check().
Simplified and future-proofed png_user_version_check().
Send comments/corrections/commendations to png-mng-implement at lists.sf.net Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit (subscription required; visit

35
png.c
View File

@ -165,15 +165,25 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
int int
png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver) png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
{ {
/* Libpng versions 1.0.0 and later are binary compatible if the version
* string matches through the second '.'; we must recompile any
* applications that use any older library version.
*/
if (user_png_ver != NULL) if (user_png_ver != NULL)
{ {
int i = 0; int i = -1;
int found_dots = 0;
do do
{ {
if (user_png_ver[i] != png_libpng_ver[i]) i++;
if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i])
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
} while (png_libpng_ver[i++]); if (user_png_ver[i] == '.')
found_dots++;
} while (found_dots < 2 && user_png_ver[i] != 0 &&
PNG_LIBPNG_VER_STRING[i] != 0);
} }
else else
@ -181,17 +191,6 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0) if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0)
{ {
/* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
* we must recompile any applications that use any older library version.
* For versions after libpng 1.0, we will be compatible, so we need
* only check the first and third digits (note that when we reach version
* 1.10 we will need to check the fourth symbol, namely user_png_ver[3]).
*/
if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
(user_png_ver[0] == '1' && (user_png_ver[2] != png_libpng_ver[2] ||
user_png_ver[3] != png_libpng_ver[3])) ||
(user_png_ver[0] == '0' && user_png_ver[2] < '9'))
{
#ifdef PNG_WARNINGS_SUPPORTED #ifdef PNG_WARNINGS_SUPPORTED
size_t pos = 0; size_t pos = 0;
char m[128]; char m[128];
@ -200,7 +199,7 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
"Application built with libpng-"); "Application built with libpng-");
pos = png_safecat(m, (sizeof m), pos, user_png_ver); pos = png_safecat(m, (sizeof m), pos, user_png_ver);
pos = png_safecat(m, (sizeof m), pos, " but running with "); pos = png_safecat(m, (sizeof m), pos, " but running with ");
pos = png_safecat(m, (sizeof m), pos, png_libpng_ver); pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING);
PNG_UNUSED(pos) PNG_UNUSED(pos)
png_warning(png_ptr, m); png_warning(png_ptr, m);
@ -212,12 +211,10 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
return 0; return 0;
} }
}
/* Success return. */ /* Success return. */
return 1; return 1;
} }
/* Generic function to create a png_struct for either read or write - this /* Generic function to create a png_struct for either read or write - this
* contains the common initialization. * contains the common initialization.
*/ */
@ -694,13 +691,13 @@ png_get_copyright(png_const_structrp png_ptr)
#else #else
# ifdef __STDC__ # ifdef __STDC__
return PNG_STRING_NEWLINE \ return PNG_STRING_NEWLINE \
"libpng version 1.7.0beta40 - November 1, 2014" PNG_STRING_NEWLINE \ "libpng version 1.7.0beta40 - November 5, 2014" PNG_STRING_NEWLINE \
"Copyright (c) 1998-2014 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2014 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE; PNG_STRING_NEWLINE;
# else # else
return "libpng version 1.7.0beta40 - November 1, 2014\ return "libpng version 1.7.0beta40 - November 5, 2014\
Copyright (c) 1998-2014 Glenn Randers-Pehrson\ Copyright (c) 1998-2014 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";