diff -u -r -N squid-3.3.4/acinclude/lib-checks.m4 squid-3.3.5/acinclude/lib-checks.m4 --- squid-3.3.4/acinclude/lib-checks.m4 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/acinclude/lib-checks.m4 2013-05-20 23:48:55.000000000 +1200 @@ -94,3 +94,129 @@ ]) SQUID_STATE_ROLLBACK(iphlpapi) ]) + +dnl Checks whether the OpenSSL SSL_get_certificate crashes squid and if a +dnl workaround can be used instead of using the SSL_get_certificate +AC_DEFUN([SQUID_CHECK_OPENSSL_GETCERTIFICATE_WORKS],[ + AH_TEMPLATE(SQUID_SSLGETCERTIFICATE_BUGGY, "Define to 1 if the SSL_get_certificate crashes squid") + AH_TEMPLATE(SQUID_USE_SSLGETCERTIFICATE_HACK, "Define to 1 to use squid workaround for SSL_get_certificate") + SQUID_STATE_SAVE(check_SSL_get_certificate) + LIBS="$SSLLIB $LIBS" + if test "x$SSLLIBDIR" != "x"; then + LIBS="$LIBS -Wl,-rpath -Wl,$SSLLIBDIR" + fi + + AC_MSG_CHECKING(whether the SSL_get_certificate is buggy) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM( + [ + #include + #include + ], + [ + SSLeay_add_ssl_algorithms(); + SSL_CTX *sslContext = SSL_CTX_new(SSLv3_method()); + SSL *ssl = SSL_new(sslContext); + X509* cert = SSL_get_certificate(ssl); + return 0; + ]) + ], + [ + AC_MSG_RESULT([no]) + ], + [ + AC_DEFINE(SQUID_SSLGETCERTIFICATE_BUGGY, 1) + AC_MSG_RESULT([yes]) + ], + []) + + AC_MSG_CHECKING(whether the workaround for SSL_get_certificate works) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM( + [ + #include + #include + ], + [ + SSLeay_add_ssl_algorithms(); + SSL_CTX *sslContext = SSL_CTX_new(SSLv3_method()); + X509 ***pCert = (X509 ***)sslContext->cert; + X509 *sslCtxCert = pCert && *pCert ? **pCert : (X509 *)0x1; + if (sslCtxCert != NULL) + return 1; + return 0; + ]) + ], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE(SQUID_USE_SSLGETCERTIFICATE_HACK, 1) + ], + [ + AC_MSG_RESULT([no]) + ], +[]) + +SQUID_STATE_ROLLBACK(check_SSL_get_certificate) +]) + + +dnl Try to handle TXT_DB related problems: +dnl 1) The type of TXT_DB::data member changed in openSSL-1.0.1 version +dnl 2) The IMPLEMENT_LHASH_* openSSL macros in openSSL-1.0.1 and later releases is not +dnl implemented correctly and causes type conversion errors while compiling squid + +AC_DEFUN([SQUID_CHECK_OPENSSL_TXTDB],[ + AH_TEMPLATE(SQUID_SSLTXTDB_PSTRINGDATA, "Define to 1 if the TXT_DB uses OPENSSL_PSTRING data member") + AH_TEMPLATE(SQUID_USE_SSLLHASH_HACK, "Define to 1 to use squid workaround for openssl IMPLEMENT_LHASH_* type conversion errors") + + SQUID_STATE_SAVE(check_TXTDB) + + LIBS="$LIBS $SSLLIB" + AC_MSG_CHECKING(whether the TXT_DB use OPENSSL_PSTRING data member) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [ + #include + ], + [ + TXT_DB *db = NULL; + int i = sk_OPENSSL_PSTRING_num(db->data); + return 0; + ]) + ], + [ + AC_DEFINE(SQUID_SSLTXTDB_PSTRINGDATA, 1) + AC_MSG_RESULT([yes]) + ], + [ + AC_MSG_RESULT([no]) + ], + []) + + AC_MSG_CHECKING(whether the workaround for OpenSSL IMPLEMENT_LHASH_ macros should used) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [ + #include + + static unsigned long index_serial_hash(const char **a){} + static int index_serial_cmp(const char **a, const char **b){} + static IMPLEMENT_LHASH_HASH_FN(index_serial_hash,const char **) + static IMPLEMENT_LHASH_COMP_FN(index_serial_cmp,const char **) + ], + [ + TXT_DB *db = NULL; + TXT_DB_create_index(db, 1, NULL, LHASH_HASH_FN(index_serial_hash), LHASH_COMP_FN(index_serial_cmp)); + ]) + ], + [ + AC_MSG_RESULT([no]) + ], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE(SQUID_USE_SSLLHASH_HACK, 1) + ], +[]) + +SQUID_STATE_ROLLBACK(check_TXTDB) +]) diff -u -r -N squid-3.3.4/ChangeLog squid-3.3.5/ChangeLog --- squid-3.3.4/ChangeLog 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/ChangeLog 2013-05-20 23:48:55.000000000 +1200 @@ -1,4 +1,20 @@ +Changes to squid-3.3.5 (20 May 2013): + + - Bug 3851: Delay Pool class 5 tag:levels displayed incorrectly in cache manager + - Bug 3845: http_port tcpkeepalive= option fails parsing + - Bug 3840: assertion failed 'sde' in UFS cache loading + - Bug 3836: make check failures with automake-1.13 + - Bug 3827: Remove AccessLogEntry::cache.authuser + - Bug 3816 pt2: SSL_get_certificate call inside Ssl::verifySslCertificate crashes + - Bug 3780: cachemgr.cgi: output problem in HTTP Header Statistics + - Bug 3759: OpenSSL compilation error on stock Fedora17, RHEL, CentOS 6 systems + - Bug 3744: squid terminated: FATAL: Bungled (null) line 3: sslproxy_cert_sign signTrusted all + - Port from 2.6: external acl %ACL and %DATA tags + - Update copyright on SN.png + - ... and several minor memory leaks + - ... and some documentation polish + Changes to squid-3.3.4 (27 Apr 2013): - Bug 3831: basic_ncsa_auth Blowfish and SHA support @@ -74,6 +90,11 @@ - ... and many compile error fixes - ... and a very large amount of code polish for faster compilation +Changes to squid-3.2.11 (30 Apr 2013): + + - Regression Bug 3839: build error: src/tools.h: No such file or directory + - Update copyright on SN.png + Changes to squid-3.2.10 (27 Apr 2013): - Bug 3833: squidclient: Option '-k' is not present in man(1) page diff -u -r -N squid-3.3.4/configure squid-3.3.5/configure --- squid-3.3.4/configure 2013-04-27 15:35:47.000000000 +1200 +++ squid-3.3.5/configure 2013-05-20 23:50:55.000000000 +1200 @@ -1,7 +1,7 @@ #! /bin/sh # From configure.ac Revision. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for Squid Web Proxy 3.3.4. +# Generated by GNU Autoconf 2.68 for Squid Web Proxy 3.3.5. # # Report bugs to . # @@ -575,8 +575,8 @@ # Identity of this package. PACKAGE_NAME='Squid Web Proxy' PACKAGE_TARNAME='squid' -PACKAGE_VERSION='3.3.4' -PACKAGE_STRING='Squid Web Proxy 3.3.4' +PACKAGE_VERSION='3.3.5' +PACKAGE_STRING='Squid Web Proxy 3.3.5' PACKAGE_BUGREPORT='http://bugs.squid-cache.org/' PACKAGE_URL='' @@ -1570,7 +1570,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Squid Web Proxy 3.3.4 to adapt to many kinds of systems. +\`configure' configures Squid Web Proxy 3.3.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1640,7 +1640,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Squid Web Proxy 3.3.4:";; + short | recursive ) echo "Configuration of Squid Web Proxy 3.3.5:";; esac cat <<\_ACEOF @@ -2014,7 +2014,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Squid Web Proxy configure 3.3.4 +Squid Web Proxy configure 3.3.5 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -3110,7 +3110,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Squid Web Proxy $as_me 3.3.4, which was +It was created by Squid Web Proxy $as_me 3.3.5, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -3929,7 +3929,7 @@ # Define the identity of the package. PACKAGE='squid' - VERSION='3.3.4' + VERSION='3.3.5' cat >>confdefs.h <<_ACEOF @@ -4331,6 +4331,12 @@ + + + + + + # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_0x.html # ============================================================================ @@ -21018,6 +21024,282 @@ fi +if test "x$with_openssl" = "xyes"; then + + + + +# save state, key is check_SSL_get_certificate +check_SSL_get_certificate_CFLAGS="${CFLAGS}" +check_SSL_get_certificate_CXXFLAGS="${CXXFLAGS}" +check_SSL_get_certificate_LDFLAGS="${LDFLAGS}" +check_SSL_get_certificate_LIBS="${LIBS}" +check_SSL_get_certificate_CC="${CC}" +check_SSL_get_certificate_CXX="${CXX}" +check_SSL_get_certificate_squid_saved_vars="" +for squid_util_var_tosave in $check_SSL_get_certificate_squid_saved_vars +do + squid_util_var_tosave2="check_SSL_get_certificate_${squid_util_var_tosave}" + eval "${squid_util_var_tosave2}=\"${squid_util_var_tosave}\"" +done + + LIBS="$SSLLIB $LIBS" + if test "x$SSLLIBDIR" != "x"; then + LIBS="$LIBS -Wl,-rpath -Wl,$SSLLIBDIR" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the SSL_get_certificate is buggy" >&5 +$as_echo_n "checking whether the SSL_get_certificate is buggy... " >&6; } + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + #include + +int +main () +{ + + SSLeay_add_ssl_algorithms(); + SSL_CTX *sslContext = SSL_CTX_new(SSLv3_method()); + SSL *ssl = SSL_new(sslContext); + X509* cert = SSL_get_certificate(ssl); + return 0; + + ; + return 0; +} + +_ACEOF +if ac_fn_cxx_try_run "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +else + + $as_echo "#define SQUID_SSLGETCERTIFICATE_BUGGY 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the workaround for SSL_get_certificate works" >&5 +$as_echo_n "checking whether the workaround for SSL_get_certificate works... " >&6; } + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + #include + +int +main () +{ + + SSLeay_add_ssl_algorithms(); + SSL_CTX *sslContext = SSL_CTX_new(SSLv3_method()); + X509 ***pCert = (X509 ***)sslContext->cert; + X509 *sslCtxCert = pCert && *pCert ? **pCert : (X509 *)0x1; + if (sslCtxCert != NULL) + return 1; + return 0; + + ; + return 0; +} + +_ACEOF +if ac_fn_cxx_try_run "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define SQUID_USE_SSLGETCERTIFICATE_HACK 1" >>confdefs.h + + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + +# rollback state, key is check_SSL_get_certificate +CFLAGS="${check_SSL_get_certificate_CFLAGS}" +CXXFLAGS="${check_SSL_get_certificate_CXXFLAGS}" +LDFLAGS="${check_SSL_get_certificate_LDFLAGS}" +LIBS="${check_SSL_get_certificate_LIBS}" +CC="${check_SSL_get_certificate_CC}" +CXX="${check_SSL_get_certificate_CXX}" +for squid_util_var_tosave in $check_SSL_get_certificate_squid_saved_vars +do + squid_util_var_tosave2="\$check_SSL_get_certificate_${squid_util_var_tosave}" + eval "$squid_util_var_tosave=\"${squid_util_var_tosave2}\"" +done + +# commit state, key is check_SSL_get_certificate +unset check_SSL_get_certificate_CFLAGS +unset check_SSL_get_certificate_CXXFLAGS +unset check_SSL_get_certificate_LDFLAGS +unset check_SSL_get_certificate_LIBS +unset check_SSL_get_certificate_CC +unset check_SSL_get_certificate_CXX +for squid_util_var_tosave in $check_SSL_get_certificate_squid_saved_vars +do + unset ${squid_util_var_tosave} +done + + + + + + + + +# save state, key is check_TXTDB +check_TXTDB_CFLAGS="${CFLAGS}" +check_TXTDB_CXXFLAGS="${CXXFLAGS}" +check_TXTDB_LDFLAGS="${LDFLAGS}" +check_TXTDB_LIBS="${LIBS}" +check_TXTDB_CC="${CC}" +check_TXTDB_CXX="${CXX}" +check_TXTDB_squid_saved_vars="" +for squid_util_var_tosave in $check_TXTDB_squid_saved_vars +do + squid_util_var_tosave2="check_TXTDB_${squid_util_var_tosave}" + eval "${squid_util_var_tosave2}=\"${squid_util_var_tosave}\"" +done + + + LIBS="$LIBS $SSLLIB" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the TXT_DB use OPENSSL_PSTRING data member" >&5 +$as_echo_n "checking whether the TXT_DB use OPENSSL_PSTRING data member... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + +int +main () +{ + + TXT_DB *db = NULL; + int i = sk_OPENSSL_PSTRING_num(db->data); + return 0; + + ; + return 0; +} + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + $as_echo "#define SQUID_SSLTXTDB_PSTRINGDATA 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the workaround for OpenSSL IMPLEMENT_LHASH_ macros should used" >&5 +$as_echo_n "checking whether the workaround for OpenSSL IMPLEMENT_LHASH_ macros should used... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + + static unsigned long index_serial_hash(const char **a){} + static int index_serial_cmp(const char **a, const char **b){} + static IMPLEMENT_LHASH_HASH_FN(index_serial_hash,const char **) + static IMPLEMENT_LHASH_COMP_FN(index_serial_cmp,const char **) + +int +main () +{ + + TXT_DB *db = NULL; + TXT_DB_create_index(db, 1, NULL, LHASH_HASH_FN(index_serial_hash), LHASH_COMP_FN(index_serial_cmp)); + + ; + return 0; +} + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define SQUID_USE_SSLLHASH_HACK 1" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +# rollback state, key is check_TXTDB +CFLAGS="${check_TXTDB_CFLAGS}" +CXXFLAGS="${check_TXTDB_CXXFLAGS}" +LDFLAGS="${check_TXTDB_LDFLAGS}" +LIBS="${check_TXTDB_LIBS}" +CC="${check_TXTDB_CC}" +CXX="${check_TXTDB_CXX}" +for squid_util_var_tosave in $check_TXTDB_squid_saved_vars +do + squid_util_var_tosave2="\$check_TXTDB_${squid_util_var_tosave}" + eval "$squid_util_var_tosave=\"${squid_util_var_tosave2}\"" +done + +# commit state, key is check_TXTDB +unset check_TXTDB_CFLAGS +unset check_TXTDB_CXXFLAGS +unset check_TXTDB_LDFLAGS +unset check_TXTDB_LIBS +unset check_TXTDB_CC +unset check_TXTDB_CXX +for squid_util_var_tosave in $check_TXTDB_squid_saved_vars +do + unset ${squid_util_var_tosave} +done + + + +fi # Check whether --enable-forw-via-db was given. if test "${enable_forw_via_db+set}" = set; then : @@ -31398,7 +31680,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Squid Web Proxy $as_me 3.3.4, which was +This file was extended by Squid Web Proxy $as_me 3.3.5, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -31464,7 +31746,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -Squid Web Proxy config.status 3.3.4 +Squid Web Proxy config.status 3.3.5 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff -u -r -N squid-3.3.4/configure.ac squid-3.3.5/configure.ac --- squid-3.3.4/configure.ac 2013-04-27 15:35:47.000000000 +1200 +++ squid-3.3.5/configure.ac 2013-05-20 23:50:55.000000000 +1200 @@ -1,4 +1,4 @@ -AC_INIT([Squid Web Proxy],[3.3.4],[http://bugs.squid-cache.org/],[squid]) +AC_INIT([Squid Web Proxy],[3.3.5],[http://bugs.squid-cache.org/],[squid]) AC_PREREQ(2.61) AC_CONFIG_HEADERS([include/autoconf.h]) AC_CONFIG_AUX_DIR(cfgaux) @@ -1260,6 +1260,10 @@ fi AC_SUBST(SSLLIB) +if test "x$with_openssl" = "xyes"; then +SQUID_CHECK_OPENSSL_GETCERTIFICATE_WORKS +SQUID_CHECK_OPENSSL_TXTDB +fi AC_ARG_ENABLE(forw-via-db, AS_HELP_STRING([--enable-forw-via-db],[Enable Forw/Via database]), [ diff -u -r -N squid-3.3.4/CREDITS squid-3.3.5/CREDITS --- squid-3.3.4/CREDITS 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/CREDITS 2013-05-20 23:48:55.000000000 +1200 @@ -540,9 +540,8 @@ Squid NOW icon - copyright Squid Project This work is licensed under the - Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported Liscence - (CC BY-NC-SA 3.0) - [ http://creativecommons.org/licenses/by-nc-sa/3.0/ ] + Creative Commons Attribution-ShareAlike 3.0 Unported Liscence (CC BY-SA 3.0) + [ http://creativecommons.org/licenses/by-sa/3.0/ ] ============================================================================== diff -u -r -N squid-3.3.4/helpers/basic_auth/DB/basic_db_auth.8 squid-3.3.5/helpers/basic_auth/DB/basic_db_auth.8 --- squid-3.3.4/helpers/basic_auth/DB/basic_db_auth.8 2013-04-27 15:59:21.000000000 +1200 +++ squid-3.3.5/helpers/basic_auth/DB/basic_db_auth.8 2013-05-21 00:24:20.000000000 +1200 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "BASIC_DB_AUTH 1" -.TH BASIC_DB_AUTH 1 "2013-04-26" "perl v5.10.1" "User Contributed Perl Documentation" +.TH BASIC_DB_AUTH 1 "2013-05-20" "perl v5.10.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff -u -r -N squid-3.3.4/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc squid-3.3.5/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc --- squid-3.3.4/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc 2013-05-20 23:48:55.000000000 +1200 @@ -425,6 +425,7 @@ dp = xstrdup(rfc1738_escape(domain)); if (!domain && margs.ddomain) { domain = xstrdup(margs.ddomain); + dp = xstrdup(rfc1738_escape(domain)); if (debug_enabled) debug((char *) "%s| %s: INFO: Got User: %s set default domain: %s\n", LogTime(), PROGRAM, up, dp); else diff -u -r -N squid-3.3.4/helpers/external_acl/SQL_session/ext_sql_session_acl.8 squid-3.3.5/helpers/external_acl/SQL_session/ext_sql_session_acl.8 --- squid-3.3.4/helpers/external_acl/SQL_session/ext_sql_session_acl.8 2013-04-27 15:59:25.000000000 +1200 +++ squid-3.3.5/helpers/external_acl/SQL_session/ext_sql_session_acl.8 2013-05-21 00:24:25.000000000 +1200 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EXT_SQL_SESSION_ACL 1" -.TH EXT_SQL_SESSION_ACL 1 "2013-04-26" "perl v5.10.1" "User Contributed Perl Documentation" +.TH EXT_SQL_SESSION_ACL 1 "2013-05-20" "perl v5.10.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff -u -r -N squid-3.3.4/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 squid-3.3.5/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 --- squid-3.3.4/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 2013-04-27 15:59:26.000000000 +1200 +++ squid-3.3.5/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 2013-05-21 00:24:26.000000000 +1200 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "EXT_WBINFO_GROUP_ACL.PL.IN 1" -.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2013-04-26" "perl v5.10.1" "User Contributed Perl Documentation" +.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2013-05-20" "perl v5.10.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l diff -u -r -N squid-3.3.4/helpers/log_daemon/DB/log_db_daemon.8 squid-3.3.5/helpers/log_daemon/DB/log_db_daemon.8 --- squid-3.3.4/helpers/log_daemon/DB/log_db_daemon.8 2013-04-27 15:59:26.000000000 +1200 +++ squid-3.3.5/helpers/log_daemon/DB/log_db_daemon.8 2013-05-21 00:24:26.000000000 +1200 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "LOG_DB_DAEMON 1" -.TH LOG_DB_DAEMON 1 "2013-04-26" "perl v5.10.1" "User Contributed Perl Documentation" +.TH LOG_DB_DAEMON 1 "2013-05-20" "perl v5.10.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -413,9 +413,3 @@ This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. -.SH "POD ERRORS" -.IX Header "POD ERRORS" -Hey! \fBThe above document had some coding errors, which are explained below:\fR -.IP "Around line 199:" 4 -.IX Item "Around line 199:" -You forgot a '=back' before '=head1' diff -u -r -N squid-3.3.4/helpers/log_daemon/DB/log_db_daemon.pl.in squid-3.3.5/helpers/log_daemon/DB/log_db_daemon.pl.in --- squid-3.3.4/helpers/log_daemon/DB/log_db_daemon.pl.in 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/helpers/log_daemon/DB/log_db_daemon.pl.in 2013-05-20 23:48:55.000000000 +1200 @@ -41,6 +41,8 @@ Write debug messages to Squid stderr or cache.log +=back + =cut # the first argument to this script is the log file path describing the DSN @@ -196,6 +198,8 @@ __END__ +=pod + =head1 DESCRIPTION This module exploits the new logfile daemon support available in squid 2.7 and 3.2 to store access log entries in a MySQL database. diff -u -r -N squid-3.3.4/include/autoconf.h.in squid-3.3.5/include/autoconf.h.in --- squid-3.3.4/include/autoconf.h.in 2013-04-27 15:35:09.000000000 +1200 +++ squid-3.3.5/include/autoconf.h.in 2013-05-20 23:49:34.000000000 +1200 @@ -1208,12 +1208,25 @@ /* Define to enable SNMP monitoring of Squid */ #undef SQUID_SNMP +/* "Define to 1 if the SSL_get_certificate crashes squid" */ +#undef SQUID_SSLGETCERTIFICATE_BUGGY + +/* "Define to 1 if the TXT_DB uses OPENSSL_PSTRING data member" */ +#undef SQUID_SSLTXTDB_PSTRINGDATA + /* TCP receive buffer size */ #undef SQUID_TCP_SO_RCVBUF /* TCP send buffer size */ #undef SQUID_TCP_SO_SNDBUF +/* "Define to 1 to use squid workaround for SSL_get_certificate" */ +#undef SQUID_USE_SSLGETCERTIFICATE_HACK + +/* "Define to 1 to use squid workaround for openssl IMPLEMENT_LHASH_* type + conversion errors" */ +#undef SQUID_USE_SSLLHASH_HACK + /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. diff -u -r -N squid-3.3.4/include/version.h squid-3.3.5/include/version.h --- squid-3.3.4/include/version.h 2013-04-27 15:35:47.000000000 +1200 +++ squid-3.3.5/include/version.h 2013-05-20 23:50:56.000000000 +1200 @@ -7,7 +7,7 @@ */ #ifndef SQUID_RELEASE_TIME -#define SQUID_RELEASE_TIME 1367033686 +#define SQUID_RELEASE_TIME 1369050531 #endif #ifndef APP_SHORTNAME diff -u -r -N squid-3.3.4/lib/libTrie/aclocal.m4 squid-3.3.5/lib/libTrie/aclocal.m4 --- squid-3.3.4/lib/libTrie/aclocal.m4 2013-04-27 15:35:41.000000000 +1200 +++ squid-3.3.5/lib/libTrie/aclocal.m4 2013-05-20 23:50:38.000000000 +1200 @@ -406,18 +406,6 @@ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. -AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) - # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, diff -u -r -N squid-3.3.4/lib/libTrie/configure.ac squid-3.3.5/lib/libTrie/configure.ac --- squid-3.3.4/lib/libTrie/configure.ac 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/lib/libTrie/configure.ac 2013-05-20 23:48:55.000000000 +1200 @@ -1,7 +1,7 @@ # Process this file with autoconf to produce a configure script. AC_INIT(libTrie, 0.1, rbtcollins@squid-cache.org) AC_CONFIG_SRCDIR([src/Trie.cc]) -AM_CONFIG_HEADER([config.h]) +AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR(cfgaux) enable_inline=${enable_inline:=yes} diff -u -r -N squid-3.3.4/RELEASENOTES.html squid-3.3.5/RELEASENOTES.html --- squid-3.3.4/RELEASENOTES.html 2013-04-27 16:00:02.000000000 +1200 +++ squid-3.3.5/RELEASENOTES.html 2013-05-21 00:24:44.000000000 +1200 @@ -1,11 +1,11 @@ - - Squid 3.3.4 release notes + + Squid 3.3.5 release notes -

Squid 3.3.4 release notes

+

Squid 3.3.5 release notes

Squid Developers


@@ -56,7 +56,7 @@

1. Notice

-

The Squid Team are pleased to announce the release of Squid-3.3.4.

+

The Squid Team are pleased to announce the release of Squid-3.3.5.

This new release is available for download from http://www.squid-cache.org/Versions/v3/3.3/ or the mirrors.

@@ -275,6 +275,12 @@ ssl::certUntrusted, ssl::certSelfSigned.

+
external_acl_type
+

%ACL format tag ported from 2.6. +Sends the name of ACL being tested to the external helper.

+

%DATA format tag ported from 2.6. +Inserts the ACL arguments into a particular location of the helper input instead of at the end of the line.

+
logformat

New token %ssl::bump_mode to log the SSL-bump mode type performed on a request. Logs values of: -, none, client-first, or server-first.

@@ -394,16 +400,9 @@
error_map

Not yet ported from 2.6

-
external_acl_type
-

%ACL format tag not yet ported from 2.6

-

%DATA format tag not yet ported from 2.6

-
external_refresh_check

Not yet ported from 2.7

-
http_port
-

act-as-origin not yet ported from 2.7

-
ignore_ims_on_miss

Not yet ported from 2.7

diff -u -r -N squid-3.3.4/scripts/find-alive.pl squid-3.3.5/scripts/find-alive.pl --- squid-3.3.4/scripts/find-alive.pl 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/scripts/find-alive.pl 2013-05-20 23:48:55.000000000 +1200 @@ -23,9 +23,9 @@ 'AsyncCall.* constructed, this=(\S+)', 'AsyncCall.* destruct.*, this=(\S+)', ], - HttpReq => [ - '\bHttpRequest.* constructed, this=(\S+)', - '\bHttpRequest.* destructed, this=(\S+)', + HttpHeaderEntry => [ + '\bHttpHeaderEntry.* created HttpHeaderEntry (\S+)', + '\bHttpHeaderEntry.* destroying entry (\S+)', ], ClientSocketContext => [ '\bClientSocketContext constructing, this=(\S+)', diff -u -r -N squid-3.3.4/src/AccessLogEntry.cc squid-3.3.5/src/AccessLogEntry.cc --- squid-3.3.4/src/AccessLogEntry.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/AccessLogEntry.cc 2013-05-20 23:48:55.000000000 +1200 @@ -37,7 +37,6 @@ #endif safe_free(headers.reply); - safe_free(cache.authuser); safe_free(headers.adapted_request); HTTPMSGUNLOCK(adapted_request); diff -u -r -N squid-3.3.4/src/AccessLogEntry.h squid-3.3.5/src/AccessLogEntry.h --- squid-3.3.4/src/AccessLogEntry.h 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/AccessLogEntry.h 2013-05-20 23:48:55.000000000 +1200 @@ -151,7 +151,6 @@ code (LOG_TAG_NONE), msec(0), rfc931 (NULL), - authuser (NULL), extuser(NULL), #if USE_SSL ssluser(NULL), @@ -170,7 +169,6 @@ log_type code; int msec; const char *rfc931; - const char *authuser; const char *extuser; #if USE_SSL diff -u -r -N squid-3.3.4/src/cache_cf.cc squid-3.3.5/src/cache_cf.cc --- squid-3.3.4/src/cache_cf.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/cache_cf.cc 2013-05-20 23:48:55.000000000 +1200 @@ -300,14 +300,10 @@ static void SetConfigFilename(char const *file_name, bool is_pipe) { - cfg_filename = file_name; - - char const *token; - if (is_pipe) cfg_filename = file_name + 1; - else if ((token = strrchr(cfg_filename, '/'))) - cfg_filename = token + 1; + else + cfg_filename = file_name; } static const char* @@ -528,7 +524,7 @@ if ((token = strchr(new_file_name, '"'))) *token = '\0'; - cfg_filename = new_file_name; + SetConfigFilename(new_file_name, false); } config_lineno = new_lineno; @@ -598,7 +594,7 @@ fclose(fp); } - cfg_filename = orig_cfg_filename; + SetConfigFilename(orig_cfg_filename, false); config_lineno = orig_config_lineno; xfree(tmp_line); @@ -1907,8 +1903,10 @@ fs = find_fstype(type_str); - if (fs < 0) - self_destruct(); + if (fs < 0) { + debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "ERROR: This proxy does not support the '" << type_str << "' cache type. Ignoring."); + return; + } /* reconfigure existing dir */ @@ -3687,17 +3685,16 @@ } else if (strncmp(token, "tcpkeepalive=", 13) == 0) { char *t = token + 13; s->tcp_keepalive.enabled = 1; - s->tcp_keepalive.idle = xatoui(t); + s->tcp_keepalive.idle = xatoui(t,','); t = strchr(t, ','); if (t) { ++t; - s->tcp_keepalive.interval = xatoui(t); + s->tcp_keepalive.interval = xatoui(t,','); t = strchr(t, ','); } if (t) { ++t; s->tcp_keepalive.timeout = xatoui(t); - // t = strchr(t, ','); // not really needed, left in as documentation } #if USE_SSL } else if (strcasecmp(token, "sslBump") == 0) { diff -u -r -N squid-3.3.4/src/cf.data.pre squid-3.3.5/src/cf.data.pre --- squid-3.3.4/src/cf.data.pre 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/cf.data.pre 2013-05-20 23:48:55.000000000 +1200 @@ -689,6 +689,13 @@ list separator. ; can be any non-alphanumeric character. + %ACL The name of the ACL being tested. + %DATA The ACL arguments. If not used then any arguments + is automatically added at the end of the line + sent to the helper. + NOTE: this will encode the arguments as one token, + whereas the default will pass each separately. + %% The percent sign. Useful for helpers which need an unchanging input format. @@ -3498,9 +3505,15 @@ HTTP related format codes: - [http::]>h Original request header. Optional header name argument - on the format header[:[separator]element] - [http::]>ha The HTTP request headers after adaptation and redirection. + [http::]>h Original received request header. + Usually differs from the request header sent by + Squid, although most fields are often preserved. + Accepts optional header field name/value filter + argument using name[:[separator]element] format. + [http::]>ha Received request header after adaptation and + redirection (pre-cache REQMOD vectoring point). + Usually differs from the request header sent by + Squid, although most fields are often preserved. Optional header name argument as for >h [http::]h diff -u -r -N squid-3.3.4/src/client_db.cc squid-3.3.5/src/client_db.cc --- squid-3.3.4/src/client_db.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/client_db.cc 2013-05-20 23:48:55.000000000 +1200 @@ -79,8 +79,9 @@ clientdbAdd(const Ip::Address &addr) { ClientInfo *c; - char *buf = new char[MAX_IPSTRLEN]; + char *buf = static_cast(xmalloc(MAX_IPSTRLEN)); // becomes hash.key c = (ClientInfo *)memAllocate(MEM_CLIENT_INFO); + debugs(77, 9, "ClientInfo constructed, this=" << c); c->hash.key = addr.NtoA(buf,MAX_IPSTRLEN); c->addr = addr; #if USE_DELAY_POOLS @@ -362,6 +363,7 @@ } #endif + debugs(77, 9, "ClientInfo destructed, this=" << c); memFree(c, MEM_CLIENT_INFO); } diff -u -r -N squid-3.3.4/src/client_side.cc squid-3.3.5/src/client_side.cc --- squid-3.3.4/src/client_side.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/client_side.cc 2013-05-20 23:48:55.000000000 +1200 @@ -618,13 +618,6 @@ aLogEntry->cache.requestSize += request->content_length; aLogEntry->cache.extuser = request->extacl_user.termedBuf(); -#if USE_AUTH - if (request->auth_user_request != NULL) { - if (request->auth_user_request->username()) - aLogEntry->cache.authuser = xstrdup(request->auth_user_request->username()); - } -#endif - // Adapted request, if any, inherits and then collects all the stats, but // the virgin request gets logged instead; copy the stats to log them. // TODO: avoid losses by keeping these stats in a shared history object? diff -u -r -N squid-3.3.4/src/DelayTagged.cc squid-3.3.5/src/DelayTagged.cc --- squid-3.3.4/src/DelayTagged.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/DelayTagged.cc 2013-05-20 23:48:55.000000000 +1200 @@ -190,10 +190,10 @@ } void -DelayTaggedBucket::stats (StoreEntry *entry) const +DelayTaggedBucket::stats(StoreEntry *entry) const { - storeAppendPrintf(entry, " :" SQUIDSTRINGPH , SQUIDSTRINGPRINT(tag)); - theBucket.stats (entry); + storeAppendPrintf(entry, " " SQUIDSTRINGPH ":", SQUIDSTRINGPRINT(tag)); + theBucket.stats(entry); } DelayTagged::Id::Id(DelayTagged::Pointer aDelayTagged, String &aTag) : theTagged(aDelayTagged) diff -u -r -N squid-3.3.4/src/external_acl.cc squid-3.3.5/src/external_acl.cc --- squid-3.3.4/src/external_acl.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/external_acl.cc 2013-05-20 23:48:55.000000000 +1200 @@ -194,6 +194,8 @@ #endif EXT_ACL_EXT_LOG, EXT_ACL_TAG, + EXT_ACL_ACLNAME, + EXT_ACL_ACLDATA, EXT_ACL_PERCENT, EXT_ACL_END } type; @@ -479,6 +481,10 @@ format->type = _external_acl_format::EXT_ACL_EXT_LOG; else if (strcmp(token, "%TAG") == 0) format->type = _external_acl_format::EXT_ACL_TAG; + else if (strcmp(token, "%ACL") == 0) + format->type = _external_acl_format::EXT_ACL_ACLNAME; + else if (strcmp(token, "%DATA") == 0) + format->type = _external_acl_format::EXT_ACL_ACLDATA; else if (strcmp(token, "%%") == 0) format->type = _external_acl_format::EXT_ACL_PERCENT; else { @@ -675,6 +681,7 @@ struct _external_acl_data { external_acl *def; + const char *name; wordlist *arguments; }; @@ -683,6 +690,7 @@ free_external_acl_data(void *data) { external_acl_data *p = static_cast(data); + safe_free(p->name); wordlistDestroy(&p->arguments); cbdataReferenceDone(p->def); } @@ -709,6 +717,10 @@ if (!data->def) self_destruct(); + // def->name is the name of the external_acl_type. + // this is the name of the 'acl' directive being tested + data->name = xstrdup(AclMatchedName); + while ((token = strtokFile())) { wordlistAdd(&data->arguments, token); } @@ -946,6 +958,7 @@ HttpRequest *request = ch->request; HttpReply *reply = ch->reply; mb.reset(); + bool data_used = false; for (format = acl_data->def->format; format; format = format->next) { const char *str = NULL; @@ -1136,6 +1149,29 @@ case _external_acl_format::EXT_ACL_TAG: str = request->tag.termedBuf(); break; + case _external_acl_format::EXT_ACL_ACLNAME: + str = acl_data->name; + break; + case _external_acl_format::EXT_ACL_ACLDATA: + data_used = true; + for (arg = acl_data->arguments; arg; arg = arg->next) { + if (!first) + sb.append(" ", 1); + + if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) { + const char *quoted = rfc1738_escape(arg->key); + sb.append(quoted, strlen(quoted)); + } else { + static MemBuf mb2; + mb2.init(); + strwordquote(&mb2, arg->key); + sb.append(mb2.buf, mb2.size); + mb2.clean(); + } + + first = 0; + } + break; case _external_acl_format::EXT_ACL_PERCENT: str = "%"; break; @@ -1168,18 +1204,20 @@ first = 0; } - for (arg = acl_data->arguments; arg; arg = arg->next) { - if (!first) - mb.append(" ", 1); + if (!data_used) { + for (arg = acl_data->arguments; arg; arg = arg->next) { + if (!first) + mb.append(" ", 1); + + if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) { + const char *quoted = rfc1738_escape(arg->key); + mb.append(quoted, strlen(quoted)); + } else { + strwordquote(&mb, arg->key); + } - if (acl_data->def->quote == external_acl::QUOTE_METHOD_URL) { - const char *quoted = rfc1738_escape(arg->key); - mb.append(quoted, strlen(quoted)); - } else { - strwordquote(&mb, arg->key); + first = 0; } - - first = 0; } return mb.buf; diff -u -r -N squid-3.3.4/src/format/Format.cc squid-3.3.5/src/format/Format.cc --- squid-3.3.4/src/format/Format.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/format/Format.cc 2013-05-20 23:48:55.000000000 +1200 @@ -760,7 +760,10 @@ break; case LFT_USER_NAME: - out = strOrNull(al->cache.authuser); +#if USE_AUTH + if (al->request && al->request->auth_user_request != NULL) + out = strOrNull(al->request->auth_user_request->username()); +#endif if (!out) out = strOrNull(al->cache.extuser); #if USE_SSL @@ -772,7 +775,10 @@ break; case LFT_USER_LOGIN: - out = strOrNull(al->cache.authuser); +#if USE_AUTH + if (al->request && al->request->auth_user_request != NULL) + out = strOrNull(al->request->auth_user_request->username()); +#endif break; case LFT_USER_IDENT: diff -u -r -N squid-3.3.4/src/forward.cc squid-3.3.5/src/forward.cc --- squid-3.3.4/src/forward.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/forward.cc 2013-05-20 23:48:55.000000000 +1200 @@ -545,10 +545,7 @@ if (!entry->isEmpty()) return false; - if (n_tries > 10) - return false; - - if (origin_tries > 2) + if (n_tries > Config.forward_max_tries) return false; if (squid_curtime - start_t > Config.Timeout.forward) @@ -1023,9 +1020,6 @@ debugs(17, 3, HERE << "reusing pconn " << serverConnection()); ++n_tries; - if (!serverConnection()->getPeer()) - ++origin_tries; - comm_add_close_handler(serverConnection()->fd, fwdServerClosedWrapper, this); /* Update server side TOS and Netfilter mark on the connection. */ @@ -1225,9 +1219,6 @@ if (n_tries > Config.forward_max_tries) return 0; - if (origin_tries > 1) - return 0; - if (request->bodyNibbled()) return 0; diff -u -r -N squid-3.3.4/src/forward.h squid-3.3.5/src/forward.h --- squid-3.3.4/src/forward.h 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/forward.h 2013-05-20 23:48:55.000000000 +1200 @@ -99,7 +99,6 @@ Comm::ConnectionPointer clientConn; ///< a possibly open connection to the client. time_t start_t; int n_tries; - int origin_tries; // AsyncCalls which we set and may need cancelling. struct { diff -u -r -N squid-3.3.4/src/fs/ufs/RebuildState.cc squid-3.3.5/src/fs/ufs/RebuildState.cc --- squid-3.3.4/src/fs/ufs/RebuildState.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/fs/ufs/RebuildState.cc 2013-05-20 23:48:55.000000000 +1200 @@ -420,9 +420,14 @@ added->releaseRequest(); if (added->swap_filen > -1) { - UFSSwapDir *sde = dynamic_cast(INDEXSD(added->swap_dirn)); - assert(sde); - sde->undoAddDiskRestore(added); + SwapDir *someDir = INDEXSD(added->swap_dirn); + assert(someDir); + if (UFSSwapDir *ufsDir = dynamic_cast(someDir)) + ufsDir->undoAddDiskRestore(added); + // else the entry was loaded from and/or is currently in a non-UFS dir + // Thus, there is no use in preserving its disk file (the only purpose + // of undoAddDiskRestore!), even if we could. Instead, we release the + // the entry and [eventually] unlink its disk file or free its slot. } added->release(); diff -u -r -N squid-3.3.4/src/helper.cc squid-3.3.5/src/helper.cc --- squid-3.3.4/src/helper.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/helper.cc 2013-05-20 23:48:55.000000000 +1200 @@ -36,6 +36,7 @@ #include "comm/Connection.h" #include "comm/Write.h" #include "fd.h" +#include "fde.h" #include "format/Quoting.h" #include "helper.h" #include "Mem.h" @@ -765,7 +766,7 @@ safe_free(srv->requests); cbdataReferenceDone(srv->parent); - cbdataFree(srv); + delete srv; } static void @@ -831,7 +832,7 @@ cbdataReferenceDone(srv->parent); - cbdataFree(srv); + delete srv; } /// Calls back with a pointer to the buffer with the helper output @@ -940,7 +941,7 @@ helperReturnBuffer(i, srv, hlp, msg, t); } - if (Comm::IsConnOpen(srv->readPipe)) { + if (Comm::IsConnOpen(srv->readPipe) && !fd_table[srv->readPipe->fd].closing()) { int spaceSize = srv->rbuf_sz - srv->roffset - 1; assert(spaceSize >= 0); @@ -1044,7 +1045,7 @@ helperStatefulReleaseServer(srv); } - if (Comm::IsConnOpen(srv->readPipe)) { + if (Comm::IsConnOpen(srv->readPipe) && !fd_table[srv->readPipe->fd].closing()) { int spaceSize = srv->rbuf_sz - srv->roffset - 1; assert(spaceSize >= 0); diff -u -r -N squid-3.3.4/src/HttpHeader.cc squid-3.3.5/src/HttpHeader.cc --- squid-3.3.4/src/HttpHeader.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/HttpHeader.cc 2013-05-20 23:48:55.000000000 +1200 @@ -438,37 +438,37 @@ PROF_start(HttpHeaderClean); - /* - * An unfortunate bug. The entries array is initialized - * such that count is set to zero. httpHeaderClean() seems to - * be called both when 'hdr' is created, and destroyed. Thus, - * we accumulate a large number of zero counts for 'hdr' before - * it is ever used. Can't think of a good way to fix it, except - * adding a state variable that indicates whether or not 'hdr' - * has been used. As a hack, just never count zero-sized header - * arrays. - */ - if (owner <= hoReply) { + /* + * An unfortunate bug. The entries array is initialized + * such that count is set to zero. httpHeaderClean() seems to + * be called both when 'hdr' is created, and destroyed. Thus, + * we accumulate a large number of zero counts for 'hdr' before + * it is ever used. Can't think of a good way to fix it, except + * adding a state variable that indicates whether or not 'hdr' + * has been used. As a hack, just never count zero-sized header + * arrays. + */ if (0 != entries.count) HttpHeaderStats[owner].hdrUCountDistr.count(entries.count); ++ HttpHeaderStats[owner].destroyedCount; HttpHeaderStats[owner].busyDestroyedCount += entries.count > 0; + } // if (owner <= hoReply) - while ((e = getEntry(&pos))) { - /* tmp hack to try to avoid coredumps */ + while ((e = getEntry(&pos))) { + /* tmp hack to try to avoid coredumps */ - if (e->id < 0 || e->id >= HDR_ENUM_END) { - debugs(55, DBG_CRITICAL, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); - } else { + if (e->id < 0 || e->id >= HDR_ENUM_END) { + debugs(55, DBG_CRITICAL, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); + } else { + if (owner <= hoReply) HttpHeaderStats[owner].fieldTypeDistr.count(e->id); - /* yes, this deletion leaves us in an inconsistent state */ - delete e; - } + /* yes, this deletion leaves us in an inconsistent state */ + delete e; } - } // if (owner <= hoReply) + } entries.clean(); httpHeaderMaskInit(&mask, 0); len = 0; @@ -1738,6 +1738,7 @@ storeAppendPrintf(e, "%2s\t %-5s\t %5s\t %6s\n", "id", "#flds", "count", "%total"); hs->hdrUCountDistr.dump(e, httpHeaderFldsPerHdrDumper); + storeAppendPrintf(e, "\n"); dump_stat = NULL; } @@ -1759,7 +1760,6 @@ for (i = 1; i < HttpHeaderStatCount; ++i) { httpHeaderStatDump(HttpHeaderStats + i, e); - storeAppendPrintf(e, "%s\n", "
"); } /* field stats for all messages */ diff -u -r -N squid-3.3.4/src/HttpHeaderTools.h squid-3.3.5/src/HttpHeaderTools.h --- squid-3.3.4/src/HttpHeaderTools.h 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/HttpHeaderTools.h 2013-05-20 23:48:55.000000000 +1200 @@ -5,6 +5,9 @@ #include "HttpHeader.h" #include "typedefs.h" +#if HAVE_FUNCTIONAL +#include +#endif #if HAVE_LIST #include #endif @@ -14,6 +17,9 @@ #if HAVE_STRING #include #endif +#if HAVE_STRINGS_H +#include +#endif class acl_access; class ACLList; @@ -56,8 +62,18 @@ void dumpReplacement(StoreEntry *entry, const char *optionName) const; private: + /// Case-insensitive std::string "less than" comparison functor. + /// Fast version recommended by Meyers' "Effective STL" for ASCII c-strings. + class NoCaseLessThan: public std::binary_function + { + public: + bool operator()(const std::string &lhs, const std::string &rhs) const { + return strcasecmp(lhs.c_str(), rhs.c_str()) < 0; + } + }; + /// a name:mangler map; optimize: use unordered map or some such - typedef std::map ManglersByName; + typedef std::map ManglersByName; /// one mangler for each known header headerMangler known[HDR_ENUM_END]; diff -u -r -N squid-3.3.4/src/log/FormatHttpdCombined.cc squid-3.3.5/src/log/FormatHttpdCombined.cc --- squid-3.3.4/src/log/FormatHttpdCombined.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/log/FormatHttpdCombined.cc 2013-05-20 23:48:55.000000000 +1200 @@ -45,13 +45,15 @@ Log::Format::HttpdCombined(const AccessLogEntry::Pointer &al, Logfile * logfile) { const char *user_ident = ::Format::QuoteUrlEncodeUsername(al->cache.rfc931); - - const char *user_auth = ::Format::QuoteUrlEncodeUsername(al->cache.authuser); - + const char *user_auth = NULL; const char *referer = NULL; const char *agent = NULL; if (al->request) { +#if USE_AUTH + if (al->request->auth_user_request != NULL) + user_auth = ::Format::QuoteUrlEncodeUsername(al->request->auth_user_request->username()); +#endif referer = al->request->header.getStr(HDR_REFERER); agent = al->request->header.getStr(HDR_USER_AGENT); } diff -u -r -N squid-3.3.4/src/log/FormatHttpdCommon.cc squid-3.3.5/src/log/FormatHttpdCommon.cc --- squid-3.3.4/src/log/FormatHttpdCommon.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/log/FormatHttpdCommon.cc 2013-05-20 23:48:55.000000000 +1200 @@ -35,6 +35,7 @@ #include "format/Quoting.h" #include "format/Token.h" #include "globals.h" +#include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" #include "SquidConfig.h" @@ -43,7 +44,11 @@ void Log::Format::HttpdCommon(const AccessLogEntry::Pointer &al, Logfile * logfile) { - const char *user_auth = ::Format::QuoteUrlEncodeUsername(al->cache.authuser); + const char *user_auth = NULL; +#if USE_AUTH + if (al->request && al->request->auth_user_request != NULL) + user_auth = ::Format::QuoteUrlEncodeUsername(al->request->auth_user_request->username()); +#endif const char *user_ident = ::Format::QuoteUrlEncodeUsername(al->cache.rfc931); char clientip[MAX_IPSTRLEN]; diff -u -r -N squid-3.3.4/src/log/FormatSquidIcap.cc squid-3.3.5/src/log/FormatSquidIcap.cc --- squid-3.3.4/src/log/FormatSquidIcap.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/log/FormatSquidIcap.cc 2013-05-20 23:48:55.000000000 +1200 @@ -59,7 +59,10 @@ client = al->cache.caddr.NtoA(clientbuf, MAX_IPSTRLEN); } - user = ::Format::QuoteUrlEncodeUsername(al->cache.authuser); +#if USE_AUTH + if (al->request != NULL && al->request->auth_user_request != NULL) + user = ::Format::QuoteUrlEncodeUsername(al->request->auth_user_request->username()); +#endif if (!user) user = ::Format::QuoteUrlEncodeUsername(al->cache.extuser); diff -u -r -N squid-3.3.4/src/log/FormatSquidNative.cc squid-3.3.5/src/log/FormatSquidNative.cc --- squid-3.3.4/src/log/FormatSquidNative.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/log/FormatSquidNative.cc 2013-05-20 23:48:55.000000000 +1200 @@ -35,6 +35,7 @@ #include "format/Quoting.h" #include "format/Token.h" #include "globals.h" +#include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" #include "SquidConfig.h" @@ -45,7 +46,12 @@ { char hierHost[MAX_IPSTRLEN]; - const char *user = ::Format::QuoteUrlEncodeUsername(al->cache.authuser); + const char *user = NULL; + +#if USE_AUTH + if (al->request && al->request->auth_user_request != NULL) + user = ::Format::QuoteUrlEncodeUsername(al->request->auth_user_request->username()); +#endif if (!user) user = ::Format::QuoteUrlEncodeUsername(al->cache.extuser); diff -u -r -N squid-3.3.4/src/Makefile.am squid-3.3.5/src/Makefile.am --- squid-3.3.4/src/Makefile.am 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/Makefile.am 2013-05-20 23:48:55.000000000 +1200 @@ -974,7 +974,7 @@ cache_cf.o: cf_parser.cci # cf_gen builds the configuration files. -cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) +cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) cf_gen_defines.cci $(HOSTCXX) -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src # squid.conf.default is built by cf_gen when making cf_parser.cci @@ -984,7 +984,9 @@ cf_parser.cci: cf.data cf_gen$(EXEEXT) ./cf_gen$(EXEEXT) cf.data $(srcdir)/cf.data.depend -cf_gen_defines.cci: $(srcdir)/cf_gen_defines $(srcdir)/cf.data.pre +# The cf_gen_defines.cci is auto-generated and does not exist when the +# dependencies computed. We need to add its include files (autoconf.h) here +cf_gen_defines.cci: $(srcdir)/cf_gen_defines $(srcdir)/cf.data.pre $(top_builddir)/include/autoconf.h $(AWK) -f $(srcdir)/cf_gen_defines <$(srcdir)/cf.data.pre >$@ || ($(RM) -f $@ && exit 1) diff -u -r -N squid-3.3.4/src/Makefile.in squid-3.3.5/src/Makefile.in --- squid-3.3.4/src/Makefile.in 2013-04-27 15:35:25.000000000 +1200 +++ squid-3.3.5/src/Makefile.in 2013-05-20 23:50:04.000000000 +1200 @@ -7294,7 +7294,7 @@ cache_cf.o: cf_parser.cci # cf_gen builds the configuration files. -cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) +cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) cf_gen_defines.cci $(HOSTCXX) -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src # squid.conf.default is built by cf_gen when making cf_parser.cci @@ -7304,7 +7304,9 @@ cf_parser.cci: cf.data cf_gen$(EXEEXT) ./cf_gen$(EXEEXT) cf.data $(srcdir)/cf.data.depend -cf_gen_defines.cci: $(srcdir)/cf_gen_defines $(srcdir)/cf.data.pre +# The cf_gen_defines.cci is auto-generated and does not exist when the +# dependencies computed. We need to add its include files (autoconf.h) here +cf_gen_defines.cci: $(srcdir)/cf_gen_defines $(srcdir)/cf.data.pre $(top_builddir)/include/autoconf.h $(AWK) -f $(srcdir)/cf_gen_defines <$(srcdir)/cf.data.pre >$@ || ($(RM) -f $@ && exit 1) cf.data: cf.data.pre Makefile diff -u -r -N squid-3.3.4/src/Parsing.cc squid-3.3.5/src/Parsing.cc --- squid-3.3.4/src/Parsing.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/Parsing.cc 2013-05-20 23:48:55.000000000 +1200 @@ -75,9 +75,9 @@ } unsigned int -xatoui(const char *token) +xatoui(const char *token, char eov) { - int64_t input = xatoll(token, 10); + int64_t input = xatoll(token, 10, eov); if (input < 0) { debugs(0, DBG_PARSE_NOTE(DBG_IMPORTANT), "ERROR: The input value '" << token << "' cannot be less than 0."); self_destruct(); @@ -107,7 +107,7 @@ } int64_t -xatoll(const char *token, int base) +xatoll(const char *token, int base, char eov) { char *end = NULL; int64_t ret = strtoll(token, &end, base); @@ -117,7 +117,7 @@ self_destruct(); } - if (*end) { + if (*end != eov) { debugs(0, DBG_PARSE_NOTE(DBG_IMPORTANT), "ERROR: Invalid value: '" << token << "' is supposed to be a number."); self_destruct(); } diff -u -r -N squid-3.3.4/src/Parsing.h squid-3.3.5/src/Parsing.h --- squid-3.3.4/src/Parsing.h 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/Parsing.h 2013-05-20 23:48:55.000000000 +1200 @@ -38,9 +38,9 @@ double xatof(const char *token); int xatoi(const char *token); -unsigned int xatoui(const char *token); +unsigned int xatoui(const char *token, char eov = '\0'); long xatol(const char *token); -int64_t xatoll(const char *token, int base); +int64_t xatoll(const char *token, int base, char eov = '\0'); unsigned short xatos(const char *token); /** diff -u -r -N squid-3.3.4/src/ssl/certificate_db.cc squid-3.3.5/src/ssl/certificate_db.cc --- squid-3.3.4/src/ssl/certificate_db.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/ssl/certificate_db.cc 2013-05-20 23:48:55.000000000 +1200 @@ -165,7 +165,7 @@ if (!db) return; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA for (int i = 0; i < sk_OPENSSL_PSTRING_num(db->data); ++i) { const char ** current_row = ((const char **)sk_OPENSSL_PSTRING_value(db->data, i)); #else @@ -183,7 +183,7 @@ void Ssl::CertificateDb::sq_TXT_DB_delete_row(TXT_DB *db, int idx) { char **rrow; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA rrow = (char **)sk_OPENSSL_PSTRING_delete(db->data, idx); #else rrow = (char **)sk_delete(db->data, idx); @@ -197,7 +197,7 @@ const Columns db_indexes[]={cnlSerial, cnlName}; for (unsigned int i = 0; i < countof(db_indexes); ++i) { void *data = NULL; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA if (LHASH_OF(OPENSSL_STRING) *fieldIndex = db->index[db_indexes[i]]) data = lh_OPENSSL_STRING_delete(fieldIndex, rrow); #else @@ -471,19 +471,11 @@ corrupt = true; // Create indexes in db. -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL - if (!corrupt && !TXT_DB_create_index(temp_db.get(), cnlSerial, NULL, LHASH_HASH_FN(index_serial), LHASH_COMP_FN(index_serial))) - corrupt = true; - - if (!corrupt && !TXT_DB_create_index(temp_db.get(), cnlName, NULL, LHASH_HASH_FN(index_name), LHASH_COMP_FN(index_name))) - corrupt = true; -#else if (!corrupt && !TXT_DB_create_index(temp_db.get(), cnlSerial, NULL, LHASH_HASH_FN(index_serial_hash), LHASH_COMP_FN(index_serial_cmp))) corrupt = true; if (!corrupt && !TXT_DB_create_index(temp_db.get(), cnlName, NULL, LHASH_HASH_FN(index_name_hash), LHASH_COMP_FN(index_name_cmp))) corrupt = true; -#endif if (corrupt) throw std::runtime_error("The SSL certificate database " + db_path + " is corrupted. Please rebuild"); @@ -523,7 +515,7 @@ return false; bool removed_one = false; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA for (int i = 0; i < sk_OPENSSL_PSTRING_num(db.get()->data); ++i) { const char ** current_row = ((const char **)sk_OPENSSL_PSTRING_value(db.get()->data, i)); #else @@ -548,14 +540,14 @@ if (!db) return false; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA if (sk_OPENSSL_PSTRING_num(db.get()->data) == 0) #else if (sk_num(db.get()->data) == 0) #endif return false; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA const char **row = (const char **)sk_OPENSSL_PSTRING_value(db.get()->data, 0); #else const char **row = (const char **)sk_value(db.get()->data, 0); @@ -571,7 +563,7 @@ if (!db) return false; -#if OPENSSL_VERSION_NUMBER >= 0x1000004fL +#if SQUID_SSLTXTDB_PSTRINGDATA for (int i = 0; i < sk_OPENSSL_PSTRING_num(db.get()->data); ++i) { const char ** current_row = ((const char **)sk_OPENSSL_PSTRING_value(db.get()->data, i)); #else diff -u -r -N squid-3.3.4/src/ssl/certificate_db.h squid-3.3.5/src/ssl/certificate_db.h --- squid-3.3.4/src/ssl/certificate_db.h 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/ssl/certificate_db.h 2013-05-20 23:48:55.000000000 +1200 @@ -136,17 +136,17 @@ /// Definitions required by openSSL, to use the index_* functions defined above ///with TXT_DB_create_index. -#if OPENSSL_VERSION_NUMBER > 0x10000000L - static unsigned long index_serial_LHASH_HASH(const void *a) { +#if SQUID_USE_SSLLHASH_HACK + static unsigned long index_serial_hash_LHASH_HASH(const void *a) { return index_serial_hash((const char **)a); } - static int index_serial_LHASH_COMP(const void *arg1, const void *arg2) { + static int index_serial_cmp_LHASH_COMP(const void *arg1, const void *arg2) { return index_serial_cmp((const char **)arg1, (const char **)arg2); } - static unsigned long index_name_LHASH_HASH(const void *a) { + static unsigned long index_name_hash_LHASH_HASH(const void *a) { return index_name_hash((const char **)a); } - static int index_name_LHASH_COMP(const void *arg1, const void *arg2) { + static int index_name_cmp_LHASH_COMP(const void *arg1, const void *arg2) { return index_name_cmp((const char **)arg1, (const char **)arg2); } #else diff -u -r -N squid-3.3.4/src/ssl/support.cc squid-3.3.5/src/ssl/support.cc --- squid-3.3.4/src/ssl/support.cc 2013-04-27 15:34:48.000000000 +1200 +++ squid-3.3.5/src/ssl/support.cc 2013-05-20 23:48:55.000000000 +1200 @@ -1413,9 +1413,12 @@ { // SSL_get_certificate is buggy in openssl versions 1.0.1d and 1.0.1e // Try to retrieve certificate directly from SSL_CTX object -#if OPENSSL_VERSION_NUMBER == 0x1000105fL || OPENSSL_VERSION_NUMBER == 0x1000104fL +#if SQUID_USE_SSLGETCERTIFICATE_HACK X509 ***pCert = (X509 ***)sslContext->cert; X509 * cert = pCert && *pCert ? **pCert : NULL; +#elif SQUID_SSLGETCERTIFICATE_BUGGY + X509 * cert = NULL; + assert(0); #else // Temporary ssl for getting X509 certificate from SSL_CTX. Ssl::SSL_Pointer ssl(SSL_new(sslContext));