summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2014-11-05 12:00:32 -0600
committerGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2014-11-05 12:00:32 -0600
commita2fe24d186ef156c0ac40d445bda1b0c99e3f2d4 (patch)
tree2513cd2f33a3920f9593965436a87ce729345126
parent97dd654ba42a698ae61941791bf99435bd30bafa (diff)
downloadlibpng-a2fe24d186ef156c0ac40d445bda1b0c99e3f2d4.tar.gz
[libpng16] Simplified and future-proofed png_user_version_check().
-rw-r--r--ANNOUNCE1
-rw-r--r--CHANGES1
-rw-r--r--png.c22
3 files changed, 11 insertions, 13 deletions
diff --git a/ANNOUNCE b/ANNOUNCE
index 3a6cfd85a..72c02c283 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -44,6 +44,7 @@ Version 1.6.15beta05 [November 5, 2014]
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
(subscription required; visit
diff --git a/CHANGES b/CHANGES
index a153e4fab..9e7c2c5f6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5052,6 +5052,7 @@ Version 1.6.15beta05 [November 5, 2014]
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
(subscription required; visit
diff --git a/png.c b/png.c
index 1d1bf8bdf..13274ee57 100644
--- a/png.c
+++ b/png.c
@@ -165,33 +165,30 @@ png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
int
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)
{
int i = -1;
+ int found_dots = 0;
do
{
i++;
if (user_png_ver[i] != png_libpng_ver[i])
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i] != 0 && user_png_ver[i] != 0);
+ if (user_png_ver[i] == '.')
+ found_dots++;
+ } while (found_dots < 2 && png_libpng_ver[i] != 0 && user_png_ver[i] != 0);
}
else
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
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
size_t pos = 0;
@@ -213,7 +210,6 @@ png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
return 0;
}
- }
/* Success return. */
return 1;