diff -u -r -N squid-3.3.0.2/ChangeLog squid-3.3.0.3/ChangeLog
--- squid-3.3.0.2/ChangeLog	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/ChangeLog	2013-01-09 14:09:06.000000000 +1300
@@ -1,3 +1,12 @@
+Changes to squid-3.3.0.3 (09 Jan 2013):
+
+	- Bug 3729: 32-bit overflow in parsing 64-bit configuration values
+	- Bug 3728: Improve debug for cache_dir
+	- Additional fixes for CVE-2012-5643 / SQUID:2012-1
+	- kerberos_ldap_group: support multiple groups in squid.conf ACL definition
+	- kqueue: update status from experimental to fully available net I/O method
+	- ... and many memory leaks and potential bugs detected by Coverity Scan
+
 Changes to squid-3.3.0.2 (03 Dec 2012):
 
 	- Support matching empty header field values using req_header and rep_header
@@ -23,6 +32,18 @@
 	- ... and many compile error fixes
 	- ... and a very large amount of code polish for faster compilation
 
+Changes to squid-3.2.6 (09 Jan 2013):
+
+	- Regression Bug 3731: TOS setsockopt() requires int value
+	- Regression Bug 3712: Rotating logs overwrites the previous log
+	- Bug 3727: LLVM compile errors in kerberos_ldap_group
+	- Bug 3650: Negotiate auth missing challenge token
+	- Additional fixes for CVE-2012-5643 / SQUID:2012-1
+
+Changes to squid-3.2.5 (10 Dec 2012):
+
+	- Bug 3698: Add missing include of errno.h
+
 Changes to squid-3.2.4 (03 Dec 2012):
 
 	- Ported: urllogin ACL from squid 2.7
@@ -472,6 +493,10 @@
 	- ... and a great many testing improvements
 	- ... and many documentation updates
 
+Changes to squid-3.1.23 (09 Jan 2013):
+
+	- Additional fixes for CVE-2012-5643 / SQUID:2012-1
+
 Changes to squid-3.1.22 (03 Dec 2012):
 
 	- Bug 3685: Squid hangs in Delay Pools ClassCBucket::update
diff -u -r -N squid-3.3.0.2/configure squid-3.3.0.3/configure
--- squid-3.3.0.2/configure	2012-12-02 21:31:05.000000000 +1300
+++ squid-3.3.0.3/configure	2013-01-09 14:10:25.000000000 +1300
@@ -1,9 +1,9 @@
 #! /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.0.2.
+# Generated by GNU Autoconf 2.68 for Squid Web Proxy 3.3.0.3.
 #
-# Report bugs to <http://www.squid-cache.org/bugs/>.
+# Report bugs to <http://bugs.squid-cache.org/>.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -248,7 +248,7 @@
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
     $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: http://www.squid-cache.org/bugs/ about your system,
+$0: http://bugs.squid-cache.org/ about your system,
 $0: including any error possibly output before this
 $0: message. Then install a modern shell, or manually run
 $0: the script under such a shell if you do have one."
@@ -575,9 +575,9 @@
 # Identity of this package.
 PACKAGE_NAME='Squid Web Proxy'
 PACKAGE_TARNAME='squid'
-PACKAGE_VERSION='3.3.0.2'
-PACKAGE_STRING='Squid Web Proxy 3.3.0.2'
-PACKAGE_BUGREPORT='http://www.squid-cache.org/bugs/'
+PACKAGE_VERSION='3.3.0.3'
+PACKAGE_STRING='Squid Web Proxy 3.3.0.3'
+PACKAGE_BUGREPORT='http://bugs.squid-cache.org/'
 PACKAGE_URL=''
 
 ac_unique_file="src/main.cc"
