diff options
author | Daniel Ahlberg <aliz@gentoo.org> | 2003-02-27 09:42:07 +0000 |
---|---|---|
committer | Daniel Ahlberg <aliz@gentoo.org> | 2003-02-27 09:42:07 +0000 |
commit | 4c8fe220f3fd8354dab9e19011b297d77dc0c1e6 (patch) | |
tree | ed698749fdf7a0b5728ed28b351020c8eabccfe8 /sys-libs/zlib | |
parent | Security update (diff) | |
download | gentoo-2-4c8fe220f3fd8354dab9e19011b297d77dc0c1e6.tar.gz gentoo-2-4c8fe220f3fd8354dab9e19011b297d77dc0c1e6.tar.bz2 gentoo-2-4c8fe220f3fd8354dab9e19011b297d77dc0c1e6.zip |
Added missing patch
Diffstat (limited to 'sys-libs/zlib')
-rw-r--r-- | sys-libs/zlib/files/zlib-1.1.4-gentoo.security.patch | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/sys-libs/zlib/files/zlib-1.1.4-gentoo.security.patch b/sys-libs/zlib/files/zlib-1.1.4-gentoo.security.patch new file mode 100644 index 000000000000..e057098ccf55 --- /dev/null +++ b/sys-libs/zlib/files/zlib-1.1.4-gentoo.security.patch @@ -0,0 +1,352 @@ +diff -Naur zlib-1.1.4/ChangeLog zlib-1.1.4-vsnprintf/ChangeLog +--- zlib-1.1.4/ChangeLog 2002-03-11 15:02:35.000000000 +0000 ++++ zlib-1.1.4-vsnprintf/ChangeLog 2003-02-24 05:31:41.000000000 +0000 +@@ -1,6 +1,13 @@ + + ChangeLog file for zlib + ++Changes in 1.1.4-patched (23 February 2003) ++- fix a security vulnerability related to improper use of snprintf/vsnprintf ++ function. ++- ./configure now detects the presence of snprintf/vsnprintf and enables it ++ automatically if present. ++- README.vsnprintf added. ++ + Changes in 1.1.4 (11 March 2002) + - ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in +diff -Naur zlib-1.1.4/README.vsnprintf zlib-1.1.4-vsnprintf/README.vsnprintf +--- zlib-1.1.4/README.vsnprintf 1970-01-01 00:00:00.000000000 +0000 ++++ zlib-1.1.4-vsnprintf/README.vsnprintf 2003-02-24 05:13:28.000000000 +0000 +@@ -0,0 +1,23 @@ ++During a recent audit of zlib-1.1.4, a buffer-overflow and string-format ++vulnerability was found in the gzprintf() function. This has been corrected in ++this version of zlib; in addition, some ./configure checks have been added to ++make sure the host system can utilize the corrections fully. ++ ++As a result, it is now strongly recommended that your host system or compiler ++provide a fully C99-compliant implementation of the vsnprintf() function. ++Anything less will reduce the functionality and/or security of the gzprintf() ++function. The most critical aspect is that vsnprintf() should be present and ++should provide a return value. If this function is missing, one of the ++fallback functions (vsprintf(), snprintf(), vsnprintf()) will have to be used, ++and if so, they too should return a value. If your system is lacking in any of ++these aspects, the ./configure script should warn you and refer you to this ++file. ++ ++In addition, the HAS_vsnprintf and HAS_snprintf macros are automatically ++defined if these functions are available. zlib-1.1.4 and older versions did ++not do this, potentially leading to a broken and vulnerable zlib even when the ++host system supported the requisite functionality to avoid this. ++ ++ ++ -- Kelledin <kelledin@users.sourceforge.net> ++ +diff -Naur zlib-1.1.4/configure zlib-1.1.4-vsnprintf/configure +--- zlib-1.1.4/configure 1998-07-08 18:19:35.000000000 +0000 ++++ zlib-1.1.4-vsnprintf/configure 2003-02-24 05:13:28.000000000 +0000 +@@ -156,6 +156,209 @@ + fi + + cat > $test.c <<EOF ++#include <stdio.h> ++ ++#if (defined(__MSDOS__) || defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)) && !defined(STDC) ++# define STDC ++#endif ++ ++int main() { ++ int i; ++ ++ i=0; ++#ifndef STDC ++ choke me ++#endif ++ ++ return 0; ++} ++EOF ++ ++if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ echo "Checking whether to use vsnprintf() or snprintf()... using vsnprintf()" ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest(char *fmt, ...) { ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ vsnprintf(buf, sizeof(buf), fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest("Hello%d\n", 1)); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_vsnprintf" ++ echo "Checking for vsnprintf() in stdio.h... Yes." ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest(char *fmt, ...) { ++ int i; ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ i=vsnprintf(buf, sizeof(buf), fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest("Hello%d\n", 1)); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_vsnprintf_return" ++ echo "Checking for return value of vsnprintf()... Yes." ++ else ++ echo "Checking for return value of vsnprintf()... No." ++ echo " WARNING: apparently vsnprintf() does not return a value. zlib" ++ echo " can build but will be open to possible string-format security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ fi ++ else ++ echo "Checking for vsnprintf() in stdio.h... No." ++ echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" ++ echo " can build but will be open to possible buffer-overflow security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest(char *fmt, ...) { ++ int i; ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ i=vsprintf(buf, fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest("Hello%d\n", 1)); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_vsprintf_return" ++ echo "Checking for return value of vsprintf()... Yes." ++ else ++ echo "Checking for return value of vsprintf()... No." ++ echo " WARNING: apparently vsprintf() does not return a value. zlib" ++ echo " can build but will be open to possible string-format security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ fi ++ fi ++else ++ echo "Checking whether to use vsnprintf() or snprintf()... using snprintf()" ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest() { ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ snprintf(buf, sizeof(buf), fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest()); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_snprintf" ++ echo "Checking for snprintf() in stdio.h... Yes." ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest() { ++ int i; ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ i=snprintf(buf, sizeof(buf), fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest()); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_snprintf_return" ++ echo "Checking for return value of snprintf()... Yes." ++ else ++ echo "Checking for return value of snprintf()... No." ++ echo " WARNING: apparently snprintf() does not return a value. zlib" ++ echo " can build but will be open to possible string-format security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ fi ++ else ++ echo "Checking for snprintf() in stdio.h... No." ++ echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" ++ echo " can build but will be open to possible buffer-overflow security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ ++ cat > $test.c <<EOF ++#include <stdio.h> ++#include <stdarg.h> ++ ++int mytest() { ++ int i; ++ char buf[20]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ i=sprintf(buf, fmt, ap); ++ return 0; ++} ++ ++int main() { ++ return (mytest()); ++} ++EOF ++ ++ if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ CFLAGS="$CFLAGS -DHAS_sprintf_return" ++ echo "Checking for return value of sprintf()... Yes." ++ else ++ echo "Checking for return value of sprintf()... No." ++ echo " WARNING: apparently sprintf() does not return a value. zlib" ++ echo " can build but will be open to possible string-format security" ++ echo " vulnerabilities. See README.vsnprintf for more info." ++ echo ++ fi ++ fi ++fi ++ ++cat > $test.c <<EOF + #include <errno.h> + int main() { return 0; } + EOF +diff -Naur zlib-1.1.4/gzio.c zlib-1.1.4-vsnprintf/gzio.c +--- zlib-1.1.4/gzio.c 2002-03-11 13:16:01.000000000 +0000 ++++ zlib-1.1.4-vsnprintf/gzio.c 2003-02-24 05:18:44.000000000 +0000 +@@ -529,14 +529,42 @@ + int len; + + va_start(va, format); ++ ++ /* 2003/02/23: Add proper length checking here, if possible. ++ * ++ * -- Kelledin ++ */ + #ifdef HAS_vsnprintf +- (void)vsnprintf(buf, sizeof(buf), format, va); ++# ifdef HAS_vsnprintf_return ++ len=vsnprintf(buf, sizeof(buf), format, va); ++ va_end(va); ++ ++ if (len <= 0 || len >= sizeof(buf)) { ++ /* Resulting string too large to fit in the buffer. */ ++ return 0; ++ } ++# else ++ vsnprintf(buf, sizeof(buf), format, va); ++ va_end(va); ++ len=strlen(buf); ++ if (len <= 0) return 0; ++# endif + #else +- (void)vsprintf(buf, format, va); +-#endif ++# ifdef HAS_vsprintf_return ++ len=vsprintf(buf, format, va); ++ va_end(va); ++ ++ if (len <= 0 || len >= sizeof(buf)) { ++ /* Resulting string too large to fit in the buffer. */ ++ return 0; ++ } ++# else ++ vsprintf(buf, format, va); + va_end(va); +- len = strlen(buf); /* some *sprintf don't return the nb of bytes written */ ++ len=strlen(buf); + if (len <= 0) return 0; ++# endif ++#endif + + return gzwrite(file, buf, (unsigned)len); + } +@@ -552,15 +580,41 @@ + char buf[Z_PRINTF_BUFSIZE]; + int len; + ++ /* 2003/02/23: Add proper length checking here when possible. ++ * ++ * -- Kelledin ++ */ + #ifdef HAS_snprintf ++# ifdef HAS_snprintf_return ++ len=snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, ++ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++ ++ if (len <= 0 || len >= sizeof(buf)) { ++ /* Resulting string too large to fit in the buffer. */ ++ return 0; ++ } ++# else + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++ len=strlen(buf); ++ if (len <= 0) return 0; ++# endif + #else ++# ifdef HAS_sprintf_return ++ len=sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, ++ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++ ++ if (len <= 0 || len >= sizeof(buf)) { ++ /* Resulting string too large to fit in the buffer. */ ++ return 0; ++ } ++# else + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +-#endif +- len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */ ++ len=strlen(buf); + if (len <= 0) return 0; ++# endif ++#endif + + return gzwrite(file, buf, len); + } + |