diff -u -r -N squid-3.2.6/ChangeLog squid-3.2.7/ChangeLog
--- squid-3.2.6/ChangeLog	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/ChangeLog	2013-02-01 23:55:31.000000000 +1300
@@ -1,3 +1,20 @@
+Changes to squid-3.2.7 (01 Feb 2013):
+
+	- Bug 3736: Floating point exception due to divide by zero
+	- Bug 3735: raw-IPv6 domain URLs crash if IPv6-disabled
+	- Bug 3732: Fix ConnOpener IPv6 awareness
+	- Bug 3729: 32-bit overflow in parsing 64-bit configuration values
+	- Bug 3728: Improve debug for cache_dir
+	- Bug 3687: unhandled exception: c when using interception and peers
+	- Bug 3678: external acl grace period causes acl lookup failures
+	- Bug 3567: Memory leak handling malformed requests
+	- Bug 3111: Mid-term fix for the forward.cc "err" assertion
+	- Support OpenSSL NO_Compression optio
+	- Fix IPv6 enabled pinger on split-stack or IPv6-disabled systems
+	- Fix "address.GetPort() != 0" assertion for helpers
+	- ... and several minor memory leaks
+	- ... and some cache.log message polishing
+
 Changes to squid-3.2.6 (09 Jan 2013):
 
 	- Regression Bug 3731: TOS setsockopt() requires int value
diff -u -r -N squid-3.2.6/configure squid-3.2.7/configure
--- squid-3.2.6/configure	2013-01-09 14:42:47.000000000 +1300
+++ squid-3.2.7/configure	2013-02-01 23:57:00.000000000 +1300
@@ -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.2.6.
+# Generated by GNU Autoconf 2.68 for Squid Web Proxy 3.2.7.
 #
 # Report bugs to <http://bugs.squid-cache.org/>.
 #
@@ -575,8 +575,8 @@
 # Identity of this package.
 PACKAGE_NAME='Squid Web Proxy'
 PACKAGE_TARNAME='squid'
-PACKAGE_VERSION='3.2.6'
-PACKAGE_STRING='Squid Web Proxy 3.2.6'
+PACKAGE_VERSION='3.2.7'
+PACKAGE_STRING='Squid Web Proxy 3.2.7'
 PACKAGE_BUGREPORT='http://bugs.squid-cache.org/'
 PACKAGE_URL=''
 