@@ -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.0.2 to adapt to many kinds of systems.
+\`configure' configures Squid Web Proxy 3.3.0.3 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.0.2:";;
+     short | recursive ) echo "Configuration of Squid Web Proxy 3.3.0.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1730,7 +1730,7 @@
                           http://wiki.squid-cache.org/SquidFaq/CacheDigests
   --disable-select        Disable select(2) support.
   --disable-poll          Disable poll(2) support.
-  --enable-kqueue         Enable kqueue(2) support (experimental).
+  --disable-kqueue        Disable kqueue(2) support.
   --disable-epoll         Disable Linux epoll(2) support.
   --disable-devpoll       Disable Solaris /dev/poll support.
   --disable-http-violations
@@ -1951,7 +1951,7 @@
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <http://www.squid-cache.org/bugs/>.
+Report bugs to <http://bugs.squid-cache.org/>.
 _ACEOF
 ac_status=$?
 fi
@@ -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.0.2
+Squid Web Proxy configure 3.3.0.3
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -2211,9 +2211,9 @@
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ----------------------------------------------- ##
-## Report this to http://www.squid-cache.org/bugs/ ##
-## ----------------------------------------------- ##"
+( $as_echo "## ------------------------------------------- ##
+## Report this to http://bugs.squid-cache.org/ ##
+## ------------------------------------------- ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
@@ -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.0.2, which was
+It was created by Squid Web Proxy $as_me 3.3.0.3, 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.0.2'
+ VERSION='3.3.0.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -21056,7 +21056,6 @@
 { $as_echo "$as_me:${as_lineno-$LINENO}: enabling poll syscall for net I/O: ${enable_poll:=auto}" >&5
 $as_echo "$as_me: enabling poll syscall for net I/O: ${enable_poll:=auto}" >&6;}
 
-# kqueue support is still experiemntal and unstable. Not enabled by default.
 # Check whether --enable-kqueue was given.
 if test "${enable_kqueue+set}" = set; then :
   enableval=$enable_kqueue;
@@ -21068,7 +21067,7 @@
 
 fi
 
-if test "x${enable_kqueue:=no}" = "xyes" ; then
+if test "x${enable_kqueue:=auto}" != "xno" ; then
   for ac_header in sys/event.h
 do :
   ac_fn_cxx_check_header_mongrel "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default"
@@ -21078,15 +21077,40 @@
 _ACEOF
 
 else
-   as_fn_error $? "kqueue support requires sys/event.h header file." "$LINENO" 5
+
+    if test "x${enable_kqueue}" = "xyes" ; then
+      as_fn_error $? "kqueue support requires sys/event.h header file." "$LINENO" 5
+    fi
+
 fi
 
 done
 
-  squid_opt_io_loop_engine="kqueue"
+  for ac_func in kqueue
+do :
+  ac_fn_cxx_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue"
+if test "x$ac_cv_func_kqueue" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_KQUEUE 1
+_ACEOF
+
+else
+
+    if test "x${enable_kqueue}" = "xyes" ; then
+      as_fn_error $? "kqueue support missing in libc library." "$LINENO" 5
+    fi
+
+fi
+done
+
+  if test "x$ac_cv_func_kqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes" ; then
+    squid_opt_io_loop_engine="kqueue"
+  else
+    enable_kqueue="no"
+  fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: enabling kqueue for net I/O: $enable_kqueue" >&5
-$as_echo "$as_me: enabling kqueue for net I/O: $enable_kqueue" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: enabling kqueue for net I/O: ${enable_kqueue:=auto}" >&5
+$as_echo "$as_me: enabling kqueue for net I/O: ${enable_kqueue:=auto}" >&6;}
 
 # Check whether --enable-epoll was given.
 if test "${enable_epoll+set}" = set; then :
@@ -28779,7 +28803,6 @@
 	glob \
 	htobe16 \
 	htole16 \
-	kqueue\
 	lrand48 \
 	mallinfo \
 	mallocblksize \
@@ -29001,7 +29024,7 @@
 $as_echo "$as_me: choosing user-specified net I/O API $squid_opt_io_loop_engine" >&6;}
 elif test "x$enable_epoll" != "xno" -a "x$squid_cv_epoll_works" = "xyes" ; then
   squid_opt_io_loop_engine="epoll"
-elif test "x$enable_kqueue" != "xno" -a "x$ac_cv_func_kqueue" = "xyes" ; then
+elif test "x$enable_kqueue" != "xno" ; then
   squid_opt_io_loop_engine="kqueue"
 elif test "x$enable_devpoll" != "xno" ; then
   squid_opt_io_loop_engine="devpoll"
@@ -31296,7 +31319,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.0.2, which was
+This file was extended by Squid Web Proxy $as_me 3.3.0.3, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -31356,13 +31379,13 @@
 Configuration commands:
 $config_commands
 
-Report bugs to <http://www.squid-cache.org/bugs/>."
+Report bugs to <http://bugs.squid-cache.org/>."
 
 _ACEOF
 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.0.2
+Squid Web Proxy config.status 3.3.0.3
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
diff -u -r -N squid-3.3.0.2/configure.ac squid-3.3.0.3/configure.ac
--- squid-3.3.0.2/configure.ac	2012-12-02 21:31:05.000000000 +1300
+++ squid-3.3.0.3/configure.ac	2013-01-09 14:10:25.000000000 +1300
@@ -1,4 +1,4 @@
-AC_INIT([Squid Web Proxy],[3.3.0.2],[http://www.squid-cache.org/bugs/],[squid])
+AC_INIT([Squid Web Proxy],[3.3.0.3],[http://bugs.squid-cache.org/],[squid])
 AC_PREREQ(2.61)
 AC_CONFIG_HEADERS([include/autoconf.h])
 AC_CONFIG_AUX_DIR(cfgaux)
@@ -1313,18 +1313,29 @@
 ])
 AC_MSG_NOTICE([enabling poll syscall for net I/O: ${enable_poll:=auto}])
 
-# kqueue support is still experiemntal and unstable. Not enabled by default.
 AC_ARG_ENABLE(kqueue,
-  AS_HELP_STRING([--enable-kqueue],
-                 [Enable kqueue(2) support (experimental).]), [
+  AS_HELP_STRING([--disable-kqueue],
+                 [Disable kqueue(2) support.]), [
 SQUID_YESNO($enableval,[--enable-kqueue takes no extra argument])
 ])
-if test "x${enable_kqueue:=no}" = "xyes" ; then
-  AC_CHECK_HEADERS([sys/event.h],[],
-    [ AC_MSG_ERROR([kqueue support requires sys/event.h header file.]) ])
-  squid_opt_io_loop_engine="kqueue"
+if test "x${enable_kqueue:=auto}" != "xno" ; then
+  AC_CHECK_HEADERS([sys/event.h],[],[
+    if test "x${enable_kqueue}" = "xyes" ; then
+      AC_MSG_ERROR([kqueue support requires sys/event.h header file.])
+    fi
+  ])
+  AC_CHECK_FUNCS(kqueue,[],[
+    if test "x${enable_kqueue}" = "xyes" ; then
+      AC_MSG_ERROR([kqueue support missing in libc library.])
+    fi
+  ])
+  if test "x$ac_cv_func_kqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes" ; then
+    squid_opt_io_loop_engine="kqueue"
+  else
+    enable_kqueue="no"
+  fi
 fi
-AC_MSG_NOTICE([enabling kqueue for net I/O: $enable_kqueue])
+AC_MSG_NOTICE([enabling kqueue for net I/O: ${enable_kqueue:=auto}])
 
 dnl Enable epoll()
 AC_ARG_ENABLE(epoll,
@@ -3160,7 +3171,6 @@
 	glob \
 	htobe16 \
 	htole16 \
-	kqueue\
 	lrand48 \
 	mallinfo \
 	mallocblksize \
@@ -3228,7 +3238,7 @@
 	AC_MSG_NOTICE([choosing user-specified net I/O API $squid_opt_io_loop_engine])
 elif test "x$enable_epoll" != "xno" -a "x$squid_cv_epoll_works" = "xyes" ; then
   squid_opt_io_loop_engine="epoll"
-elif test "x$enable_kqueue" != "xno" -a "x$ac_cv_func_kqueue" = "xyes" ; then
+elif test "x$enable_kqueue" != "xno" ; then
   squid_opt_io_loop_engine="kqueue"
 elif test "x$enable_devpoll" != "xno" ; then
   squid_opt_io_loop_engine="devpoll"
diff -u -r -N squid-3.3.0.2/helpers/basic_auth/DB/basic_db_auth.8 squid-3.3.0.3/helpers/basic_auth/DB/basic_db_auth.8
--- squid-3.3.0.2/helpers/basic_auth/DB/basic_db_auth.8	2012-12-02 21:48:01.000000000 +1300
+++ squid-3.3.0.3/helpers/basic_auth/DB/basic_db_auth.8	2013-01-09 14:33:06.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "BASIC_DB_AUTH 1"
-.TH BASIC_DB_AUTH 1 "2012-12-02" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH BASIC_DB_AUTH 1 "2013-01-08" "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.0.2/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/kerberos_ldap_group.cc	2013-01-09 14:09:06.000000000 +1300
@@ -32,6 +32,7 @@
 #include "squid.h"
 #include "helpers/defines.h"
 #include "util.h"
+#include "rfc1738.h"
 
 #ifdef HAVE_LDAP
 
@@ -226,7 +227,8 @@
 main(int argc, char *const argv[])
 {
     char buf[6400];
-    char *user, *domain;
+    char *user, *domain, *group;
+    char *up=NULL, *dp=NULL, *np=NULL;
     char *nuser, *nuser8 = NULL, *netbios;
     char *c;
     int opt;
@@ -334,11 +336,17 @@
     }
 
     debug((char *) "%s| %s: INFO: Starting version %s\n", LogTime(), PROGRAM, KERBEROS_LDAP_GROUP_VERSION);
+    int gopt = 0;
     if (create_gd(&margs)) {
-        debug((char *) "%s| %s: FATAL: Error in group list: %s\n", LogTime(), PROGRAM, margs.glist ? margs.glist : "NULL");
-        SEND_ERR("");
-        clean_args(&margs);
-        exit(1);
+        if ( margs.glist != NULL ) {
+            debug((char *) "%s| %s: FATAL: Error in group list: %s\n", LogTime(), PROGRAM, margs.glist ? margs.glist : "NULL");
+            SEND_ERR("");
+            clean_args(&margs);
+            exit(1);
+        } else {
+            debug((char *) "%s| %s: INFO: no group list given expect it from stdin\n", LogTime(), PROGRAM);
+            gopt = 1;
+        }
     }
     if (create_nd(&margs)) {
         debug((char *) "%s| %s: FATAL: Error in netbios list: %s\n", LogTime(), PROGRAM, margs.nlist ? margs.nlist : "NULL");
@@ -370,12 +378,18 @@
         if (c) {
             *c = '\0';
         } else {
-            SEND_ERR("");
+            SEND_ERR("Invalid input. CR missing");
             debug((char *) "%s| %s: ERR\n", LogTime(), PROGRAM);
             continue;
         }
 
-        user = buf;
+        user = strtok(buf, " \n");
+        if (!user) {
+            debug((char *) "%s| %s: INFO: No Username given\n", LogTime(), PROGRAM);
+            SEND_ERR("Invalid request. No Username");
+            continue;
+        }
+        rfc1738_unescape(user);
         nuser = strchr(user, '\\');
         if (!nuser)
             nuser8 = strstr(user, "%5C");
@@ -391,33 +405,62 @@
                 nuser = nuser8 + 3;
             }
             netbios = user;
+            up = xstrdup(rfc1738_escape(nuser));
+            np = xstrdup(rfc1738_escape(netbios));
             if (debug_enabled)
-                debug((char *) "%s| %s: INFO: Got User: %s Netbios Name: %s\n", LogTime(), PROGRAM, nuser, netbios);
+                debug((char *) "%s| %s: INFO: Got User: %s Netbios Name: %s\n", LogTime(), PROGRAM, up, np);
             else
-                log((char *) "%s| %s: INFO: Got User: %s Netbios Name: %s\n", LogTime(), PROGRAM, nuser, netbios);
+                log((char *) "%s| %s: INFO: Got User: %s Netbios Name: %s\n", LogTime(), PROGRAM, up, np);
             domain = get_netbios_name(&margs, netbios);
             user = nuser;
+            xfree(up);
+            xfree(np);
         } else if (domain) {
             strup(domain);
             *domain = '\0';
             ++domain;
         }
+        up = xstrdup(rfc1738_escape(user));
+        if (domain)
+            dp = xstrdup(rfc1738_escape(domain));
         if (!domain && margs.ddomain) {
             domain = xstrdup(margs.ddomain);
             if (debug_enabled)
-                debug((char *) "%s| %s: INFO: Got User: %s set default domain: %s\n", LogTime(), PROGRAM, user, domain);
+                debug((char *) "%s| %s: INFO: Got User: %s set default domain: %s\n", LogTime(), PROGRAM, up, dp);
             else
-                log((char *) "%s| %s: INFO: Got User: %s set default domain: %s\n", LogTime(), PROGRAM, user, domain);
+                log((char *) "%s| %s: INFO: Got User: %s set default domain: %s\n", LogTime(), PROGRAM, up, dp);
         }
         if (debug_enabled)
-            debug((char *) "%s| %s: INFO: Got User: %s Domain: %s\n", LogTime(), PROGRAM, user, domain ? domain : "NULL");
+            debug((char *) "%s| %s: INFO: Got User: %s Domain: %s\n", LogTime(), PROGRAM, up, domain ? dp : "NULL");
         else
-            log((char *) "%s| %s: INFO: Got User: %s Domain: %s\n", LogTime(), PROGRAM, user, domain ? domain : "NULL");
+            log((char *) "%s| %s: INFO: Got User: %s Domain: %s\n", LogTime(), PROGRAM, up, domain ? dp : "NULL");
 
+        xfree(up);
+        xfree(dp);
         if (!strcmp(user, "QQ") && domain && !strcmp(domain, "QQ")) {
             clean_args(&margs);
             exit(-1);
         }
+        if (gopt) {
+            if ((group = strtok(NULL, " \n")) != NULL) {
+                debug((char *) "%s| %s: INFO: Read group list %s from stdin\n", LogTime(), PROGRAM, group);
+                rfc1738_unescape(group);
+                if (margs.groups) {
+                    clean_gd(margs.groups);
+                    margs.groups = NULL;
+                }
+                margs.glist = xstrdup(group);
+                if (create_gd(&margs)) {
+                    SEND_ERR("Error in group list");
+                    debug((char *) "%s| %s: FATAL: Error in group list: %s\n", LogTime(), PROGRAM, margs.glist ? margs.glist : "NULL");
+                    continue;
+                }
+            } else {
+                SEND_ERR("No group list received on stdin");
+                debug((char *) "%s| %s: FATAL: No group list received on stdin\n", LogTime(), PROGRAM);
+                continue;
+            }
+        }
         if (check_memberof(&margs, user, domain)) {
             SEND_OK("");
             debug((char *) "%s| %s: DEBUG: OK\n", LogTime(), PROGRAM);
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/Makefile.am squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/Makefile.am
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/Makefile.am	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/Makefile.am	2013-01-09 14:09:06.000000000 +1300
@@ -24,6 +24,7 @@
 
 ext_kerberos_ldap_group_acl_LDFLAGS =
 ext_kerberos_ldap_group_acl_LDADD = \
+	$(top_builddir)/lib/libmiscencoding.la \
 	$(COMPAT_LIB) \
 	$(LDAPLIB) \
 	$(LBERLIB) \
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/Makefile.in squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/Makefile.in
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/Makefile.in	2012-12-02 21:30:38.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/Makefile.in	2013-01-09 14:09:44.000000000 +1300
@@ -72,7 +72,8 @@
 @ENABLE_XPROF_STATS_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/lib/profiler/libprofiler.la
 am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
 am__DEPENDENCIES_3 =
-ext_kerberos_ldap_group_acl_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ext_kerberos_ldap_group_acl_DEPENDENCIES =  \
+	$(top_builddir)/lib/libmiscencoding.la $(am__DEPENDENCIES_2) \
 	$(am__DEPENDENCIES_3) $(am__DEPENDENCIES_3) \
 	$(am__DEPENDENCIES_3) $(am__DEPENDENCIES_3) \
 	$(am__DEPENDENCIES_3)
@@ -408,6 +409,7 @@
 
 ext_kerberos_ldap_group_acl_LDFLAGS = 
 ext_kerberos_ldap_group_acl_LDADD = \
+	$(top_builddir)/lib/libmiscencoding.la \
 	$(COMPAT_LIB) \
 	$(LDAPLIB) \
 	$(LBERLIB) \
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_group.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_group.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_group.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_group.cc	2013-01-09 14:09:06.000000000 +1300
@@ -42,6 +42,18 @@
     return gdsp;
 }
 
+void
+free_gd(struct gdstruct *gdsp)
+{
+    while (gdsp) {
+        struct gdstruct *gdspn = gdsp->next;
+        xfree(gdsp->group);
+        xfree(gdsp->domain);
+        xfree(gdsp);
+        gdsp = gdspn;
+    }
+}
+
 char *utf8dup(struct main_args *margs);
 
 char *
@@ -101,35 +113,24 @@
 char *
 hex_utf_char(struct main_args *margs, int flag)
 {
-    char *up;
-    char *upd;
-    char *ul;
-    int a, n, nl, ival, ichar;
+    int ival, ichar;
     int iUTF2, iUTF3, iUTF4;
 
-    if (flag) {
-        up = margs->ulist;
-    } else {
-        up = margs->tlist;
-    }
-
+    char *up = (flag ? margs->ulist : margs->tlist);
     if (!up)
         return NULL;
 
-    upd = strrchr(up, '@');
-    if (upd)
-        a = upd - up;
-    else
-        a = strlen(up);
-
-    ul = (char *) xmalloc(strlen(up));
-    n = 0;
-    nl = 0;
+    char *upd = strrchr(up, '@');
+    size_t a = (upd ? (upd - up) : strlen(up) );
+
+    char *ul = (char *) xmalloc(strlen(up)+1);
+    size_t n = 0;
+    int nl = 0;
     iUTF2 = 0;
     iUTF3 = 0;
     iUTF4 = 0;
 
-    while (n < (int) strlen(up)) {
+    while (n < strlen(up)) {
         if (flag && n == a)
             break;
         if (up[n] == '@') {
@@ -147,15 +148,13 @@
             ichar = (ival - 48) * 16;
         else {
             debug((char *) "%s| %s: WARNING: Invalid Hex value %c\n", LogTime(), PROGRAM, ival);
-            if (ul)
-                xfree(ul);
+            xfree(ul);
             return NULL;
         }
 
         if (n == a - 1) {
             debug((char *) "%s| %s: WARNING: Invalid Hex UTF-8 string %s\n", LogTime(), PROGRAM, up);
-            if (ul)
-                xfree(ul);
+            xfree(ul);
             return NULL;
         }
         ++n;
@@ -168,8 +167,7 @@
             ichar = ichar + ival - 48;
         else {
             debug((char *) "%s| %s: WARNING: Invalid Hex value %c\n", LogTime(), PROGRAM, ival);
-            if (ul)
-                xfree(ul);
+            xfree(ul);
             return NULL;
         }
 
@@ -189,8 +187,7 @@
                 ul[nl] = ichar;
                 ul[nl + 1] = '\0';
                 debug((char *) "%s| %s: WARNING: Invalid UTF-8 sequence for Unicode %s\n", LogTime(), PROGRAM, ul);
-                if (ul)
-                    xfree(ul);
+                xfree(ul);
                 return NULL;
             }
         } else if (iUTF3) {
@@ -219,8 +216,7 @@
                 ul[nl] = ichar;
                 ul[nl + 1] = '\0';
                 debug((char *) "%s| %s: WARNING: Invalid UTF-8 sequence for Unicode %s\n", LogTime(), PROGRAM, ul);
-                if (ul)
-                    xfree(ul);
+                xfree(ul);
                 return NULL;
             }
         } else if (iUTF4) {
@@ -248,8 +244,7 @@
                 ul[nl] = ichar;
                 ul[nl + 1] = '\0';
                 debug((char *) "%s| %s: WARNING: Invalid UTF-8 sequence for Unicode %s\n", LogTime(), PROGRAM, ul);
-                if (ul)
-                    xfree(ul);
+                xfree(ul);
                 return NULL;
             }
         } else if (ichar < 0x80) {
@@ -275,8 +270,7 @@
             ul[nl] = ichar;
             ul[nl + 1] = '\0';
             debug((char *) "%s| %s: WARNING: Invalid UTF-8 sequence for Unicode %s\n", LogTime(), PROGRAM, ul);
-            if (ul)
-                xfree(ul);
+            xfree(ul);
             return NULL;
         }
         ++n;
@@ -286,8 +280,7 @@
     if (iUTF2 || iUTF3 || iUTF4) {
         debug((char *) "%s| %s: INFO: iUTF2: %d iUTF3: %d iUTF4: %d\n", LogTime(), PROGRAM, iUTF2, iUTF3, iUTF4);
         debug((char *) "%s| %s: WARNING: Invalid UTF-8 sequence for Unicode %s\n", LogTime(), PROGRAM, ul);
-        if (ul)
-            xfree(ul);
+        xfree(ul);
         return NULL;
     }
     if (flag && upd)
@@ -299,7 +292,6 @@
 create_gd(struct main_args *margs)
 {
     char *gp, *dp;
-    char *hp1, *hp2, *up;
     char *p;
     struct gdstruct *gdsp = NULL, *gdspn = NULL;
     /*
@@ -321,28 +313,43 @@
      *
      *
      */
-    hp1 = hex_utf_char(margs, 0);
-    hp2 = hex_utf_char(margs, 1);
-    up = utf8dup(margs);
+    char *hp1 = hex_utf_char(margs, 0);
+    char *hp2 = hex_utf_char(margs, 1);
+    char *up = utf8dup(margs);
+
+    // NP: will point to the start of a temporary assembly buffer used by 'p' and 'gp'
+    //     for catenation of the hp1, hp2, and up buffer contents from above.
+    //     necessary for xfree() because both p and gp move over the assembly area
+    char *gpbuf = NULL;
+
+    // release the allocated UTF decoding buffers
+#define cleanup() { \
+    xfree(gpbuf); \
+    xfree(hp1); \
+    xfree(hp2); \
+    xfree(up); \
+    free_gd(gdsp); \
+ }
+
     p = up;
     if (hp1) {
         if (hp2) {
             if (up) {
-                p = (char *) xmalloc(strlen(up) + strlen(hp1) + strlen(hp2) + 2);
+                gpbuf = p = (char *) xmalloc(strlen(up) + strlen(hp1) + strlen(hp2) + 2);
                 strcpy(p, up);
                 strcat(p, ":");
                 strcat(p, hp1);
                 strcat(p, ":");
                 strcat(p, hp2);
             } else {
-                p = (char *) xmalloc(strlen(hp1) + strlen(hp2) + 1);
+                gpbuf = p = (char *) xmalloc(strlen(hp1) + strlen(hp2) + 1);
                 strcpy(p, hp1);
                 strcat(p, ":");
                 strcat(p, hp2);
             }
         } else {
             if (up) {
-                p = (char *) xmalloc(strlen(up) + strlen(hp1) + 1);
+                gpbuf = p = (char *) xmalloc(strlen(up) + strlen(hp1) + 1);
                 strcpy(p, up);
                 strcat(p, ":");
                 strcat(p, hp1);
@@ -352,7 +359,7 @@
     } else {
         if (hp2) {
             if (up) {
-                p = (char *) xmalloc(strlen(up) + strlen(hp2) + 1);
+                gpbuf = p = (char *) xmalloc(strlen(up) + strlen(hp2) + 1);
                 strcpy(p, up);
                 strcat(p, ":");
                 strcat(p, hp2);
@@ -367,6 +374,7 @@
 
     if (!p) {
         debug((char *) "%s| %s: ERROR: No groups defined.\n", LogTime(), PROGRAM);
+        cleanup();
         return (1);
     }
     while (*p) {		/* loop over group list */
@@ -377,18 +385,24 @@
         if (*p == '@') {	/* end of group name - start of domain name */
             if (p == gp) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: ERROR: No group defined for domain %s\n", LogTime(), PROGRAM, p);
+                cleanup();
                 return (1);
             }
+            if (dp) {  /* end of domain name - twice */
+                debug((char *) "%s| %s: @ is not allowed in group name %s@%s\n",LogTime(), PROGRAM,gp,dp);
+                cleanup();
+                return(1);
+            }
             *p = '\0';
             ++p;
             gdsp = init_gd();
-            gdsp->group = gp;
-            if (gdspn)		/* Have already an existing structure */
-                gdsp->next = gdspn;
+            gdsp->group = xstrdup(gp);
+            gdsp->next = gdspn;
             dp = p;		/* after @ starts new domain name */
         } else if (*p == ':') {	/* end of group name or end of domain name */
             if (p == gp) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: ERROR: No group defined for domain %s\n", LogTime(), PROGRAM, p);
+                cleanup();
                 return (1);
             }
             *p = '\0';
@@ -398,9 +412,8 @@
                 dp = NULL;
             } else {		/* end of group name and no domain name */
                 gdsp = init_gd();
-                gdsp->group = gp;
-                if (gdspn)	/* Have already an existing structure */
-                    gdsp->next = gdspn;
+                gdsp->group = xstrdup(gp);
+                gdsp->next = gdspn;
             }
             gdspn = gdsp;
             gp = p;		/* after : starts new group name */
@@ -410,19 +423,22 @@
     }
     if (p == gp) {		/* empty group name not allowed */
         debug((char *) "%s| %s: ERROR: No group defined for domain %s\n", LogTime(), PROGRAM, p);
+        cleanup();
         return (1);
     }
     if (dp) {			/* end of domain name */
         gdsp->domain = xstrdup(dp);
     } else {			/* end of group name and no domain name */
         gdsp = init_gd();
-        gdsp->group = gp;
+        gdsp->group = xstrdup(gp);
         if (gdspn)		/* Have already an existing structure */
             gdsp->next = gdspn;
     }
     debug((char *) "%s| %s: INFO: Group %s  Domain %s\n", LogTime(), PROGRAM, gdsp->group, gdsp->domain ? gdsp->domain : "NULL");
 
     margs->groups = gdsp;
+    gdsp = NULL; // prevent the cleanup() deallocating it.
+    cleanup();
     return (0);
 }
 #endif
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_ldap.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_ldap.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_ldap.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_ldap.cc	2013-01-09 14:09:06.000000000 +1300
@@ -109,9 +109,6 @@
     void *params)
 {
     struct ldap_creds *cp = (struct ldap_creds *) params;
-    url = url;
-    request = request;
-    msgid = msgid;
     return tool_sasl_bind(ld, cp->dn, cp->pw);
 }
 #endif
@@ -127,9 +124,6 @@
     void *params)
 {
     struct ldap_creds *cp = (struct ldap_creds *) params;
-    url = url;
-    request = request;
-    msgid = msgid;
     return ldap_bind_s(ld, cp->dn, cp->pw, LDAP_AUTH_SIMPLE);
 }
 
@@ -192,9 +186,6 @@
     void *params)
 {
     struct ldap_creds *cp = (struct ldap_creds *) params;
-    url = url;
-    request = request;
-    msgid = msgid;
     return tool_sasl_bind(ld, cp->dn, cp->pw);
 }
 #endif
@@ -211,9 +202,6 @@
 {
 
     struct ldap_creds *cp = (struct ldap_creds *) params;
-    url = url;
-    request = request;
-    msgid = msgid;
     return ldap_bind_s(ld, cp->dn, cp->pw, LDAP_AUTH_SIMPLE);
 }
 
@@ -369,19 +357,18 @@
     search_exp = (char *) xmalloc(strlen(filter) + strlen(ldap_filter_esc) + 1);
     snprintf(search_exp, strlen(filter) + strlen(ldap_filter_esc) + 1, filter, ldap_filter_esc);
 
-    if (ldap_filter_esc)
-        xfree(ldap_filter_esc);
+    xfree(ldap_filter_esc);
 
     if (depth > margs->mdepth) {
         debug((char *) "%s| %s: DEBUG: Max search depth reached %d>%d\n", LogTime(), PROGRAM, depth, margs->mdepth);
+        xfree(search_exp);
         return 0;
     }
     debug((char *) "%s| %s: DEBUG: Search ldap server with bind path %s and filter : %s\n", LogTime(), PROGRAM, bindp, search_exp);
     rc = ldap_search_ext_s(ld, bindp, LDAP_SCOPE_SUBTREE,
                            search_exp, NULL, 0,
                            NULL, NULL, &searchtime, 0, &res);
-    if (search_exp)
-        xfree(search_exp);
+    xfree(search_exp);
 
     if (rc != LDAP_SUCCESS) {
         error((char *) "%s| %s: ERROR: Error searching ldap server: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
@@ -673,22 +660,16 @@
     rc = ldap_url_parse(ldapuri, &url);
     if (rc != LDAP_SUCCESS) {
         error((char *) "%s| %s: ERROR: Error while parsing url: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
-        if (ldapuri)
-            xfree(ldapuri);
-        if (url)
-            xfree(url);
+        xfree(ldapuri);
+        xfree(url);
         return NULL;
     }
 #else
 #error "No URL parsing function"
 #endif
-    if (url) {
-        xfree(url);
-        url = NULL;
-    }
+    safe_free(url);
     rc = ldap_initialize(&ld, ldapuri);
-    if (ldapuri)
-        xfree(ldapuri);
+    xfree(ldapuri);
     if (rc != LDAP_SUCCESS) {
         error((char *) "%s| %s: ERROR: Error while initialising connection to ldap server: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
         ldap_unbind(ld);
@@ -744,22 +725,16 @@
             rc = ldap_url_parse(ldapuri, &url);
             if (rc != LDAP_SUCCESS) {
                 error((char *) "%s| %s: ERROR: Error while parsing url: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
-                if (ldapuri)
-                    xfree(ldapuri);
-                if (url)
-                    xfree(url);
+                xfree(ldapuri);
+                xfree(url);
                 return NULL;
             }
 #else
 #error "No URL parsing function"
 #endif
-            if (url) {
-                xfree(url);
-                url = NULL;
-            }
+            safe_free(url);
             rc = ldap_initialize(&ld, ldapuri);
-            if (ldapuri)
-                xfree(ldapuri);
+            xfree(ldapuri);
             if (rc != LDAP_SUCCESS) {
                 error((char *) "%s| %s: ERROR: Error while initialising connection to ldap server: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
                 ldap_unbind(ld);
@@ -897,7 +872,7 @@
                 continue;
             }
             lcreds = (ldap_creds *) xmalloc(sizeof(struct ldap_creds));
-            lcreds->dn = bindp ? xstrdup(bindp) : NULL;
+            lcreds->dn = NULL;
             lcreds->pw = margs->ssl ? xstrdup(margs->ssl) : NULL;
             ldap_set_rebind_proc(ld, ldap_sasl_rebind, (char *) lcreds);
             if (ld != NULL) {
@@ -938,9 +913,7 @@
             port = atoi(p);
         }
         nhosts = get_hostname_list(margs, &hlist, 0, host);
-        if (host)
-            xfree(host);
-        host = NULL;
+        safe_free(host);
         for (i = 0; i < nhosts; ++i) {
 
             ld = tool_ldap_open(margs, hlist[i].host, port, ssl);
@@ -967,8 +940,7 @@
 
         }
         nhosts = free_hostname_list(&hlist, nhosts);
-        if (bindp)
-            xfree(bindp);
+        xfree(bindp);
         if (margs->lbind) {
             bindp = xstrdup(margs->lbind);
         } else {
@@ -1005,15 +977,13 @@
     search_exp = (char *) xmalloc(strlen(filter) + strlen(ldap_filter_esc) + 1);
     snprintf(search_exp, strlen(filter) + strlen(ldap_filter_esc) + 1, filter, ldap_filter_esc);
 
-    if (ldap_filter_esc)
-        xfree(ldap_filter_esc);
+    xfree(ldap_filter_esc);
 
     debug((char *) "%s| %s: DEBUG: Search ldap server with bind path %s and filter : %s\n", LogTime(), PROGRAM, bindp, search_exp);
     rc = ldap_search_ext_s(ld, bindp, LDAP_SCOPE_SUBTREE,
                            search_exp, NULL, 0,
                            NULL, NULL, &searchtime, 0, &res);
-    if (search_exp)
-        xfree(search_exp);
+    xfree(search_exp);
 
     if (rc != LDAP_SUCCESS) {
         error((char *) "%s| %s: ERROR: Error searching ldap server: %s\n", LogTime(), PROGRAM, ldap_err2string(rc));
@@ -1121,15 +1091,13 @@
         search_exp = (char *) xmalloc(strlen(filter) + strlen(ldap_filter_esc) + 1);
         snprintf(search_exp, strlen(filter) + strlen(ldap_filter_esc) + 1, filter, ldap_filter_esc);
 
-        if (ldap_filter_esc)
-            xfree(ldap_filter_esc);
+        xfree(ldap_filter_esc);
 
         debug((char *) "%s| %s: DEBUG: Search ldap server with bind path %s and filter: %s\n", LogTime(), PROGRAM, bindp, search_exp);
         rc = ldap_search_ext_s(ld, bindp, LDAP_SCOPE_SUBTREE,
                                search_exp, NULL, 0,
                                NULL, NULL, &searchtime, 0, &res);
-        if (search_exp)
-            xfree(search_exp);
+        xfree(search_exp);
 
         debug((char *) "%s| %s: DEBUG: Found %d ldap entr%s\n", LogTime(), PROGRAM, ldap_count_entries(ld, res), ldap_count_entries(ld, res) > 1 || ldap_count_entries(ld, res) == 0 ? "ies" : "y");
 
@@ -1147,15 +1115,13 @@
             search_exp = (char *) xmalloc(strlen(filter) + strlen(ldap_filter_esc) + 1);
             snprintf(search_exp, strlen(filter) + strlen(ldap_filter_esc) + 1, filter, ldap_filter_esc);
 
-            if (ldap_filter_esc)
-                xfree(ldap_filter_esc);
+            xfree(ldap_filter_esc);
 
             debug((char *) "%s| %s: DEBUG: Search ldap server with bind path %s and filter: %s\n", LogTime(), PROGRAM, bindp, search_exp);
             rc = ldap_search_ext_s(ld, bindp, LDAP_SCOPE_SUBTREE,
                                    search_exp, NULL, 0,
                                    NULL, NULL, &searchtime, 0, &res);
-            if (search_exp)
-                xfree(search_exp);
+            xfree(search_exp);
 
             max_attr_2 = get_attributes(margs, ld, res, ATTRIBUTE, &attr_value_2);
             /*
@@ -1187,8 +1153,10 @@
 
             debug((char *) "%s| %s: DEBUG: Users primary group %s %s\n", LogTime(), PROGRAM, retval ? "matches" : "does not match", group);
 
-        } else
+        } else {
+            ldap_msgfree(res);
             debug((char *) "%s| %s: DEBUG: Did not find ldap entry for group %s\n", LogTime(), PROGRAM, group);
+        }
         /*
          * Cleanup
          */
@@ -1212,16 +1180,11 @@
         krb5_cleanup();
 #endif
     if (lcreds) {
-        if (lcreds->dn)
-            xfree(lcreds->dn);
-        if (lcreds->pw)
-            xfree(lcreds->pw);
+        xfree(lcreds->dn);
+        xfree(lcreds->pw);
         xfree(lcreds);
     }
-    if (bindp)
-        xfree(bindp);
-    bindp = NULL;
+    xfree(bindp);
     return (retval);
-
 }
 #endif
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_lserver.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_lserver.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_lserver.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_lserver.cc	2013-01-09 14:09:06.000000000 +1300
@@ -40,6 +40,18 @@
     return lssp;
 }
 
+void
+free_ls(struct lsstruct *lssp)
+{
+    while (lssp) {
+        struct lsstruct *lsspn = lssp->next;
+        xfree(lssp->lserver);
+        xfree(lssp->domain);
+        xfree(lssp);
+        lssp = lsspn;
+    }
+}
+
 int
 create_ls(struct main_args *margs)
 {
@@ -73,18 +85,24 @@
         if (*p == '@') {	/* end of group name - start of domain name */
             if (p == np) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: DEBUG: No ldap servers defined for domain %s\n", LogTime(), PROGRAM, p);
+                free_ls(lssp);
                 return (1);
             }
+            if (dp) {  /* end of domain name - twice */
+                debug((char *) "%s| %s: @ is not allowed in server name %s@%s\n",LogTime(), PROGRAM,np,dp);
+                free_ls(lssp);
+                return(1);
+            }
             *p = '\0';
             ++p;
             lssp = init_ls();
             lssp->lserver = xstrdup(np);
-            if (lsspn)		/* Have already an existing structure */
-                lssp->next = lsspn;
+            lssp->next = lsspn;
             dp = p;		/* after @ starts new domain name */
         } else if (*p == ':') {	/* end of group name or end of domain name */
             if (p == np) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: DEBUG: No ldap servers defined for domain %s\n", LogTime(), PROGRAM, p);
+                free_ls(lssp);
                 return (1);
             }
             *p = '\0';
@@ -95,8 +113,7 @@
             } else {		/* end of group name and no domain name */
                 lssp = init_ls();
                 lssp->lserver = xstrdup(np);
-                if (lsspn)	/* Have already an existing structure */
-                    lssp->next = lsspn;
+                lssp->next = lsspn;
             }
             lsspn = lssp;
             np = p;		/* after : starts new group name */
@@ -106,6 +123,7 @@
     }
     if (p == np) {		/* empty group name not allowed */
         debug((char *) "%s| %s: DEBUG: No ldap servers defined for domain %s\n", LogTime(), PROGRAM, p);
+        free_ls(lssp);
         return (1);
     }
     if (dp) {			/* end of domain name */
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_netbios.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_netbios.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_netbios.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_netbios.cc	2013-01-09 14:09:06.000000000 +1300
@@ -41,6 +41,18 @@
     return ndsp;
 }
 
+void
+free_nd(struct ndstruct *ndsp)
+{
+    while (ndsp) {
+        struct ndstruct *ndspn = ndsp->next;
+        xfree(ndsp->netbios);
+        xfree(ndsp->domain);
+        xfree(ndsp);
+        ndsp = ndspn;
+    }
+}
+
 int
 create_nd(struct main_args *margs)
 {
@@ -74,18 +86,24 @@
         if (*p == '@') {	/* end of group name - start of domain name */
             if (p == np) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: DEBUG: No netbios name defined for domain %s\n", LogTime(), PROGRAM, p);
+                free_nd(ndsp);
                 return (1);
             }
+            if (dp) {  /* end of domain name - twice */
+                debug((char *) "%s| %s: @ is not allowed in netbios name %s@%s\n",LogTime(), PROGRAM,np,dp);
+                free_nd(ndsp);
+                return(1);
+            }
             *p = '\0';
             ++p;
             ndsp = init_nd();
             ndsp->netbios = xstrdup(np);
-            if (ndspn)		/* Have already an existing structure */
-                ndsp->next = ndspn;
+            ndsp->next = ndspn;
             dp = p;		/* after @ starts new domain name */
         } else if (*p == ':') {	/* end of group name or end of domain name */
             if (p == np) {	/* empty group name not allowed */
                 debug((char *) "%s| %s: DEBUG: No netbios name defined for domain %s\n", LogTime(), PROGRAM, p);
+                free_nd(ndsp);
                 return (1);
             }
             *p = '\0';
@@ -96,13 +114,13 @@
             } else {		/* end of group name and no domain name */
                 ndsp = init_nd();
                 ndsp->netbios = xstrdup(np);
-                if (ndspn)	/* Have already an existing structure */
-                    ndsp->next = ndspn;
+                ndsp->next = ndspn;
             }
             ndspn = ndsp;
             np = p;		/* after : starts new group name */
             if (!ndsp->domain || !strcmp(ndsp->domain, "")) {
                 debug((char *) "%s| %s: DEBUG: No domain defined for netbios name %s\n", LogTime(), PROGRAM, ndsp->netbios);
+                free_nd(ndsp);
                 return (1);
             }
             debug((char *) "%s| %s: DEBUG: Netbios name %s  Domain %s\n", LogTime(), PROGRAM, ndsp->netbios, ndsp->domain);
@@ -111,6 +129,7 @@
     }
     if (p == np) {		/* empty group name not allowed */
         debug((char *) "%s| %s: DEBUG: No netbios name defined for domain %s\n", LogTime(), PROGRAM, p);
+        free_nd(ndsp);
         return (1);
     }
     if (dp) {			/* end of domain name */
@@ -118,11 +137,11 @@
     } else {			/* end of group name and no domain name */
         ndsp = init_nd();
         ndsp->netbios = xstrdup(np);
-        if (ndspn)		/* Have already an existing structure */
-            ndsp->next = ndspn;
+        ndsp->next = ndspn;
     }
     if (!ndsp->domain || !strcmp(ndsp->domain, "")) {
         debug((char *) "%s| %s: DEBUG: No domain defined for netbios name %s\n", LogTime(), PROGRAM, ndsp->netbios);
+        free_nd(ndsp);
         return (1);
     }
     debug((char *) "%s| %s: DEBUG: Netbios name %s  Domain %s\n", LogTime(), PROGRAM, ndsp->netbios, ndsp->domain);
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_resolv.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_resolv.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_resolv.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_resolv.cc	2013-01-09 14:09:06.000000000 +1300
@@ -297,10 +297,10 @@
             if ((len = res_search(service, ns_c_in, ns_t_srv, (u_char *) buffer, PACKETSZ_MULT * NS_PACKETSZ)) < 0) {
                 error((char *) "%s| %s: ERROR: Error while resolving service record %s with res_search\n", LogTime(), PROGRAM, service);
                 nsError(h_errno, service);
-                goto cleanup;
+                goto finalise;
             }
         } else {
-            goto cleanup;
+            goto finalise;
         }
     }
     if (len > PACKETSZ_MULT * NS_PACKETSZ) {
@@ -309,70 +309,70 @@
         if ((len = res_search(service, ns_c_in, ns_t_srv, (u_char *) buffer, len)) < 0) {
             error((char *) "%s| %s: ERROR: Error while resolving service record %s with res_search\n", LogTime(), PROGRAM, service);
             nsError(h_errno, service);
-            goto cleanup;
+            goto finalise;
         }
         if (len > olen) {
             error((char *) "%s| %s: ERROR: Reply to big: buffer: %d reply length: %d\n", LogTime(), PROGRAM, olen, len);
-            goto cleanup;
+            goto finalise;
         }
     }
     p = buffer;
     p += 6 * NS_INT16SZ;	/* Header(6*16bit) = id + flags + 4*section count */
     if (p > buffer + len) {
         error((char *) "%s| %s: ERROR: Message to small: %d < header size\n", LogTime(), PROGRAM, len);
-        goto cleanup;
+        goto finalise;
     }
     if ((size = dn_expand(buffer, buffer + len, p, name, sysconf(_SC_HOST_NAME_MAX))) < 0) {
         error((char *) "%s| %s: ERROR: Error while expanding query name with dn_expand:  %s\n", LogTime(), PROGRAM, strerror(errno));
-        goto cleanup;
+        goto finalise;
     }
     p += size;			/* Query name */
     p += 2 * NS_INT16SZ;	/* Query type + class (2*16bit) */
     if (p > buffer + len) {
         error((char *) "%s| %s: ERROR: Message to small: %d < header + query name,type,class \n", LogTime(), PROGRAM, len);
-        goto cleanup;
+        goto finalise;
     }
     while (p < buffer + len) {
         if ((size = dn_expand(buffer, buffer + len, p, name, sysconf(_SC_HOST_NAME_MAX))) < 0) {
             error((char *) "%s| %s: ERROR: Error while expanding answer name with dn_expand:  %s\n", LogTime(), PROGRAM, strerror(errno));
-            goto cleanup;
+            goto finalise;
         }
         p += size;		/* Resource Record name */
         if (p > buffer + len) {
             error((char *) "%s| %s: ERROR: Message to small: %d < header + query name,type,class + answer name\n", LogTime(), PROGRAM, len);
-            goto cleanup;
+            goto finalise;
         }
         NS_GET16(type, p);	/* RR type (16bit) */
         p += NS_INT16SZ + NS_INT32SZ;	/* RR class + ttl (16bit+32bit) */
         if (p > buffer + len) {
             error((char *) "%s| %s: ERROR: Message to small: %d < header + query name,type,class + answer name + RR type,class,ttl\n", LogTime(), PROGRAM, len);
-            goto cleanup;
+            goto finalise;
         }
         NS_GET16(rdlength, p);	/* RR data length (16bit) */
 
         if (type == ns_t_srv) {	/* SRV record */
             if (p > buffer + len) {
                 error((char *) "%s| %s: ERROR: Message to small: %d < header + query name,type,class + answer name + RR type,class,ttl + RR data length\n", LogTime(), PROGRAM, len);
-                goto cleanup;
+                goto finalise;
             }
             NS_GET16(priority, p);	/* Priority (16bit) */
             if (p > buffer + len) {
                 error((char *) "%s| %s: ERROR: Message to small: %d <  SRV RR + priority\n", LogTime(), PROGRAM, len);
-                goto cleanup;
+                goto finalise;
             }
             NS_GET16(weight, p);	/* Weight (16bit) */
             if (p > buffer + len) {
                 error((char *) "%s| %s: ERROR: Message to small: %d <  SRV RR + priority + weight\n", LogTime(), PROGRAM, len);
-                goto cleanup;
+                goto finalise;
             }
             NS_GET16(port, p);	/* Port (16bit) */
             if (p > buffer + len) {
                 error((char *) "%s| %s: ERROR: Message to small: %d <  SRV RR + priority + weight + port\n", LogTime(), PROGRAM, len);
-                goto cleanup;
+                goto finalise;
             }
             if ((size = dn_expand(buffer, buffer + len, p, host, NS_MAXDNAME)) < 0) {
                 error((char *) "%s| %s: ERROR: Error while expanding SRV RR name with dn_expand:  %s\n", LogTime(), PROGRAM, strerror(errno));
-                goto cleanup;
+                goto finalise;
             }
             debug((char *) "%s| %s: DEBUG: Resolved SRV %s record to %s\n", LogTime(), PROGRAM, service, host);
             hp = (struct hstruct *) xrealloc(hp, sizeof(struct hstruct) * (nh + 1));
@@ -387,7 +387,7 @@
         }
         if (p > buffer + len) {
             error((char *) "%s| %s: ERROR: Message to small: %d <  SRV RR + priority + weight + port + name\n", LogTime(), PROGRAM, len);
-            goto cleanup;
+            goto finalise;
         }
     }
     if (p != buffer + len) {
@@ -396,10 +396,10 @@
 #else
         error((char *) "%s| %s: ERROR: Inconsistence message length: %d!=0\n", LogTime(), PROGRAM, buffer + len - p);
 #endif
-        goto cleanup;
+        goto finalise;
     }
 
-cleanup:
+finalise:
     nhosts = get_hostname_list(margs, &hp, nh, domain);
 
     debug("%s| %s: DEBUG: Adding %s to list\n", LogTime(), PROGRAM, domain);
@@ -411,6 +411,7 @@
     hp[nhosts].weight = -2;
     ++nhosts;
 
+cleanup:
     /* Remove duplicates */
     for (i = 0; i < nhosts; ++i) {
         for (j = i + 1; j < nhosts; ++j) {
diff -u -r -N squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_sasl.cc squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_sasl.cc
--- squid-3.3.0.2/helpers/external_acl/kerberos_ldap_group/support_sasl.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/kerberos_ldap_group/support_sasl.cc	2013-01-09 14:09:06.000000000 +1300
@@ -134,7 +134,6 @@
 {
     const char *dflt = interact->defresult;
 
-    flags = flags;
     switch (interact->id) {
     case SASL_CB_GETREALM:
         if (defaults)
@@ -231,11 +230,7 @@
     char *sasl_realm = NULL;
     char *sasl_authc_id = NULL;
     char *sasl_authz_id = NULL;
-#ifdef HAVE_SUN_LDAP_SDK
     char *sasl_mech = (char *) "GSSAPI";
-#else
-    char *sasl_mech = NULL;
-#endif
     /*
      * Force encryption
      */
diff -u -r -N squid-3.3.0.2/helpers/external_acl/SQL_session/ext_sql_session_acl.8 squid-3.3.0.3/helpers/external_acl/SQL_session/ext_sql_session_acl.8
--- squid-3.3.0.2/helpers/external_acl/SQL_session/ext_sql_session_acl.8	2012-12-02 21:48:04.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/SQL_session/ext_sql_session_acl.8	2013-01-09 14:33:08.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "EXT_SQL_SESSION_ACL 1"
-.TH EXT_SQL_SESSION_ACL 1 "2012-12-02" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH EXT_SQL_SESSION_ACL 1 "2013-01-08" "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.0.2/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8 squid-3.3.0.3/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8
--- squid-3.3.0.2/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8	2012-12-02 21:48:04.000000000 +1300
+++ squid-3.3.0.3/helpers/external_acl/wbinfo_group/ext_wbinfo_group_acl.8	2013-01-09 14:33:08.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "EXT_WBINFO_GROUP_ACL.PL.IN 1"
-.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2012-12-02" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH EXT_WBINFO_GROUP_ACL.PL.IN 1 "2013-01-08" "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.0.2/helpers/log_daemon/DB/log_db_daemon.8 squid-3.3.0.3/helpers/log_daemon/DB/log_db_daemon.8
--- squid-3.3.0.2/helpers/log_daemon/DB/log_db_daemon.8	2012-12-02 21:48:05.000000000 +1300
+++ squid-3.3.0.3/helpers/log_daemon/DB/log_db_daemon.8	2013-01-09 14:33:09.000000000 +1300
@@ -124,7 +124,7 @@
 .\" ========================================================================
 .\"
 .IX Title "LOG_DB_DAEMON 1"
-.TH LOG_DB_DAEMON 1 "2012-12-02" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH LOG_DB_DAEMON 1 "2013-01-08" "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.0.2/helpers/log_daemon/file/log_file_daemon.cc squid-3.3.0.3/helpers/log_daemon/file/log_file_daemon.cc
--- squid-3.3.0.2/helpers/log_daemon/file/log_file_daemon.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/log_daemon/file/log_file_daemon.cc	2013-01-09 14:09:06.000000000 +1300
@@ -61,8 +61,8 @@
             fprintf(stderr, "WARNING: remove '%s' failure: %s\n", to, xstrerror());
         }
 #endif
-        if (rename(path, to) < 0 && errno != ENOENT) {
-            fprintf(stderr, "WARNING: rename '%s' to '%s' failure: %s\n", path, to, xstrerror());
+        if (rename(from, to) < 0 && errno != ENOENT) {
+            fprintf(stderr, "WARNING: rename '%s' to '%s' failure: %s\n", from, to, xstrerror());
         }
     }
     if (rotate_count > 0) {
diff -u -r -N squid-3.3.0.2/helpers/negotiate_auth/kerberos/negotiate_kerberos_auth.cc squid-3.3.0.3/helpers/negotiate_auth/kerberos/negotiate_kerberos_auth.cc
--- squid-3.3.0.2/helpers/negotiate_auth/kerberos/negotiate_kerberos_auth.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/helpers/negotiate_auth/kerberos/negotiate_kerberos_auth.cc	2013-01-09 14:09:06.000000000 +1300
@@ -30,6 +30,7 @@
  * Hosted at http://sourceforge.net/projects/squidkerbauth
  */
 #include "squid.h"
+#include "rfc1738.h"
 #include "compat/getaddrinfo.h"
 #include "compat/getnameinfo.h"
 
@@ -458,10 +459,10 @@
                 *p = '\0';
             }
             fprintf(stdout, "AF %s %s\n", token, user);
-            debug((char *) "%s| %s: DEBUG: AF %s %s\n", LogTime(), PROGRAM, token, user);
+            debug((char *) "%s| %s: DEBUG: AF %s %s\n", LogTime(), PROGRAM, token, rfc1738_escape(user));
             if (log)
                 fprintf(stderr, "%s| %s: INFO: User %s authenticated\n", LogTime(),
-                        PROGRAM, user);
+                        PROGRAM, rfc1738_escape(user));
             goto cleanup;
         } else {
             if (check_gss_err(major_status, minor_status, "gss_accept_sec_context()", log))
@@ -493,10 +494,10 @@
                 *p = '\0';
             }
             fprintf(stdout, "AF %s %s\n", "AA==", user);
-            debug((char *) "%s| %s: DEBUG: AF %s %s\n", LogTime(), PROGRAM, "AA==", user);
+            debug((char *) "%s| %s: DEBUG: AF %s %s\n", LogTime(), PROGRAM, "AA==", rfc1738_escape(user));
             if (log)
                 fprintf(stderr, "%s| %s: INFO: User %s authenticated\n", LogTime(),
-                        PROGRAM, user);
+                        PROGRAM, rfc1738_escape(user));
 
         }
 cleanup:
diff -u -r -N squid-3.3.0.2/include/version.h squid-3.3.0.3/include/version.h
--- squid-3.3.0.2/include/version.h	2012-12-02 21:31:05.000000000 +1300
+++ squid-3.3.0.3/include/version.h	2013-01-09 14:10:25.000000000 +1300
@@ -7,7 +7,7 @@
  */
 
 #ifndef SQUID_RELEASE_TIME
-#define SQUID_RELEASE_TIME 1354437010
+#define SQUID_RELEASE_TIME 1357693744
 #endif
 
 #ifndef APP_SHORTNAME
diff -u -r -N squid-3.3.0.2/lib/smblib/smblib.c squid-3.3.0.3/lib/smblib/smblib.c
--- squid-3.3.0.2/lib/smblib/smblib.c	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/lib/smblib/smblib.c	2013-01-09 14:09:06.000000000 +1300
@@ -120,8 +120,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;
@@ -213,9 +215,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);
@@ -236,9 +241,19 @@
 
     /* 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 */
-    strcpy(con -> desthost, host);
+    if (!host) {
+        if (Con_Handle == NULL) {
+            free(con);
+            Con_Handle = NULL;
+        }
+        SMBlib_errno = -SMBlibE_CallFailed;
+        return NULL;
+    }
+    strncpy(con->desthost, host, sizeof(con->desthost));
+    con->desthost[sizeof(con->desthost)-1]='\0';
 
     /* Now connect to the remote end, but first upper case the name of the
        service we are going to call, sine some servers want it in uppercase */
@@ -280,9 +295,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;
 
     }
@@ -291,6 +307,10 @@
 
     if ((*tree = SMB_TreeConnect(con, NULL, service, password, "A:")) == NULL) {
 
+        if (Con_Handle == NULL) {
+            free(con);
+        }
+        SMBlib_errno = -SMBlibE_BAD;
         return NULL;
 
     }
@@ -325,7 +345,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;
@@ -391,7 +412,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.3.0.2/RELEASENOTES.html squid-3.3.0.3/RELEASENOTES.html
--- squid-3.3.0.2/RELEASENOTES.html	2012-12-02 21:48:12.000000000 +1300
+++ squid-3.3.0.3/RELEASENOTES.html	2013-01-09 14:33:14.000000000 +1300
@@ -2,10 +2,10 @@
 <HTML>
 <HEAD>
  <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.66">
- <TITLE>Squid 3.3.0.2 release notes</TITLE>
+ <TITLE>Squid 3.3.0.3 release notes</TITLE>
 </HEAD>
 <BODY>
-<H1>Squid 3.3.0.2 release notes</H1>
+<H1>Squid 3.3.0.3 release notes</H1>
 
 <H2>Squid Developers</H2>
 <HR>
@@ -56,7 +56,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.3.0.2 for testing.</P>
+<P>The Squid Team are pleased to announce the release of Squid-3.3.0.3 for testing.</P>
 <P>This new release is available for download from 
 <A HREF="http://www.squid-cache.org/Versions/v3/3.3/">http://www.squid-cache.org/Versions/v3/3.3/</A> or the 
 <A HREF="http://www.squid-cache.org/Mirrors/http-mirrors.html">mirrors</A>.</P>
@@ -329,7 +329,14 @@
 
 <P>
 <DL>
-<P><EM>There are no changed ./configure options in Squid-3.3.</EM></P>
+<DT><B>--enable-kqueue</B><DD>
+<P>kqueue network I/O module is now built by default when it is available.
+This option is no longer required to enable kqueue support,
+but if used will abort build when kqueue dependencies are missing or broken.</P>
+
+<DT><B>--disable-kqueue</B><DD>
+<P>kqueue network I/O module is now built by default when it is available.
+This configure option is now needed to disable it. Previously it did nothing.</P>
 
 </DL>
 </P>
diff -u -r -N squid-3.3.0.2/snmplib/parse.c squid-3.3.0.3/snmplib/parse.c
--- squid-3.3.0.2/snmplib/parse.c	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/snmplib/parse.c	2013-01-09 14:09:06.000000000 +1300
@@ -405,7 +405,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;
@@ -625,6 +625,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 }
@@ -657,9 +667,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;
@@ -680,8 +690,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
@@ -690,12 +700,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;
@@ -945,9 +957,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
@@ -989,9 +1004,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) {
@@ -1005,6 +1022,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;
                 }
             }
@@ -1023,6 +1041,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;
                 }
             }
@@ -1035,6 +1054,7 @@
             break;
         } else {
             print_error("Bad operator", (char *) NULL, type);
+            free_node_list(root);
             return NULL;
         }
     }
@@ -1075,18 +1095,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.3.0.2/snmplib/snmp_vars.c squid-3.3.0.3/snmplib/snmp_vars.c
--- squid-3.3.0.2/snmplib/snmp_vars.c	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/snmplib/snmp_vars.c	2013-01-09 14:09:06.000000000 +1300
@@ -373,6 +373,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.3.0.2/src/auth/digest/auth_digest.cc squid-3.3.0.3/src/auth/digest/auth_digest.cc
--- squid-3.3.0.2/src/auth/digest/auth_digest.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/auth/digest/auth_digest.cc	2013-01-09 14:09:06.000000000 +1300
@@ -932,10 +932,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.
@@ -943,33 +947,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 */
@@ -977,8 +991,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 */
@@ -987,26 +1003,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);
+        if (digest_request->cnonce || digest_request->nc[0] != '\0') {
+            debugs(29, 2, "missing qop!");
+            rv = authDigestLogUsername(username, digest_request);
+            safe_free(username);
+            return rv;
         }
     }
 
@@ -1016,10 +1040,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;
@@ -1027,8 +1053,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.3.0.2/src/auth/negotiate/auth_negotiate.cc squid-3.3.0.3/src/auth/negotiate/auth_negotiate.cc
--- squid-3.3.0.2/src/auth/negotiate/auth_negotiate.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/auth/negotiate/auth_negotiate.cc	2013-01-09 14:09:06.000000000 +1300
@@ -66,9 +66,6 @@
 static int authnegotiate_initialised = 0;
 
 /// \ingroup AuthNegotiateInternal
-Auth::Negotiate::Config negotiateConfig;
-
-/// \ingroup AuthNegotiateInternal
 static hash_table *proxy_auth_cache = NULL;
 
 /*
@@ -292,7 +289,7 @@
 Auth::UserRequest::Pointer
 Auth::Negotiate::Config::decode(char const *proxy_auth)
 {
-    Auth::Negotiate::User *newUser = new Auth::Negotiate::User(&negotiateConfig);
+    Auth::Negotiate::User *newUser = new Auth::Negotiate::User(Auth::Config::Find("negotiate"));
     Auth::UserRequest *auth_user_request = new Auth::Negotiate::UserRequest();
     assert(auth_user_request->user() == NULL);
 
diff -u -r -N squid-3.3.0.2/src/cache_cf.cc squid-3.3.0.3/src/cache_cf.cc
--- squid-3.3.0.2/src/cache_cf.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/cache_cf.cc	2013-01-09 14:09:06.000000000 +1300
@@ -2282,7 +2282,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);
@@ -4179,7 +4179,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.3.0.2/src/client_side.cc squid-3.3.0.3/src/client_side.cc
--- squid-3.3.0.2/src/client_side.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/client_side.cc	2013-01-09 14:09:06.000000000 +1300
@@ -702,7 +702,8 @@
         if (request)
             al->adapted_request = HTTPMSGLOCK(request);
         accessLogLog(al, checklist);
-        updateCounters();
+        if (request)
+            updateCounters();
 
         if (getConn() != NULL && getConn()->clientConnection != NULL)
             clientdbUpdate(getConn()->clientConnection->remote, logType, AnyP::PROTO_HTTP, out.size);
@@ -2128,14 +2129,18 @@
     }
 }
 
-/**
- *  parseHttpRequest()
+/** Parse an HTTP request
  *
- *  Returns
- *  NULL on incomplete requests
- *  a ClientSocketContext structure on success or failure.
- *  Sets result->flags.parsed_ok to 0 if failed to parse the request.
- *  Sets result->flags.parsed_ok to 1 if we have a good request.
+ *  \note Sets result->flags.parsed_ok to 0 if failed to parse the request,
+ *          to 1 if the request was correctly parsed.
+ *  \param[in] csd a ConnStateData. The caller must make sure it is not null
+ *  \param[in] hp an HttpParser
+ *  \param[out] mehtod_p will be set as a side-effect of the parsing.
+ *          Pointed-to value will be set to Http::METHOD_NONE in case of
+ *          parsing failure
+ *  \param[out] http_ver will be set as a side-effect of the parsing
+ *  \return NULL on incomplete requests,
+ *          a ClientSocketContext structure on success or failure.
  */
 static ClientSocketContext *
 parseHttpRequest(ConnStateData *csd, HttpParser *hp, HttpRequestMethod * method_p, HttpVersion *http_ver)
@@ -2211,7 +2216,7 @@
     *method_p = HttpRequestMethod(&hp->buf[hp->req.m_start], &hp->buf[hp->req.m_end]+1);
 
     /* deny CONNECT via accelerated ports */
-    if (*method_p == METHOD_CONNECT && csd && csd->port && csd->port->accel) {
+    if (*method_p == METHOD_CONNECT && csd->port && csd->port->accel) {
         debugs(33, DBG_IMPORTANT, "WARNING: CONNECT method received on " << csd->port->protocol << " Accelerator port " << csd->port->s.GetPort() );
         /* XXX need a way to say "this many character length string" */
         debugs(33, DBG_IMPORTANT, "WARNING: for request: " << hp->buf);
diff -u -r -N squid-3.3.0.2/src/client_side_reply.cc squid-3.3.0.3/src/client_side_reply.cc
--- squid-3.3.0.2/src/client_side_reply.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/client_side_reply.cc	2013-01-09 14:09:06.000000000 +1300
@@ -2067,10 +2067,14 @@
 
     ConnStateData * conn = http->getConn();
 
-    if (conn == NULL || !conn->isOpen()) {
-        // too late, our conn is closing
-        // TODO: should we also quit?
-        debugs(33,3, HERE << "not sending more data to a closing " << conn->clientConnection);
+    // too late, our conn is closing
+    // TODO: should we also quit?
+    if (conn == NULL) {
+        debugs(33,3, "not sending more data to a closed connection" );
+        return;
+    }
+    if (!conn->isOpen()) {
+        debugs(33,3, "not sending more data to closing connection " << conn->clientConnection);
         return;
     }
 
diff -u -r -N squid-3.3.0.2/src/client_side_request.cc squid-3.3.0.3/src/client_side_request.cc
--- squid-3.3.0.2/src/client_side_request.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/client_side_request.cc	2013-01-09 14:09:06.000000000 +1300
@@ -1757,6 +1757,7 @@
 
         clientStreamNode *node = (clientStreamNode *)client_stream.tail->prev->data;
         clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
+        assert(repContext);
         repContext->createStoreEntry(request->method, request->flags);
 
         EBIT_CLR(storeEntry()->flags, ENTRY_FWD_HDR_WAIT);
@@ -1910,7 +1911,8 @@
 #endif
         calloutContext->error->detailError(errDetail);
         calloutContext->readNextRequest = true;
-        c->expectNoForwarding();
+        if (c != NULL)
+            c->expectNoForwarding();
         doCallouts();
     }
     //else if(calloutContext == NULL) is it possible?
diff -u -r -N squid-3.3.0.2/src/comm/ModKqueue.cc squid-3.3.0.3/src/comm/ModKqueue.cc
--- squid-3.3.0.2/src/comm/ModKqueue.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/comm/ModKqueue.cc	2013-01-09 14:09:06.000000000 +1300
@@ -55,6 +55,7 @@
 #if USE_KQUEUE
 #include "comm/Loops.h"
 #include "fde.h"
+#include "globals.h"
 #include "SquidTime.h"
 #include "StatCounters.h"
 #include "Store.h"
diff -u -r -N squid-3.3.0.2/src/DiskIO/AIO/AIODiskIOStrategy.cc squid-3.3.0.3/src/DiskIO/AIO/AIODiskIOStrategy.cc
--- squid-3.3.0.2/src/DiskIO/AIO/AIODiskIOStrategy.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/AIO/AIODiskIOStrategy.cc	2013-01-09 14:09:06.000000000 +1300
@@ -47,9 +47,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.3.0.2/src/DiskIO/DiskDaemon/diskd.cc squid-3.3.0.3/src/DiskIO/DiskDaemon/diskd.cc
--- squid-3.3.0.2/src/DiskIO/DiskDaemon/diskd.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/DiskDaemon/diskd.cc	2013-01-09 14:09:06.000000000 +1300
@@ -264,6 +264,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) {
 
@@ -368,7 +372,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.3.0.2/src/DiskIO/DiskDaemon/DiskdFile.cc squid-3.3.0.3/src/DiskIO/DiskDaemon/DiskdFile.cc
--- squid-3.3.0.2/src/DiskIO/DiskDaemon/DiskdFile.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/DiskDaemon/DiskdFile.cc	2013-01-09 14:09:06.000000000 +1300
@@ -66,8 +66,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);
@@ -379,8 +382,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;
@@ -404,7 +409,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.3.0.2/src/DiskIO/DiskThreads/aiops.cc squid-3.3.0.3/src/DiskIO/DiskThreads/aiops.cc
--- squid-3.3.0.2/src/DiskIO/DiskThreads/aiops.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/DiskThreads/aiops.cc	2013-01-09 14:09:06.000000000 +1300
@@ -722,8 +722,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.3.0.2/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc squid-3.3.0.3/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc
--- squid-3.3.0.2/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2013-01-09 14:09:06.000000000 +1300
@@ -187,7 +187,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.3.0.2/src/DiskIO/IpcIo/IpcIoFile.cc squid-3.3.0.3/src/DiskIO/IpcIo/IpcIoFile.cc
--- squid-3.3.0.2/src/DiskIO/IpcIo/IpcIoFile.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/DiskIO/IpcIo/IpcIoFile.cc	2013-01-09 14:09:06.000000000 +1300
@@ -588,9 +588,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.3.0.2/src/esi/Esi.cc squid-3.3.0.3/src/esi/Esi.cc
--- squid-3.3.0.2/src/esi/Esi.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/esi/Esi.cc	2013-01-09 14:09:06.000000000 +1300
@@ -2077,12 +2077,13 @@
 
         debugs (86,3, "esiChooseAdd: Added a new element, elements = " << elements.size());
 
-        if (chosenelement == -1)
-            if ((dynamic_cast<esiWhen *>(element.getRaw()))->
-                    testsTrue()) {
+        if (chosenelement == -1) {
+            const esiWhen * topElement=dynamic_cast<esiWhen *>(element.getRaw());
+            if (topElement && topElement->testsTrue()) {
                 chosenelement = elements.size() - 1;
                 debugs (86,3, "esiChooseAdd: Chose element " << elements.size());
             }
+        }
     }
 
     return true;
diff -u -r -N squid-3.3.0.2/src/fs/ufs/UFSSwapDir.cc squid-3.3.0.3/src/fs/ufs/UFSSwapDir.cc
--- squid-3.3.0.2/src/fs/ufs/UFSSwapDir.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/fs/ufs/UFSSwapDir.cc	2013-01-09 14:09:06.000000000 +1300
@@ -236,7 +236,7 @@
     /* TODO: factor out these 4 lines */
     ConfigOption *ioOptions = IO->io->getOptionTree();
 
-    if (ioOptions)
+    if (currentIOOptions && ioOptions)
         currentIOOptions->options.push_back(ioOptions);
 }
 
diff -u -r -N squid-3.3.0.2/src/htcp.cc squid-3.3.0.3/src/htcp.cc
--- squid-3.3.0.2/src/htcp.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/htcp.cc	2013-01-09 14:09:06.000000000 +1300
@@ -1088,14 +1088,15 @@
         htcpHandleTstResponse(hdr, buf, sz, from);
 }
 
-HtcpReplyData::HtcpReplyData() : hdr(hoHtcpReply)
+HtcpReplyData::HtcpReplyData() :
+        hit(0), hdr(hoHtcpReply), msg_id(0), version(0.0)
 {}
 
 static void
 
 htcpHandleTstResponse(htcpDataHeader * hdr, char *buf, int sz, Ip::Address &from)
 {
-    htcpReplyData htcpReply;
+    HtcpReplyData htcpReply;
     cache_key *key = NULL;
 
     Ip::Address *peer;
@@ -1180,14 +1181,13 @@
     /* s is a new object */
     s = htcpUnpackSpecifier(buf, sz);
 
-    s->setFrom(from);
-
-    s->setDataHeader(dhdr);
-
-    if (NULL == s) {
+    if (s == NULL) {
         debugs(31, 3, "htcpHandleTstRequest: htcpUnpackSpecifier failed");
         htcpLogHtcp(from, dhdr->opcode, LOG_UDP_INVALID, dash_str);
         return;
+    } else {
+        s->setFrom(from);
+        s->setDataHeader(dhdr);
     }
 
     if (!s->request) {
diff -u -r -N squid-3.3.0.2/src/htcp.h squid-3.3.0.3/src/htcp.h
--- squid-3.3.0.2/src/htcp.h	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/htcp.h	2013-01-09 14:09:06.000000000 +1300
@@ -57,11 +57,8 @@
     } cto;
 };
 
-/// \bug redundant typedef
-typedef class HtcpReplyData htcpReplyData;
-
 /// \ingroup ServerProtocolHTCP
-void neighborsHtcpReply(const cache_key *, htcpReplyData *, const Ip::Address &);
+void neighborsHtcpReply(const cache_key *, HtcpReplyData *, const Ip::Address &);
 
 /// \ingroup ServerProtocolHTCP
 void htcpOpenPorts(void);
diff -u -r -N squid-3.3.0.2/src/HttpHdrRange.cc squid-3.3.0.3/src/HttpHdrRange.cc
--- squid-3.3.0.2/src/HttpHdrRange.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/HttpHdrRange.cc	2013-01-09 14:09:06.000000000 +1300
@@ -96,7 +96,7 @@
             return false;
     } else
         /* must have a '-' somewhere in _this_ field */
-        if (!((p = strchr(field, '-')) || (p - field >= flen))) {
+        if (!((p = strchr(field, '-')) && (p - field < flen))) {
             debugs(64, 2, "invalid (missing '-') range-spec near: '" << field << "'");
             return false;
         } else {
diff -u -r -N squid-3.3.0.2/src/icmp/Icmp4.cc squid-3.3.0.3/src/icmp/Icmp4.cc
--- squid-3.3.0.2/src/icmp/Icmp4.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/icmp/Icmp4.cc	2013-01-09 14:09:06.000000000 +1300
@@ -155,6 +155,7 @@
     }
 
     Log(to, ' ', NULL, 0, 0);
+    to.FreeAddrInfo(S);
 }
 
 void
@@ -220,11 +221,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);
 
@@ -241,6 +246,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.3.0.2/src/icmp/Icmp6.cc squid-3.3.0.3/src/icmp/Icmp6.cc
--- squid-3.3.0.2/src/icmp/Icmp6.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/icmp/Icmp6.cc	2013-01-09 14:09:06.000000000 +1300
@@ -200,6 +200,7 @@
     debugs(42,9, HERE << "x=" << x);
 
     Log(to, 0, NULL, 0, 0);
+    to.FreeAddrInfo(S);
 }
 
 /**
@@ -293,11 +294,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;
     }
 
@@ -334,6 +337,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.3.0.2/src/icp_v2.cc squid-3.3.0.3/src/icp_v2.cc
--- squid-3.3.0.2/src/icp_v2.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/icp_v2.cc	2013-01-09 14:09:06.000000000 +1300
@@ -95,10 +95,13 @@
 Comm::ConnectionPointer icpOutgoingConn = NULL;
 
 /* icp_common_t */
-_icp_common_t::_icp_common_t() : opcode(ICP_INVALID), version(0), length(0), reqnum(0), flags(0), pad(0), shostid(0)
+_icp_common_t::_icp_common_t() :
+        opcode(ICP_INVALID), version(0), length(0), reqnum(0),
+        flags(0), pad(0), shostid(0)
 {}
 
-_icp_common_t::_icp_common_t(char *buf, unsigned int len)
+_icp_common_t::_icp_common_t(char *buf, unsigned int len) :
+        opcode(ICP_INVALID), version(0), reqnum(0), flags(0), pad(0), shostid(0)
 {
     if (len < sizeof(_icp_common_t)) {
         /* mark as invalid */
diff -u -r -N squid-3.3.0.2/src/ip/Qos.cci squid-3.3.0.3/src/ip/Qos.cci
--- squid-3.3.0.2/src/ip/Qos.cci	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/ip/Qos.cci	2013-01-09 14:09:06.000000000 +1300
@@ -5,8 +5,13 @@
 int
 Ip::Qos::setSockTos(const Comm::ConnectionPointer &conn, tos_t tos)
 {
-#ifdef IP_TOS
-    int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos_t));
+#if defined(IP_TOS)
+    // Bug 3731: FreeBSD produces 'invalid option'
+    // unless we pass it a 32-bit variable storing 8-bits of data.
+    // NP: it is documented as 'int' for all systems, even those like Linux which accept 8-bit char
+    //     so we convert to a int before setting.
+    int bTos = tos;
+    int x = setsockopt(conn->fd, IPPROTO_IP, IP_TOS, &bTos, sizeof(bTos));
     if (x < 0)
         debugs(50, 2, "Ip::Qos::setSockTos: setsockopt(IP_TOS) on " << conn << ": " << xstrerror());
     return x;
diff -u -r -N squid-3.3.0.2/src/ip/QosConfig.cc squid-3.3.0.3/src/ip/QosConfig.cc
--- squid-3.3.0.2/src/ip/QosConfig.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/ip/QosConfig.cc	2013-01-09 14:09:06.000000000 +1300
@@ -184,22 +184,14 @@
 
 Ip::Qos::Config Ip::Qos::TheConfig;
 
-Ip::Qos::Config::Config()
+Ip::Qos::Config::Config() : tosLocalHit(0), tosSiblingHit(0), tosParentHit(0),
+        tosMiss(0), tosMissMask(0), preserveMissTos(false),
+        preserveMissTosMask(0xFF), markLocalHit(0), markSiblingHit(0),
+        markParentHit(0), markMiss(0), markMissMask(0),
+        preserveMissMark(false), preserveMissMarkMask(0xFFFFFFFF),
+        tosToServer(NULL), tosToClient(NULL), nfmarkToServer(NULL),
+        nfmarkToClient(NULL)
 {
-    tosLocalHit = 0;
-    tosSiblingHit = 0;
-    tosParentHit = 0;
-    tosMiss = 0;
-    tosMissMask = 0;
-    preserveMissTos = false;
-    preserveMissTosMask = 0xFF;
-    markLocalHit = 0;
-    markSiblingHit = 0;
-    markParentHit = 0;
-    markMiss = 0;
-    markMissMask = 0;
-    preserveMissMark = false;
-    preserveMissMarkMask = 0xFFFFFFFF;
 }
 
 void
diff -u -r -N squid-3.3.0.2/src/ipc/Kid.cc squid-3.3.0.3/src/ipc/Kid.cc
--- squid-3.3.0.2/src/ipc/Kid.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/ipc/Kid.cc	2013-01-09 14:09:06.000000000 +1300
@@ -17,7 +17,8 @@
         badFailures(0),
         pid(-1),
         startTime(0),
-        isRunning(false)
+        isRunning(false),
+        status(0)
 {
 }
 
@@ -26,7 +27,8 @@
         badFailures(0),
         pid(-1),
         startTime(0),
-        isRunning(false)
+        isRunning(false),
+        status(0)
 {
 }
 
diff -u -r -N squid-3.3.0.2/src/MemObject.cc squid-3.3.0.3/src/MemObject.cc
--- squid-3.3.0.2/src/MemObject.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/MemObject.cc	2013-01-09 14:09:06.000000000 +1300
@@ -182,7 +182,7 @@
     debugs(20, DBG_IMPORTANT, "MemObject->nclients: " << nclients);
     debugs(20, DBG_IMPORTANT, "MemObject->reply: " << _reply);
     debugs(20, DBG_IMPORTANT, "MemObject->request: " << request);
-    debugs(20, DBG_IMPORTANT, "MemObject->log_url: " << log_url << " " << checkNullString(log_url));
+    debugs(20, DBG_IMPORTANT, "MemObject->log_url: " << checkNullString(log_url));
 }
 
 HttpReply const *
diff -u -r -N squid-3.3.0.2/src/neighbors.cc squid-3.3.0.3/src/neighbors.cc
--- squid-3.3.0.2/src/neighbors.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/neighbors.cc	2013-01-09 14:09:06.000000000 +1300
@@ -74,7 +74,7 @@
 static void neighborRemove(CachePeer *);
 static void neighborAlive(CachePeer *, const MemObject *, const icp_common_t *);
 #if USE_HTCP
-static void neighborAliveHtcp(CachePeer *, const MemObject *, const htcpReplyData *);
+static void neighborAliveHtcp(CachePeer *, const MemObject *, const HtcpReplyData *);
 #endif
 static void neighborCountIgnored(CachePeer *);
 static void peerRefreshDNS(void *);
@@ -893,7 +893,7 @@
 
 #if USE_HTCP
 static void
-neighborAliveHtcp(CachePeer * p, const MemObject * mem, const htcpReplyData * htcp)
+neighborAliveHtcp(CachePeer * p, const MemObject * mem, const HtcpReplyData * htcp)
 {
     peerAlive(p);
     ++ p->stats.pings_acked;
@@ -1689,7 +1689,7 @@
 
 #if USE_HTCP
 void
-neighborsHtcpReply(const cache_key * key, htcpReplyData * htcp, const Ip::Address &from)
+neighborsHtcpReply(const cache_key * key, HtcpReplyData * htcp, const Ip::Address &from)
 {
     StoreEntry *e = Store::Root().get(key);
     MemObject *mem = NULL;
diff -u -r -N squid-3.3.0.2/src/Parsing.cc squid-3.3.0.3/src/Parsing.cc
--- squid-3.3.0.2/src/Parsing.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/Parsing.cc	2013-01-09 14:09:06.000000000 +1300
@@ -84,7 +84,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.3.0.2/src/peer_proxy_negotiate_auth.cc squid-3.3.0.3/src/peer_proxy_negotiate_auth.cc
--- squid-3.3.0.2/src/peer_proxy_negotiate_auth.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/peer_proxy_negotiate_auth.cc	2013-01-09 14:09:06.000000000 +1300
@@ -331,8 +331,7 @@
                 p = strchr(buf, ':');
                 if (p)
                     ++p;
-                if (keytab_filename)
-                    xfree(keytab_filename);
+                xfree(keytab_filename);
                 keytab_filename = xstrdup(p ? p : buf);
             } else {
                 keytab_filename = xstrdup(kf);
@@ -425,6 +424,10 @@
             mem_cache =
                 (char *) xmalloc(strlen("FILE:/tmp/peer_proxy_negotiate_auth_")
                                  + 16);
+            if (!mem_cache) {
+                debugs(11, 5, "Error while allocating memory");
+                return(1);
+            }
             snprintf(mem_cache,
                      strlen("FILE:/tmp/peer_proxy_negotiate_auth_") + 16,
                      "FILE:/tmp/peer_proxy_negotiate_auth_%d", (int) getpid());
@@ -432,6 +435,10 @@
             mem_cache =
                 (char *) xmalloc(strlen("MEMORY:peer_proxy_negotiate_auth_") +
                                  16);
+            if (!mem_cache) {
+                debugs(11, 5, "Error while allocating memory");
+                return(1);
+            }
             snprintf(mem_cache,
                      strlen("MEMORY:peer_proxy_negotiate_auth_") + 16,
                      "MEMORY:peer_proxy_negotiate_auth_%d", (int) getpid());
@@ -439,8 +446,7 @@
 
             setenv("KRB5CCNAME", mem_cache, 1);
             code = krb5_cc_resolve(kparam.context, mem_cache, &kparam.cc);
-            if (mem_cache)
-                xfree(mem_cache);
+            xfree(mem_cache);
             if (code) {
                 debugs(11, 5,
                        HERE << "Error while resolving memory credential cache : "
diff -u -r -N squid-3.3.0.2/src/peer_select.cc squid-3.3.0.3/src/peer_select.cc
--- squid-3.3.0.2/src/peer_select.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/peer_select.cc	2013-01-09 14:09:06.000000000 +1300
@@ -72,8 +72,8 @@
 static void peerSelectStateFree(ps_state * psstate);
 static void peerIcpParentMiss(CachePeer *, icp_common_t *, ps_state *);
 #if USE_HTCP
-static void peerHtcpParentMiss(CachePeer *, htcpReplyData *, ps_state *);
-static void peerHandleHtcpReply(CachePeer *, peer_t, htcpReplyData *, void *);
+static void peerHtcpParentMiss(CachePeer *, HtcpReplyData *, ps_state *);
+static void peerHandleHtcpReply(CachePeer *, peer_t, HtcpReplyData *, void *);
 #endif
 static int peerCheckNetdbDirect(ps_state * psstate);
 static void peerGetSomeNeighbor(ps_state *);
@@ -836,7 +836,7 @@
 
 #if USE_HTCP
 static void
-peerHandleHtcpReply(CachePeer * p, peer_t type, htcpReplyData * htcp, void *data)
+peerHandleHtcpReply(CachePeer * p, peer_t type, HtcpReplyData * htcp, void *data)
 {
     ps_state *psstate = (ps_state *)data;
     debugs(44, 3, "peerHandleHtcpReply: " <<
@@ -861,7 +861,7 @@
 }
 
 static void
-peerHtcpParentMiss(CachePeer * p, htcpReplyData * htcp, ps_state * ps)
+peerHtcpParentMiss(CachePeer * p, HtcpReplyData * htcp, ps_state * ps)
 {
     int rtt;
 
@@ -910,7 +910,7 @@
 #if USE_HTCP
 
     else if (proto == AnyP::PROTO_HTCP)
-        peerHandleHtcpReply(p, type, (htcpReplyData *)pingdata, data);
+        peerHandleHtcpReply(p, type, (HtcpReplyData *)pingdata, data);
 
 #endif
 
diff -u -r -N squid-3.3.0.2/src/ssl/helper.cc squid-3.3.0.3/src/ssl/helper.cc
--- squid-3.3.0.2/src/ssl/helper.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/ssl/helper.cc	2013-01-09 14:09:06.000000000 +1300
@@ -14,7 +14,7 @@
     return &sslHelper;
 }
 
-Ssl::Helper::Helper()
+Ssl::Helper::Helper() : ssl_crtd(NULL)
 {
 }
 
diff -u -r -N squid-3.3.0.2/src/store_dir.cc squid-3.3.0.3/src/store_dir.cc
--- squid-3.3.0.2/src/store_dir.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/store_dir.cc	2013-01-09 14:09:06.000000000 +1300
@@ -913,6 +913,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();
diff -u -r -N squid-3.3.0.2/src/tests/stub_MemObject.cc squid-3.3.0.3/src/tests/stub_MemObject.cc
--- squid-3.3.0.2/src/tests/stub_MemObject.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/tests/stub_MemObject.cc	2013-01-09 14:09:06.000000000 +1300
@@ -21,7 +21,25 @@
 void MemObject::trimSwappable() STUB
 void MemObject::trimUnSwappable() STUB
 int64_t MemObject::policyLowestOffsetToKeep(bool swap) const STUB_RETVAL(-1)
-MemObject::MemObject(char const *, char const *) {} // NOP due to Store
+MemObject::MemObject(char const *, char const *) :
+        url(NULL),
+        inmem_lo(0),
+        nclients(0),
+        request(NULL),
+        ping_reply_callback(NULL),
+        ircb_data(NULL),
+        log_url(NULL),
+        id(0),
+        object_sz(-1),
+        swap_hdr_sz(0),
+        vary_headers(NULL),
+        _reply(NULL)
+{
+    memset(&clients, 0, sizeof(clients));
+    memset(&start_ping, 0, sizeof(start_ping));
+    memset(&abort, 0, sizeof(abort));
+} // NOP instead of elided due to Store
+
 HttpReply const * MemObject::getReply() const
 {
     // XXX: required by testStore
diff -u -r -N squid-3.3.0.2/src/tests/testConfigParser.cc squid-3.3.0.3/src/tests/testConfigParser.cc
--- squid-3.3.0.2/src/tests/testConfigParser.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/tests/testConfigParser.cc	2013-01-09 14:09:06.000000000 +1300
@@ -30,8 +30,10 @@
         fprintf(stderr, "Invalid config line: %s\n", s);
         return false;
     }
+
     // Keep the initial value on cfgparam. The ConfigParser  methods will write on cfgline
-    strcpy(cfgparam, tmp+1);
+    strncpy(cfgparam, tmp+1, sizeof(cfgparam)-1);
+    cfgparam[sizeof(cfgparam)-1] = '\0';
 
     // Initialize parser to point to the start of quoted string
     strtok(cfgline, w_space);
diff -u -r -N squid-3.3.0.2/src/tests/test_http_range.cc squid-3.3.0.3/src/tests/test_http_range.cc
--- squid-3.3.0.2/src/tests/test_http_range.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/tests/test_http_range.cc	2013-01-09 14:09:06.000000000 +1300
@@ -187,17 +187,25 @@
 }
 
 int
-main (int argc, char **argv)
+main(int argc, char **argv)
 {
-    Mem::Init();
-    /* enable for debugging to console */
-    //    _db_init (NULL, NULL);
-    //    Debug::Levels[64] = 9;
-    testRangeParser ("bytes=0-3");
-    testRangeParser ("bytes=-3");
-    testRangeParser ("bytes=1-");
-    testRangeParser ("bytes=0-3, 1-, -2");
-    testRangeIter ();
-    testRangeCanonization();
+    try {
+        Mem::Init();
+        /* enable for debugging to console */
+        //    _db_init (NULL, NULL);
+        //    Debug::Levels[64] = 9;
+        testRangeParser("bytes=0-3");
+        testRangeParser("bytes=-3");
+        testRangeParser("bytes=1-");
+        testRangeParser("bytes=0-3, 1-, -2");
+        testRangeIter();
+        testRangeCanonization();
+    } catch (const std::exception &e) {
+        printf("Error: dying from an unhandled exception: %s\n", e.what());
+        return 1;
+    } catch (...) {
+        printf("Error: dying from an unhandled exception.\n");
+        return 1;
+    }
     return 0;
 }
diff -u -r -N squid-3.3.0.2/src/tests/testHttpReply.cc squid-3.3.0.3/src/tests/testHttpReply.cc
--- squid-3.3.0.2/src/tests/testHttpReply.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/tests/testHttpReply.cc	2013-01-09 14:09:06.000000000 +1300
@@ -88,7 +88,7 @@
 #endif
 
     // valid ICY protocol status line
-    input.append("ICY 200 Okay\n\n", 18);
+    input.append("ICY 200 Okay\n\n", 14);
     hdr_len = headersEnd(input.content(),input.contentSize());
     CPPUNIT_ASSERT( engine.sanityCheckStartLine(&input, hdr_len, &error) );
     CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
diff -u -r -N squid-3.3.0.2/src/tests/testHttpRequest.cc squid-3.3.0.3/src/tests/testHttpRequest.cc
--- squid-3.3.0.2/src/tests/testHttpRequest.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/tests/testHttpRequest.cc	2013-01-09 14:09:06.000000000 +1300
@@ -57,6 +57,7 @@
     CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
     CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
     CPPUNIT_ASSERT_EQUAL(String("http://foo/bar"), String(url));
+    xfree(url);
 
     /* a connect url with non-CONNECT data */
     url = xstrdup(":foo/bar");
diff -u -r -N squid-3.3.0.2/src/wccp2.cc squid-3.3.0.3/src/wccp2.cc
--- squid-3.3.0.2/src/wccp2.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/src/wccp2.cc	2013-01-09 14:09:06.000000000 +1300
@@ -584,6 +584,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);
@@ -651,6 +652,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);
diff -u -r -N squid-3.3.0.2/tools/cachemgr.cc squid-3.3.0.3/tools/cachemgr.cc
--- squid-3.3.0.2/tools/cachemgr.cc	2012-12-02 21:30:11.000000000 +1300
+++ squid-3.3.0.3/tools/cachemgr.cc	2013-01-09 14:09:06.000000000 +1300
@@ -978,10 +978,10 @@
 
     // limit the input to something reasonable.
     // 4KB should be enough for the GET/POST data length, but may be extended.
-    size_t bufLen = (len >= 4096 ? len : 4095);
+    size_t bufLen = (len < 4096 ? len : 4095);
     char *buf = (char *)xmalloc(bufLen + 1);
 
-    size_t readLen = fread(buf, bufLen, 1, stdin);
+    size_t readLen = fread(buf, 1, bufLen, stdin);
     if (readLen == 0) {
         xfree(buf);
         return NULL;
@@ -990,9 +990,9 @@
     len -= readLen;
 
     // purge the remainder of the request entity
-    while (len > 0) {
+    while (len > 0 && readLen) {
         char temp[65535];
-        readLen = fread(temp, 65535, 1, stdin);
+        readLen = fread(temp, 1, 65535, stdin);
         len -= readLen;
     }
 
