From a2fe24d186ef156c0ac40d445bda1b0c99e3f2d4 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Wed, 5 Nov 2014 12:00:32 -0600 Subject: [PATCH] [libpng16] Simplified and future-proofed png_user_version_check(). --- ANNOUNCE | 1 + CHANGES | 1 + png.c | 22 +++++++++------------- 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;