@@ -1571,7 +1571,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.2.6 to adapt to many kinds of systems.
+\`configure' configures Squid Web Proxy 3.2.7 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1641,7 +1641,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Squid Web Proxy 3.2.6:";;
+     short | recursive ) echo "Configuration of Squid Web Proxy 3.2.7:";;
    esac
   cat <<\_ACEOF
 
@@ -2019,7 +2019,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Squid Web Proxy configure 3.2.6
+Squid Web Proxy configure 3.2.7
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -3115,7 +3115,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.2.6, which was
+It was created by Squid Web Proxy $as_me 3.2.7, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -3934,7 +3934,7 @@
 
 # Define the identity of the package.
  PACKAGE='squid'
- VERSION='3.2.6'
+ VERSION='3.2.7'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -30894,7 +30894,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.2.6, which was
+This file was extended by Squid Web Proxy $as_me 3.2.7, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -30960,7 +30960,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.2.6
+Squid Web Proxy config.status 3.2.7
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
diff -u -r -N squid-3.2.6/configure.ac squid-3.2.7/configure.ac
--- squid-3.2.6/configure.ac	2013-01-09 14:42:47.000000000 +1300
+++ squid-3.2.7/configure.ac	2013-02-01 23:56:59.000000000 +1300
@@ -1,4 +1,4 @@
-AC_INIT([Squid Web Proxy],[3.2.6],[http://bugs.squid-cache.org/],[squid])
+AC_INIT([Squid Web Proxy],[3.2.7],[http://bugs.squid-cache.org/],[squid])
 AC_PREREQ(2.61)
 AC_CONFIG_HEADERS([include/autoconf.h])
 AC_CONFIG_AUX_DIR(cfgaux)
diff -u -r -N squid-3.2.6/helpers/basic_auth/DB/basic_db_auth.8 squid-3.2.7/helpers/basic_auth/DB/basic_db_auth.8
--- squid-3.2.6/helpers/basic_auth/DB/basic_db_auth.8	2013-01-09 15:05:47.000000000 +1300
+++ squid-3.2.7/helpers/basic_auth/DB/basic_db_auth.8	2013-02-02 00:21:45.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "BASIC_DB_AUTH 1"
-.TH BASIC_DB_AUTH 1 "2013-01-08" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH BASIC_DB_AUTH 1 "2013-02-01" "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.2.6/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 squid-3.2.7/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8
--- squid-3.2.6/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8	2013-01-09 15:05:51.000000000 +1300
+++ squid-3.2.7/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8	2013-02-02 00:22:05.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "EXT_WBINFO_GROUP_ACL.PL.IN 1"
-.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2013-01-08" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2013-02-01" "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.2.6/include/version.h squid-3.2.7/include/version.h
--- squid-3.2.6/include/version.h	2013-01-09 14:42:47.000000000 +1300
+++ squid-3.2.7/include/version.h	2013-02-01 23:57:00.000000000 +1300
@@ -9,7 +9,7 @@
  */
 
 #ifndef SQUID_RELEASE_TIME
-#define SQUID_RELEASE_TIME 1357695708
+#define SQUID_RELEASE_TIME 1359716114
 #endif
 
 #ifndef APP_SHORTNAME
diff -u -r -N squid-3.2.6/lib/smblib/smblib.c squid-3.2.7/lib/smblib/smblib.c
--- squid-3.2.6/lib/smblib/smblib.c	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/lib/smblib/smblib.c	2013-02-01 23:55:31.000000000 +1300
@@ -122,8 +122,10 @@
     strcpy(con -> password, "");
     strcpy(con -> sock_options, "");
     strcpy(con -> address, "");
-    strcpy(con -> desthost, server);
-    strcpy(con -> PDomain, NTdomain);
+    strncpy(con -> desthost, server, sizeof(con->desthost));
+    con->desthost[sizeof(con->desthost) - 1] = '\0';
+    strncpy(con -> PDomain, NTdomain, sizeof(con->PDomain));
+    con->PDomain[sizeof(con->PDomain) - 1] = '\0';
     strcpy(con -> OSName, SMBLIB_DEFAULT_OSNAME);
     strcpy(con -> LMType, SMBLIB_DEFAULT_LMTYPE);
     con -> first_tree = con -> last_tree = NULL;
@@ -216,9 +218,12 @@
 
     /* Init some things ... */
 
-    strcpy(con -> service, service);
-    strcpy(con -> username, username);
-    strcpy(con -> password, password);
+    strncpy(con -> service, service, sizeof(con -> service));
+    con -> service[sizeof(con -> service) - 1] = '\0';
+    strncpy(con -> username, username, sizeof(con -> username));
+    con -> username[sizeof(con -> username) - 1] = '\0';
+    strncpy(con -> password, password, sizeof(con -> password));
+    con -> password[sizeof(con -> password) - 1] = '\0';
     strcpy(con -> sock_options, "");
     strcpy(con -> address, "");
     strcpy(con -> PDomain, SMBLIB_DEFAULT_DOMAIN);
@@ -239,8 +244,17 @@
 
     /* Now figure out the host portion of the service */
 
-    strcpy(temp, service);
+    strncpy(temp, service, sizeof(temp));
+    temp[sizeof(temp) - 1] = '\0';
     host = strtok(temp, "/\\");     /* Separate host name portion */
+    if (!host) {
+        if (Con_Handle == NULL) {
+            free(con);
+            Con_Handle = NULL;
+        }
+        SMBlib_errno = -SMBlibE_CallFailed;
+        return NULL;
+    }
     strcpy(con -> desthost, host);
 
     /* Now connect to the remote end, but first upper case the name of the
@@ -283,9 +297,10 @@
 
     if (SMB_Negotiate(con, SMB_Prots_Restrict) < 0) {
 
-        /* Hmmm what should we do here ... We have a connection, but could not
-           negotiate ...                                                      */
-
+        if (Con_Handle == NULL) {
+            free(con);
+        }
+        SMBlib_errno = -SMBlibE_NegNoProt;
         return NULL;
 
     }
@@ -294,6 +309,10 @@
 
     if ((*tree = SMB_TreeConnect(con, NULL, service, password, "A:")) == NULL) {
 
+        if (Con_Handle == NULL) {
+            free(con);
+        }
+        SMBlib_errno = -SMBlibE_BAD;
         return NULL;
 
     }
@@ -328,7 +347,8 @@
         pass_len = 24;
         memcpy(pword, PassWord, 24);
     } else {
-        strcpy(pword, PassWord);
+        strncpy(pword, PassWord, sizeof(pword));
+        pword[sizeof(pword) - 1] = '\0';
 #ifdef PAM_SMB_ENC_PASS
         if (Con_Handle->encrypt_passwords) {
             pass_len = 24;
@@ -394,7 +414,7 @@
 
         p = p + 1;
 
-        if (NtDomain != NULL) {
+        if (NtDomain == NULL) {
             strcpy(p, Con_Handle -> PDomain);
             p = p + strlen(Con_Handle -> PDomain);
         } else {
diff -u -r -N squid-3.2.6/RELEASENOTES.html squid-3.2.7/RELEASENOTES.html
--- squid-3.2.6/RELEASENOTES.html	2013-01-09 15:06:07.000000000 +1300
+++ squid-3.2.7/RELEASENOTES.html	2013-02-02 00:23:34.000000000 +1300
@@ -2,10 +2,10 @@
 <HTML>
 <HEAD>
  <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.66">
- <TITLE>Squid 3.2.6 release notes</TITLE>
+ <TITLE>Squid 3.2.7 release notes</TITLE>
 </HEAD>
 <BODY>
-<H1>Squid 3.2.6 release notes</H1>
+<H1>Squid 3.2.7 release notes</H1>
 
 <H2>Squid Developers</H2>
 <HR>
@@ -72,7 +72,7 @@
 <HR>
 <H2><A NAME="s1">1.</A> <A HREF="#toc1">Notice</A></H2>
 
-<P>The Squid Team are pleased to announce the release of Squid-3.2.6 for 
+<P>The Squid Team are pleased to announce the release of Squid-3.2.7 for 
 testing.</P>
 <P>This new release is available for download from 
 <A HREF="http://www.squid-cache.org/Versions/v3/3.2/">http://www.squid-cache.org/Versions/v3/3.2/</A> or the 
diff -u -r -N squid-3.2.6/snmplib/parse.c squid-3.2.7/snmplib/parse.c
--- squid-3.2.6/snmplib/parse.c	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/snmplib/parse.c	2013-02-01 23:55:31.000000000 +1300
@@ -408,7 +408,7 @@
         np->enums = NULL;	/* so we don't free them later */
         if (root->child_list == NULL) {
             root->child_list = tp;
-        } else {
+        } else if (peer) {
             peer->next_peer = tp;
         }
         peer = tp;
@@ -630,6 +630,16 @@
     xfree((char *) np);
 }
 
+static void
+free_node_list(struct node *nl)
+{
+    while (nl) {
+        struct node *t = nl->next;
+        free_node(nl);
+        nl = t;
+    }
+}
+
 /*
  * Parse an entry of the form:
  * label OBJECT IDENTIFIER ::= { parent 2 }
@@ -662,9 +672,9 @@
                 op++, nop++) {
             /* every node must have parent's name and child's name or number */
             if (op->label && (nop->label || (nop->subid != -1))) {
-                strcpy(np->parent, op->label);
+                strncpy(np->parent, op->label, sizeof(np->parent) - 1);
                 if (nop->label)
-                    strcpy(np->label, nop->label);
+                    strncpy(np->label, nop->label, sizeof(np->label) - 1);
                 if (nop->subid != -1)
                     np->subid = nop->subid;
                 np->type = 0;
@@ -685,8 +695,8 @@
          */
         if (count == (length - 2)) {
             if (op->label) {
-                strcpy(np->parent, op->label);
-                strcpy(np->label, name);
+                strncpy(np->parent, op->label, sizeof(np->parent));
+                strncpy(np->label, name, sizeof(np->label));
                 if (nop->subid != -1)
                     np->subid = nop->subid;
                 else
@@ -695,12 +705,14 @@
                 free_node(np);
                 if (oldnp)
                     oldnp->next = NULL;
-                else
+                else {
+                    free_node_list(root); // we need to clear the newly allocated list
                     return NULL;
+                }
             }
         } else {
             print_error("Missing end of oid", (char *) NULL, type);
-            free_node(np);	/* the last node allocated wasn't used */
+            free_node_list(root); // we need to clear the newly allocated list
             if (oldnp)
                 oldnp->next = NULL;
             return NULL;
@@ -950,9 +962,12 @@
     length = getoid(fp, SubOid, 32);
     if (length > 1 && length <= 32) {
         /* just take the last pair in the oid list */
-        if (SubOid[length - 2].label)
+        if (SubOid[length - 2].label) {
             strncpy(np->parent, SubOid[length - 2].label, 64);
-        strcpy(np->label, name);
+            np->parent[63] = '\0';
+        }
+        strncpy(np->label, name, sizeof(np->label));
+        np->label[sizeof(np->label) - 1] = '\0';
         if (SubOid[length - 1].subid != -1)
             np->subid = SubOid[length - 1].subid;
         else
@@ -995,9 +1010,11 @@
                 return root;
             }
             print_error(token, "is a reserved word", type);
+            free_node_list(root);
             return NULL;
         }
         strncpy(name, token, 64);
+        name[63] = '\0';
         type = get_token(fp, token);
         if (type == OBJTYPE) {
             if (root == NULL) {
@@ -1011,6 +1028,7 @@
                 np->next = parse_objecttype(fp, name);
                 if (np->next == NULL) {
                     print_error("Bad parse of objecttype", (char *) NULL, type);
+                    free_node_list(root);
                     return NULL;
                 }
             }
@@ -1029,6 +1047,7 @@
                 np->next = parse_objectid(fp, name);
                 if (np->next == NULL) {
                     print_error("Bad parse of object type", (char *) NULL, type);
+                    free_node_list(root);
                     return NULL;
                 }
             }
@@ -1041,6 +1060,7 @@
             break;
         } else {
             print_error("Bad operator", (char *) NULL, type);
+            free_node_list(root);
             return NULL;
         }
     }
@@ -1081,18 +1101,20 @@
             strlen("DUMMY")));
     if (!p) {
         snmplib_debug(0, "Bad MIB version or tag missing, install original!\n");
+        fclose(fp);
         return NULL;
     }
     if (!strcmp(mbuf, "DUMMY")) {
         snmplib_debug(0, "You need to update your MIB!\n");
+        fclose(fp);
         return NULL;
     }
     nodes = parse(fp);
+    fclose(fp);
     if (!nodes) {
         snmplib_debug(0, "Mib table is bad.  Exiting\n");
         return NULL;
     }
     tree = build_tree(nodes);
-    fclose(fp);
     return (tree);
 }
diff -u -r -N squid-3.2.6/snmplib/snmp_vars.c squid-3.2.7/snmplib/snmp_vars.c
--- squid-3.2.6/snmplib/snmp_vars.c	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/snmplib/snmp_vars.c	2013-02-01 23:55:31.000000000 +1300
@@ -377,6 +377,7 @@
     u_char *DataPtr;
     int DataLen;
     oid TmpBuf[MAX_NAME_LEN];
+    memset(TmpBuf, 0, MAX_NAME_LEN * sizeof(*TmpBuf));
 
     int AllVarLen = *BufLen;
     int ThisVarLen = 0;
diff -u -r -N squid-3.2.6/src/auth/digest/auth_digest.cc squid-3.2.7/src/auth/digest/auth_digest.cc
--- squid-3.2.6/src/auth/digest/auth_digest.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/auth/digest/auth_digest.cc	2013-02-01 23:55:31.000000000 +1300
@@ -933,10 +933,14 @@
 
     /* 2069 requirements */
 
+    // return value.
+    Auth::UserRequest::Pointer rv;
     /* do we have a username ? */
     if (!username || username[0] == '\0') {
-        debugs(29, 2, HERE << "Empty or not present username");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Empty or not present username");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* Sanity check of the username.
@@ -944,33 +948,43 @@
      * have been redone
      */
     if (strchr(username, '"')) {
-        debugs(29, 2, HERE << "Unacceptable username '" << username << "'");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Unacceptable username '" << username << "'");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* do we have a realm ? */
     if (!digest_request->realm || digest_request->realm[0] == '\0') {
-        debugs(29, 2, HERE << "Empty or not present realm");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Empty or not present realm");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* and a nonce? */
     if (!digest_request->nonceb64 || digest_request->nonceb64[0] == '\0') {
-        debugs(29, 2, HERE << "Empty or not present nonce");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Empty or not present nonce");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* we can't check the URI just yet. We'll check it in the
      * authenticate phase, but needs to be given */
     if (!digest_request->uri || digest_request->uri[0] == '\0') {
-        debugs(29, 2, HERE << "Missing URI field");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Missing URI field");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* is the response the correct length? */
     if (!digest_request->response || strlen(digest_request->response) != 32) {
-        debugs(29, 2, HERE << "Response length invalid");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Response length invalid");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* check the algorithm is present and supported */
@@ -978,8 +992,10 @@
         digest_request->algorithm = xstrndup("MD5", 4);
     else if (strcmp(digest_request->algorithm, "MD5")
              && strcmp(digest_request->algorithm, "MD5-sess")) {
-        debugs(29, 2, HERE << "invalid algorithm specified!");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "invalid algorithm specified!");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* 2617 requirements, indicated by qop */
@@ -988,26 +1004,34 @@
         /* check the qop is what we expected. */
         if (strcmp(digest_request->qop, QOP_AUTH) != 0) {
             /* we received a qop option we didn't send */
-            debugs(29, 2, HERE << "Invalid qop option received");
-            return authDigestLogUsername(username, digest_request);
+            debugs(29, 2, "Invalid qop option received");
+            rv = authDigestLogUsername(username, digest_request);
+            safe_free(username);
+            return rv;
         }
 
         /* check cnonce */
         if (!digest_request->cnonce || digest_request->cnonce[0] == '\0') {
-            debugs(29, 2, HERE << "Missing cnonce field");
-            return authDigestLogUsername(username, digest_request);
+            debugs(29, 2, "Missing cnonce field");
+            rv = authDigestLogUsername(username, digest_request);
+            safe_free(username);
+            return rv;
         }
 
         /* check nc */
         if (strlen(digest_request->nc) != 8 || strspn(digest_request->nc, "0123456789abcdefABCDEF") != 8) {
-            debugs(29, 2, HERE << "invalid nonce count");
-            return authDigestLogUsername(username, digest_request);
+            debugs(29, 2, "invalid nonce count");
+            rv = authDigestLogUsername(username, digest_request);
+            safe_free(username);
+            return rv;
         }
     } else {
         /* cnonce and nc both require qop */
         if (digest_request->cnonce || digest_request->nc) {
-            debugs(29, 2, HERE << "missing qop!");
-            return authDigestLogUsername(username, digest_request);
+            debugs(29, 2, "missing qop!");
+            rv = authDigestLogUsername(username, digest_request);
+            safe_free(username);
+            return rv;
         }
     }
 
@@ -1017,10 +1041,12 @@
     nonce = authenticateDigestNonceFindNonce(digest_request->nonceb64);
     if (!nonce) {
         /* we couldn't find a matching nonce! */
-        debugs(29, 2, HERE << "Unexpected or invalid nonce received");
+        debugs(29, 2, "Unexpected or invalid nonce received");
         if (digest_request->user() != NULL)
             digest_request->user()->credentials(Auth::Failed);
-        return authDigestLogUsername(username, digest_request);
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     digest_request->nonce = nonce;
@@ -1028,8 +1054,10 @@
 
     /* check that we're not being hacked / the username hasn't changed */
     if (nonce->user && strcmp(username, nonce->user->username())) {
-        debugs(29, 2, HERE << "Username for the nonce does not equal the username for the request");
-        return authDigestLogUsername(username, digest_request);
+        debugs(29, 2, "Username for the nonce does not equal the username for the request");
+        rv = authDigestLogUsername(username, digest_request);
+        safe_free(username);
+        return rv;
     }
 
     /* the method we'll check at the authenticate step as well */
diff -u -r -N squid-3.2.6/src/cache_cf.cc squid-3.2.7/src/cache_cf.cc
--- squid-3.2.6/src/cache_cf.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/cache_cf.cc	2013-02-01 23:55:31.000000000 +1300
@@ -2240,7 +2240,7 @@
             p->sslcapath = xstrdup(token + 10);
         } else if (strncmp(token, "sslcrlfile=", 11) == 0) {
             safe_free(p->sslcrlfile);
-            p->sslcapath = xstrdup(token + 10);
+            p->sslcrlfile = xstrdup(token + 11);
         } else if (strncmp(token, "sslflags=", 9) == 0) {
             safe_free(p->sslflags);
             p->sslflags = xstrdup(token + 9);
@@ -4135,7 +4135,7 @@
                               cpuAffinityMap->processes()[i]);
         }
         storeAppendPrintf(entry, " cores=");
-        for (size_t i = 0; i < cpuAffinityMap->processes().size(); ++i) {
+        for (size_t i = 0; i < cpuAffinityMap->cores().size(); ++i) {
             storeAppendPrintf(entry, "%s%i", (i ? "," : ""),
                               cpuAffinityMap->cores()[i]);
         }
diff -u -r -N squid-3.2.6/src/client_side.cc squid-3.2.7/src/client_side.cc
--- squid-3.2.6/src/client_side.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/client_side.cc	2013-02-01 23:55:31.000000000 +1300
@@ -2447,7 +2447,7 @@
 clientProcessRequest(ConnStateData *conn, HttpParser *hp, ClientSocketContext *context, const HttpRequestMethod& method, HttpVersion http_ver)
 {
     ClientHttpRequest *http = context->http;
-    HttpRequest *request = NULL;
+    HttpRequest::Pointer request;
     bool notedUseOfBuffer = false;
     bool chunked = false;
     bool mustReplyToOptions = false;
diff -u -r -N squid-3.2.6/src/comm/ConnOpener.cc squid-3.2.7/src/comm/ConnOpener.cc
--- squid-3.2.6/src/comm/ConnOpener.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/comm/ConnOpener.cc	2013-02-01 23:55:31.000000000 +1300
@@ -10,6 +10,7 @@
 #include "fde.h"
 #include "icmp/net_db.h"
 #include "ipcache.h"
+#include "ip/tools.h"
 #include "SquidTime.h"
 
 CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener);
@@ -155,12 +156,10 @@
 
     /* get a socket open ready for connecting with */
     if (temporaryFd_ < 0) {
-#if USE_IPV6
         /* outbound sockets have no need to be protocol agnostic. */
-        if (conn_->remote.IsIPv4()) {
+        if (!(Ip::EnableIpv6&IPV6_SPECIAL_V4MAPPING) && conn_->remote.IsIPv4()) {
             conn_->local.SetIPv4();
         }
-#endif
         temporaryFd_ = comm_openex(SOCK_STREAM, IPPROTO_TCP, conn_->local, conn_->flags, conn_->tos, conn_->nfmark, host_);
         if (temporaryFd_ < 0) {
             doneConnecting(COMM_ERR_CONNECT, 0);
diff -u -r -N squid-3.2.6/src/defines.h squid-3.2.7/src/defines.h
--- squid-3.2.6/src/defines.h	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/defines.h	2013-02-01 23:55:31.000000000 +1300
@@ -175,6 +175,11 @@
 #define IPC_UNIX_STREAM 4
 #define IPC_UNIX_DGRAM 5
 
+/* required for AF_UNIX below to be defined [on FreeBSD] */
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
 #if HAVE_SOCKETPAIR && defined (AF_UNIX)
 #define IPC_STREAM IPC_UNIX_STREAM
 #define IPC_DGRAM IPC_UNIX_DGRAM
diff -u -r -N squid-3.2.6/src/DiskIO/AIO/AIODiskIOStrategy.cc squid-3.2.7/src/DiskIO/AIO/AIODiskIOStrategy.cc
--- squid-3.2.6/src/DiskIO/AIO/AIODiskIOStrategy.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/AIO/AIODiskIOStrategy.cc	2013-02-01 23:55:31.000000000 +1300
@@ -49,9 +49,12 @@
 #include "DiskIO/ReadRequest.h"
 #include "DiskIO/WriteRequest.h"
 
-AIODiskIOStrategy::AIODiskIOStrategy()
+AIODiskIOStrategy::AIODiskIOStrategy() :
+        fd(-1)
 {
+    aq.aq_state = AQ_STATE_NONE;
     aq.aq_numpending = 0;
+    memset(&aq.aq_queue, 0, sizeof(aq.aq_queue));
 }
 
 AIODiskIOStrategy::~AIODiskIOStrategy()
diff -u -r -N squid-3.2.6/src/DiskIO/DiskDaemon/diskd.cc squid-3.2.7/src/DiskIO/DiskDaemon/diskd.cc
--- squid-3.2.6/src/DiskIO/DiskDaemon/diskd.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/DiskDaemon/diskd.cc	2013-02-01 23:55:31.000000000 +1300
@@ -266,6 +266,10 @@
 
     if (s->shm_offset > -1)
         buf = shmbuf + s->shm_offset;
+    else {
+        fprintf(stderr, "%d UNLNK id(%u) Error: no filename in shm buffer\n", (int) mypid, s->id);
+        return;
+    }
 
     switch (r->mtype) {
 
@@ -370,7 +374,10 @@
 
     hash = hash_create(fsCmp, 1 << 4, fsHash);
     assert(hash);
-    fcntl(0, F_SETFL, SQUID_NONBLOCK);
+    if (fcntl(0, F_SETFL, SQUID_NONBLOCK) < 0) {
+        perror(xstrerror());
+        return 1;
+    }
     memset(&sa, '\0', sizeof(sa));
     sa.sa_handler = alarm_handler;
     sa.sa_flags = SA_RESTART;
diff -u -r -N squid-3.2.6/src/DiskIO/DiskDaemon/DiskdFile.cc squid-3.2.7/src/DiskIO/DiskDaemon/DiskdFile.cc
--- squid-3.2.6/src/DiskIO/DiskDaemon/DiskdFile.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/DiskDaemon/DiskdFile.cc	2013-02-01 23:55:31.000000000 +1300
@@ -69,8 +69,11 @@
     cbdataFree(t);
 }
 
-DiskdFile::DiskdFile(char const *aPath, DiskdIOStrategy *anIO) : errorOccured (false), IO(anIO),
-        inProgressIOs (0)
+DiskdFile::DiskdFile(char const *aPath, DiskdIOStrategy *anIO) :
+        errorOccured(false),
+        IO(anIO),
+        mode(0),
+        inProgressIOs(0)
 {
     assert (aPath);
     debugs(79, 3, "DiskdFile::DiskdFile: " << aPath);
@@ -382,8 +385,10 @@
     debugs(79, 3, "DiskdFile::readDone: status " << M->status);
     assert (M->requestor);
     ReadRequest::Pointer readRequest = dynamic_cast<ReadRequest *>(M->requestor);
+
     /* remove the free protection */
-    readRequest->RefCountDereference();
+    if (readRequest != NULL)
+        readRequest->RefCountDereference();
 
     if (M->status < 0) {
         ++diskd_stats.read.fail;
@@ -407,7 +412,8 @@
     assert (M->requestor);
     WriteRequest::Pointer writeRequest = dynamic_cast<WriteRequest *>(M->requestor);
     /* remove the free protection */
-    writeRequest->RefCountDereference();
+    if (writeRequest != NULL)
+        writeRequest->RefCountDereference();
 
     if (M->status < 0) {
         errorOccured = true;
diff -u -r -N squid-3.2.6/src/DiskIO/DiskThreads/aiops.cc squid-3.2.7/src/DiskIO/DiskThreads/aiops.cc
--- squid-3.2.6/src/DiskIO/DiskThreads/aiops.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/DiskThreads/aiops.cc	2013-02-01 23:55:31.000000000 +1300
@@ -729,8 +729,10 @@
 static void
 squidaio_do_read(squidaio_request_t * requestp)
 {
-    lseek(requestp->fd, requestp->offset, requestp->whence);
-    requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+    if (lseek(requestp->fd, requestp->offset, requestp->whence) >= 0)
+        requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+    else
+        requestp->ret = -1;
     requestp->err = errno;
 }
 
diff -u -r -N squid-3.2.6/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc squid-3.2.7/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc
--- squid-3.2.6/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2013-02-01 23:55:31.000000000 +1300
@@ -190,7 +190,10 @@
     debugs(32, 2, "aioSync: done");
 }
 
-DiskThreadsIOStrategy::DiskThreadsIOStrategy() :  initialised (false) {}
+DiskThreadsIOStrategy::DiskThreadsIOStrategy() :
+        initialised(false),
+        squidaio_ctrl_pool(NULL)
+{}
 
 void
 DiskThreadsIOStrategy::aioStats(StoreEntry * sentry)
diff -u -r -N squid-3.2.6/src/DiskIO/IpcIo/IpcIoFile.cc squid-3.2.7/src/DiskIO/IpcIo/IpcIoFile.cc
--- squid-3.2.6/src/DiskIO/IpcIo/IpcIoFile.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/DiskIO/IpcIo/IpcIoFile.cc	2013-02-01 23:55:31.000000000 +1300
@@ -584,9 +584,14 @@
 /* IpcIoMsg */
 
 IpcIoMsg::IpcIoMsg():
-        requestId(0), offset(0), len(0), command(IpcIo::cmdNone), xerrno(0)
+        requestId(0),
+        offset(0),
+        len(0),
+        command(IpcIo::cmdNone),
+        xerrno(0)
 {
     start.tv_sec = 0;
+    start.tv_usec = 0;
 }
 
 /* IpcIoPendingRequest */
diff -u -r -N squid-3.2.6/src/external_acl.cc squid-3.2.7/src/external_acl.cc
--- squid-3.2.6/src/external_acl.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/external_acl.cc	2013-02-01 23:55:31.000000000 +1300
@@ -830,8 +830,13 @@
             if (acl->def->theHelper->stats.queue_size <= (int)acl->def->theHelper->childs.n_active) {
                 debugs(82, 2, "aclMatchExternal: \"" << key << "\": queueing a call.");
                 ch->changeState(ExternalACLLookup::Instance());
-                debugs(82, 2, "aclMatchExternal: \"" << key << "\": return -1.");
-                return -1; // to get here we have to have an expired cache entry. MUST not use.
+                if (!entry) {
+                    debugs(82, 2, "aclMatchExternal: \"" << key << "\": return -1.");
+                    return -1; // to get here we have to have an expired cache entry. MUST not use.
+                }
+                // else we have a usable entry in grace period
+                debugs(82, 2, "aclMatchExternal: \"" << key << "\": grace period active, will use results from entry.");
+                // Fall thru to processing below.
             } else {
                 if (!entry) {
                     debugs(82, 1, "aclMatchExternal: '" << acl->def->name <<
diff -u -r -N squid-3.2.6/src/forward.cc squid-3.2.7/src/forward.cc
--- squid-3.2.6/src/forward.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/forward.cc	2013-02-01 23:55:31.000000000 +1300
@@ -196,6 +196,8 @@
 
     if (entry->store_status == STORE_PENDING) {
         if (entry->isEmpty()) {
+            if (!err) // we quit (e.g., fd closed) before an error or content
+                fail(new ErrorState(ERR_READ_ERROR, HTTP_BAD_GATEWAY, request));
             assert(err);
             errorAppendEntry(entry, err);
             err = NULL;
diff -u -r -N squid-3.2.6/src/icmp/Icmp4.cc squid-3.2.7/src/icmp/Icmp4.cc
--- squid-3.2.6/src/icmp/Icmp4.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/icmp/Icmp4.cc	2013-02-01 23:55:31.000000000 +1300
@@ -156,6 +156,7 @@
     }
 
     Log(to, ' ', NULL, 0, 0);
+    to.FreeAddrInfo(S);
 }
 
 void
@@ -221,11 +222,15 @@
 
     icmp = (struct icmphdr *) (void *) (pkt + iphdrlen);
 
-    if (icmp->icmp_type != ICMP_ECHOREPLY)
+    if (icmp->icmp_type != ICMP_ECHOREPLY) {
+        preply.from.FreeAddrInfo(from);
         return;
+    }
 
-    if (icmp->icmp_id != icmp_ident)
+    if (icmp->icmp_id != icmp_ident) {
+        preply.from.FreeAddrInfo(from);
         return;
+    }
 
     echo = (icmpEchoData *) (void *) (icmp + 1);
 
@@ -242,6 +247,7 @@
     control.SendResult(preply, (sizeof(pingerReplyData) - MAX_PKT4_SZ + preply.psize) );
 
     Log(preply.from, icmp->icmp_type, icmpPktStr[icmp->icmp_type], preply.rtt, preply.hops);
+    preply.from.FreeAddrInfo(from);
 }
 
 #endif /* USE_ICMP */
diff -u -r -N squid-3.2.6/src/icmp/Icmp6.cc squid-3.2.7/src/icmp/Icmp6.cc
--- squid-3.2.6/src/icmp/Icmp6.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/icmp/Icmp6.cc	2013-02-01 23:55:31.000000000 +1300
@@ -202,6 +202,7 @@
     debugs(42,9, HERE << "x=" << x);
 
     Log(to, 0, NULL, 0, 0);
+    to.FreeAddrInfo(S);
 }
 
 /**
@@ -296,11 +297,13 @@
                    ( icmp6header->icmp6_type&0x80 ? icmp6HighPktStr[(int)(icmp6header->icmp6_type&0x7f)] : icmp6LowPktStr[(int)(icmp6header->icmp6_type&0x7f)] )
                   );
         }
+        preply.from.FreeAddrInfo(from);
         return;
     }
 
     if (icmp6header->icmp6_id != icmp_ident) {
         debugs(42, 8, HERE << "dropping Icmp6 read. IDENT check failed. ident=='" << icmp_ident << "'=='" << icmp6header->icmp6_id << "'");
+        preply.from.FreeAddrInfo(from);
         return;
     }
 
@@ -337,6 +340,7 @@
 
     /* send results of the lookup back to squid.*/
     control.SendResult(preply, (sizeof(pingerReplyData) - PINGER_PAYLOAD_SZ + preply.psize) );
+    preply.from.FreeAddrInfo(from);
 }
 
 #endif /* USE_ICMP */
diff -u -r -N squid-3.2.6/src/icmp/pinger.cc squid-3.2.7/src/icmp/pinger.cc
--- squid-3.2.6/src/icmp/pinger.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/icmp/pinger.cc	2013-02-01 23:55:31.000000000 +1300
@@ -71,6 +71,7 @@
 #include "Icmp4.h"
 #include "Icmp6.h"
 #include "IcmpPinger.h"
+#include "ip/tools.h"
 
 #if _SQUID_MSWIN_
 
@@ -148,6 +149,9 @@
 
     getCurrentTime();
 
+    // determine IPv4 or IPv6 capabilities before using sockets.
+    Ip::ProbeTransport();
+
     _db_init(NULL, debug_args);
 
     debugs(42, 0, "pinger: Initialising ICMP pinger ...");
diff -u -r -N squid-3.2.6/src/ip/testAddress.cc squid-3.2.7/src/ip/testAddress.cc
--- squid-3.2.6/src/ip/testAddress.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/ip/testAddress.cc	2013-02-01 23:55:31.000000000 +1300
@@ -714,6 +714,7 @@
     CPPUNIT_ASSERT( memcmp( expect->ai_addr, ipval->ai_addr, expect->ai_addrlen ) == 0 );
 
     freeaddrinfo(expect);
+    anIP.FreeAddrInfo(ipval);
 }
 
 void
diff -u -r -N squid-3.2.6/src/mem_node.cc squid-3.2.7/src/mem_node.cc
--- squid-3.2.6/src/mem_node.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/mem_node.cc	2013-02-01 23:55:31.000000000 +1300
@@ -65,8 +65,12 @@
     n->write_pending = 0;
 }
 
-mem_node::mem_node(int64_t offset):nodeBuffer(0,offset,data)
-{}
+mem_node::mem_node(int64_t offset) :
+        nodeBuffer(0,offset,data),
+        write_pending(0)
+{
+    *data = 0;
+}
 
 mem_node::~mem_node()
 {}
diff -u -r -N squid-3.2.6/src/Parsing.cc squid-3.2.7/src/Parsing.cc
--- squid-3.2.6/src/Parsing.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/Parsing.cc	2013-02-01 23:55:31.000000000 +1300
@@ -85,7 +85,7 @@
 GetInteger64(void)
 {
     char *token = strtok(NULL, w_space);
-    int i;
+    int64_t i;
 
     if (token == NULL)
         self_destruct();
diff -u -r -N squid-3.2.6/src/peer_select.cc squid-3.2.7/src/peer_select.cc
--- squid-3.2.6/src/peer_select.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/peer_select.cc	2013-02-01 23:55:31.000000000 +1300
@@ -47,6 +47,7 @@
 #include "SquidTime.h"
 #include "icmp/net_db.h"
 #include "ipcache.h"
+#include "ip/tools.h"
 
 static struct {
     int timeouts;
@@ -242,15 +243,18 @@
     const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified;
     const bool choseDirect = fs && fs->code == HIER_DIRECT;
     if (isIntercepted && useOriginalDst && choseDirect) {
-        // construct a "result" adding the ORIGINAL_DST to the set instead of DIRECT
-        Comm::ConnectionPointer p = new Comm::Connection();
-        p->remote = req->clientConnectionManager->clientConnection->local;
-        p->peerType = fs->code;
-        p->setPeer(fs->_peer);
-
-        // check for a configured outgoing address for this destination...
-        getOutgoingAddress(psstate->request, p);
-        psstate->paths->push_back(p);
+        // check the client is still around before using any of its details
+        if (req->clientConnectionManager.valid()) {
+            // construct a "result" adding the ORIGINAL_DST to the set instead of DIRECT
+            Comm::ConnectionPointer p = new Comm::Connection();
+            p->remote = req->clientConnectionManager->clientConnection->local;
+            p->peerType = fs->code;
+            p->setPeer(fs->_peer);
+
+            // check for a configured outgoing address for this destination...
+            getOutgoingAddress(psstate->request, p);
+            psstate->paths->push_back(p);
+        }
 
         // clear the used fs and continue
         psstate->servers = fs->next;
@@ -352,6 +356,14 @@
 
             p = new Comm::Connection();
             p->remote = ia->in_addrs[n];
+
+            // when IPv6 is disabled we cannot use it
+            if (!Ip::EnableIpv6 && p->remote.IsIPv6()) {
+                const char *host = (fs->_peer ? fs->_peer->host : psstate->request->GetHost());
+                ipcacheMarkBadAddr(host, p->remote);
+                continue;
+            }
+
             if (fs->_peer)
                 p->remote.SetPort(fs->_peer->http_port);
             else
diff -u -r -N squid-3.2.6/src/ssl/support.cc squid-3.2.7/src/ssl/support.cc
--- squid-3.2.6/src/ssl/support.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/ssl/support.cc	2013-02-01 23:55:31.000000000 +1300
@@ -400,6 +400,11 @@
         "NO_TLSv1_2", SSL_OP_NO_TLSv1_2
     },
 #endif
+#if SSL_OP_NO_COMPRESSION
+    {
+        "No_Compression", SSL_OP_NO_COMPRESSION
+    },
+#endif
     {
         "", 0
     },
diff -u -r -N squid-3.2.6/src/store_client.cc squid-3.2.7/src/store_client.cc
--- squid-3.2.6/src/store_client.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/store_client.cc	2013-02-01 23:55:31.000000000 +1300
@@ -61,7 +61,7 @@
 static StoreIOState::STRCB storeClientReadHeader;
 static void storeClientCopy2(StoreEntry * e, store_client * sc);
 static EVH storeClientCopyEvent;
-static int CheckQuickAbort2(StoreEntry * entry);
+static bool CheckQuickAbortIsReasonable(StoreEntry * entry);
 static void CheckQuickAbort(StoreEntry * entry);
 
 CBDATA_CLASS_INIT(store_client);
@@ -781,72 +781,72 @@
     return npend;
 }
 
-/* return 1 if the request should be aborted */
-static int
-CheckQuickAbort2(StoreEntry * entry)
+/* return true if the request should be aborted */
+static bool
+CheckQuickAbortIsReasonable(StoreEntry * entry)
 {
     MemObject * const mem = entry->mem_obj;
     assert(mem);
-    debugs(90, 3, "CheckQuickAbort2: entry=" << entry << ", mem=" << mem);
+    debugs(90, 3, "entry=" << entry << ", mem=" << mem);
 
     if (mem->request && !mem->request->flags.cachable) {
-        debugs(90, 3, "CheckQuickAbort2: YES !mem->request->flags.cachable");
-        return 1;
+        debugs(90, 3, "quick-abort? YES !mem->request->flags.cachable");
+        return true;
     }
 
     if (EBIT_TEST(entry->flags, KEY_PRIVATE)) {
-        debugs(90, 3, "CheckQuickAbort2: YES KEY_PRIVATE");
-        return 1;
+        debugs(90, 3, "quick-abort? YES KEY_PRIVATE");
+        return true;
     }
 
     int64_t expectlen = entry->getReply()->content_length + entry->getReply()->hdr_sz;
 
-    if (expectlen < 0)
+    if (expectlen < 0) {
         /* expectlen is < 0 if *no* information about the object has been received */
-        return 1;
+        debugs(90, 3, "quick-abort? YES no object data received yet");
+        return true;
+    }
 
-    int64_t curlen =  mem->endOffset ();
+    int64_t curlen =  mem->endOffset();
 
     if (Config.quickAbort.min < 0) {
-        debugs(90, 3, "CheckQuickAbort2: NO disabled");
-        return 0;
+        debugs(90, 3, "quick-abort? NO disabled");
+        return false;
     }
 
-    int64_t roffLimit = mem->request->getRangeOffsetLimit();
-
-    if ( roffLimit < 0 && mem->request && mem->request->range ) {
+    if (mem->request && mem->request->range && mem->request->getRangeOffsetLimit() < 0) {
         /* Don't abort if the admin has configured range_ofset -1 to download fully for caching. */
-        debugs(90, 3, "CheckQuickAbort2: NO admin configured range replies to full-download");
-        return 0;
+        debugs(90, 3, "quick-abort? NO admin configured range replies to full-download");
+        return false;
     }
 
     if (curlen > expectlen) {
-        debugs(90, 3, "CheckQuickAbort2: YES bad content length");
-        return 1;
+        debugs(90, 3, "quick-abort? YES bad content length");
+        return true;
     }
 
     if ((expectlen - curlen) < (Config.quickAbort.min << 10)) {
-        debugs(90, 3, "CheckQuickAbort2: NO only little more left");
-        return 0;
+        debugs(90, 3, "quick-abort? NO only a little more object left to receive");
+        return false;
     }
 
     if ((expectlen - curlen) > (Config.quickAbort.max << 10)) {
-        debugs(90, 3, "CheckQuickAbort2: YES too much left to go");
-        return 1;
+        debugs(90, 3, "quick-abort? YES too much left to go");
+        return true;
     }
 
     if (expectlen < 100) {
-        debugs(90, 3, "CheckQuickAbort2: NO avoid FPE");
-        return 0;
+        debugs(90, 3, "quick-abort? NO avoid FPE");
+        return false;
     }
 
     if ((curlen / (expectlen / 100)) > (Config.quickAbort.pct)) {
-        debugs(90, 3, "CheckQuickAbort2: NO past point of no return");
-        return 0;
+        debugs(90, 3, "quick-abort? NO past point of no return");
+        return false;
     }
 
-    debugs(90, 3, "CheckQuickAbort2: YES default, returning 1");
-    return 1;
+    debugs(90, 3, "quick-abort? YES default");
+    return true;
 }
 
 static void
@@ -863,7 +863,7 @@
     if (EBIT_TEST(entry->flags, ENTRY_SPECIAL))
         return;
 
-    if (CheckQuickAbort2(entry) == 0)
+    if (!CheckQuickAbortIsReasonable(entry))
         return;
 
     entry->abort();
diff -u -r -N squid-3.2.6/src/store_dir.cc squid-3.2.7/src/store_dir.cc
--- squid-3.2.6/src/store_dir.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/store_dir.cc	2013-02-01 23:55:31.000000000 +1300
@@ -907,6 +907,10 @@
 void
 StoreHashIndex::create()
 {
+    if (Config.cacheSwap.n_configured == 0) {
+        debugs(0, DBG_PARSE_NOTE(DBG_CRITICAL), "No cache_dir stores are configured.");
+    }
+
     for (int i = 0; i < Config.cacheSwap.n_configured; ++i) {
         if (dir(i).active())
             store(i)->create();
@@ -934,6 +938,12 @@
 void
 StoreHashIndex::init()
 {
+    if (Config.Store.objectsPerBucket <= 0)
+        fatal("'store_objects_per_bucket' should be larger than 0.");
+
+    if (Config.Store.avgObjectSize <= 0)
+        fatal("'store_avg_object_size' should be larger than 0.");
+
     /* Calculate size of hash table (maximum currently 64k buckets).  */
     /* this is very bogus, its specific to the any Store maintaining an
      * in-core index, not global */
diff -u -r -N squid-3.2.6/src/wccp2.cc squid-3.2.7/src/wccp2.cc
--- squid-3.2.6/src/wccp2.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/wccp2.cc	2013-02-01 23:55:31.000000000 +1300
@@ -592,6 +592,7 @@
     /* The password field, for the MD5 hash, needs to be 8 bytes and NUL padded. */
     memset(pwd, 0, sizeof(pwd));
     strncpy(pwd, password, sizeof(pwd));
+    pwd[sizeof(pwd) - 1] = '\0';
 
     ws = (struct wccp2_security_md5_t *) ptr;
     assert(ntohs(ws->security_type) == WCCP2_SECURITY_INFO);
@@ -660,6 +661,7 @@
     /* The password field, for the MD5 hash, needs to be 8 bytes and NUL padded. */
     memset(pwd, 0, sizeof(pwd));
     strncpy(pwd, srv->wccp_password, sizeof(pwd));
+    pwd[sizeof(pwd) - 1] = '\0';
 
     /* Take a copy of the challenge: we need to NUL it before comparing */
     memcpy(md5_challenge, ws->security_implementation, 16);
@@ -1008,7 +1010,8 @@
 #if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
     {
         int i = IP_PMTUDISC_DONT;
-        setsockopt(theWccp2Connection, SOL_IP, IP_MTU_DISCOVER, &i, sizeof i);
+        if (setsockopt(theWccp2Connection, SOL_IP, IP_MTU_DISCOVER, &i, sizeof i) < 0)
+            debugs(80, 2, "WARNING: Path MTU discovery could not be disabled on FD " << theWccp2Connection << ": " << xstrerror());
     }
 
 #endif
@@ -1047,8 +1050,9 @@
             /* Disconnect the sending socket. Note: FreeBSD returns error
              * but disconnects anyway so we have to just assume it worked
              */
-            if (wccp2_numrouters > 1)
-                connect(theWccp2Connection, (struct sockaddr *) &null, router_len);
+            if (wccp2_numrouters > 1) {
+                (void)connect(theWccp2Connection, (struct sockaddr *) &null, router_len);
+            }
         }
 
         service_list_ptr = service_list_ptr->next;
@@ -1606,10 +1610,9 @@
                                 &service_list_ptr->wccp_packet,
                                 service_list_ptr->wccp_packet_size);
             } else {
-                send(theWccp2Connection,
-                     &service_list_ptr->wccp_packet,
-                     service_list_ptr->wccp_packet_size,
-                     0);
+                errno = 0;
+                if (send(theWccp2Connection, &service_list_ptr->wccp_packet, service_list_ptr->wccp_packet_size, 0) < static_cast<int>(service_list_ptr->wccp_packet_size))
+                    debugs(80, 2, "ERROR: failed to send WCCPv2 HERE_I_AM packet to " << router << " : " << xstrerror());
             }
         }
 
@@ -1983,20 +1986,21 @@
             if (ntohl(router_list_ptr->num_caches)) {
                 /* send packet */
 
+                /* FIXME INET6 : drop temp conversion */
+                Ip::Address tmp_rtr(router);
+
                 if (wccp2_numrouters > 1) {
-                    /* FIXME INET6 : drop temp conversion */
-                    Ip::Address tmp_rtr(router);
                     comm_udp_sendto(theWccp2Connection,
                                     tmp_rtr,
                                     &wccp_packet,
                                     offset);
                 } else {
-                    send(theWccp2Connection,
-                         &wccp_packet,
-                         offset,
-                         0);
+                    errno = 0;
+                    if (send(theWccp2Connection, &wccp_packet, offset, 0) < static_cast<int>(offset))
+                        debugs(80, 2, "ERROR: failed to send WCCPv2 HERE_I_AM packet to " << tmp_rtr << " : " << xstrerror());
                 }
             }
+            safe_free(weight);
         }
 
         service_list_ptr = service_list_ptr->next;
diff -u -r -N squid-3.2.6/src/wccp.cc squid-3.2.7/src/wccp.cc
--- squid-3.2.6/src/wccp.cc	2013-01-09 14:41:51.000000000 +1300
+++ squid-3.2.7/src/wccp.cc	2013-02-01 23:55:31.000000000 +1300
@@ -302,13 +302,18 @@
     debugs(80, 6, "wccpHereIam: Called");
 
     wccp_here_i_am.id = last_id;
-    comm_udp_send(theWccpConnection,
-                  &wccp_here_i_am,
-                  sizeof(wccp_here_i_am),
-                  0);
+    double interval = 10.0; // TODO: make this configurable, possibly negotiate with the router.
+    errno = 0;
+    ssize_t sent = comm_udp_send(theWccpConnection, &wccp_here_i_am, sizeof(wccp_here_i_am), 0);
+
+    // if we failed to send the whole lot, try again at a shorter interval (20%)
+    if (sent != sizeof(wccp_here_i_am)) {
+        debugs(80, 2, "ERROR: failed to send WCCP HERE_I_AM packet: " << xstrerror());
+        interval = 2.0;
+    }
 
     if (!eventFind(wccpHereIam, NULL))
-        eventAdd("wccpHereIam", wccpHereIam, NULL, 10.0, 1);
+        eventAdd("wccpHereIam", wccpHereIam, NULL, interval, 1);
 }
 
 static void
