Patchwork [meta-oe,4/7] net-snmp: sync with 5.7 maintainence branch

login
register
mail settings
Submitter Otavio Salvador
Date Feb. 17, 2012, 5:42 p.m.
Message ID <a877826247055037c1004ae0a0460608795f3bbe.1329500480.git.otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/21371/
State Accepted
Commit 675da0c58afe0926f9e614acb49b9e6c5d30d413
Headers show

Comments

Otavio Salvador - Feb. 17, 2012, 5:42 p.m.
Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 .../net-snmp/files/sync-with-5.7-branch.patch      |19998 ++++++++++++++++++++
 .../recipes-extended/net-snmp/net-snmp_5.7.1.bb    |    3 +-
 2 files changed, 20000 insertions(+), 1 deletions(-)
 create mode 100644 meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch

Patch

diff --git a/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch b/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
new file mode 100644
index 0000000..442e8d0
--- /dev/null
+++ b/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
@@ -0,0 +1,19998 @@ 
+Sync with 5.7 branch
+
+This syncs v5.7.1 to 2012-02-08 5.7 GIT branch status
+
+Upstream-Status: Backport
+
+diff --git a/.gitignore b/.gitignore
+index 9d6a15f..9cfb7a3 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,9 +1,9 @@
+ *.bak
+ *.bs
+-*.la
+-*.lo
+ *.ft
+ *.ft.1
++*.la
++*.lo
+ *.made
+ *.o
+ *.obj
+@@ -78,7 +78,10 @@ net-snmp-config
+ net-snmp-config-x
+ net-snmp-create-v3-user
+ NEWS.new*
++perl/*.yml
+ perl/*/*.def
++perl/*/*.yml
++perl/*/*/*.yml
+ perl/agent/agent.c
+ perl/agent/default_store/default_store.c
+ perl/agent/default_store/default_store.def
+@@ -96,6 +99,7 @@ perl/TrapReceiver/const-c.inc
+ perl/TrapReceiver/const-xs.inc
+ perl/TrapReceiver/TrapReceiver.c
+ pm_to_blib
++python/build
+ sedscript
+ snmplib/snmpsm_init.h
+ snmplib/snmpsm_shutdown.h
+diff --git a/COPYING b/COPYING
+index afe6e6d..d368331 100644
+--- a/COPYING
++++ b/COPYING
+@@ -135,7 +135,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 
+ ---- Part 5: Sparta, Inc copyright notice (BSD) -----
+ 
+-Copyright (c) 2003-2011, Sparta, Inc
++Copyright (c) 2003-2012, Sparta, Inc
+ All rights reserved.
+  
+ Redistribution and use in source and binary forms, with or without
+diff --git a/Makefile.in b/Makefile.in
+index f3dd7b7..9664676 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -85,22 +85,23 @@ libtool:	$(LIBTOOL_DEPS)
+ 	$(SHELL) ./config.status --recheck
+ 
+ 
+-snmplib:
++snmplib: @FEATURETARGS@
+ 	@(cd snmplib; $(MAKE) )
+ 
+-agent:
++agent: @FEATURETARGS@
+ 	@(cd snmplib; $(MAKE) )
+ 	@(cd agent; $(MAKE) )
+ 
+-apps:
++apps: @FEATURETARGS@
+ 	@(cd snmplib; $(MAKE) )
++	@(cd agent; $(MAKE) libs)
+ 	@(cd apps; $(MAKE) )
+ 
+-snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls:
++snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls: @FEATURETARGS@
+ 	@(cd snmplib; $(MAKE) )
+ 	@(cd apps; $(MAKE) $@ )
+ 
+-snmptrapd:
++agentxtrap snmptrapd: @FEATURETARGS@
+ 	@(cd snmplib; $(MAKE) )
+ 	@(cd agent; $(MAKE) libs)
+ 	@(cd apps; $(MAKE) $@ )
+diff --git a/agent/Makefile.in b/agent/Makefile.in
+index 84a5e4c..59cf4ef 100644
+--- a/agent/Makefile.in
++++ b/agent/Makefile.in
+@@ -114,7 +114,6 @@ USELIBS		= ../snmplib/libnetsnmp.$(LIB_EXTENSION)$(LIB_VERSION)
+ AGENTLIB	= libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION)
+ MIBLIB		= libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION)
+ 
+-LOCAL_LIBS	= -L../snmplib/.libs -L../snmplib -L./.libs
+ LAGENTLIBS	= @LAGENTLIBS@
+ LMIBLIBS	= @LMIBLIBS@
+ VAL_LIBS	= @VAL_LIBS@
+@@ -282,34 +281,33 @@ all: agentlib subdirs miblib $(INSTALLBINPROGS) $(INSTALLSBINPROGS)
+ # build stuff targets
+ #
+ getkstat: getkstat.o
+-	$(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS)
++	$(CC) $(CFLAGS) -o $@ $? $(LIBS)
+ 
+ getkstat.o: mibgroup/kernel_sunos5.c
+ 	$(CC) $(CFLAGS) -o $@ -D_GETKSTAT_TEST -DDODEBUG -c $? 
+ 
+ getmibstat: getmibstat.o
+-	$(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS)
++	$(CC) $(CFLAGS) -o $@ $? $(LIBS)
+ 
+ getmibstat.o: mibgroup/kernel_sunos5.c
+ 	$(CC) $(CFLAGS) -o $@ -D_GETMIBSTAT_TEST -DDODEBUG -c $? 
+ 
+-snmpd$(EXEEXT):	${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(MIBLIB) $(LIBTARG) 
+-	$(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} $(LOCAL_LIBS) ${LDFLAGS} ${OUR_AGENT_LIBS}
+-
++snmpd$(EXEEXT):	${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(HELPERLIB) $(MIBLIB) $(LIBTARG) 
++	$(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} ${LDFLAGS} ${OUR_AGENT_LIBS}
+ 
+ libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION):    ${LLIBAGENTOBJS} $(USELIBS)
+ 	$(LIB_LD_CMD) $(AGENTLIB) ${LLIBAGENTOBJS} $(USELIBS) ${LAGENTLIBS} @LD_NO_UNDEFINED@ $(LDFLAGS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@
+ 	$(RANLIB) $(AGENTLIB)
+ 
+ libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION): ${LMIBOBJS} $(AGENTLIB) $(USELIBS)
+-	$(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(LIB_LD_LIBS) @AGENTLIBS@
++	$(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@
+ 	$(RANLIB) $(MIBLIB)
+ 
+ agentlib: $(AGENTLIB)
+ 
+ miblib: $(MIBLIB)
+ 
+-libs: $(INSTALLLIBS)
++libs: $(AGENTLIB) $(MIBLIB)
+ 
+ embedperlinstall:
+ 	  @$(SHELL) $(srcdir)/../mkinstalldirs $(INSTALL_PREFIX)$(snmplibdir)
+diff --git a/agent/agent_handler.c b/agent/agent_handler.c
+index da64761..59e9613 100644
+--- a/agent/agent_handler.c
++++ b/agent/agent_handler.c
+@@ -774,7 +774,7 @@ netsnmp_handler_registration_free(netsnmp_handler_registration *reginfo)
+ /** Duplicates handler registration object and all subsequent handlers.
+  *  Creates a copy of the handler registration object and all its data.
+  *
+- *  @param handler is the handler registration object to be duplicated
++ *  @param reginfo is the handler registration object to be duplicated
+  *
+  *  @return Returns a pointer to the complete copy,
+  *         or NULL if any problem occured.
+@@ -922,7 +922,8 @@ netsnmp_free_delegated_cache(netsnmp_delegated_cache *dcache)
+  *  Sweeps through given chain of requests and sets 'delegated'
+  *  flag accordingly to the isdelegaded parameter.
+  *
+- *  @param isdelegaded New value of the 'delegated' flag.
++ *  @param requests Request list.
++ *  @param isdelegated New value of the 'delegated' flag.
+  */
+ void
+ netsnmp_handler_mark_requests_as_delegated(netsnmp_request_info *requests,
+diff --git a/agent/agent_read_config.c b/agent/agent_read_config.c
+index 3514f0f..f9ef1af 100644
+--- a/agent/agent_read_config.c
++++ b/agent/agent_read_config.c
+@@ -115,13 +115,10 @@ netsnmp_feature_child_of(snmpd_unregister_config_handler, agent_read_config_all)
+ void
+ snmpd_set_agent_user(const char *token, char *cptr)
+ {
+-#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
+-    struct passwd  *info;
+-#endif
+-
+     if (cptr[0] == '#') {
+         char           *ecp;
+         int             uid;
++
+         uid = strtoul(cptr + 1, &ecp, 10);
+         if (*ecp != 0) {
+             config_perror("Bad number");
+@@ -129,44 +126,47 @@ snmpd_set_agent_user(const char *token, char *cptr)
+ 	    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 			       NETSNMP_DS_AGENT_USERID, uid);
+ 	}
+-    }
+ #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
+-    else if ((info = getpwnam(cptr)) != NULL) {
+-        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+-			   NETSNMP_DS_AGENT_USERID, info->pw_uid);
+     } else {
+-        config_perror("User not found in passwd database");
+-    }
+-    endpwent();
++        struct passwd  *info;
++
++        info = getpwnam(cptr);
++        if (info)
++            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
++                               NETSNMP_DS_AGENT_USERID, info->pw_uid);
++        else
++            config_perror("User not found in passwd database");
++        endpwent();
+ #endif
++    }
+ }
+ 
+ void
+ snmpd_set_agent_group(const char *token, char *cptr)
+ {
+-#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
+-    struct group   *info;
+-#endif
+-
+     if (cptr[0] == '#') {
+         char           *ecp;
+         int             gid = strtoul(cptr + 1, &ecp, 10);
++
+         if (*ecp != 0) {
+             config_perror("Bad number");
+ 	} else {
+             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 			       NETSNMP_DS_AGENT_GROUPID, gid);
+ 	}
+-    }
+ #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
+-    else if ((info = getgrnam(cptr)) != NULL) {
+-        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+-			   NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
+     } else {
+-        config_perror("Group not found in group database");
+-    }
+-    endpwent();
++        struct group   *info;
++
++        info = getgrnam(cptr);
++        if (info)
++            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
++                               NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
++        else
++            config_perror("Group not found in group database");
++        endgrent();
+ #endif
++    }
+ }
+ #endif
+ 
+@@ -187,9 +187,10 @@ snmpd_set_agent_address(const char *token, char *cptr)
+         /*
+          * append to the older specification string 
+          */
+-        snprintf(buf, SPRINT_MAX_LEN, "%s,%s", ptr, cptr);
++        snprintf(buf, sizeof(buf), "%s,%s", ptr, cptr);
++	buf[sizeof(buf) - 1] = '\0';
+     } else {
+-        strncpy(buf, cptr, SPRINT_MAX_LEN);
++        strlcpy(buf, cptr, sizeof(buf));
+     }
+ 
+     DEBUGMSGTL(("snmpd_ports", "port spec: %s\n", buf));
+diff --git a/agent/agent_registry.c b/agent/agent_registry.c
+index 5efaeb5..1e2482a 100644
+--- a/agent/agent_registry.c
++++ b/agent/agent_registry.c
+@@ -555,6 +555,8 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev)
+                                &ptr->oid_off);
+ }
+ 
++netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused)
++#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE
+ /** Compares OIDs of given subtrees.
+  *
+  *  @param ap,bp Pointers to the subtrees to be compared.
+@@ -563,8 +565,6 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev)
+  *
+  *  @see snmp_oid_compare()
+  */
+-netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused)
+-#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE
+ int
+ netsnmp_subtree_compare(const netsnmp_subtree *ap, const netsnmp_subtree *bp)
+ {
+@@ -742,7 +742,7 @@ netsnmp_subtree_split(netsnmp_subtree *current, oid name[], int name_len)
+ 
+ /** Loads the subtree under given context name.
+  *
+- *  @param root The subtree to be loaded into current subtree.
++ *  @param new_sub The subtree to be loaded into current subtree.
+  *
+  *  @param context_name Text name of the context we're searching for.
+  *
+@@ -1085,8 +1085,22 @@ netsnmp_subtree_find(const oid *name, size_t len, netsnmp_subtree *subtree,
+ 
+ /** Registers a MIB handler.
+  *
++ *  @param moduleName
++ *  @param var
++ *  @param varsize
++ *  @param numvars
++ *  @param  mibloc
++ *  @param mibloclen
++ *  @param priority
++ *  @param range_subid
++ *  @param range_ubound
++ *  @param  ss
++ *  @param context
++ *  @param timeout
++ *  @param flags
+  *  @param reginfo Registration handler structure.
+  *                 In a case of failure, it will be freed.
++ *  @param perform_callback
+  *
+  *  @return gives MIB_REGISTERED_OK or MIB_* error code.
+  *
+@@ -1389,6 +1403,7 @@ register_mib_detach(void)
+  *                     If range_subid is zero, then this parameter is ignored.
+  *
+  *  @param ss 
++ *  @param context
+  *  @param timeout 
+  *  @param flags 
+  *
+@@ -1584,6 +1599,7 @@ netsnmp_subtree_unload(netsnmp_subtree *sub, netsnmp_subtree *prev, const char *
+         DEBUGMSGOID(("register_mib", sub->start_a, sub->start_len));
+     } else {
+         DEBUGMSG(("register_mib", "[NIL]"));
++        return;
+     }
+     DEBUGMSG(("register_mib", ", "));
+     if (prev != NULL) {
+@@ -1664,7 +1680,7 @@ unregister_mib_context(oid * name, size_t len, int priority,
+                        int range_subid, oid range_ubound,
+                        const char *context)
+ {
+-    netsnmp_subtree *list, *myptr;
++    netsnmp_subtree *list, *myptr = NULL;
+     netsnmp_subtree *prev, *child, *next; /* loop through children */
+     struct register_parameters reg_parms;
+     int old_lookup_cache_val = netsnmp_get_lookup_cache_size();
+diff --git a/agent/agent_trap.c b/agent/agent_trap.c
+index cc90620..dfa9dcf 100644
+--- a/agent/agent_trap.c
++++ b/agent/agent_trap.c
+@@ -801,6 +801,7 @@ netsnmp_send_traps(int trap, int specific,
+ 
+     }
+ 
++    if (template_v2pdu) {
+ 	/* A context name was provided, so copy it and its length to the v2 pdu
+ 	 * template. */
+ 	if (context != NULL)
+@@ -808,6 +809,7 @@ netsnmp_send_traps(int trap, int specific,
+ 		template_v2pdu->contextName    = strdup(context);
+ 		template_v2pdu->contextNameLen = strlen(context);
+ 	}
++    }
+ 
+     /*
+      *  Now loop through the list of trap sinks
+diff --git a/agent/auto_nlist.c b/agent/auto_nlist.c
+index cb92a5b..bcbdb05 100644
+--- a/agent/auto_nlist.c
++++ b/agent/auto_nlist.c
+@@ -52,6 +52,9 @@ auto_nlist_value(const char *string)
+         }
+     }
+     if (*ptr == 0) {
++#if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7))
++        static char *n_name = NULL;
++#endif
+         *ptr = (struct autonlist *) malloc(sizeof(struct autonlist));
+         it = *ptr;
+         it->left = 0;
+@@ -66,15 +69,35 @@ auto_nlist_value(const char *string)
+         strcpy(it->nl[0].n_name, string);
+         it->nl[0].n_name[strlen(string)+1] = '\0';
+ #else
+-        sprintf(it->nl[0].n_name, "_%s", string);
++
++        if (n_name != NULL)
++            free(n_name);
++
++        n_name = malloc(strlen(string) + 2);
++        if (n_name == NULL) {
++            snmp_log(LOG_ERR, "nlist err: failed to allocate memory");
++            return (-1);
++        }
++        snprintf(n_name, strlen(string) + 2, "_%s", string);
++        it->nl[0].n_name = (const char*)n_name;
+ #endif
+         it->nl[1].n_name = 0;
+         init_nlist(it->nl);
+ #if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) || \
+-                    defined(netbsd1) || defined(dragonfly)) 
++                    defined(netbsd1) || defined(dragonfly))
+         if (it->nl[0].n_type == 0) {
+-            strcpy(it->nl[0].n_name, string);
+-            it->nl[0].n_name[strlen(string)+1] = '\0';
++            static char *n_name2 = NULL;
++
++            if (n_name2 != NULL)
++                free(n_name2);
++
++            n_name2 = malloc(strlen(string) + 1);
++            if (n_name2 == NULL) {
++                snmp_log(LOG_ERR, "nlist err: failed to allocate memory");
++                return (-1);
++            }
++            strcpy(n_name2, string);
++            it->nl[0].n_name = (const char*)n_name2;
+             init_nlist(it->nl);
+         }
+ #endif
+@@ -86,7 +109,8 @@ auto_nlist_value(const char *string)
+ 	    }
+             return (-1);
+         } else {
+-            DEBUGMSGTL(("auto_nlist:auto_nlist_value", "found symbol %s at %x.\n",
++            DEBUGMSGTL(("auto_nlist:auto_nlist_value",
++			"found symbol %s at %lx.\n",
+                         it->symbol, it->nl[0].n_value));
+             return (it->nl[0].n_value);
+         }
+@@ -95,7 +119,7 @@ auto_nlist_value(const char *string)
+ }
+ 
+ int
+-auto_nlist(const char *string, char *var, int size)
++auto_nlist(const char *string, char *var, size_t size)
+ {
+     long            result;
+     int             ret;
+@@ -192,7 +216,7 @@ init_nlist(struct nlist nl[])
+ }
+ 
+ int
+-KNLookup(struct nlist nl[], int nl_which, char *buf, int s)
++KNLookup(struct nlist nl[], int nl_which, char *buf, size_t s)
+ {
+     struct nlist   *nlp = &nl[nl_which];
+ 
+diff --git a/agent/helpers/all_helpers.c b/agent/helpers/all_helpers.c
+index 0f2b6a1..e1e1b78 100644
+--- a/agent/helpers/all_helpers.c
++++ b/agent/helpers/all_helpers.c
+@@ -26,7 +26,7 @@ netsnmp_init_helpers(void)
+     netsnmp_init_bulk_to_next_helper();
+ #ifndef NETSNMP_FEATURE_REMOVE_TABLE_DATASET
+     netsnmp_init_table_dataset();
+-#endif
++#endif /* NETSNMP_FEATURE_REMOVE_TABLE_DATASET */
+ 
+ #ifndef NETSNMP_FEATURE_REMOVE_ROW_MERGE
+     netsnmp_init_row_merge();
+diff --git a/agent/helpers/instance.c b/agent/helpers/instance.c
+index 2142909..a187d58 100644
+--- a/agent/helpers/instance.c
++++ b/agent/helpers/instance.c
+@@ -536,6 +536,8 @@ netsnmp_register_num_file_instance(const char *name,
+ }
+ #endif /* NETSNMP_FEATURE_REMOVE_REGISTER_NUM_FILE_INSTANCE */
+ 
++netsnmp_feature_child_of(register_int_instance,instance)
++#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE
+ /**
+  * This function registers an int helper handler to a specified OID.
+  *
+@@ -554,8 +556,6 @@ netsnmp_register_num_file_instance(const char *name,
+  *      MIB_REGISTERED_OK is returned if the registration was a success.
+  *	Failures are MIB_REGISTRATION_FAILED and MIB_DUPLICATE_REGISTRATION.
+  */
+-netsnmp_feature_child_of(register_int_instance,instance)
+-#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE
+ int
+ netsnmp_register_int_instance(const char *name,
+                               const oid * reg_oid, size_t reg_oid_len,
+diff --git a/agent/helpers/old_api.c b/agent/helpers/old_api.c
+index b1630e6..4888cbc 100644
+--- a/agent/helpers/old_api.c
++++ b/agent/helpers/old_api.c
+@@ -103,8 +103,12 @@ netsnmp_register_old_api(const char *moduleName,
+         reginfo->rootoid_len = (mibloclen + vp->namelen);
+         reginfo->rootoid =
+             (oid *) malloc(reginfo->rootoid_len * sizeof(oid));
+-        if (reginfo->rootoid == NULL)
++        if (reginfo->rootoid == NULL) {
++            SNMP_FREE(vp);
++            SNMP_FREE(reginfo->handlerName);
++            SNMP_FREE(reginfo);
+             return SNMP_ERR_GENERR;
++        }
+ 
+         memcpy(reginfo->rootoid, mibloc, mibloclen * sizeof(oid));
+         memcpy(reginfo->rootoid + mibloclen, vp->name, vp->namelen
+@@ -127,7 +131,7 @@ netsnmp_register_old_api(const char *moduleName,
+          */
+         if (netsnmp_register_handler(reginfo) != MIB_REGISTERED_OK) {
+             /** netsnmp_handler_registration_free(reginfo); already freed */
+-            SNMP_FREE(vp);
++            /* SNMP_FREE(vp); already freed */
+         }
+     }
+     return SNMPERR_SUCCESS;
+diff --git a/agent/helpers/snmp_get_statistic.c b/agent/helpers/snmp_get_statistic.c
+index 2e4fed8..efac2ac 100644
+--- a/agent/helpers/snmp_get_statistic.c
++++ b/agent/helpers/snmp_get_statistic.c
+@@ -58,4 +58,4 @@ netsnmp_register_statistic_handler(netsnmp_handler_registration *reginfo,
+ }
+ #else /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */
+ netsnmp_feature_unused(helper_statistics);
+-#endif
++#endif /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */
+diff --git a/agent/helpers/table_array.c b/agent/helpers/table_array.c
+index 49e0b24..7c98aae 100644
+--- a/agent/helpers/table_array.c
++++ b/agent/helpers/table_array.c
+@@ -576,8 +576,11 @@ group_requests(netsnmp_agent_request_info *agtreq_info,
+         DEBUGMSG(("table_array:group", "\n"));
+         g = SNMP_MALLOC_TYPEDEF(netsnmp_request_group);
+         i = SNMP_MALLOC_TYPEDEF(netsnmp_request_group_item);
+-        if (i == NULL || g == NULL)
++        if (i == NULL || g == NULL) {
++            SNMP_FREE(i);
++            SNMP_FREE(g);
+             return;
++        }
+         g->list = i;
+         g->table = tad->table;
+         i->ri = current;
+diff --git a/agent/helpers/table_dataset.c b/agent/helpers/table_dataset.c
+index 5160748..0949a8a 100644
+--- a/agent/helpers/table_dataset.c
++++ b/agent/helpers/table_dataset.c
+@@ -467,7 +467,7 @@ netsnmp_register_table_data_set(netsnmp_handler_registration *reginfo,
+                            netsnmp_get_table_data_set_handler(data_set));
+     ret = netsnmp_register_table_data(reginfo, data_set->table,
+                                        table_info);
+-    if (reginfo->handler)
++    if (ret == SNMPERR_SUCCESS && reginfo->handler)
+         netsnmp_handler_owns_table_info(reginfo->handler->next);
+     return ret;
+ }
+@@ -1105,9 +1105,11 @@ netsnmp_config_parse_table_set(const char *token, char *line)
+         switch (tp->access) {
+         case MIB_ACCESS_CREATE:
+             table_set->allow_creation = 1;
++            /* fallthrough */
+         case MIB_ACCESS_READWRITE:
+         case MIB_ACCESS_WRITEONLY:
+             canwrite = 1;
++            /* fallthrough */
+         case MIB_ACCESS_READONLY:
+             DEBUGMSGTL(("table_set_add_table",
+                         "adding column %ld of type %d\n", tp->subid, type));
+diff --git a/agent/helpers/table_iterator.c b/agent/helpers/table_iterator.c
+index 64ef2cb..8ed5cd0 100644
+--- a/agent/helpers/table_iterator.c
++++ b/agent/helpers/table_iterator.c
+@@ -648,6 +648,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler,
+                          */
+                         if (free_this_index_search)
+                             snmp_free_varbind(free_this_index_search);
++                        netsnmp_free_request_data_sets(reqtmp);
++                        SNMP_FREE(reqtmp);
+                         return SNMP_ERR_GENERR;
+                     }
+                     coloid[reginfo->rootoid_len + 1] = table_info->colnum;
+@@ -681,6 +683,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler,
+                                 if (free_this_index_search)
+                                     snmp_free_varbind
+                                         (free_this_index_search);
++                                netsnmp_free_request_data_sets(reqtmp);
++                                SNMP_FREE(reqtmp);
+                                 return SNMP_ERR_GENERR;
+                             }
+                             request_count--;   /* One less to look for */
+diff --git a/agent/helpers/watcher.c b/agent/helpers/watcher.c
+index ee80736..9b3933b 100644
+--- a/agent/helpers/watcher.c
++++ b/agent/helpers/watcher.c
+@@ -245,14 +245,11 @@ netsnmp_watcher_helper_handler(netsnmp_mib_handler *handler,
+     netsnmp_watcher_cache *old_data;
+ 
+     DEBUGMSGTL(("helper:watcher", "Got request:  %d\n", reqinfo->mode));
+-
+     DEBUGMSGTL(( "helper:watcher", "  oid:"));
+     DEBUGMSGOID(("helper:watcher", requests->requestvb->name,
+                                    requests->requestvb->name_length));
+     DEBUGMSG((   "helper:watcher", "\n"));
+ 
+-
+-
+     switch (reqinfo->mode) {
+         /*
+          * data requests 
+@@ -392,14 +389,11 @@ netsnmp_watched_timestamp_handler(netsnmp_mib_handler *handler,
+ 
+     DEBUGMSGTL(("helper:watcher:timestamp",
+                                "Got request:  %d\n", reqinfo->mode));
+-
+     DEBUGMSGTL(( "helper:watcher:timestamp", "  oid:"));
+     DEBUGMSGOID(("helper:watcher:timestamp", requests->requestvb->name,
+                                    requests->requestvb->name_length));
+     DEBUGMSG((   "helper:watcher:timestamp", "\n"));
+ 
+-
+-
+     switch (reqinfo->mode) {
+         /*
+          * data requests 
+@@ -481,14 +475,11 @@ netsnmp_watched_spinlock_handler(netsnmp_mib_handler *handler,
+ 
+     DEBUGMSGTL(("helper:watcher:spinlock",
+                                "Got request:  %d\n", reqinfo->mode));
+-
+     DEBUGMSGTL(( "helper:watcher:spinlock", "  oid:"));
+     DEBUGMSGOID(("helper:watcher:spinlock", requests->requestvb->name,
+                                    requests->requestvb->name_length));
+     DEBUGMSG((   "helper:watcher:spinlock", "\n"));
+ 
+-
+-
+     switch (reqinfo->mode) {
+         /*
+          * Ensure the assigned value matches the current one
+diff --git a/agent/mibgroup/Rmon/agutil.c b/agent/mibgroup/Rmon/agutil.c
+index d28bb67..12c6342 100644
+--- a/agent/mibgroup/Rmon/agutil.c
++++ b/agent/mibgroup/Rmon/agutil.c
+@@ -200,12 +200,7 @@ AGUTIL_get_oid_value(u_char * var_val, u_char var_val_type,
+ u_long
+ AGUTIL_sys_up_time(void)
+ {
+-    struct timeval  current, delta;
+-    const struct timeval* const starttime_ptr = netsnmp_get_agent_starttime();
+-
+-    gettimeofday(&current, NULL);
+-    NETSNMP_TIMERSUB(&current, starttime_ptr, &delta);
+-    return delta.tv_sec * 100 + delta.tv_usec / 10000;
++    return netsnmp_get_agent_runtime();
+ }
+ 
+ /*
+diff --git a/agent/mibgroup/Rmon/event.c b/agent/mibgroup/Rmon/event.c
+index 008ebaa..04a8555 100644
+--- a/agent/mibgroup/Rmon/event.c
++++ b/agent/mibgroup/Rmon/event.c
+@@ -128,6 +128,7 @@ typedef struct {
+ 
+ static TABLE_DEFINTION_T EventCtrlTable;
+ static TABLE_DEFINTION_T *table_ptr = &EventCtrlTable;
++static unsigned char zero_octet_string[1];
+ 
+ /*
+  * Control Table RowApi Callbacks 
+@@ -262,7 +263,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type,
+     static int      prev_action = COMMIT;
+     RMON_ENTRY_T   *hdr;
+     CRTL_ENTRY_T   *cloned_body;
+-    CRTL_ENTRY_T   *body;
+ 
+     switch (action) {
+     case RESERVE1:
+@@ -283,7 +283,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type,
+         leaf_id = (int) name[eventEntryFirstIndexBegin - 1];
+         hdr = ROWAPI_find(table_ptr, long_temp);        /* it MUST be OK */
+         cloned_body = (CRTL_ENTRY_T *) hdr->tmp;
+-        body = (CRTL_ENTRY_T *) hdr->body;
+         switch (leaf_id) {
+         case Leaf_event_description:
+             char_temp = AGMALLOC(1 + MAX_event_description);
+@@ -406,7 +405,7 @@ var_eventTable(struct variable *vp,
+             return (unsigned char *) theEntry.event_description;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+     case EVENTTYPE:
+         long_ret = theEntry.event_type;
+@@ -417,7 +416,7 @@ var_eventTable(struct variable *vp,
+             return (unsigned char *) theEntry.event_community;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+     case EVENTLASTTIMESENT:
+         long_ret = theEntry.event_last_time_sent;
+@@ -428,7 +427,7 @@ var_eventTable(struct variable *vp,
+             return (unsigned char *) hdr->owner;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+     case EVENTSTATUS:
+         long_ret = hdr->status;
+@@ -457,7 +456,6 @@ var_logTable(struct variable *vp,
+     static long     long_ret;
+     static DATA_ENTRY_T theEntry;
+     RMON_ENTRY_T   *hdr;
+-    CRTL_ENTRY_T   *ctrl;
+ 
+     *write_method = NULL;
+     hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len,
+@@ -467,8 +465,6 @@ var_logTable(struct variable *vp,
+     if (!hdr)
+         return NULL;
+ 
+-    ctrl = (CRTL_ENTRY_T *) hdr->body;
+-
+     *var_len = sizeof(long);    /* default */
+ 
+     switch (vp->magic) {
+@@ -487,7 +483,7 @@ var_logTable(struct variable *vp,
+             return (unsigned char *) theEntry.log_description;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+     default:
+         ERROR_MSG("");
+diff --git a/agent/mibgroup/Rmon/history.c b/agent/mibgroup/Rmon/history.c
+index b962567..c8e9c25 100644
+--- a/agent/mibgroup/Rmon/history.c
++++ b/agent/mibgroup/Rmon/history.c
+@@ -181,7 +181,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type,
+                                                var_val_len,
+                                                MIN_historyControlBucketsRequested,
+                                                MAX_historyControlBucketsRequested,
+-                                               &cloned_body->scrlr.
++                                               (long *) &cloned_body->scrlr.
+                                                data_requested);
+             if (SNMP_ERR_NOERROR != snmp_status) {
+                 return snmp_status;
+@@ -198,7 +198,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type,
+                                                var_val_len,
+                                                MIN_historyControlInterval,
+                                                MAX_historyControlInterval,
+-                                               &cloned_body->interval);
++                                               (long *) &cloned_body->interval);
+             if (SNMP_ERR_NOERROR != snmp_status) {
+                 return snmp_status;
+             }
+@@ -257,6 +257,7 @@ var_historyControlTable(struct variable *vp,
+                         int exact,
+                         size_t * var_len, WriteMethod ** write_method)
+ {
++    static unsigned char zero_octet_string[1];
+     static long     long_ret;
+     static CRTL_ENTRY_T theEntry;
+     RMON_ENTRY_T   *hdr;
+@@ -298,7 +299,7 @@ var_historyControlTable(struct variable *vp,
+             return (unsigned char *) hdr->owner;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+ 
+     case CTRL_STATUS:
+@@ -530,7 +531,6 @@ var_etherHistoryTable(struct variable *vp,
+     static long     long_ret;
+     static DATA_ENTRY_T theBucket;
+     RMON_ENTRY_T   *hdr;
+-    CRTL_ENTRY_T   *ctrl;
+ 
+     *write_method = NULL;
+     hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len,
+@@ -542,8 +542,6 @@ var_etherHistoryTable(struct variable *vp,
+ 
+     *var_len = sizeof(long);    /* default */
+ 
+-    ctrl = (CRTL_ENTRY_T *) hdr->body;
+-
+     switch (vp->magic) {
+     case DATA_INDEX:
+         long_ret = hdr->ctrl_index;
+diff --git a/agent/mibgroup/Rmon/row_api.h b/agent/mibgroup/Rmon/row_api.h
+index 2fb5a88..9f576be 100644
+--- a/agent/mibgroup/Rmon/row_api.h
++++ b/agent/mibgroup/Rmon/row_api.h
+@@ -62,7 +62,7 @@ typedef struct tagEntry {
+ typedef int     (ENTRY_CALLBACK_T) (RMON_ENTRY_T *);
+ 
+ typedef struct {
+-    char           *name;
++    const char     *name;
+     RMON_ENTRY_T   *first;
+     u_long          max_number_of_entries;      /* '<0' means without limit */
+     u_long          current_number_of_entries;
+diff --git a/agent/mibgroup/Rmon/statistics.c b/agent/mibgroup/Rmon/statistics.c
+index 51f25ee..3ed4acb 100644
+--- a/agent/mibgroup/Rmon/statistics.c
++++ b/agent/mibgroup/Rmon/statistics.c
+@@ -317,6 +317,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length,
+                     int exact, size_t * var_len,
+                     WriteMethod ** write_method)
+ {
++    static unsigned char zero_octet_string[1];
+     static long     long_return;
+     static CRTL_ENTRY_T theEntry;
+     RMON_ENTRY_T   *hdr;
+@@ -397,7 +398,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length,
+             return (unsigned char *) hdr->owner;
+         } else {
+             *var_len = 0;
+-            return NETSNMP_REMOVE_CONST(unsigned char *, "");
++            return zero_octet_string;
+         }
+     case IDetherStatsStatus:
+         long_return = hdr->status;
+diff --git a/agent/mibgroup/agent/extend.c b/agent/mibgroup/agent/extend.c
+index ddef4fb..8268559 100644
+--- a/agent/mibgroup/agent/extend.c
++++ b/agent/mibgroup/agent/extend.c
+@@ -120,7 +120,8 @@ _register_extend( oid *base, size_t len )
+     netsnmp_table_data                *dinfo;
+     netsnmp_table_registration_info   *tinfo;
+     netsnmp_watcher_info              *winfo;
+-    netsnmp_handler_registration      *reg;
++    netsnmp_handler_registration      *reg = NULL;
++    int                                rc;
+ 
+     for ( eptr=ereg_head; eptr; eptr=eptr->next ) {
+         if (!snmp_oid_compare( base, len, eptr->root_oid, eptr->oid_len))
+@@ -128,6 +129,8 @@ _register_extend( oid *base, size_t len )
+     }
+     if (!eptr) {
+         eptr = SNMP_MALLOC_TYPEDEF( extend_registration_block );
++        if (!eptr)
++            return NULL;
+         eptr->root_oid = snmp_duplicate_objid( base, len );
+         eptr->oid_len  = len;
+         eptr->num_entries = 0;
+@@ -157,7 +160,10 @@ _register_extend( oid *base, size_t len )
+                 "nsExtendConfigTable", handle_nsExtendConfigTable, 
+                 oid_buf, len+1, HANDLER_CAN_RONLY);
+ #endif /* !NETSNMP_NO_WRITE_SUPPORT */
+-    netsnmp_register_table_data( reg, dinfo, tinfo );
++    rc = netsnmp_register_table_data( reg, dinfo, tinfo );
++    if (rc != SNMPERR_SUCCESS) {
++        goto bail;
++    }
+     netsnmp_handler_owns_table_info(reg->handler->next);
+     eptr->reg[0] = reg;
+ 
+@@ -175,7 +181,9 @@ _register_extend( oid *base, size_t len )
+     reg   = netsnmp_create_handler_registration(
+                 "nsExtendOut1Table", handle_nsExtendOutput1Table, 
+                 oid_buf, len+1, HANDLER_CAN_RONLY);
+-    netsnmp_register_table_data( reg, dinfo, tinfo );
++    rc = netsnmp_register_table_data( reg, dinfo, tinfo );
++    if (rc != SNMPERR_SUCCESS)
++        goto bail;
+     netsnmp_handler_owns_table_info(reg->handler->next);
+     eptr->reg[1] = reg;
+ 
+@@ -195,7 +203,9 @@ _register_extend( oid *base, size_t len )
+     reg   = netsnmp_create_handler_registration(
+                 "nsExtendOut2Table", handle_nsExtendOutput2Table, 
+                 oid_buf, len+1, HANDLER_CAN_RONLY);
+-    netsnmp_register_table( reg, tinfo );
++    rc = netsnmp_register_table( reg, tinfo );
++    if (rc != SNMPERR_SUCCESS)
++        goto bail;
+     netsnmp_handler_owns_table_info(reg->handler->next);
+     eptr->reg[2] = reg;
+ 
+@@ -209,9 +219,20 @@ _register_extend( oid *base, size_t len )
+     winfo = netsnmp_create_watcher_info(
+                 &(eptr->num_entries), sizeof(eptr->num_entries),
+                 ASN_INTEGER, WATCHER_FIXED_SIZE);
+-    netsnmp_register_watched_scalar2( reg, winfo );
++    rc = netsnmp_register_watched_scalar2( reg, winfo );
++    if (rc != SNMPERR_SUCCESS)
++        goto bail;
+ 
+     return eptr;
++
++bail:
++    if (eptr->reg[2])
++        netsnmp_unregister_handler(eptr->reg[2]);
++    if (eptr->reg[1])
++        netsnmp_unregister_handler(eptr->reg[1]);
++    if (eptr->reg[0])
++        netsnmp_unregister_handler(eptr->reg[0]);
++    return NULL;
+ }
+ 
+ static void
+@@ -406,9 +427,9 @@ _free_extension( netsnmp_extend *extension, extend_registration_block *ereg )
+             eprev->next = eptr->next;
+         else
+             ereg->ehead = eptr->next;
++        netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row);
+     }
+ 
+-    netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row);
+     SNMP_FREE( extension->token );
+     SNMP_FREE( extension->cache );
+     SNMP_FREE( extension->command );
+diff --git a/agent/mibgroup/agent/nsDebug.c b/agent/mibgroup/agent/nsDebug.c
+index 0a629cc..89a90b0 100644
+--- a/agent/mibgroup/agent/nsDebug.c
++++ b/agent/mibgroup/agent/nsDebug.c
+@@ -423,8 +423,9 @@ handle_nsDebugTable(netsnmp_mib_handler *handler,
+ 		 */
+                 debug_entry = (netsnmp_token_descr*)
+                                netsnmp_extract_iterator_context(request);
+-                debug_entry->enabled =
+-                    (*request->requestvb->val.integer == RS_ACTIVE);
++                if (debug_entry)
++                    debug_entry->enabled =
++                        (*request->requestvb->val.integer == RS_ACTIVE);
+ 		break;
+ 
+             case RS_CREATEANDWAIT:
+diff --git a/agent/mibgroup/agent/nsLogging.c b/agent/mibgroup/agent/nsLogging.c
+index c06a18a..7f20bdb 100644
+--- a/agent/mibgroup/agent/nsLogging.c
++++ b/agent/mibgroup/agent/nsLogging.c
+@@ -363,7 +363,7 @@ handle_nsLoggingTable(netsnmp_mib_handler *handler,
+ 		switch ( *request->requestvb->val.integer ) {
+                 case RS_ACTIVE:
+                 case RS_CREATEANDGO:
+-                    if ( !logh->type ) {
++                    if ( !logh || !logh->type ) {
+                         netsnmp_set_request_error(reqinfo, request,
+                                                   SNMP_ERR_INCONSISTENTVALUE);
+                         return SNMP_ERR_INCONSISTENTVALUE;
+diff --git a/agent/mibgroup/agent/nsVacmAccessTable.c b/agent/mibgroup/agent/nsVacmAccessTable.c
+index 22d2154..79fa97d 100644
+--- a/agent/mibgroup/agent/nsVacmAccessTable.c
++++ b/agent/mibgroup/agent/nsVacmAccessTable.c
+@@ -174,11 +174,11 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
+             /* Extract the authType token from the list of indexes */
+             idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
+             memset(atype, 0, sizeof(atype));
+-            strncpy(atype, (char *)idx->val.string, idx->val_len);
++            memcpy(atype, (char *)idx->val.string, idx->val_len);
+             viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
+             DEBUGMSGTL(("nsVacm", "GET %s (%d)\n", idx->val.string, viewIdx));
+ 
+-            if (!entry)
++            if (!entry || viewIdx < 0)
+                 continue;
+ 
+             switch (table_info->colnum) {
+@@ -248,7 +248,7 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
+                  */
+                 idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
+                 memset(atype, 0, sizeof(atype));
+-                strncpy(atype, (char *)idx->val.string, idx->val_len);
++                memcpy(atype, (char *)idx->val.string, idx->val_len);
+                 viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
+                 if ( viewIdx < 0 ) {
+                     ret = SNMP_ERR_NOCREATION;
+@@ -322,8 +322,10 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
+             /* Extract the authType token from the list of indexes */
+             idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
+             memset(atype, 0, sizeof(atype));
+-            strncpy(atype, (char *)idx->val.string, idx->val_len);
++            memcpy(atype, (char *)idx->val.string, idx->val_len);
+             viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
++            if (viewIdx < 0)
++                    continue;
+ 
+             switch (table_info->colnum) {
+             case COLUMN_NSVACMCONTEXTMATCH:
+diff --git a/agent/mibgroup/agentx/agentx_config.c b/agent/mibgroup/agentx/agentx_config.c
+index b590c7a..ea453c2 100644
+--- a/agent/mibgroup/agentx/agentx_config.c
++++ b/agent/mibgroup/agentx/agentx_config.c
+@@ -180,10 +180,8 @@ agentx_config_init(void)
+      */
+     netsnmp_register_default_domain("agentx", "unix tcp");
+     netsnmp_register_default_target("agentx", "unix", NETSNMP_AGENTX_SOCKET);
+-#define val(x) __STRING(x)
+     netsnmp_register_default_target("agentx", "tcp",
+-                                    "localhost:" val(AGENTX_PORT));
+-#undef val
++                                    "localhost:" __STRING(AGENTX_PORT));
+     agentx_register_config_handler("agentxsocket",
+                                   agentx_parse_agentx_socket, NULL,
+                                   "AgentX bind address");
+diff --git a/agent/mibgroup/agentx/master_admin.c b/agent/mibgroup/agentx/master_admin.c
+index 3f4b33d..f16f392 100644
+--- a/agent/mibgroup/agentx/master_admin.c
++++ b/agent/mibgroup/agentx/master_admin.c
+@@ -64,7 +64,6 @@ int
+ open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu)
+ {
+     netsnmp_session *sp;
+-    struct timeval  now;
+ 
+     DEBUGMSGTL(("agentx/master", "open %8p\n", session));
+     sp = (netsnmp_session *) malloc(sizeof(netsnmp_session));
+@@ -104,8 +103,7 @@ open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu)
+                                                  name_length);
+     sp->securityAuthProtoLen = pdu->variables->name_length;
+     sp->securityName = strdup((char *) pdu->variables->val.string);
+-    gettimeofday(&now, NULL);
+-    sp->engineTime = calculate_sectime_diff(&now, netsnmp_get_agent_starttime());
++    sp->engineTime = (netsnmp_get_agent_runtime() + 50) / 100;
+ 
+     sp->subsession = session;   /* link back to head */
+     sp->flags |= SNMP_FLAGS_SUBSESSION;
+diff --git a/agent/mibgroup/agentx/protocol.c b/agent/mibgroup/agentx/protocol.c
+index 09c149f..6e3daf3 100644
+--- a/agent/mibgroup/agentx/protocol.c
++++ b/agent/mibgroup/agentx/protocol.c
+@@ -453,6 +453,7 @@ agentx_realloc_build_varbind(u_char ** buf, size_t * buf_len,
+     case ASN_COUNTER:
+     case ASN_GAUGE:
+     case ASN_TIMETICKS:
++    case ASN_UINTEGER:
+         if (!agentx_realloc_build_int(buf, buf_len, out_len, allow_realloc,
+                                       *(vp->val.integer), network_order)) {
+             DEBUGINDENTLESS();
+@@ -1372,6 +1373,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type,
+     case ASN_COUNTER:
+     case ASN_GAUGE:
+     case ASN_TIMETICKS:
++    case ASN_UINTEGER:
+         int_val = agentx_parse_int(bufp, network_byte_order);
+         memmove(data_buf, &int_val, 4);
+         *data_len = 4;
+@@ -1429,6 +1431,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type,
+         break;
+ 
+     default:
++        DEBUGMSG(("recv", "Can not parse type %x", *type));
+         DEBUGINDENTLESS();
+         return NULL;
+     }
+diff --git a/agent/mibgroup/agentx/subagent.c b/agent/mibgroup/agentx/subagent.c
+index 5d51834..76b1acf 100644
+--- a/agent/mibgroup/agentx/subagent.c
++++ b/agent/mibgroup/agentx/subagent.c
+@@ -243,6 +243,24 @@ free_set_vars(netsnmp_session * ss, netsnmp_pdu *pdu)
+ }
+ #endif /* !NETSNMP_NO_WRITE_SUPPORT */
+ 
++static void
++send_agentx_error(netsnmp_session *session, netsnmp_pdu *pdu, int errstat, int errindex)
++{
++    pdu = snmp_clone_pdu(pdu);
++    pdu->command   = AGENTX_MSG_RESPONSE;
++    pdu->version   = session->version;
++    pdu->errstat   = errstat;
++    pdu->errindex  = errindex;
++    snmp_free_varbind(pdu->variables);
++    pdu->variables = NULL;
++
++    DEBUGMSGTL(("agentx/subagent", "Sending AgentX response error stat %d idx %d\n",
++             errstat, errindex));
++    if (!snmp_send(session, pdu)) {
++        snmp_free_pdu(pdu);
++    }
++}
++
+ int
+ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+                      netsnmp_pdu *pdu, void *magic)
+@@ -298,8 +316,10 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+              * agentx_reopen_session unregisters itself if it succeeds in talking 
+              * to the master agent.  
+              */
+-            snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session,
+-                                NULL);
++            snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session, NULL);
++            snmp_log(LOG_INFO, "AgentX master disconnected us, reconnecting in %d\n", period);
++        } else {
++            snmp_log(LOG_INFO, "AgentX master disconnected us, not reconnecting\n");
+         }
+         return 0;
+     } else if (operation != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
+@@ -325,6 +345,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+             (ns_subagent_magic *) calloc(1, sizeof(ns_subagent_magic));
+         if (smagic == NULL) {
+             DEBUGMSGTL(("agentx/subagent", "couldn't malloc() smagic\n"));
++            /* would like to send_agentx_error(), but it needs memory too */
+             return 1;
+         }
+         smagic->original_command = pdu->command;
+@@ -389,6 +410,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+         if (asi == NULL) {
+             SNMP_FREE(smagic);
+             snmp_log(LOG_WARNING, "save_set_vars() failed\n");
++            send_agentx_error(session, pdu, AGENTX_ERR_PARSE_FAILED, 0);
+             return 1;
+         }
+         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_RESERVE1;
+@@ -402,6 +424,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+         if (asi == NULL) {
+             SNMP_FREE(smagic);
+             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
++            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
+             return 1;
+         }
+         if (asi->mode != SNMP_MSG_INTERNAL_SET_RESERVE2) {
+@@ -409,6 +432,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+             snmp_log(LOG_WARNING,
+                      "dropping bad AgentX request (wrong mode %d)\n",
+                      asi->mode);
++            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
+             return 1;
+         }
+         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_ACTION;
+@@ -422,6 +446,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+         if (asi == NULL) {
+             SNMP_FREE(smagic);
+             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
++            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
+             return 1;
+         }
+         if (asi->mode == SNMP_MSG_INTERNAL_SET_RESERVE1 ||
+@@ -446,6 +471,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+         if (asi == NULL) {
+             SNMP_FREE(smagic);
+             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
++            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
+             return 1;
+         }
+         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_UNDO;
+@@ -484,6 +510,26 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
+     return 1;
+ }
+ 
++static int
++_invalid_op_and_magic(int op, ns_subagent_magic *smagic)
++{
++    int invalid = 0;
++
++    if (smagic && (snmp_sess_pointer(smagic->session) == NULL ||
++        op == NETSNMP_CALLBACK_OP_TIMED_OUT)) {
++        if (smagic->ovars != NULL) {
++            snmp_free_varbind(smagic->ovars);
++        }
++        free(smagic);
++        invalid = 1;
++    }
++
++    if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || smagic == NULL)
++        invalid = 1;
++
++    return invalid;
++}
++
+ int
+ handle_subagent_response(int op, netsnmp_session * session, int reqid,
+                          netsnmp_pdu *pdu, void *magic)
+@@ -492,13 +538,7 @@ handle_subagent_response(int op, netsnmp_session * session, int reqid,
+     netsnmp_variable_list *u = NULL, *v = NULL;
+     int             rc = 0;
+ 
+-    if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || magic == NULL) {
+-        if (op == NETSNMP_CALLBACK_OP_TIMED_OUT && magic != NULL) {
+-            if (smagic->ovars != NULL) {
+-                snmp_free_varbind(smagic->ovars);
+-            }
+-            free(smagic);
+-        }
++    if (_invalid_op_and_magic(op, magic)) {
+         return 1;
+     }
+ 
+@@ -778,6 +818,7 @@ subagent_open_master_session(void)
+ {
+     netsnmp_transport *t;
+     netsnmp_session sess;
++    const char *agentx_socket;
+ 
+     DEBUGMSGTL(("agentx/subagent", "opening session...\n"));
+ 
+@@ -795,9 +836,9 @@ subagent_open_master_session(void)
+     sess.callback = handle_agentx_packet;
+     sess.authenticator = NULL;
+ 
+-    t = netsnmp_transport_open_client(
+-            "agentx", netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+-                                            NETSNMP_DS_AGENT_X_SOCKET));
++    agentx_socket = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
++                                          NETSNMP_DS_AGENT_X_SOCKET);
++    t = netsnmp_transport_open_client("agentx", agentx_socket);
+     if (t == NULL) {
+         /*
+          * Diagnose snmp_open errors with the input
+@@ -806,12 +847,9 @@ subagent_open_master_session(void)
+         if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
+                                     NETSNMP_DS_AGENT_NO_CONNECTION_WARNINGS)) {
+             char buf[1024];
+-            const char *socket =
+-                netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+-                                      NETSNMP_DS_AGENT_X_SOCKET);
+             snprintf(buf, sizeof(buf), "Warning: "
+                      "Failed to connect to the agentx master agent (%s)",
+-                     socket ? socket : "[NIL]");
++                     agentx_socket ? agentx_socket : "[NIL]");
+             if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
+                                         NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
+                 netsnmp_sess_log_error(LOG_WARNING, buf, &sess);
+@@ -832,8 +870,7 @@ subagent_open_master_session(void)
+             char buf[1024];
+             snprintf(buf, sizeof(buf), "Error: "
+                      "Failed to create the agentx master agent session (%s)",
+-                     netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+-                                           NETSNMP_DS_AGENT_X_SOCKET));
++                     agentx_socket);
+             snmp_sess_perror(buf, &sess);
+         }
+         netsnmp_transport_free(t);
+diff --git a/agent/mibgroup/disman/event/mteEventConf.c b/agent/mibgroup/disman/event/mteEventConf.c
+index 949d6e5..24192a6 100644
+--- a/agent/mibgroup/disman/event/mteEventConf.c
++++ b/agent/mibgroup/disman/event/mteEventConf.c
+@@ -296,6 +296,11 @@ parse_setEvent( const char *token, char *line )
+     if (cp && *cp == '=') {
+         cp = skip_token( cp );   /* skip the '=' assignment character */
+     }
++    if (!cp) {
++        config_perror("syntax error: missing set value");
++        return;
++    }
++
+     value = strtol( cp, NULL, 0);
+ 
+     /*
+diff --git a/agent/mibgroup/disman/event/mteEventNotificationTable.c b/agent/mibgroup/disman/event/mteEventNotificationTable.c
+index 9095f0e..7d2c94a 100644
+--- a/agent/mibgroup/disman/event/mteEventNotificationTable.c
++++ b/agent/mibgroup/disman/event/mteEventNotificationTable.c
+@@ -98,6 +98,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -136,6 +139,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             /*
+@@ -204,6 +210,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -225,6 +234,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteEventSetTable.c b/agent/mibgroup/disman/event/mteEventSetTable.c
+index 67a8170..ee696f1 100644
+--- a/agent/mibgroup/disman/event/mteEventSetTable.c
++++ b/agent/mibgroup/disman/event/mteEventSetTable.c
+@@ -100,6 +100,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -151,6 +154,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             /*
+@@ -233,6 +239,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -254,6 +263,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteEventTable.c b/agent/mibgroup/disman/event/mteEventTable.c
+index 5603715..c5b534e 100644
+--- a/agent/mibgroup/disman/event/mteEventTable.c
++++ b/agent/mibgroup/disman/event/mteEventTable.c
+@@ -106,6 +106,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+             if (!entry || !(entry->flags & MTE_EVENT_FLAG_VALID))
+@@ -142,6 +145,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -223,6 +229,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_RESERVE2:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -255,6 +264,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_FREE:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -280,6 +292,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+@@ -304,6 +319,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteObjectsTable.c b/agent/mibgroup/disman/event/mteObjectsTable.c
+index 443c5cc..f7f6e02 100644
+--- a/agent/mibgroup/disman/event/mteObjectsTable.c
++++ b/agent/mibgroup/disman/event/mteObjectsTable.c
+@@ -101,6 +101,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -135,6 +138,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+     case MODE_SET_RESERVE1:
+ 
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -198,8 +204,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+         break;
+ 
+     case MODE_SET_RESERVE2:
+-
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -232,8 +240,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+         break;
+ 
+     case MODE_SET_FREE:
+-
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -259,6 +269,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -282,6 +295,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteTrigger.c b/agent/mibgroup/disman/event/mteTrigger.c
+index 002b543..7fca1b0 100644
+--- a/agent/mibgroup/disman/event/mteTrigger.c
++++ b/agent/mibgroup/disman/event/mteTrigger.c
+@@ -255,6 +255,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
+         DEBUGMSGTL(( "disman:event:trigger:monitor", "Trigger query (%s) failed: %d\n",
+                            (( entry->flags & MTE_TRIGGER_FLAG_VWILD ) ? "walk" : "get"), n));
+         _mteTrigger_failure( "failed to run mteTrigger query" );
++        snmp_free_varbind(var);
+         return;
+     }
+ 
+@@ -299,6 +300,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
+                 if (!vtmp) {
+                     _mteTrigger_failure(
+                           "failed to create mteTrigger temp varbind");
++                    snmp_free_varbind(var);
+                     return;
+                 }
+                 vtmp->type = ASN_NULL;
+@@ -336,6 +338,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
+                     if (!vtmp) {
+                         _mteTrigger_failure(
+                                  "failed to create mteTrigger temp varbind");
++                        snmp_free_varbind(var);
+                         return;
+                     }
+                     vtmp->type = ASN_NULL;
+@@ -377,6 +380,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
+                 if (!vtmp) {
+                     _mteTrigger_failure(
+                              "failed to create mteTrigger temp varbind");
++                    snmp_free_varbind(var);
+                     return;
+                 }
+                 vtmp->type = ASN_NULL;
+@@ -712,6 +716,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
+                         if (!vtmp) {
+                             _mteTrigger_failure(
+                                   "failed to create mteTrigger discontinuity varbind");
++                            snmp_free_varbind(dvar);
+                             return;
+                         }
+                         snmp_set_var_objid(vtmp, entry->mteDeltaDiscontID,
+diff --git a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
+index a34ad30..ed1ec30 100644
+--- a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
++++ b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
+@@ -97,6 +97,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -105,8 +108,10 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
+              *   rows where the mteTriggerTest 'boolean(1)' bit is set.
+              * So skip entries where this isn't the case.
+              */
+-            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN ))
++            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN )) {
++                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
+                 continue;
++            }
+ 
+             switch (tinfo->colnum) {
+             case COLUMN_MTETRIGGERBOOLEANCOMPARISON:
+@@ -152,6 +157,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -236,6 +244,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -256,6 +267,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
+index 47f112c..c2c2e8e 100644
+--- a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
++++ b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
+@@ -27,6 +27,7 @@ init_mteTriggerDeltaTable(void)
+     size_t      mteTDeltaTable_oid_len = OID_LENGTH(mteTDeltaTable_oid);
+     netsnmp_handler_registration    *reg;
+     netsnmp_table_registration_info *table_info;
++    int         rc;
+ 
+     /*
+      * Ensure the (combined) table container is available...
+@@ -61,7 +62,9 @@ init_mteTriggerDeltaTable(void)
+     table_info->max_column = COLUMN_MTETRIGGERDELTADISCONTINUITYIDTYPE;
+ 
+     /* Register this using the (common) trigger_table_data container */
+-    netsnmp_tdata_register(reg, trigger_table_data, table_info);
++    rc = netsnmp_tdata_register(reg, trigger_table_data, table_info);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+     netsnmp_handler_owns_table_info(reg->handler->next);
+     DEBUGMSGTL(("disman:event:init", "Trigger Delta Table\n"));
+ }
+@@ -89,6 +92,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -97,8 +103,10 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
+              *   rows where the mteTriggerSampleType is 'deltaValue(2)'
+              * So skip entries where this isn't the case.
+              */
+-            if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA ))
++            if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA )) {
++                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
+                 continue;
++            }
+ 
+             switch (tinfo->colnum) {
+             case COLUMN_MTETRIGGERDELTADISCONTINUITYID:
+@@ -125,6 +133,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -199,6 +210,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -219,6 +233,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
+index ce1299f..22b683e 100644
+--- a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
++++ b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
+@@ -27,6 +27,7 @@ init_mteTriggerExistenceTable(void)
+     static oid mteTExistTable_oid[]   = { 1, 3, 6, 1, 2, 1, 88, 1, 2, 4 };
+     size_t     mteTExistTable_oid_len = OID_LENGTH(mteTExistTable_oid);
+     netsnmp_handler_registration    *reg;
++    int        rc;
+ 
+     /*
+      * Ensure the (combined) table container is available...
+@@ -61,7 +62,10 @@ init_mteTriggerExistenceTable(void)
+     table_info->max_column = COLUMN_MTETRIGGEREXISTENCEEVENT;
+ 
+     /* Register this using the (common) trigger_table_data container */
+-    netsnmp_tdata_register(reg, trigger_table_data, table_info);
++    rc = netsnmp_tdata_register(reg, trigger_table_data, table_info);
++    if (rc != SNMPERR_SUCCESS)
++        return;
++
+     netsnmp_handler_owns_table_info(reg->handler->next);
+     DEBUGMSGTL(("disman:event:init", "Trigger Exist Table\n"));
+ }
+@@ -89,6 +93,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -97,8 +104,10 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
+              *   rows where the mteTriggerTest 'existence(0)' bit is set.
+              * So skip entries where this isn't the case.
+              */
+-            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE ))
++            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE )) {
++                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
+                 continue;
++            }
+ 
+             switch (tinfo->colnum) {
+             case COLUMN_MTETRIGGEREXISTENCETEST:
+@@ -139,6 +148,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -212,6 +224,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -233,6 +248,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteTriggerTable.c b/agent/mibgroup/disman/event/mteTriggerTable.c
+index d738ab5..88c2f8b 100644
+--- a/agent/mibgroup/disman/event/mteTriggerTable.c
++++ b/agent/mibgroup/disman/event/mteTriggerTable.c
+@@ -109,6 +109,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -186,6 +189,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -292,6 +298,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_RESERVE2:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -324,6 +333,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_FREE:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -349,6 +361,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+@@ -373,6 +388,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
+index 37d35e0..5aed0c8 100644
+--- a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
++++ b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
+@@ -97,6 +97,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -105,8 +108,10 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
+              *   rows where the mteTriggerTest 'threshold(2)' bit is set.
+              * So skip entries where this isn't the case.
+              */
+-            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD ))
++            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD )) {
++                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
+                 continue;
++            }
+ 
+             switch (tinfo->colnum) {
+             case COLUMN_MTETRIGGERTHRESHOLDSTARTUP:
+@@ -189,6 +194,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+@@ -276,6 +284,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             if (!entry) {
+                 /*
+@@ -296,6 +307,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/expr/expErrorTable.c b/agent/mibgroup/disman/expr/expErrorTable.c
+index 6640a41..a759e2d 100644
+--- a/agent/mibgroup/disman/expr/expErrorTable.c
++++ b/agent/mibgroup/disman/expr/expErrorTable.c
+@@ -77,6 +77,9 @@ expErrorTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expExpression *)
+                     netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+diff --git a/agent/mibgroup/disman/expr/expExpressionTable.c b/agent/mibgroup/disman/expr/expExpressionTable.c
+index ced9e0c..79aa715 100644
+--- a/agent/mibgroup/disman/expr/expExpressionTable.c
++++ b/agent/mibgroup/disman/expr/expExpressionTable.c
+@@ -88,6 +88,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expExpression *)
+                     netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+@@ -150,6 +153,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expExpression *)
+                 netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+@@ -204,6 +210,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_RESERVE2:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -236,6 +245,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_FREE:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -261,6 +273,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+             entry = (struct expExpression *)
+                     netsnmp_tdata_extract_entry(request);
+@@ -286,6 +301,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
+          *  (reasonably) safe to apply them in the Commit phase
+          */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expExpression *)
+                 netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+diff --git a/agent/mibgroup/disman/expr/expObject.c b/agent/mibgroup/disman/expr/expObject.c
+index 28fbac6..c27437b 100644
+--- a/agent/mibgroup/disman/expr/expObject.c
++++ b/agent/mibgroup/disman/expr/expObject.c
+@@ -240,7 +240,6 @@ void
+ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
+ {
+     netsnmp_variable_list *var;
+-    int res;
+ 
+     /*
+      * Retrieve and store the basic object value(s)
+@@ -279,7 +278,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
+                                        expr->expPrefix_len,
+                                        expr->pvars );
+         }
+-        res = netsnmp_query_get( var, expr->session );
++        netsnmp_query_get( var, expr->session );
+     }
+     
+     if ( obj->expObjectSampleType != EXPSAMPLETYPE_ABSOLUTE ) {
+@@ -312,7 +311,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
+         else
+             var = _expObject_buildList( obj->expObjDeltaD,
+                                         obj->expObjDeltaD_len, 0, NULL );
+-        res = netsnmp_query_get( var, expr->session );
++        netsnmp_query_get( var, expr->session );
+         if ( obj->old_dvars )
+             snmp_free_varbind( obj->old_dvars );
+         obj->old_dvars = obj->dvars;
+@@ -338,7 +337,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
+          *
+          *    (The MIB description seems bogus?)
+          */
+-        res = netsnmp_query_get( var, expr->session );
++        netsnmp_query_get( var, expr->session );
+         if ( obj->cvars )
+             snmp_free_varbind( obj->cvars );
+         obj->cvars = var;
+diff --git a/agent/mibgroup/disman/expr/expObjectTable.c b/agent/mibgroup/disman/expr/expObjectTable.c
+index 4182b3e..adda438 100644
+--- a/agent/mibgroup/disman/expr/expObjectTable.c
++++ b/agent/mibgroup/disman/expr/expObjectTable.c
+@@ -90,6 +90,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expObject *)netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+             if (!entry || !(entry->flags & EXP_OBJ_FLAG_VALID))
+@@ -159,6 +162,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expObject *)
+                 netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+@@ -211,6 +217,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_RESERVE2:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -245,6 +254,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_FREE:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -270,6 +282,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_ACTION:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+             entry = (struct expObject *)
+                     netsnmp_tdata_extract_entry(request);
+@@ -296,6 +311,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
+          */
+         ret = 0;  /* Flag to re-check expExpressionPrefix settings */
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct expObject *) netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info(request);
+ 
+diff --git a/agent/mibgroup/disman/expr/expValueTable.c b/agent/mibgroup/disman/expr/expValueTable.c
+index eac5faa..d74dbd1 100644
+--- a/agent/mibgroup/disman/expr/expValueTable.c
++++ b/agent/mibgroup/disman/expr/expValueTable.c
+@@ -124,7 +124,7 @@ NEXT_EXP:
+         }
+         if ( vp->val.objid[0] != 0 ) {
+             DEBUGMSGTL(( "disman:expr:val",
+-                         "non-zero instance (%d)\n", vp->val.objid[0]));
++                         "non-zero instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0]));
+             return NULL;  /* Invalid instance */
+         }
+ 
+@@ -158,7 +158,7 @@ NEXT_EXP:
+          */
+         if ( vp->val_len > 0 && vp->val.objid[0] != 0 ) {
+             DEBUGMSGTL(( "disman:expr:val",
+-                         "non-zero next instance (%d)\n", vp->val.objid[0]));
++                         "non-zero next instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0]));
+             return NULL;        /* All valid instances start with .0 */
+         }
+         plen = exp->expPrefix_len;
+@@ -231,6 +231,8 @@ NEXT_EXP:
+                 len = vp2->name_length - exp->expPrefix_len;
+                 snmp_set_var_typed_value( vp, ASN_PRIV_IMPLIED_OBJECT_ID,
+                       (u_char*)(vp2->name+exp->expPrefix_len), len);
++            } else {
++                len = 1;
+             }
+             res = expValue_evaluateExpression( exp, vp->val.objid+1, len-1);
+             DEBUGMSGTL(( "disman:expr:val", "w/card next returned (%p)\n", res));
+diff --git a/agent/mibgroup/disman/expression/expValueTable.c b/agent/mibgroup/disman/expression/expValueTable.c
+index feace8c..6b315c6 100644
+--- a/agent/mibgroup/disman/expression/expValueTable.c
++++ b/agent/mibgroup/disman/expression/expValueTable.c
+@@ -133,7 +133,7 @@ init_expValueTable(void)
+      * Initialize a "session" that defines who we're going to talk to
+      */
+     snmp_sess_init(&session);   /* set up defaults */
+-    session.peername = "localhost";
++    session.peername = strdup("localhost");
+ 
+     DEBUGMSGTL(("expValueTable", "done.\n"));
+ }
+@@ -272,8 +272,7 @@ Evaluate_Expression(struct expValueTable_data *vtable_data)
+                     break;
+                 }
+             }
+-            strncpy(temp, expression + 1, j - 1);
+-            *(temp + j - 1) = '\0';
++            sprintf(temp, "%.*s", j - 1, expression + 1);
+             l = atoi(temp);
+             expression = expression + j;
+             /*
+@@ -434,24 +433,12 @@ expValueTable_clean(void *data)
+ void
+ build_valuetable(void)
+ {
+-    struct expExpressionTable_data *expstorage, *expfound;
++    struct expExpressionTable_data *expstorage;
+     struct expObjectTable_data *objstorage, *objfound = NULL;
+     struct header_complex_index *hcindex, *object_hcindex;
+     char           *expression;
+-    size_t          expression_len;
+     oid            *index;
+-
+-
+-    char           *result, *resultbak;
+-    char           *temp, *tempbak;
+     int             i = 0, j, l;
+-    temp = malloc(100);
+-    result = malloc(100);
+-    tempbak = temp;
+-    memset(result, 0, 100);
+-    *result = '\0';
+-    resultbak = result;
+-
+ 
+     DEBUGMSGTL(("expValueTable", "building valuetable...  \n"));
+ 
+@@ -460,7 +447,6 @@ build_valuetable(void)
+         expstorage = (struct expExpressionTable_data *) hcindex->data;
+         if (expstorage->expExpressionEntryStatus == RS_ACTIVE) {
+             expression = expstorage->expExpression;
+-            expression_len = expstorage->expExpressionLen;
+             while (*expression != '\0') {
+                 if (*expression == '$') {
+                     i++;
+@@ -475,9 +461,12 @@ build_valuetable(void)
+                             break;
+                         }
+                     }
+-                    strncpy(temp, expression + 1, j - 1);
+-                    *(temp + j - 1) = '\0';
+-                    l = atoi(temp);
++                    {
++                        char temp[100];
++
++                        sprintf(temp, "%.*s", j - 1, expression + 1);
++                        l = atoi(temp);
++                    }
+                     for (object_hcindex = expObjectTableStorage;
+                          object_hcindex != NULL;
+                          object_hcindex = object_hcindex->next) {
+@@ -495,7 +484,6 @@ build_valuetable(void)
+                                 expstorage->expExpressionNameLen)
+                             && (l == objstorage->expObjectIndex)) {
+                             if (objfound == NULL) {
+-                                expfound = expstorage;
+                                 objfound = objstorage;
+                             }
+                             if (objstorage->expObjectIDWildcard ==
+diff --git a/agent/mibgroup/disman/ping/pingCtlTable.c b/agent/mibgroup/disman/ping/pingCtlTable.c
+index a4fd3a8..a5036e2 100644
+--- a/agent/mibgroup/disman/ping/pingCtlTable.c
++++ b/agent/mibgroup/disman/ping/pingCtlTable.c
+@@ -340,12 +340,11 @@ pingProbeHistoryTable_addall(struct pingCtlTable_data *thedata)
+ void
+ pingCtlTable_cleaner(struct header_complex_index *thestuff)
+ {
+-    struct header_complex_index *hciptr = NULL;
+-    struct pingCtlTable_data *StorageDel = NULL;
++    struct header_complex_index *hciptr;
++
+     DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout  "));
+     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
+-        StorageDel =
+-            header_complex_extract_entry(&pingCtlTableStorage, hciptr);
++        header_complex_extract_entry(&pingCtlTableStorage, hciptr);
+         DEBUGMSGTL(("pingProbeHistoryTable", "cleaner  "));
+     }
+ }
+@@ -864,7 +863,6 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata)
+ {
+     struct header_complex_index *hciptr2 = NULL;
+     struct header_complex_index *hcilast = NULL;
+-    struct pingProbeHistoryTable_data *StorageDel = NULL;
+     struct pingProbeHistoryTable_data *StorageTmp = NULL;
+     netsnmp_variable_list *vars = NULL;
+     oid             newoid[MAX_OID_LEN];
+@@ -895,9 +893,7 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata)
+ 
+         }
+     }
+-    StorageDel =
+-        header_complex_extract_entry(&pingProbeHistoryTableStorage,
+-                                     hcilast);
++    header_complex_extract_entry(&pingProbeHistoryTableStorage, hcilast);
+     DEBUGMSGTL(("pingProbeHistoryTable",
+                 "delete the last one success!\n"));
+ }
+@@ -1231,7 +1227,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
+          unsigned long *minrtt, unsigned long *maxrtt,
+          unsigned long *averagertt, pid_t pid)
+ {
+-    int             size;
+     char            recvbuf[BUFSIZE];
+     char            sendbuf[BUFSIZE];
+     int             nsent = 1;
+@@ -1257,8 +1252,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
+     }
+     setuid(getuid());           /* don't need special permissions any more */
+ 
+-    size = 60 * 1024;           /* OK if setsockopt fails */
+-
+     tv.tv_sec = 5;
+     tv.tv_usec = 0;
+     setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+@@ -1266,11 +1259,13 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
+     for (current_probe_temp = 1;
+          current_probe_temp <= item->pingCtlProbeCount;
+          current_probe_temp++) {
++        time_t          timep;
+         (*pr->fsend) (datalen, pid, nsent, sockfd, sendbuf);
+         nsent++;
+         len = pr->salen;
+         if (readable_timeo(sockfd, item->pingCtlTimeOut) == 0) {
+             /* printf("socket timeout!\n"); */
++            n = -1;
+             fail_probe = fail_probe + 1;
+             flag = 1;
+         } else {
+@@ -1282,18 +1277,17 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
+ 
+         gettimeofday(&tval, NULL);
+ 
+-        time_t          timep;
+         time(&timep);
+ 
+         (*pr->fproc) (recvbuf, n, &tval, timep, item, ai, datalen, minrtt,
+                       maxrtt, sumrtt, averagertt, current_probe_temp,
+                       success_probe, fail_probe, flag, &current_var, pid);
+-        printf("receiver success!\n");
+         if (current_probe_temp >= item->pingCtlProbeCount) {
+             SNMP_FREE(sumrtt);
+             return;
+         }
+     }
++    close(sockfd);
+ }
+ 
+ unsigned long
+@@ -1599,7 +1593,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf)
+ {
+     int             len;
+     struct icmp    *icmp = NULL;
+-    struct timeval *temp = NULL;
+ 
+     icmp = (struct icmp *) sendbuf;
+     icmp->icmp_type = ICMP_ECHO;
+@@ -1607,7 +1600,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf)
+     icmp->icmp_id = pid;
+     icmp->icmp_seq = nsent;
+     gettimeofday((struct timeval *) icmp->icmp_data, NULL);
+-    temp = (struct timeval *) icmp->icmp_data;
+ 
+     len = 8 + datalen;          /* checksum ICMP header and data */
+     icmp->icmp_cksum = 0;
+@@ -1773,7 +1765,7 @@ run_ping(unsigned int clientreg, void *clientarg)
+             if (device) {
+                 struct ifreq    ifr;
+                 memset(&ifr, 0, sizeof(ifr));
+-                strncpy(ifr.ifr_name, device, IFNAMSIZ - 1);
++                strlcpy(ifr.ifr_name, device, IFNAMSIZ);
+                 if (setsockopt
+                     (probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device,
+                      strlen(device) + 1) == -1) {
+@@ -1936,6 +1928,7 @@ run_ping(unsigned int clientreg, void *clientarg)
+                   (char *) outpack, &ident, &start_time, &screen_width,
+                   &deadline);
+ 
++        close(icmp_sock);
+     }
+     return;
+ }
+@@ -2705,8 +2698,7 @@ write_pingCtlAdminStatus(int action,
+                     snmp_alarm_register(StorageTmp->pingCtlFrequency,
+                                         SA_REPEAT, run_ping, StorageTmp);
+             else
+-                StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL,
+-                                                           run_ping,
++                StorageTmp->timer_id = snmp_alarm_register(1, 0, run_ping,
+                                                            StorageTmp);
+ 
+         } else if (StorageTmp->pingCtlAdminStatus == 2
+@@ -4367,8 +4359,7 @@ write_pingCtlRowStatus(int action,
+                                             StorageTmp);
+                 else
+                     StorageTmp->timer_id =
+-                        snmp_alarm_register(1, (int) NULL, run_ping,
+-                                            StorageTmp);
++                        snmp_alarm_register(1, 0, run_ping, StorageTmp);
+ 
+             }
+ 
+@@ -4451,7 +4442,9 @@ int
+ __schedule_exit(int next, long *nreceived, long *tmax)
+ {
+     unsigned long   waittime;
++#if 0
+     struct itimerval it;
++#endif
+ 
+     if (*nreceived) {
+         waittime = 2 * (*tmax);
+@@ -4463,11 +4456,13 @@ __schedule_exit(int next, long *nreceived, long *tmax)
+     if (next < 0 || next < waittime / 1000)
+         next = waittime / 1000;
+ 
++#if 0
+     it.it_interval.tv_sec = 0;
+     it.it_interval.tv_usec = 0;
+     it.it_value.tv_sec = waittime / 1000000;
+     it.it_value.tv_usec = waittime % 1000000;
+-    /* setitimer(ITIMER_REAL, &it, NULL); */
++    setitimer(ITIMER_REAL, &it, NULL);
++#endif
+     return next;
+ }
+ 
+@@ -4741,6 +4736,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload,
+ 
+     gettimeofday(start_time, NULL);
+ 
++#if 0
+     if (*deadline) {
+         struct itimerval it;
+ 
+@@ -4749,6 +4745,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload,
+         it.it_value.tv_sec = (*deadline);
+         it.it_value.tv_usec = 0;
+     }
++#endif
+ 
+     if (isatty(STDOUT_FILENO)) {
+         struct winsize  w;
+diff --git a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
+index de398a8..78c75be 100644
+--- a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
++++ b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
+@@ -74,12 +74,10 @@ void
+ pingProbeHistoryTable_cleaner(struct header_complex_index *thestuff)
+ {
+     struct header_complex_index *hciptr = NULL;
+-    struct pingProbeHistoryTable_data *StorageDel = NULL;
++
+     DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout  "));
+     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
+-        StorageDel =
+-            header_complex_extract_entry(&pingProbeHistoryTableStorage,
+-                                         hciptr);
++        header_complex_extract_entry(&pingProbeHistoryTableStorage, hciptr);
+         DEBUGMSGTL(("pingProbeHistoryTable", "cleaner  "));
+     }
+ 
+diff --git a/agent/mibgroup/disman/ping/pingResultsTable.c b/agent/mibgroup/disman/ping/pingResultsTable.c
+index bc4a9f4..1445d86 100644
+--- a/agent/mibgroup/disman/ping/pingResultsTable.c
++++ b/agent/mibgroup/disman/ping/pingResultsTable.c
+@@ -86,12 +86,11 @@ pingResultsTable_inadd(struct pingResultsTable_data *thedata);
+ void
+ pingResultsTable_cleaner(struct header_complex_index *thestuff)
+ {
+-    struct header_complex_index *hciptr = NULL;
+-    struct pingResultsTable_data *StorageDel = NULL;
++    struct header_complex_index *hciptr;
++
+     DEBUGMSGTL(("pingResultsTable", "cleanerout  "));
+     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
+-        StorageDel =
+-            header_complex_extract_entry(&pingResultsTableStorage, hciptr);
++        header_complex_extract_entry(&pingResultsTableStorage, hciptr);
+         DEBUGMSGTL(("pingResultsTable", "cleaner  "));
+     }
+ 
+diff --git a/agent/mibgroup/disman/schedule/schedCore.h b/agent/mibgroup/disman/schedule/schedCore.h
+index 4436711..35866d7 100644
+--- a/agent/mibgroup/disman/schedule/schedCore.h
++++ b/agent/mibgroup/disman/schedule/schedCore.h
+@@ -44,7 +44,7 @@ struct schedTable_entry {
+     char            schedDay[4+4];
+     char            schedHour[3];
+     char            schedMinute[8];
+-    char            schedContextName[SCHED_STR1_LEN];
++    char            schedContextName[SCHED_STR1_LEN+1];
+     oid             schedVariable[   MAX_OID_LEN   ];
+     size_t          schedVariable_len;
+     long            schedValue;
+diff --git a/agent/mibgroup/disman/schedule/schedTable.c b/agent/mibgroup/disman/schedule/schedTable.c
+index 943e545..bba48fd 100644
+--- a/agent/mibgroup/disman/schedule/schedTable.c
++++ b/agent/mibgroup/disman/schedule/schedTable.c
+@@ -98,6 +98,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_GET:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct schedTable_entry *)
+                     netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info( request);
+@@ -210,6 +213,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
+          */
+     case MODE_SET_RESERVE1:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct schedTable_entry *)
+                     netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info( request);
+@@ -340,6 +346,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_RESERVE2:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -370,6 +379,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
+ 
+     case MODE_SET_FREE:
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             tinfo = netsnmp_extract_table_info(request);
+ 
+             switch (tinfo->colnum) {
+@@ -417,7 +429,11 @@ schedTable_handler(netsnmp_mib_handler *handler,
+          * All these assignments are "unfailable", so it's
+          *  (reasonably) safe to apply them in the Commit phase
+          */
++        entry = NULL;
+         for (request = requests; request; request = request->next) {
++            if (request->processed)
++                continue;
++
+             entry = (struct schedTable_entry *)
+                     netsnmp_tdata_extract_entry(request);
+             tinfo = netsnmp_extract_table_info( request);
+@@ -460,7 +476,7 @@ schedTable_handler(netsnmp_mib_handler *handler,
+                 recalculate = 1;
+                 break;
+             case COLUMN_SCHEDCONTEXTNAME:
+-                memset(entry->schedContextName, 0, SCHED_STR1_LEN+1);
++                memset(entry->schedContextName, 0, sizeof(entry->schedContextName));
+                 memcpy(entry->schedContextName,
+                                            request->requestvb->val.string,
+                                            request->requestvb->val_len);
+@@ -514,8 +530,10 @@ schedTable_handler(netsnmp_mib_handler *handler,
+                 break;
+             }
+         }
+-        if (recalculate)
++        if (recalculate) {
++            netsnmp_assert(entry);
+             sched_nextTime(entry);
++        }
+         break;
+     }
+     return SNMP_ERR_NOERROR;
+diff --git a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
+index 23ac029..04143eb 100644
+--- a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
++++ b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
+@@ -713,7 +713,6 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data
+ {
+     struct header_complex_index *hciptr2 = NULL;
+     struct header_complex_index *hcilast = NULL;
+-    struct traceRouteProbeHistoryTable_data *StorageDel = NULL;
+     struct traceRouteProbeHistoryTable_data *StorageTmp = NULL;
+     netsnmp_variable_list *vars = NULL;
+     oid             newoid[MAX_OID_LEN];
+@@ -745,9 +744,7 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data
+ 
+         }
+     }
+-    StorageDel =
+-        header_complex_extract_entry(&traceRouteProbeHistoryTableStorage,
+-                                     hcilast);
++    header_complex_extract_entry(&traceRouteProbeHistoryTableStorage, hcilast);
+     DEBUGMSGTL(("traceRouteProbeHistoryTable",
+                 "delete the last one success!\n"));
+     vars = NULL;
+@@ -1353,7 +1350,6 @@ int
+ traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata)
+ {
+     struct header_complex_index *hciptr2 = NULL;
+-    struct traceRouteResultsTable_data *StorageDel = NULL;
+     netsnmp_variable_list *vars = NULL;
+     oid             newoid[MAX_OID_LEN];
+     size_t          newoid_len = 0;
+@@ -1368,9 +1364,8 @@ traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata)
+          hciptr2 = hciptr2->next) {
+         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
+             == 0) {
+-            StorageDel =
+-                header_complex_extract_entry
+-                (&traceRouteResultsTableStorage, hciptr2);
++            header_complex_extract_entry(&traceRouteResultsTableStorage,
++                                         hciptr2);
+             DEBUGMSGTL(("traceRouteResultsTable", "delete  success!\n"));
+ 
+         }
+@@ -1386,7 +1381,6 @@ int
+ traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata)
+ {
+     struct header_complex_index *hciptr2 = NULL;
+-    struct traceRouteProbeHistoryTable_data *StorageDel = NULL;
+     netsnmp_variable_list *vars = NULL;
+     oid             newoid[MAX_OID_LEN];
+     size_t          newoid_len = 0;
+@@ -1402,9 +1396,8 @@ traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata)
+          hciptr2 = hciptr2->next) {
+         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
+             == 0) {
+-            StorageDel =
+-                header_complex_extract_entry
+-                (&traceRouteProbeHistoryTableStorage, hciptr2);
++            header_complex_extract_entry(&traceRouteProbeHistoryTableStorage,
++                                         hciptr2);
+             DEBUGMSGTL(("traceRouteProbeHistoryTable",
+                         "delete  success!\n"));
+ 
+@@ -1419,7 +1412,6 @@ int
+ traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata)
+ {
+     struct header_complex_index *hciptr2 = NULL;
+-    struct traceRouteHopsTable_data *StorageDel = NULL;
+     netsnmp_variable_list *vars = NULL;
+     oid             newoid[MAX_OID_LEN];
+     size_t          newoid_len = 0;
+@@ -1435,9 +1427,7 @@ traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata)
+          hciptr2 = hciptr2->next) {
+         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
+             == 0) {
+-            StorageDel =
+-                header_complex_extract_entry(&traceRouteHopsTableStorage,
+-                                             hciptr2);
++            header_complex_extract_entry(&traceRouteHopsTableStorage, hciptr2);
+             DEBUGMSGTL(("traceRouteHopsTable", "delete  success!\n"));
+ 
+         }
+@@ -3210,8 +3200,7 @@ write_traceRouteCtlAdminStatus(int action,
+                                         SA_REPEAT, run_traceRoute,
+                                         StorageTmp);
+             else
+-                StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL,
+-                                                           run_traceRoute,
++                StorageTmp->timer_id = snmp_alarm_register(1, 0, run_traceRoute,
+                                                            StorageTmp);
+ 
+         } else if (StorageTmp->traceRouteCtlAdminStatus == 2
+@@ -4041,8 +4030,7 @@ write_traceRouteCtlRowStatus(int action,
+                                             StorageTmp);
+                 else
+                     StorageTmp->timer_id =
+-                        snmp_alarm_register(1, (int) NULL, run_traceRoute,
+-                                            StorageTmp);
++                        snmp_alarm_register(1, 0, run_traceRoute, StorageTmp);
+ 
+             }
+ 
+@@ -4924,6 +4912,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg)
+ 
+         }
+ 
++        close(sndsock);
++
+         if (flag == 1) {
+             DEBUGMSGTL(("traceRouteProbeHistoryTable", "path changed!\n"));
+             send_traceRoute_trap(item, traceRoutePathChange,
+@@ -5556,6 +5546,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg)
+ 
+         }
+ 
++        close(sndsock);
++
+         if (flag == 1) {
+             printf("path changed!\n");
+             send_traceRoute_trap(item, traceRoutePathChange,
+@@ -6105,7 +6097,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
+ #ifdef HAVE_SOCKADDR_SA_LEN
+     register int    n;
+ #endif
+-    register struct ifreq *ifrp, *ifend, *ifnext, *mp;
++    register struct ifreq *ifrp, *ifend, *ifnext;
+     register struct sockaddr_in *sin;
+     register struct ifaddrlist *al;
+     struct ifconf   ifc;
+@@ -6137,7 +6129,6 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
+     ifend = (struct ifreq *) ((char *) ibuf + ifc.ifc_len);
+ 
+     al = ifaddrlist;
+-    mp = NULL;
+     nipaddr = 0;
+     for (; ifrp < ifend; ifrp = ifnext) {
+ #ifdef HAVE_SOCKADDR_SA_LEN
+@@ -6157,7 +6148,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
+          * SIOCGIFFLAGS stomps over it because the requests
+          * are returned in a union.)
+          */
+-        strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name));
++        strlcpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name));
+         if (ioctl(fd, SIOCGIFFLAGS, (char *) &ifr) < 0) {
+             if (errno == ENXIO)
+                 continue;
+@@ -6174,9 +6165,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
+         if ((ifr.ifr_flags & IFF_UP) == 0)
+             continue;
+ 
+-
+-        (void) strncpy(device, ifr.ifr_name, sizeof(ifr.ifr_name));
+-        device[sizeof(device) - 1] = '\0';
++        sprintf(device, "%.*s", (int) sizeof(ifr.ifr_name), ifr.ifr_name);
+ #ifdef sun
+         /*
+          * Ignore sun virtual interfaces 
+diff --git a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
+index efb1b54..00f4bc3 100644
+--- a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
++++ b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
+@@ -47,8 +47,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval)
+                 *retval = -2;
+                 return NULL;
+             }
+-            memset (list_head, 0, sizeof (struct ifname));
+-            strncpy (list_head->name, p->ifa_name, IF_NAMESIZE);
++            memset(list_head, 0, sizeof (struct ifname));
++            strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE);
+             continue;
+         }
+ 
+@@ -69,8 +69,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval)
+             return NULL;
+         }
+         nameptr2 = nameptr2->ifn_next;
+-        memset (nameptr2, 0, sizeof (struct ifname));
+-        strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE);
++        memset(nameptr2, 0, sizeof (struct ifname));
++        strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE);
+         continue;
+ 
+     }
+@@ -655,7 +655,7 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co
+                 "called\n"));
+ 
+     memset(&ifr, 0, sizeof(ifr));
+-    strcpy(ifr.ifr_name, name);
++    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ 
+     memset(&driver_info, 0, sizeof (driver_info));
+     driver_info.cmd = ETHTOOL_GDRVINFO;
+@@ -730,8 +730,8 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co
+     for (i = 0; i < nstats; i++) {
+         char s[ETH_GSTRING_LEN];
+ 
+-        strncpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
+-            ETH_GSTRING_LEN);
++        strlcpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
++                sizeof(s));
+     
+         if (DOT3STATSALIGNMENTERRORS(s)) {
+             data->dot3StatsAlignmentErrors = (u_long)eth_stats->data[i];
+@@ -911,8 +911,7 @@ _dot3Stats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
+         }
+     }
+ 
+-    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+-    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
++    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+     rc = ioctl(fd, which, ifrq);
+     if (rc < 0) {
+         DEBUGMSGTL(("access:dot3StatsTable:ioctl",
+diff --git a/agent/mibgroup/examples/example.c b/agent/mibgroup/examples/example.c
+index 8f27ead..50b7e7d 100644
+--- a/agent/mibgroup/examples/example.c
++++ b/agent/mibgroup/examples/example.c
+@@ -163,7 +163,7 @@ init_example(void)
+      *  Also set a default value for the string object.  Note that the
+      *   example integer variable was initialised above.
+      */
+-    strncpy(example_str, EXAMPLE_STR_DEFAULT, EXAMPLE_STR_LEN);
++    strlcpy(example_str, EXAMPLE_STR_DEFAULT, sizeof(example_str));
+ 
+     snmpd_register_config_handler("exampleint",
+                                   example_parse_config_exampleint,
+@@ -209,7 +209,7 @@ example_parse_config_examplestr(const char *token, char *cptr)
+     /*
+      * Make sure the string fits in the space allocated for it.
+      */
+-    if (strlen(cptr) < EXAMPLE_STR_LEN)
++    if (strlen(cptr) < sizeof(example_str))
+         strcpy(example_str, cptr);
+     else {
+         /*
+@@ -217,10 +217,8 @@ example_parse_config_examplestr(const char *token, char *cptr)
+          * An alternative approach would be to log an error,
+          *  and discard this value altogether.
+          */
+-        strncpy(example_str, cptr, EXAMPLE_STR_LEN - 4);
+-        example_str[EXAMPLE_STR_LEN - 4] = 0;
+-        strcat(example_str, "...");
+-        example_str[EXAMPLE_STR_LEN - 1] = 0;
++        sprintf(example_str, "%.*s...", (int) (sizeof(example_str) - 4), cptr);
++        netsnmp_assert(strlen(example_str) < sizeof(example_str));
+     }
+ }
+ 
+diff --git a/agent/mibgroup/examples/netSnmpHostsTable_access.c b/agent/mibgroup/examples/netSnmpHostsTable_access.c
+index f6f933a..3d2e5fb 100644
+--- a/agent/mibgroup/examples/netSnmpHostsTable_access.c
++++ b/agent/mibgroup/examples/netSnmpHostsTable_access.c
+@@ -177,10 +177,11 @@ void           *
+ netSnmpHostsTable_create_data_context(netsnmp_variable_list * index_data)
+ {
+     my_data_info *datactx = SNMP_MALLOC_TYPEDEF(my_data_info);
++
+     if (!datactx)
+         return NULL;
+-    strncpy(datactx->hostname, index_data->val.string,
+-            strlen(index_data->val.string));
++    strlcpy(datactx->hostname, (const char *) index_data->val.string,
++            sizeof(datactx->hostname));
+     return datactx;
+ }
+ 
+diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
+index df47ca4..25a7330 100644
+--- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
++++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
+@@ -34,9 +34,6 @@ int
+ check_netSnmpHostAddressType(int type, long *val, size_t val_len,
+                              long *old_val, size_t old_val_len)
+ {
+-
+-    int             ret;
+-
+     /** Check to see that we were called legally */
+     if (!val)
+         return SNMP_ERR_GENERR;
+@@ -59,8 +56,6 @@ check_netSnmpHostAddressType(int type, long *val, size_t val_len,
+     default:
+         return SNMP_ERR_INCONSISTENTVALUE;
+     }
+-    ret = SNMP_ERR_NOERROR;
+-
+ 
+     /** looks ok, call the local version of the same function. */
+     return check_netSnmpHostAddressType_local(type, val, val_len, old_val,
+@@ -79,9 +74,6 @@ int
+ check_netSnmpHostAddress(int type, char *val, size_t val_len,
+                          char *old_val, size_t old_val_len)
+ {
+-
+-    int             ret;
+-
+     /** Check to see that we were called legally */
+     if (!val)
+         return SNMP_ERR_GENERR;
+@@ -91,11 +83,8 @@ check_netSnmpHostAddress(int type, char *val, size_t val_len,
+         return SNMP_ERR_WRONGTYPE;
+ 
+     /** Check the ranges of the passed value for legality */
+-    if (!(val_len >= 0 && val_len <= 255)
+-        ) {
++    if (!(val_len >= 0 && val_len <= 255))
+         return SNMP_ERR_WRONGVALUE;
+-    }
+-
+ 
+     /** looks ok, call the local version of the same function. */
+     return check_netSnmpHostAddress_local(type, val, val_len, old_val,
+@@ -138,11 +127,10 @@ check_netSnmpHostStorage(int type, long *val, size_t val_len,
+     default:
+         return SNMP_ERR_INCONSISTENTVALUE;
+     }
+-    ret = SNMP_ERR_NOERROR;
+ 
+-    if (ret =
+-        check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE,
+-                                 *val))
++    ret = check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE,
++                                   *val);
++    if (ret)
+         return ret;
+ 
+     /** looks ok, call the local version of the same function. */
+@@ -187,11 +175,10 @@ check_netSnmpHostRowStatus(int type, long *val, size_t val_len,
+     default:
+         return SNMP_ERR_INCONSISTENTVALUE;
+     }
+-    ret = SNMP_ERR_NOERROR;
+ 
+-    if (ret =
+-        check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT,
+-                                   *val))
++    ret = check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT,
++                                     *val);
++    if (ret)
+         return ret;
+ 
+     /** looks ok, call the local version of the same function. */
+diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
+index 335a0ae..6cd44c9 100644
+--- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
++++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
+@@ -3,8 +3,8 @@
+  *        : : mib2c.check_values_local.conf,v 5.1 2003/05/30 23:53:15 hardaker Exp $
+  * 
+  */
+-#ifndef NETSNMPHOSTSTABLE_CHECKFNS_H
+-#define NETSNMPHOSTSTABLE_CHECKFNS_H
++#ifndef NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H
++#define NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H
+ 
+ /*
+  * these functions are designed to check incoming values for 
+@@ -18,19 +18,32 @@
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
++#if 0
++}
++#endif
+ 
+-int             check_(int type, long *val, size_t val_len, long *old_val,
+-                       size_t old_val_len);
+-int             check_(int type, char *val, size_t val_len, char *old_val,
+-                       size_t old_val_len);
+-int             check_(int type, long *val, size_t val_len, long *old_val,
+-                       size_t old_val_len);
+-int             check_(int type, long *val, size_t val_len, long *old_val,
+-                       size_t old_val_len);
+-
++int             check_netSnmpHostAddressType_local(int type, long *val,
++                                                   size_t val_len,
++                                                   long *old_val,
++                                                   size_t old_val_len);
++int             check_netSnmpHostAddress_local(int type, char *val,
++                                               size_t val_len,
++                                               char *old_val,
++                                               size_t old_val_len);
++int             check_netSnmpHostStorage_local(int type, long *val,
++                                               size_t val_len,
++                                               long *old_val,
++                                               size_t old_val_len);
++int             check_netSnmpHostRowStatus_local(int type, long *val,
++                                                 size_t val_len,
++                                                 long *old_val,
++                                                 size_t old_val_len);
+ 
++#if 0
++{
++#endif
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+-#endif                          /* NETSNMPHOSTSTABLE_CHECKFNS_H */
++#endif                          /* NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H */
+diff --git a/agent/mibgroup/examples/ucdDemoPublic.c b/agent/mibgroup/examples/ucdDemoPublic.c
+index e935216..8e9e66a 100644
+--- a/agent/mibgroup/examples/ucdDemoPublic.c
++++ b/agent/mibgroup/examples/ucdDemoPublic.c
+@@ -25,6 +25,7 @@
+ 
+ #include <net-snmp/net-snmp-includes.h>
+ #include <net-snmp/agent/net-snmp-agent-includes.h>
++#include <net-snmp/library/tools.h>
+ 
+ #include "util_funcs/header_generic.h"
+ #include "ucdDemoPublic.h"
+@@ -213,16 +214,9 @@ write_ucdDemoPublicString(int action,
+         return SNMP_ERR_WRONGLENGTH;
+     }
+     if (action == COMMIT) {
+-        if (var_val_len != 0) {
+-            strncpy((char*)publicString, (const char*)var_val, sizeof(publicString)-1);
+-            /* some sanity checks */
+-            if (strlen((const char*)var_val) > sizeof(publicString)-1 ||
+-                strlen((const char*)var_val) != var_val_len)
+-                publicString[sizeof(publicString)-1] = '\0';
+-            else
+-                publicString[var_val_len] = '\0';
+-        } else
+-            publicString[0] = '\0';
++        sprintf((char*) publicString, "%.*s",
++                (int) SNMP_MIN(sizeof(publicString) - 1, var_val_len),
++                (const char*) var_val);
+     }
+     return SNMP_ERR_NOERROR;
+ }
+diff --git a/agent/mibgroup/hardware/cpu/cpu.c b/agent/mibgroup/hardware/cpu/cpu.c
+index 3a0a5d4..2772001 100644
+--- a/agent/mibgroup/hardware/cpu/cpu.c
++++ b/agent/mibgroup/hardware/cpu/cpu.c
+@@ -142,6 +142,12 @@ netsnmp_cpu_info *netsnmp_cpu_get_byName( char *name, int create ) {
+     cpu = SNMP_MALLOC_TYPEDEF( netsnmp_cpu_info );
+     if (!cpu)
+         return NULL;
++    if (strlen(name) >= sizeof(cpu->name)) {
++        free(cpu);
++        snmp_log(LOG_ERR, "Name of CPU is too large: %s\n", name);
++        return NULL;
++    }
++
+     strcpy(cpu->name, name);
+     if ( _cpu_tail ) {
+         cpu->idx = _cpu_tail->idx+1;
+diff --git a/agent/mibgroup/hardware/cpu/cpu_kerndata.c b/agent/mibgroup/hardware/cpu/cpu_kerndata.c
+index 9a9c4a4..8a7f2b2 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_kerndata.c
++++ b/agent/mibgroup/hardware/cpu/cpu_kerndata.c
+@@ -64,32 +64,32 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+     for ( i=0; i < cpu_num; i++ ) {
+         cpu2 = netsnmp_cpu_get_byIdx( i, 0 );
+ 
+-        cpu2->user_ticks = (unsigned long)vminfo[i].v_time[V_CPU_USER];
+-        cpu2->idle_ticks = (unsigned long)vminfo[i].v_time[V_CPU_IDLE];
+-        cpu2->kern_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL];
+-        cpu2->wait_ticks = (unsigned long)vminfo[i].v_time[V_CPU_STREAM];
+-        cpu2->sys2_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+
++        cpu2->user_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_USER];
++        cpu2->idle_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_IDLE];
++        cpu2->kern_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL];
++        cpu2->wait_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_STREAM];
++        cpu2->sys2_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+
+                                           vminfo[i].v_time[V_CPU_STREAM];
+             /* nice_ticks, intrpt_ticks, sirq_ticks unused */
+ 
+             /* sum these for the overall stats */
+-        cpu->user_ticks += (unsigned long)vminfo[i].v_time[V_CPU_USER];
+-        cpu->idle_ticks += (unsigned long)vminfo[i].v_time[V_CPU_IDLE];
+-        cpu->kern_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL];
+-        cpu->wait_ticks += (unsigned long)vminfo[i].v_time[V_CPU_STREAM];
+-        cpu->sys2_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+
++        cpu->user_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_USER];
++        cpu->idle_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_IDLE];
++        cpu->kern_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL];
++        cpu->wait_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_STREAM];
++        cpu->sys2_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+
+                                           vminfo[i].v_time[V_CPU_STREAM];
+ 
+             /*
+              * Interrupt/Context Switch statistics
+              *   XXX - Do these really belong here ?
+              */
+-        cpu->swapIn       += (unsigned long)vminfo[i].v_swpin;
+-        cpu->swapOut      += (unsigned long)vminfo[i].v_swpout;
+-        cpu->pageIn       += (unsigned long)vminfo[i].v_phread;
+-        cpu->pageOut      += (unsigned long)vminfo[i].v_phwrite;
+-        cpu->nInterrupts  += (unsigned long)vminfo[i].v_intr;
+-        cpu->nCtxSwitches += (unsigned long)vminfo[i].v_swtch;
++        cpu->swapIn       += (unsigned long long)vminfo[i].v_swpin;
++        cpu->swapOut      += (unsigned long long)vminfo[i].v_swpout;
++        cpu->pageIn       += (unsigned long long)vminfo[i].v_phread;
++        cpu->pageOut      += (unsigned long long)vminfo[i].v_phwrite;
++        cpu->nInterrupts  += (unsigned long long)vminfo[i].v_intr;
++        cpu->nCtxSwitches += (unsigned long long)vminfo[i].v_swtch;
+     }
+     return 0;
+ }
+diff --git a/agent/mibgroup/hardware/cpu/cpu_kstat.c b/agent/mibgroup/hardware/cpu/cpu_kstat.c
+index 32ccb00..049864c 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_kstat.c
++++ b/agent/mibgroup/hardware/cpu/cpu_kstat.c
+@@ -48,16 +48,13 @@ void init_cpu_kstat( void ) {
+             memset(state, 0, sizeof(state));
+             for (i=0, ks_data = ksp->ks_data; i < ksp->ks_ndata; i++, ks_data++) {
+                 if ( strcmp( ks_data->name, "state" ) == 0 ) {
+-                    strncpy( state, ks_data->value.c, sizeof(state));
+-                    state[sizeof(state)-1] = '\0';
++                    strlcpy(state, ks_data->value.c, sizeof(state));
+                 } else if ( strcmp( ks_data->name, "state_begin" ) == 0 ) {
+                     state_begin = ks_data->value.i32;
+                 } else if ( strcmp( ks_data->name, "cpu_type" ) == 0 ) {
+-                    strncpy( ctype, ks_data->value.c, sizeof(ctype));
+-                    ctype[sizeof(ctype)-1] = '\0';
++                    strlcpy(ctype, ks_data->value.c, sizeof(ctype));
+                 } else if ( strcmp( ks_data->name, "fpu_type" ) == 0 ) {
+-                    strncpy( ftype, ks_data->value.c, sizeof(ftype));
+-                    ftype[sizeof(ftype)-1] = '\0';
++                    strlcpy(ftype, ks_data->value.c, sizeof(ftype));
+                 } else if ( strcmp( ks_data->name, "clock_MHz" ) == 0 ) {
+                     clock = ks_data->value.i32;
+                 }
+@@ -112,30 +109,30 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+                 break;   /* or continue ? */
+             }
+ 
+-            cpu2->user_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER];
+-            cpu2->idle_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE];
+-            cpu2->kern_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
+-            cpu2->wait_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT];
++            cpu2->user_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER];
++            cpu2->idle_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE];
++            cpu2->kern_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
++            cpu2->wait_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT];
+               /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */
+-            cpu2->sys2_ticks = (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks;
++            cpu2->sys2_ticks = (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks;
+                 /* nice_ticks, intrpt_ticks, sirq_ticks unused */
+ 
+                 /* sum these for the overall stats */
+-            cpu->user_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER];
+-            cpu->idle_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE];
+-            cpu->kern_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
+-            cpu->wait_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT];
++            cpu->user_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER];
++            cpu->idle_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE];
++            cpu->kern_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
++            cpu->wait_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT];
+               /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */
+-            cpu->sys2_ticks += (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks;
++            cpu->sys2_ticks += (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks;
+ 
+                 /*
+                  * Interrupt/Context Switch statistics
+                  *   XXX - Do these really belong here ?
+                  */
+-            cpu->swapIn       += (unsigned long)cs.cpu_vminfo.swapin;
+-            cpu->swapOut      += (unsigned long)cs.cpu_vminfo.swapout;
+-            cpu->nInterrupts  += (unsigned long)cs.cpu_sysinfo.intr;
+-            cpu->nCtxSwitches += (unsigned long)cs.cpu_sysinfo.pswitch;
++            cpu->swapIn       += (unsigned long long)cs.cpu_vminfo.swapin;
++            cpu->swapOut      += (unsigned long long)cs.cpu_vminfo.swapout;
++            cpu->nInterrupts  += (unsigned long long)cs.cpu_sysinfo.intr;
++            cpu->nCtxSwitches += (unsigned long long)cs.cpu_sysinfo.pswitch;
+         }
+     }
+     return 0;
+diff --git a/agent/mibgroup/hardware/cpu/cpu_linux.c b/agent/mibgroup/hardware/cpu/cpu_linux.c
+index 2edeccd..640407b 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_linux.c
++++ b/agent/mibgroup/hardware/cpu/cpu_linux.c
+@@ -121,6 +121,10 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+         DEBUGMSGTL(("cpu", "/proc/stat buffer increased to %d\n", bsize));
+         close(statfd);
+         statfd = open(STAT_FILE, O_RDONLY, 0);
++        if (statfd == -1) {
++            snmp_log_perror(STAT_FILE);
++            return -1;
++	}
+     }
+     close(statfd);
+ 
+@@ -159,27 +163,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+ 
+         /* kernel 2.6.33 and above */
+         if (num_cpuline_elem == 10) {
+-            cpu->guestnice_ticks = (unsigned long)cguest_nicell;
++            cpu->guestnice_ticks = (unsigned long long)cguest_nicell;
+         }
+         /* kernel 2.6.24 and above */
+         if (num_cpuline_elem >= 9) {
+-            cpu->guest_ticks = (unsigned long)cguestll;
++            cpu->guest_ticks = (unsigned long long)cguestll;
+         }
+         /* kernel 2.6.11 and above */
+         if (num_cpuline_elem >= 8) {
+-            cpu->steal_ticks = (unsigned long)cstealll;
++            cpu->steal_ticks = (unsigned long long)cstealll;
+         }
+         /* kernel 2.6 */
+         if (num_cpuline_elem >= 5) {
+-            cpu->wait_ticks   = (unsigned long)ciowll;
+-            cpu->intrpt_ticks = (unsigned long)cirqll;
+-            cpu->sirq_ticks   = (unsigned long)csoftll;
++            cpu->wait_ticks   = (unsigned long long)ciowll;
++            cpu->intrpt_ticks = (unsigned long long)cirqll;
++            cpu->sirq_ticks   = (unsigned long long)csoftll;
+         }
+         /* rest */
+-        cpu->user_ticks = (unsigned long)cusell;
+-        cpu->nice_ticks = (unsigned long)cicell;
+-        cpu->sys_ticks  = (unsigned long)csysll;
+-        cpu->idle_ticks = (unsigned long)cidell;
++        cpu->user_ticks = (unsigned long long)cusell;
++        cpu->nice_ticks = (unsigned long long)cicell;
++        cpu->sys_ticks  = (unsigned long long)csysll;
++        cpu->idle_ticks = (unsigned long long)cidell;
+     }
+     if ( b1 == buff ) {
+ 	if (first)
+@@ -232,6 +236,10 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	    vmbuff = (char*)realloc(vmbuff, vmbsize+1);
+ 	    close(vmstatfd);
+ 	    vmstatfd = open(VMSTAT_FILE, O_RDONLY, 0);
++	    if (vmstatfd == -1) {
++                snmp_log_perror("cannot open " VMSTAT_FILE);
++                return;
++	    }
+         }
+         close(vmstatfd);
+         if ( bytes_read < 0 ) {
+@@ -246,7 +254,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(vmbuff, "pgpgin ");
+ 	if (b) {
+ 	    sscanf(b, "pgpgin %llu", &pin);
+-            cpu->pageIn  = (unsigned long)pin*2;  /* ??? */
++            cpu->pageIn  = (unsigned long long)pin*2;  /* ??? */
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No pgpgin line in %s\n", VMSTAT_FILE);
+@@ -255,7 +263,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(vmbuff, "pgpgout ");
+ 	if (b) {
+ 	    sscanf(b, "pgpgout %llu", &pout);
+-            cpu->pageOut = (unsigned long)pout*2;  /* ??? */
++            cpu->pageOut = (unsigned long long)pout*2;  /* ??? */
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No pgpgout line in %s\n", VMSTAT_FILE);
+@@ -264,7 +272,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(vmbuff, "pswpin ");
+ 	if (b) {
+ 	    sscanf(b, "pswpin %llu", &swpin);
+-            cpu->swapIn  = (unsigned long)swpin;
++            cpu->swapIn  = (unsigned long long)swpin;
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No pswpin line in %s\n", VMSTAT_FILE);
+@@ -273,7 +281,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(vmbuff, "pswpout ");
+ 	if (b) {
+ 	    sscanf(b, "pswpout %llu", &swpout);
+-            cpu->swapOut = (unsigned long)swpout;
++            cpu->swapOut = (unsigned long long)swpout;
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No pswpout line in %s\n", VMSTAT_FILE);
+@@ -284,8 +292,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(buff, "page ");
+ 	if (b) {
+ 	    sscanf(b, "page %llu %llu", &pin, &pout);
+-            cpu->pageIn  = (unsigned long)pin;
+-            cpu->pageOut = (unsigned long)pout;
++            cpu->pageIn  = (unsigned long long)pin;
++            cpu->pageOut = (unsigned long long)pout;
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No page line in %s\n", STAT_FILE);
+@@ -294,8 +302,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+ 	b = strstr(buff, "swap ");
+ 	if (b) {
+ 	    sscanf(b, "swap %llu %llu", &swpin, &swpout);
+-            cpu->swapIn  = (unsigned long)swpin;
+-            cpu->swapOut = (unsigned long)swpout;
++            cpu->swapIn  = (unsigned long long)swpin;
++            cpu->swapOut = (unsigned long long)swpout;
+ 	} else {
+ 	    if (first)
+ 		snmp_log(LOG_ERR, "No swap line in %s\n", STAT_FILE);
+@@ -306,7 +314,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+     b = strstr(buff, "intr ");
+     if (b) {
+ 	sscanf(b, "intr %llu %llu", &itot, &iticks);
+-        cpu->nInterrupts = (unsigned long)itot;
++        cpu->nInterrupts = (unsigned long long)itot;
+         /* iticks not used? */
+     } else {
+ 	if (first)
+@@ -315,7 +323,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
+     b = strstr(buff, "ctxt ");
+     if (b) {
+ 	sscanf(b, "ctxt %llu", &ctx);
+-        cpu->nCtxSwitches = (unsigned long)ctx;
++        cpu->nCtxSwitches = (unsigned long long)ctx;
+     } else {
+ 	if (first)
+ 	    snmp_log(LOG_ERR, "No ctxt line in %s\n", STAT_FILE);
+diff --git a/agent/mibgroup/hardware/cpu/cpu_nlist.c b/agent/mibgroup/hardware/cpu/cpu_nlist.c
+index b9554d7..974028a 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_nlist.c
++++ b/agent/mibgroup/hardware/cpu/cpu_nlist.c
+@@ -76,12 +76,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+     auto_nlist( CPU_SYMBOL, (char *) cpu_stats, sizeof(cpu_stats));
+     auto_nlist( MEM_SYMBOL, (char *)&mem_stats, sizeof(mem_stats));
+ 
+-    cpu->user_ticks = (unsigned long)cpu_stats[CP_USER];
+-    cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE];
+-    cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
+-    cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE];
+-    cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS];
+-    cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR];
++    cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER];
++    cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE];
++    cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
++    cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE];
++    cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS];
++    cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR];
+         /* wait_ticks, sirq_ticks unused */
+ 
+         /*
+@@ -89,14 +89,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+          *   XXX - Do these really belong here ?
+          */
+ #if defined(openbsd2) || defined(darwin)
+-    cpu->swapIn  = (unsigned long)mem_stats.v_swpin;
+-    cpu->swapOut = (unsigned long)mem_stats.v_swpout;
++    cpu->swapIn  = (unsigned long long)mem_stats.v_swpin;
++    cpu->swapOut = (unsigned long long)mem_stats.v_swpout;
+ #else
+-    cpu->swapIn  = (unsigned long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
+-    cpu->swapOut = (unsigned long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
++    cpu->swapIn  = (unsigned long long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
++    cpu->swapOut = (unsigned long long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
+ #endif
+-    cpu->nInterrupts  = (unsigned long)mem_stats.v_intr;
+-    cpu->nCtxSwitches = (unsigned long)mem_stats.v_swtch;
++    cpu->nInterrupts  = (unsigned long long)mem_stats.v_intr;
++    cpu->nCtxSwitches = (unsigned long long)mem_stats.v_swtch;
+ 
+ #ifdef PER_CPU_INFO
+     for ( i = 0; i < n; i++ ) {
+diff --git a/agent/mibgroup/hardware/cpu/cpu_pcp.c b/agent/mibgroup/hardware/cpu/cpu_pcp.c
+index dcc2724..94c7b5c 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_pcp.c
++++ b/agent/mibgroup/hardware/cpu/cpu_pcp.c
+@@ -153,13 +153,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+        exit(1);
+     }
+ 
+-    cpu->wait_ticks   = (unsigned long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10;
+-    cpu->intrpt_ticks = (unsigned long)resp->vset[CPUINTR]->vlist[0].value.lval / 10;
++    cpu->wait_ticks   = (unsigned long long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10;
++    cpu->intrpt_ticks = (unsigned long long)resp->vset[CPUINTR]->vlist[0].value.lval / 10;
+     /*cpu->sirq_ticks   = (unsigned long)csoftll / 10;*/
+-    cpu->user_ticks = (unsigned long)resp->vset[CPUUSER]->vlist[0].value.lval / 10;
++    cpu->user_ticks = (unsigned long long)resp->vset[CPUUSER]->vlist[0].value.lval / 10;
+     /*cpu->nice_ticks = (unsigned long)cicell / 10;*/
+-    cpu->sys_ticks  = (unsigned long)resp->vset[CPUSYS]->vlist[0].value.lval / 10;
+-    cpu->idle_ticks = (unsigned long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10;
++    cpu->sys_ticks  = (unsigned long long)resp->vset[CPUSYS]->vlist[0].value.lval / 10;
++    cpu->idle_ticks = (unsigned long long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10;
+ 
+ 
+         /*
+@@ -168,12 +168,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+          */
+     /*cpu = netsnmp_cpu_get_byIdx( -1, 0 );*/
+     /*_cpu_load_swap_etc( buff, cpu );*/
+-    cpu->pageIn  = (unsigned long)resp->vset[PAGESIN]->vlist[0].value.lval;
+-    cpu->pageOut = (unsigned long)resp->vset[PAGESOUT]->vlist[0].value.lval;
+-    cpu->swapIn  = (unsigned long)resp->vset[SWAPIN]->vlist[0].value.lval;
+-    cpu->swapOut = (unsigned long)resp->vset[SWAPOUT]->vlist[0].value.lval;
+-    cpu->nInterrupts = (unsigned long)resp->vset[INTR]->vlist[0].value.lval;
+-    cpu->nCtxSwitches = (unsigned long)resp->vset[CTXT]->vlist[0].value.lval;
++    cpu->pageIn  = (unsigned long long)resp->vset[PAGESIN]->vlist[0].value.lval;
++    cpu->pageOut = (unsigned long long)resp->vset[PAGESOUT]->vlist[0].value.lval;
++    cpu->swapIn  = (unsigned long long)resp->vset[SWAPIN]->vlist[0].value.lval;
++    cpu->swapOut = (unsigned long long)resp->vset[SWAPOUT]->vlist[0].value.lval;
++    cpu->nInterrupts = (unsigned long long)resp->vset[INTR]->vlist[0].value.lval;
++    cpu->nCtxSwitches = (unsigned long long)resp->vset[CTXT]->vlist[0].value.lval;
+ 
+     /*
+      * XXX - TODO: extract per-CPU statistics
+diff --git a/agent/mibgroup/hardware/cpu/cpu_perfstat.c b/agent/mibgroup/hardware/cpu/cpu_perfstat.c
+index 981656d..5f58190 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_perfstat.c
++++ b/agent/mibgroup/hardware/cpu/cpu_perfstat.c
+@@ -58,27 +58,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+                      sizeof(perfstat_cpu_total_t), 1) > 0) {
+ 
+         /* Returns 'u_longlong_t' statistics */
+-        cpu->user_ticks = (unsigned long)cs.user / cs.ncpus;
+-        cpu->sys_ticks  = ((unsigned long)cs.sys + (unsigned long)cs.wait) / cs.ncpus;
+-        cpu->kern_ticks = (unsigned long)cs.sys / cs.ncpus;
+-        cpu->wait_ticks = (unsigned long)cs.wait / cs.ncpus;
+-        cpu->idle_ticks = (unsigned long)cs.idle / cs.ncpus;
++        cpu->user_ticks = (unsigned long long)cs.user / cs.ncpus;
++        cpu->sys_ticks  = ((unsigned long long)cs.sys + (unsigned long long)cs.wait) / cs.ncpus;
++        cpu->kern_ticks = (unsigned long long)cs.sys / cs.ncpus;
++        cpu->wait_ticks = (unsigned long long)cs.wait / cs.ncpus;
++        cpu->idle_ticks = (unsigned long long)cs.idle / cs.ncpus;
+         /* intrpt_ticks, sirq_ticks, nice_ticks unused */
+     
+         /*
+          * Interrupt/Context Switch statistics
+          *   XXX - Do these really belong here ?
+          */
+-        cpu->pageIn       = (unsigned long)cs.sysread;
+-        cpu->pageOut      = (unsigned long)cs.syswrite;
+-        cpu->nInterrupts  = (unsigned long)cs.devintrs + cs.softintrs;
+-        cpu->nCtxSwitches = (unsigned long)cs.pswitch;
++        cpu->pageIn       = (unsigned long long)cs.sysread;
++        cpu->pageOut      = (unsigned long long)cs.syswrite;
++        cpu->nInterrupts  = (unsigned long long)cs.devintrs + cs.softintrs;
++        cpu->nCtxSwitches = (unsigned long long)cs.pswitch;
+     }
+ 
+     if (perfstat_memory_total((perfstat_id_t *)NULL, &ms,
+                      sizeof(perfstat_memory_total_t), 1) > 0) {
+-        cpu->swapIn  = (unsigned long)ms.pgspins;
+-        cpu->swapOut = (unsigned long)ms.pgspouts;
++        cpu->swapIn  = (unsigned long long)ms.pgspins;
++        cpu->swapOut = (unsigned long long)ms.pgspouts;
+     }
+ 
+ 
+@@ -91,14 +91,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+     if (perfstat_cpu(&name, cs2, sizeof(perfstat_cpu_t), n) > 0) {
+         for ( i = 0; i < n; i++ ) {
+             cpu = netsnmp_cpu_get_byIdx( i, 0 );
+-            cpu->user_ticks = (unsigned long)cs2[i].user;
+-            cpu->sys_ticks  = (unsigned long)cs2[i].sys + (unsigned long)cs2[i].wait;
+-            cpu->kern_ticks = (unsigned long)cs2[i].sys;
+-            cpu->wait_ticks = (unsigned long)cs2[i].wait;
+-            cpu->idle_ticks = (unsigned long)cs2[i].idle;
+-            cpu->pageIn     = (unsigned long)cs2[i].sysread;
+-            cpu->pageOut    = (unsigned long)cs2[i].syswrite;
+-            cpu->nCtxSwitches = (unsigned long)cs2[i].pswitch;
++            cpu->user_ticks = (unsigned long long)cs2[i].user;
++            cpu->sys_ticks  = (unsigned long long)cs2[i].sys + (unsigned long long)cs2[i].wait;
++            cpu->kern_ticks = (unsigned long long)cs2[i].sys;
++            cpu->wait_ticks = (unsigned long long)cs2[i].wait;
++            cpu->idle_ticks = (unsigned long long)cs2[i].idle;
++            cpu->pageIn     = (unsigned long long)cs2[i].sysread;
++            cpu->pageOut    = (unsigned long long)cs2[i].syswrite;
++            cpu->nCtxSwitches = (unsigned long long)cs2[i].pswitch;
+             /* Interrupt stats only apply overall, not per-CPU */
+         }
+     } else {
+diff --git a/agent/mibgroup/hardware/cpu/cpu_pstat.c b/agent/mibgroup/hardware/cpu/cpu_pstat.c
+index c68739b..35c1d63 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_pstat.c
++++ b/agent/mibgroup/hardware/cpu/cpu_pstat.c
+@@ -72,13 +72,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+ 
+     pstat_getdynamic(&psd, sizeof(psd), 1, 0);
+     /* XXX - Compare cpu_num against psd.psd_proc_cnt */
+-    cpu->user_ticks = (unsigned long)psd.psd_cpu_time[CP_USER];
+-    cpu->nice_ticks = (unsigned long)psd.psd_cpu_time[CP_NICE];
+-    cpu->sys2_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS]+
++    cpu->user_ticks = (unsigned long long)psd.psd_cpu_time[CP_USER];
++    cpu->nice_ticks = (unsigned long long)psd.psd_cpu_time[CP_NICE];
++    cpu->sys2_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]+
+                                      psd.psd_cpu_time[CP_WAIT];
+-    cpu->idle_ticks = (unsigned long)psd.psd_cpu_time[CP_IDLE];
+-    cpu->wait_ticks = (unsigned long)psd.psd_cpu_time[CP_WAIT];
+-    cpu->kern_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS];
++    cpu->idle_ticks = (unsigned long long)psd.psd_cpu_time[CP_IDLE];
++    cpu->wait_ticks = (unsigned long long)psd.psd_cpu_time[CP_WAIT];
++    cpu->kern_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS];
+         /* XXX - record (sum of) "all other ticks" */
+         /* intrpt_ticks, sirq_ticks unused */
+ 
+@@ -87,21 +87,21 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+          *   XXX - Do these really belong here ?
+          */
+     pstat_getvminfo(&psv, sizeof(psv), 1, 0);
+-    cpu->swapIn  = (unsigned long)psv.psv_sswpin;
+-    cpu->swapOut = (unsigned long)psv.psv_sswpout;
+-    cpu->nInterrupts  = (unsigned long)psv.psv_sintr;
+-    cpu->nCtxSwitches = (unsigned long)psv.psv_sswtch;
++    cpu->swapIn  = (unsigned long long)psv.psv_sswpin;
++    cpu->swapOut = (unsigned long long)psv.psv_sswpout;
++    cpu->nInterrupts  = (unsigned long long)psv.psv_sintr;
++    cpu->nCtxSwitches = (unsigned long long)psv.psv_sswtch;
+ 
+ 
+     for ( i = 0; i < psd.psd_proc_cnt; i++ ) {
+         cpu = netsnmp_cpu_get_byIdx( i, 0 );
+-        cpu->user_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_USER];
+-        cpu->nice_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_NICE];
+-        cpu->sys2_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS]+
++        cpu->user_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_USER];
++        cpu->nice_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_NICE];
++        cpu->sys2_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS]+
+                                          psd.psd_mp_cpu_time[i][CP_WAIT];
+-        cpu->idle_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_IDLE];
+-        cpu->wait_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_WAIT];
+-        cpu->kern_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS];
++        cpu->idle_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_IDLE];
++        cpu->wait_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_WAIT];
++        cpu->kern_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS];
+         /* XXX - record (sum of) "all other ticks" */
+     }
+ 
+diff --git a/agent/mibgroup/hardware/cpu/cpu_sysctl.c b/agent/mibgroup/hardware/cpu/cpu_sysctl.c
+index e549671..5599a58 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_sysctl.c
++++ b/agent/mibgroup/hardware/cpu/cpu_sysctl.c
+@@ -40,23 +40,25 @@ void _cpu_copy_stats( netsnmp_cpu_info *cpu );
+      *   (including descriptions)
+      */
+ void init_cpu_sysctl( void ) {
+-    int               n;
+-    size_t            i;
++    int               i, n;
++    size_t            siz;
+     int               ncpu_mib[]  = { CTL_HW, HW_NCPU };
++#if !(defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) ) )
+     int               model_mib[] = { CTL_HW, HW_MODEL };
++#endif
+     char              descr[ SNMP_MAXBUF ];
+     netsnmp_cpu_info  *cpu = netsnmp_cpu_get_byIdx( -1, 1 );
+     strcpy(cpu->name, "Overall CPU statistics");
+ 
+-    i = sizeof(n);
+-    sysctl(ncpu_mib, 2, &n, &i, NULL, 0);
++    siz = sizeof(n);
++    sysctl(ncpu_mib, 2, &n, &siz, NULL, 0);
+     if ( n <= 0 )
+         n = 1;   /* Single CPU system */
+-    i = sizeof(descr);
++    siz = sizeof(descr);
+ #if defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) )
+-    sysctlbyname("machdep.cpu_brand", descr, (void *)&i, NULL, 0);
++    sysctlbyname("machdep.cpu_brand", descr, &siz, NULL, 0);
+ #else
+-    sysctl(model_mib, 2, descr, &i, NULL, 0);
++    sysctl(model_mib, 2, descr, &siz, NULL, 0);
+ #endif
+     for ( i = 0; i < n; i++ ) {
+         cpu = netsnmp_cpu_get_byIdx( i, 1 );
+@@ -176,12 +178,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+ #else
+     sysctl(cpu_mib, 2,  cpu_stats, &cpu_size, NULL, 0);
+ #endif
+-    cpu->user_ticks = (unsigned long)cpu_stats[CP_USER];
+-    cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE];
+-    cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
+-    cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS];
+-    cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE];
+-    cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR];
++    cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER];
++    cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE];
++    cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
++    cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS];
++    cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE];
++    cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR];
+         /* wait_ticks, sirq_ticks unused */
+     
+         /*
+@@ -189,15 +191,15 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
+          *   XXX - Do these really belong here ?
+          */
+     sysctl(mem_mib, 2, &mem_stats, &mem_size, NULL, 0);
+-    cpu->nInterrupts  = (unsigned long)mem_stats.NS_VM_INTR;
+-    cpu->nCtxSwitches = (unsigned long)mem_stats.NS_VM_SWTCH;
+-    cpu->swapIn       = (unsigned long)mem_stats.NS_VM_SWAPIN;
+-    cpu->swapOut      = (unsigned long)mem_stats.NS_VM_SWAPOUT;
++    cpu->nInterrupts  = (unsigned long long)mem_stats.NS_VM_INTR;
++    cpu->nCtxSwitches = (unsigned long long)mem_stats.NS_VM_SWTCH;
++    cpu->swapIn       = (unsigned long long)mem_stats.NS_VM_SWAPIN;
++    cpu->swapOut      = (unsigned long long)mem_stats.NS_VM_SWAPOUT;
+ #ifdef NS_VM_PAGEIN
+-    cpu->pageIn       = (unsigned long)mem_stats.NS_VM_PAGEIN;
++    cpu->pageIn       = (unsigned long long)mem_stats.NS_VM_PAGEIN;
+ #endif
+ #ifdef NS_VM_PAGEOUT
+-    cpu->pageOut      = (unsigned long)mem_stats.NS_VM_PAGEOUT;
++    cpu->pageOut      = (unsigned long long)mem_stats.NS_VM_PAGEOUT;
+ #endif
+ 
+ #ifdef NETSNMP_KERN_MCPU
+diff --git a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
+index d510308..ed1f357 100644
+--- a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
++++ b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
+@@ -91,20 +91,20 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic )
+     }
+ 
+     DEBUGMSGTL(("cpu_sysinfo", "total cpu kernel: %lu\n", sinfo_gen->cpu[CPU_KERNEL]));
+-    cpu->sys2_ticks  = (unsigned long) sinfo_gen->cpu[CPU_KERNEL] + (unsigned long) sinfo_gen->cpu[CPU_SXBRK] + (unsigned long) sinfo_gen->cpu[CPU_INTR];
+-    cpu->kern_ticks  = (unsigned long) sinfo_gen->cpu[CPU_KERNEL];
+-    cpu->intrpt_ticks = (unsigned long) sinfo_gen->cpu[CPU_INTR];
+-    cpu->user_ticks = (unsigned long) sinfo_gen->cpu[CPU_USER];
+-    cpu->wait_ticks   = (unsigned long) sinfo_gen->cpu[CPU_WAIT];
+-    cpu->idle_ticks = (unsigned long) sinfo_gen->cpu[CPU_IDLE];
++    cpu->sys2_ticks  = (unsigned long long) sinfo_gen->cpu[CPU_KERNEL] + (unsigned long long) sinfo_gen->cpu[CPU_SXBRK] + (unsigned long long) sinfo_gen->cpu[CPU_INTR];
++    cpu->kern_ticks  = (unsigned long long) sinfo_gen->cpu[CPU_KERNEL];
++    cpu->intrpt_ticks = (unsigned long long) sinfo_gen->cpu[CPU_INTR];
++    cpu->user_ticks = (unsigned long long) sinfo_gen->cpu[CPU_USER];
++    cpu->wait_ticks   = (unsigned long long) sinfo_gen->cpu[CPU_WAIT];
++    cpu->idle_ticks = (unsigned long long) sinfo_gen->cpu[CPU_IDLE];
+ 
+     /* XXX - Do these really belong here ? */
+-    cpu->pageIn  = (unsigned long)0;
+-    cpu->pageOut = (unsigned long)0;
+-    cpu->swapIn  = (unsigned long)sinfo_gen->swapin;
+-    cpu->swapOut = (unsigned long)sinfo_gen->swapout;
+-    cpu->nInterrupts = (unsigned long)sinfo_gen->intr_svcd;
+-    cpu->nCtxSwitches = (unsigned long)sinfo_gen->pswitch;
++    cpu->pageIn  = (unsigned long long)0;
++    cpu->pageOut = (unsigned long long)0;
++    cpu->swapIn  = (unsigned long long)sinfo_gen->swapin;
++    cpu->swapOut = (unsigned long long)sinfo_gen->swapout;
++    cpu->nInterrupts = (unsigned long long)sinfo_gen->intr_svcd;
++    cpu->nCtxSwitches = (unsigned long long)sinfo_gen->pswitch;
+ 
+     /* fetch individual cpu stats */
+ 
+@@ -120,11 +120,11 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic )
+         cpu = netsnmp_cpu_get_byIdx(i, 0);
+ 
+         DEBUGMSGTL(("cpu_sysinfo", "cpu %u kernel: %lu\n", i, sinfo_cpus[i].cpu[CPU_KERNEL]));
+-        cpu->sys2_ticks  = (unsigned long)sinfo_cpus[i].cpu[CPU_KERNEL] + (unsigned long) sinfo_cpus[i].cpu[CPU_SXBRK] + (unsigned long)sinfo_cpus[i].cpu[CPU_INTR];
+-        cpu->intrpt_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_INTR];
+-        cpu->user_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_USER];
+-        cpu->wait_ticks   = (unsigned long)sinfo_cpus[i].cpu[CPU_WAIT];
+-        cpu->idle_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_IDLE];
++        cpu->sys2_ticks  = (unsigned long long)sinfo_cpus[i].cpu[CPU_KERNEL] + (unsigned long long) sinfo_cpus[i].cpu[CPU_SXBRK] + (unsigned long long)sinfo_cpus[i].cpu[CPU_INTR];
++        cpu->intrpt_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_INTR];
++        cpu->user_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_USER];
++        cpu->wait_ticks   = (unsigned long long)sinfo_cpus[i].cpu[CPU_WAIT];
++        cpu->idle_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_IDLE];
+     }
+ 
+     return 0;
+diff --git a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
+index 55327b7..93f38ce 100644
+--- a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
++++ b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
+@@ -164,7 +164,7 @@ netsnmp_fsys_arch_load( void )
+         entry->type = _fs_type( stats[i].f_fstypename );
+         entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
+ 
+-        if (! stats[i].NSFS_FLAGS & MNT_LOCAL ) {
++        if (! (stats[i].NSFS_FLAGS & MNT_LOCAL )) {
+             entry->flags |= NETSNMP_FS_FLAG_REMOTE;
+         }
+         if (  stats[i].NSFS_FLAGS & MNT_RDONLY ) {
+@@ -175,4 +175,6 @@ netsnmp_fsys_arch_load( void )
+         }
+         netsnmp_fsys_calculate32(entry);
+     }
++
++    free(stats);
+ }
+diff --git a/agent/mibgroup/hardware/fsys/fsys_mntctl.c b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
+index e65d6d5..3ad68d4 100644
+--- a/agent/mibgroup/hardware/fsys/fsys_mntctl.c
++++ b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
+@@ -128,9 +128,9 @@ netsnmp_fsys_arch_load( void )
+             continue;
+         }
+ 
+-        strncpy( entry->path,   path,    sizeof( entry->path   ));
+-        strncpy( entry->device, vmt2dataptr( aixcurr, VMT_STUB),
+-                                         sizeof( entry->device ));
++        strlcpy(entry->path, path, sizeof(entry->path));
++        strlcpy(entry->device, vmt2dataptr(aixcurr, VMT_STUB),
++                sizeof(entry->device));
+         entry->type   = _fsys_type( aixcurr->vmt_gfstype );
+ 
+         if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
+diff --git a/agent/mibgroup/hardware/fsys/fsys_mntent.c b/agent/mibgroup/hardware/fsys/fsys_mntent.c
+index 1a156f4..c380365 100644
+--- a/agent/mibgroup/hardware/fsys/fsys_mntent.c
++++ b/agent/mibgroup/hardware/fsys/fsys_mntent.c
+@@ -135,6 +135,9 @@ _fsys_type( char *typename )
+               !strcmp(typename, MNTTYPE_GFS2) ||
+               !strcmp(typename, MNTTYPE_XFS) ||
+               !strcmp(typename, MNTTYPE_JFS) ||
++              !strcmp(typename, MNTTYPE_VXFS) ||
++              !strcmp(typename, MNTTYPE_REISERFS) ||
++              !strcmp(typename, MNTTYPE_OCFS2) ||
+               !strcmp(typename, MNTTYPE_LOFS))
+        return NETSNMP_FS_TYPE_OTHER;
+ 
+@@ -190,11 +193,9 @@ netsnmp_fsys_arch_load( void )
+             continue;
+         }
+ 
+-        strncpy( entry->path,   m->NSFS_PATH,    sizeof( entry->path   ));
+-        entry->path[sizeof(entry->path)-1] = '\0';
+-        strncpy( entry->device, m->NSFS_DEV,     sizeof( entry->device ));
+-        entry->device[sizeof(entry->device)-1] = '\0';
+-        entry->type   = _fsys_type(  m->NSFS_TYPE );
++        strlcpy(entry->path, m->NSFS_PATH, sizeof(entry->path));
++        strlcpy(entry->device, m->NSFS_DEV, sizeof(entry->device));
++        entry->type = _fsys_type(m->NSFS_TYPE);
+         if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
+             entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
+ 
+diff --git a/agent/mibgroup/hardware/fsys/hw_fsys.c b/agent/mibgroup/hardware/fsys/hw_fsys.c
+index c96284e..a6cd94d 100644
+--- a/agent/mibgroup/hardware/fsys/hw_fsys.c
++++ b/agent/mibgroup/hardware/fsys/hw_fsys.c
+@@ -3,6 +3,9 @@
+ #include <net-snmp/net-snmp-includes.h>
+ #include <net-snmp/agent/net-snmp-agent-includes.h>
+ #include <net-snmp/agent/hardware/fsys.h>
++#ifdef HAVE_INTTYPES_H
++#include <inttypes.h>
++#endif
+ 
+ netsnmp_feature_child_of(hw_fsys_get_container, netsnmp_unused)
+ 
+@@ -174,9 +177,8 @@ netsnmp_fsys_by_path( char *path, int create_type )
+      * ... so let's create a new one
+      */
+     sp = _fsys_create_entry();
+-    if ( sp ) {
+-        strncpy( sp->path, path, sizeof(sp->path) );
+-    }
++    if (sp)
++        strlcpy(sp->path, path, sizeof(sp->path));
+     return sp;
+ }
+ 
+@@ -217,9 +219,8 @@ netsnmp_fsys_by_device( char *device, int create_type )
+      * ... so let's create a new one
+      */
+     sp = _fsys_create_entry();
+-    if ( sp ) {
+-        strncpy( sp->device, device, sizeof(sp->device) );
+-    }
++    if (sp)
++        strlcpy(sp->device, device, sizeof(sp->device));
+     return sp;
+ }
+ 
+@@ -242,7 +243,7 @@ _fsys_create_entry( void )
+         sp->idx.oids[0] = ++_fsys_idx;
+     }
+ 
+-    DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d\n", _fsys_idx));
++    DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d)\n", _fsys_idx));
+     CONTAINER_INSERT( _fsys_container, sp );
+     return sp;
+ }
+@@ -319,21 +320,30 @@ netsnmp_fsys_avail( netsnmp_fsys_info *f) {
+ #define INT32_MAX 0x7fffffff
+ #endif
+ 
++#ifndef PRIu64
++#define PRIu64 "llu"
++#endif
++
+ /* recalculate f->size_32, used_32, avail_32 and units_32 from f->size & comp.*/
+ void
+-netsnmp_fsys_calculate32( netsnmp_fsys_info *f)
++netsnmp_fsys_calculate32(netsnmp_fsys_info *f)
+ {
+     unsigned long long s = f->size;
+-    unsigned long long u = f->units;
+-    int factor = 0;
++    unsigned shift = 0;
++
+     while (s > INT32_MAX) {
+         s = s >> 1;
+-        u = u << 1;
+-        factor++;
++        shift++;
+     }
+ 
+     f->size_32 = s;
+-    f->units_32 = u;
+-    f->avail_32 = f->avail << factor;
+-    f->used_32 = f->used << factor;
++    f->units_32 = f->units << shift;
++    f->avail_32 = f->avail >> shift;
++    f->used_32 = f->used >> shift;
++
++    DEBUGMSGTL(("fsys", "Results of 32-bit conversion: size %" PRIu64 " -> %lu;"
++		" units %" PRIu64 " -> %lu; avail %" PRIu64 " -> %lu;"
++                " used %" PRIu64 " -> %lu\n",
++		(uint64_t)f->size, f->size_32, (uint64_t)f->units, f->units_32,
++		(uint64_t)f->avail, f->avail_32, (uint64_t)f->used, f->used_32));
+ }
+diff --git a/agent/mibgroup/hardware/fsys/mnttypes.h b/agent/mibgroup/hardware/fsys/mnttypes.h
+index f6d96fe..9183451 100644
+--- a/agent/mibgroup/hardware/fsys/mnttypes.h
++++ b/agent/mibgroup/hardware/fsys/mnttypes.h
+@@ -90,9 +90,6 @@
+ #ifndef MNTTYPE_PC
+ #define MNTTYPE_PC       "pc"
+ #endif
+-#ifndef MNTTYPE_REISERFS
+-#define MNTTYPE_REISERFS "reiserfs"
+-#endif
+ #ifndef MNTTYPE_SMBFS
+ #define MNTTYPE_SMBFS    "smbfs"
+ #endif
+@@ -108,30 +105,48 @@
+ #ifndef MNTTYPE_VFAT
+ #define MNTTYPE_VFAT     "vfat"
+ #endif
++
++/*
++ *  File systems to monitor, but not covered by HR-TYPES enumerations
++ */
++#ifndef MNTTYPE_MVFS
++#define MNTTYPE_MVFS     "mvfs"
++#endif
++#ifndef MNTTYPE_TMPFS
++#define MNTTYPE_TMPFS    "tmpfs"
++#endif
+ #ifndef MNTTYPE_GFS
+ #define MNTTYPE_GFS      "gfs"
+ #endif
+ #ifndef MNTTYPE_GFS2
+ #define MNTTYPE_GFS2     "gfs2"
+ #endif
+-
+-/*
+- *  File systems to monitor, but not covered by HR-TYPES enumerations
+- */
++#ifndef MNTTYPE_XFS
++#define MNTTYPE_XFS      "xfs"
++#endif
++#ifndef MNTTYPE_JFS
++#define MNTTYPE_JFS      "jfs"
++#endif
++#ifndef MNTTYPE_VXFS
++#define MNTTYPE_VXFS      "vxfs"
++#endif
++#ifndef MNTTYPE_REISERFS
++#define MNTTYPE_REISERFS "reiserfs"
++#endif
+ #ifndef MNTTYPE_LOFS
+ #define MNTTYPE_LOFS     "lofs"
+ #endif
+-#ifndef MNTTYPE_APP
+-#define MNTTYPE_APP      "app"
+-#endif
+-#ifndef MNTTYPE_MVFS
+-#define MNTTYPE_MVFS     "mvfs"
++#ifndef MNTTYPE_OCFS2
++#define MNTTYPE_OCFS2    "ocfs2"
+ #endif
+ 
+ /*
+  *  File systems to skip
+  *    (Probably not strictly needed)
+  */
++#ifndef MNTTYPE_APP
++#define MNTTYPE_APP      "app"
++#endif
+ #ifndef MNTTYPE_DEVPTS
+ #define MNTTYPE_DEVPTS   "devpts"
+ #endif
+@@ -144,9 +159,6 @@
+ #ifndef MNTTYPE_SYSFS
+ #define MNTTYPE_SYSFS    "sysfs"
+ #endif
+-#ifndef MNTTYPE_TMPFS
+-#define MNTTYPE_TMPFS    "tmpfs"
+-#endif
+ #ifndef MNTTYPE_USBFS
+ #define MNTTYPE_USBFS    "usbfs"
+ #endif
+@@ -156,12 +168,5 @@
+ #ifndef MNTTYPE_RPCPIPE
+ #define MNTTYPE_RPCPIPE  "rpc_pipefs"
+ #endif
+-#ifndef MNTTYPE_XFS
+-#define MNTTYPE_XFS      "xfs"
+-#endif
+-#ifndef MNTTYPE_JFS
+-#define MNTTYPE_JFS      "jfs"
+-#endif
+-
+ 
+ #endif /* _NETSNMP_FSYS_MNTTYPES_H */
+diff --git a/agent/mibgroup/hardware/memory/memory_linux.c b/agent/mibgroup/hardware/memory/memory_linux.c
+index 89abf57..8c189c5 100644
+--- a/agent/mibgroup/hardware/memory/memory_linux.c
++++ b/agent/mibgroup/hardware/memory/memory_linux.c
+@@ -46,6 +46,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+         buff = (char*)malloc(bsize+1);
+         if (NULL == buff) {
+             snmp_log(LOG_ERR, "malloc failed\n");
++            close(statfd);
+             return -1;
+         }
+     }
+@@ -53,6 +54,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+         b = (char*)realloc(buff, bsize + MEMINFO_STEP_SIZE + 1);
+         if (NULL == b) {
+             snmp_log(LOG_ERR, "malloc failed\n");
++            close(statfd);
+             return -1;
+         }
+         buff = b;
+@@ -89,13 +91,19 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+         if (first)
+             snmp_log(LOG_ERR, "No MemFree line in /proc/meminfo\n");
+     }
+-    b = strstr(buff, "MemShared: ");
+-    if (b)
+-        sscanf(b, "MemShared: %lu", &memshared);
++    if (0 == netsnmp_os_prematch("Linux","2.4")) {
++        b = strstr(buff, "MemShared: ");
++        if (b)
++            sscanf(b, "MemShared: %lu", &memshared);
++        else if (first)
++            snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n");
++    }
+     else {
+-        if (first)
+-            if (0 == netsnmp_os_prematch("Linux","2.4"))
+-                snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n");
++        b = strstr(buff, "Shmem: ");
++        if (b)
++            sscanf(b, "Shmem: %lu", &memshared);
++        else if (first)
++            snmp_log(LOG_ERR, "No Shmem line in /proc/meminfo\n");
+     }
+     b = strstr(buff, "Buffers: ");
+     if (b)
+@@ -155,8 +163,6 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+         mem->other = -1;
+     }
+ 
+-   /* Shared memory is not reported by Linux 2.6 kernel */
+-   if (0 != netsnmp_os_prematch("Linux","2.6")) {
+     mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 1 );
+     if (!mem) {
+         snmp_log_perror("No Shared Memory info entry");
+@@ -165,10 +171,9 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
+              mem->descr = strdup("Shared memory");
+         mem->units = 1024;
+         mem->size  = memshared;
+-        mem->free  = -1;
++        mem->free  = 0;    /* All in use */
+         mem->other = -1;
+     }
+-   }
+ 
+     mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 1 );
+     if (!mem) {
+diff --git a/agent/mibgroup/hardware/sensors/hw_sensors.c b/agent/mibgroup/hardware/sensors/hw_sensors.c
+index 508ad47..1a01645 100644
+--- a/agent/mibgroup/hardware/sensors/hw_sensors.c
++++ b/agent/mibgroup/hardware/sensors/hw_sensors.c
+@@ -163,6 +163,11 @@ sensor_by_name( const char *name, int create_type )
+      */
+     sp = SNMP_MALLOC_TYPEDEF( netsnmp_sensor_info );
+     if ( sp ) {
++        if (strlen(name) >= sizeof(sp->name)) {
++            snmp_log(LOG_ERR, "Sensor name is too large: %s\n", name);
++            free(sp);
++            return NULL;
++        }
+         strcpy( sp->name, name );
+         sp->type = create_type;
+         /*
+diff --git a/agent/mibgroup/hardware/sensors/lmsensors_v3.c b/agent/mibgroup/hardware/sensors/lmsensors_v3.c
+index d33a1c4..e34da19 100644
+--- a/agent/mibgroup/hardware/sensors/lmsensors_v3.c
++++ b/agent/mibgroup/hardware/sensors/lmsensors_v3.c
+@@ -32,7 +32,7 @@ netsnmp_sensor_arch_load(netsnmp_cache *cache, void *vp) {
+ 
+             while ((data2 = sensors_get_all_subfeatures( chip, data, &b))) {
+                 char           *label = NULL;
+-                double          val;
++                double          val = 0;
+                 int             type = NETSNMP_SENSOR_TYPE_OTHER;
+ 
+                 DEBUGMSGTL(("sensors:arch:detail", "  get_subfeatures (%s, %d)\n", data2->name, data2->number));
+diff --git a/agent/mibgroup/host/data_access/swinst_apt.c b/agent/mibgroup/host/data_access/swinst_apt.c
+index d204857..26cdba5 100644
+--- a/agent/mibgroup/host/data_access/swinst_apt.c
++++ b/agent/mibgroup/host/data_access/swinst_apt.c
+@@ -37,11 +37,10 @@ static char apt_fmt[SNMP_MAXBUF];
+ void
+ netsnmp_swinst_arch_init(void)
+ {
+-    strncpy( pkg_directory, "/var/lib/dpkg/info", SNMP_MAXBUF );
++    strlcpy(pkg_directory, "/var/lib/dpkg/info", sizeof(pkg_directory));
+     snprintf(apt_fmt, SNMP_MAXBUF, "%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%ds",
+ 	SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF,
+ 	SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF);
+-    return;
+ }
+ 
+ void
+@@ -95,7 +94,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
+         entry->swDate_len = 8;
+ 	memcpy(entry->swDate, "\0\0\1\1\0\0\0\0", 8);
+     }
+-    fclose(p);
++    pclose(p);
+     DEBUGMSGTL(("swinst:load:arch"," loaded %d entries\n",
+                 CONTAINER_SIZE(container)));
+ 
+diff --git a/agent/mibgroup/host/data_access/swinst_pkginfo.c b/agent/mibgroup/host/data_access/swinst_pkginfo.c
+index 1ca40a2..327ca70 100644
+--- a/agent/mibgroup/host/data_access/swinst_pkginfo.c
++++ b/agent/mibgroup/host/data_access/swinst_pkginfo.c
+@@ -103,7 +103,9 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
+                          if there isn't a list of them! */
+     }
+     d = opendir( pkg_directory );
+-    while (d != NULL && (dp = readdir(d)) != NULL) {
++    if (!d)
++	return 1;
++    while ((dp = readdir(d)) != NULL) {
+         if ( '.' == dp->d_name[0] )
+             continue;
+         entry = netsnmp_swinst_entry_create( i++ );
+diff --git a/agent/mibgroup/host/data_access/swinst_rpm.c b/agent/mibgroup/host/data_access/swinst_rpm.c
+index a2862e0..71595be 100644
+--- a/agent/mibgroup/host/data_access/swinst_rpm.c
++++ b/agent/mibgroup/host/data_access/swinst_rpm.c
+@@ -100,7 +100,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
+     int32_t              *t;
+     time_t                install_time;
+     size_t                date_len;
+-    int                   rc, i = 1;
++    int                   i = 1;
+     netsnmp_swinst_entry *entry;
+ 
+     ts = rpmtsCreate();
+@@ -112,11 +112,11 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
+ 
+     while (NULL != (h = rpmdbNextIterator( mi )))
+     {
+-
++        const u_char *dt;
+         entry = netsnmp_swinst_entry_create( i++ );
+         if (NULL == entry)
+             continue;   /* error already logged by function */
+-        rc = CONTAINER_INSERT(container, entry);
++        CONTAINER_INSERT(container, entry);
+ 
+         h = headerLink( h );
+         headerGetEntry( h, RPMTAG_NAME,        NULL, (void**)&n, NULL);
+@@ -134,8 +134,15 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
+                         : 4;     /*  application    */
+ 
+         install_time = *t;
+-        entry->swDate_len = snprintf( entry->swDate, sizeof(entry->swDate),
+-                                      "%s", date_n_time( &install_time, &date_len ));
++        dt = date_n_time( &install_time, &date_len );
++        if (date_len != 8 && date_len != 11) {
++            snmp_log(LOG_ERR, "Bogus length from date_n_time for %s", entry->swName);
++            entry->swDate_len = 0;
++        }
++        else {
++            entry->swDate_len = date_len;
++            memcpy(entry->swDate, dt, entry->swDate_len);
++        }
+ 
+         headerFree( h );
+     }
+diff --git a/agent/mibgroup/host/data_access/swrun_darwin.c b/agent/mibgroup/host/data_access/swrun_darwin.c
+index 7d07cd5..6c6b82a 100644
+--- a/agent/mibgroup/host/data_access/swrun_darwin.c
++++ b/agent/mibgroup/host/data_access/swrun_darwin.c
+@@ -289,8 +289,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry)
+     exec_path = (char *)ip;
+     DEBUGMSGTL(("swrun:load:arch:_cn"," exec_path %s\n", exec_path));
+     len = strlen(exec_path);
+-    strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1);
+-    entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0;
++    strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath));
+     if (len > sizeof(entry->hrSWRunPath)-1) {
+         DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n"));
+         entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$';
+@@ -326,8 +325,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry)
+     DEBUGMSGTL(("swrun:load:arch:_cn",
+                 SWRUNINDENT "kernel name %s\n", command));
+     if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) {
+-        strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1);
+-        entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0;
++        strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName));
+         entry->hrSWRunName_len = strlen(entry->hrSWRunName);
+         DEBUGMSGTL(("swrun:load:arch:_cn", "**"
+                     SWRUNINDENT "updated name to %s\n", entry->hrSWRunName));
+@@ -369,8 +367,7 @@ _set_command_name(netsnmp_swrun_entry *entry)
+ 
+     exec_path = arg_buf + sizeof(nargs);
+     len = strlen(exec_path);
+-    strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1);
+-    entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0;
++    strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath));
+     if (len > sizeof(entry->hrSWRunPath)-1) {
+         DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n"));
+         entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$';
+@@ -459,8 +456,8 @@ _set_command_name(netsnmp_swrun_entry *entry)
+          * save arg
+          */
+         if(entry->hrSWRunParameters_len < sizeof(entry->hrSWRunParameters)-1) {
+-            strncat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len], argN,
+-                    sizeof(entry->hrSWRunParameters) - entry->hrSWRunParameters_len - 2);
++            strlcat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len],
++                    argN, sizeof(entry->hrSWRunParameters));
+             entry->hrSWRunParameters_len = strlen(entry->hrSWRunParameters);
+             if ((entry->hrSWRunParameters_len+2 < sizeof(entry->hrSWRunParameters)-1) && (0 != nargs)) {
+                 /* add space between params */
+@@ -486,8 +483,7 @@ _set_command_name(netsnmp_swrun_entry *entry)
+     
+     /* Allocate space for the command and copy. */
+     if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) {
+-        strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1);
+-        entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0;
++        strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName));
+         entry->hrSWRunName_len = strlen(entry->hrSWRunName);
+         DEBUGMSGTL(("swrun:load:arch:_cn",
+                     " **updated name to %s\n", entry->hrSWRunName));
+diff --git a/agent/mibgroup/host/data_access/swrun_kinfo.c b/agent/mibgroup/host/data_access/swrun_kinfo.c
+index aae5f62..64583bf 100644
+--- a/agent/mibgroup/host/data_access/swrun_kinfo.c
++++ b/agent/mibgroup/host/data_access/swrun_kinfo.c
+@@ -236,7 +236,7 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags)
+                              : 4  /*  application     */
+                              ;
+ 
+-#ifdef netbsdelf5
++#ifdef netbsd5
+         switch (proc_table[i].SWRUN_K_STAT) {
+ 	case LSONPROC:
+         case LSRUN:   entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING;
+diff --git a/agent/mibgroup/host/data_access/swrun_procfs_status.c b/agent/mibgroup/host/data_access/swrun_procfs_status.c
+index 367f422..a9aa2d8 100644
+--- a/agent/mibgroup/host/data_access/swrun_procfs_status.c
++++ b/agent/mibgroup/host/data_access/swrun_procfs_status.c
+@@ -123,32 +123,26 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags)
+         }
+         fclose(fp);
+ 
+-        if ( cp ) {
+-            /*
+-             *     argv[0]   is hrSWRunPath
+-             */ 
+-            entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
+-                                       sizeof(entry->hrSWRunPath)-1, "%s", buf);
+-            /*
+-             * Stitch together argv[1..] to construct hrSWRunParameters
+-             */
+-            cp = buf + entry->hrSWRunPath_len+1;
+-            while ( 1 ) {
+-                while (*cp)
+-                    cp++;
+-                if ( '\0' == *(cp+1))
+-                    break;      /* '\0''\0' => End of command line */
+-                *cp = ' ';
+-            }
+-            entry->hrSWRunParameters_len
+-                = sprintf(entry->hrSWRunParameters, "%.*s",
+-                          (int)sizeof(entry->hrSWRunParameters) - 1,
+-                          buf + entry->hrSWRunPath_len + 1);
+-        } else {
+-            memcpy(entry->hrSWRunPath, entry->hrSWRunName, entry->hrSWRunName_len);
+-            entry->hrSWRunPath_len       = entry->hrSWRunName_len;
+-            entry->hrSWRunParameters_len = 0;
++        /*
++         *     argv[0]   is hrSWRunPath
++         */ 
++        entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
++                                   sizeof(entry->hrSWRunPath)-1, "%s", buf);
++        /*
++         * Stitch together argv[1..] to construct hrSWRunParameters
++         */
++        cp = buf + entry->hrSWRunPath_len+1;
++        while ( 1 ) {
++            while (*cp)
++                cp++;
++            if ( '\0' == *(cp+1))
++                break;      /* '\0''\0' => End of command line */
++            *cp = ' ';
+         }
++        entry->hrSWRunParameters_len
++            = sprintf(entry->hrSWRunParameters, "%.*s",
++                      (int)sizeof(entry->hrSWRunParameters) - 1,
++                      buf + entry->hrSWRunPath_len + 1);
+  
+         /*
+          * XXX - No information regarding system processes vs applications
+diff --git a/agent/mibgroup/host/hrSWInstalledTable.c b/agent/mibgroup/host/hrSWInstalledTable.c
+index 71d2a38..ad8aee3 100644
+--- a/agent/mibgroup/host/hrSWInstalledTable.c
++++ b/agent/mibgroup/host/hrSWInstalledTable.c
+@@ -143,6 +143,7 @@ initialize_table_hrSWInstalledTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,"error registering table handler for "
+                  MYTABLE "\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/host/hrSWRunPerfTable.c b/agent/mibgroup/host/hrSWRunPerfTable.c
+index 7a9adfa..43b44d1 100644
+--- a/agent/mibgroup/host/hrSWRunPerfTable.c
++++ b/agent/mibgroup/host/hrSWRunPerfTable.c
+@@ -115,6 +115,7 @@ initialize_table_hrSWRunPerfTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,"error registering table handler for "
+                  MYTABLE "\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/host/hrSWRunTable.c b/agent/mibgroup/host/hrSWRunTable.c
+index 946813e..03ad256 100644
+--- a/agent/mibgroup/host/hrSWRunTable.c
++++ b/agent/mibgroup/host/hrSWRunTable.c
+@@ -128,6 +128,7 @@ initialize_table_hrSWRunTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,"error registering table handler for "
+                  MYTABLE "\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/host/hr_device.c b/agent/mibgroup/host/hr_device.c
+index c2e112c..24031bf 100644
+--- a/agent/mibgroup/host/hr_device.c
++++ b/agent/mibgroup/host/hr_device.c
+@@ -250,8 +250,7 @@ really_try_next:
+     case HRDEV_DESCR:
+         if ((device_descr[type] != NULL) &&
+             (NULL!=(tmp_str=((*device_descr[type])(dev_idx))))) {
+-            strncpy(string, tmp_str, sizeof(string)-1);
+-            string[ sizeof(string)-1] = 0;
++            strlcpy(string, tmp_str, sizeof(string));
+         } else
+ #if NETSNMP_NO_DUMMY_VALUES
+             goto try_next;
+diff --git a/agent/mibgroup/host/hr_disk.c b/agent/mibgroup/host/hr_disk.c
+index d8f874f..679264b 100644
+--- a/agent/mibgroup/host/hr_disk.c
++++ b/agent/mibgroup/host/hr_disk.c
+@@ -355,7 +355,7 @@ parse_disk_config(const char *token, char *cptr)
+             di_curr->item_details = (void *) 0;
+             name++;
+         } else if (*name == '[') {
+-            d_set = (details_set *) malloc(sizeof(details_set));
++            d_set = (details_set *) calloc(sizeof(details_set), 1);
+             if (!d_set) {
+                 config_perror("Out of memory");
+                 SNMP_FREE(d_new);
+@@ -364,8 +364,6 @@ parse_disk_config(const char *token, char *cptr)
+                 SNMP_FREE(d_str);
+                 return;
+             }
+-            for (i = 0; i < sizeof(details_set); i++)
+-                (*d_set)[i] = (unsigned char) 0;
+             name++;
+             if (*name == '^' || *name == '!') {
+                 neg = 1;
+@@ -904,16 +902,14 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
+ 
+     sess_ref = DASessionCreate( NULL );
+     if (NULL == sess_ref) {
+-        strncpy(string, devfull, str_len);
+-        string[str_len-1] = 0;
++        strlcpy(string, devfull, str_len);
+         return -1;
+     }
+ 
+     disk = DADiskCreateFromBSDName( NULL, sess_ref, devfull );
+     if (NULL == disk) {
+         CFRelease(sess_ref);
+-        strncpy(string, devfull, str_len);
+-        string[str_len-1] = 0;
++        strlcpy(string, devfull, str_len);
+         return -1;
+     }
+ 
+@@ -924,7 +920,7 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
+                  devfull);
+         CFRelease(disk);
+         CFRelease(sess_ref);
+-        strncpy(string, devfull, str_len);
++        strlcpy(string, devfull, str_len);
+         return -1;
+     }
+ 
+@@ -932,14 +928,12 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
+     str_ref = (CFStringRef)
+         CFDictionaryGetValue(desc, kDADiskDescriptionMediaNameKey);
+     if (str_ref) {
+-        strncpy(string, CFStringGetCStringPtr(str_ref, sys_encoding),
++        strlcpy(string, CFStringGetCStringPtr(str_ref, sys_encoding),
+                 str_len);
+-        string[str_len-1] = 0;
+         DEBUGMSGTL(("verbose:diskmgr:darwin", " name %s\n", string));
+     }
+     else {
+-        strncpy(string, devfull, str_len);
+-        string[str_len-1] = 0;
++        strlcpy(string, devfull, str_len);
+     }
+     
+     CFRelease(disk);
+@@ -984,27 +978,21 @@ static void
+ Save_HR_Disk_General(void)
+ {
+ #ifdef DIOC_DESCRIBE
+-    strncpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel)-1);
+-    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
++    strlcpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel));
+ #endif
+ #ifdef DKIOCINFO
+-    strncpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel)-1);
+-    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
++    strlcpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel));
+ #endif
+ #ifdef HAVE_LINUX_HDREG_H
+-    strncpy(HRD_savedModel, (const char *) HRD_info.model,
+-                    sizeof(HRD_savedModel)-1);
+-    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
++    strlcpy(HRD_savedModel, (const char *) HRD_info.model,
++            sizeof(HRD_savedModel));
+ #endif
+ #ifdef DIOCGDINFO
+-    strncpy(HRD_savedModel, dktypenames[HRD_info.d_type],
+-                    sizeof(HRD_savedModel)-1);
+-    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
++    strlcpy(HRD_savedModel, dktypenames[HRD_info.d_type],
++            sizeof(HRD_savedModel));
+ #endif
+ #ifdef darwin
+-    strncpy(HRD_savedModel, HRD_model,
+-                    sizeof(HRD_savedModel)-1);
+-    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
++    strlcpy(HRD_savedModel, HRD_model, sizeof(HRD_savedModel));
+ #endif
+ }
+ 
+@@ -1149,9 +1137,8 @@ Query_Disk(int fd, const char *devfull)
+     str_ref = (CFStringRef)
+         CFDictionaryGetValue(desc, kDADiskDescriptionDeviceModelKey);
+     if (str_ref) {
+-        strncpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding),
++        strlcpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding),
+                 sizeof(HRD_model));
+-        HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
+         DEBUGMSGTL(("verbose:diskmgr:darwin", " model %s\n", HRD_model));
+     }
+     else
+diff --git a/agent/mibgroup/host/hr_filesys.c b/agent/mibgroup/host/hr_filesys.c
+index 660e706..b23d322 100644
+--- a/agent/mibgroup/host/hr_filesys.c
++++ b/agent/mibgroup/host/hr_filesys.c
+@@ -361,15 +361,13 @@ var_hrfilesys(struct variable *vp,
+         long_return = fsys_idx;
+         return (u_char *) & long_return;
+     case HRFSYS_MOUNT:
+-        snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_mount);
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string));
+         *var_len = strlen(string);
+         return (u_char *) string;
+     case HRFSYS_RMOUNT:
+-        if (Check_HR_FileSys_NFS()) {
+-            snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_name);
+-            string[ sizeof(string)-1 ] = 0;
+-        } else
++        if (Check_HR_FileSys_NFS())
++            strlcpy(string, HRFS_entry->HRFS_name, sizeof(string));
++        else
+             string[0] = '\0';
+         *var_len = strlen(string);
+         return (u_char *) string;
+@@ -945,17 +943,14 @@ cook_device(char *dev)
+     static char     cooked_dev[SNMP_MAXPATH+1];
+ 
+     if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {
+-        strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
+-        strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
+-                sizeof(cooked_dev)-strlen(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
++        strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev));
++        strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
++                sizeof(cooked_dev));
+     } else {
+-        strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
++        strlcpy(cooked_dev, dev, sizeof(cooked_dev));
+     }
+ 
+-    return (cooked_dev);
++    return cooked_dev;
+ }
+ 
+ 
+diff --git a/agent/mibgroup/host/hr_proc.c b/agent/mibgroup/host/hr_proc.c
+index 9d44c7b..6f93079 100644
+--- a/agent/mibgroup/host/hr_proc.c
++++ b/agent/mibgroup/host/hr_proc.c
+@@ -164,6 +164,7 @@ var_hrproc(struct variable * vp,
+            int exact, size_t * var_len, WriteMethod ** write_method)
+ {
+     int             proc_idx;
++    unsigned long long value;
+     netsnmp_cpu_info *cpu;
+ 
+     proc_idx =
+@@ -181,9 +182,9 @@ var_hrproc(struct variable * vp,
+            ( cpu->history[0].total_hist == cpu->total_ticks ))
+             return NULL;
+ 
+-        long_return  = (cpu->idle_ticks  - cpu->history[0].idle_hist)*100;
+-        long_return /= (cpu->total_ticks - cpu->history[0].total_hist);
+-        long_return  = 100 - long_return;
++        value = (cpu->idle_ticks  - cpu->history[0].idle_hist)*100;
++        value /= (cpu->total_ticks - cpu->history[0].total_hist);
++        long_return = 100 - value;
+         if (long_return < 0)
+             long_return = 0;
+         return (u_char *) & long_return;
+diff --git a/agent/mibgroup/host/hr_storage.c b/agent/mibgroup/host/hr_storage.c
+index 4b8ba8a..264fecc 100644
+--- a/agent/mibgroup/host/hr_storage.c
++++ b/agent/mibgroup/host/hr_storage.c
+@@ -595,8 +595,7 @@ really_try_next:
+         return (u_char *) storage_type_id;
+     case HRSTORE_DESCR:
+         if (store_idx > NETSNMP_MEM_TYPE_MAX) {
+-            strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1);
+-            string[ sizeof(string)-1 ] = 0;
++            strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string));
+             *var_len = strlen(string);
+             return (u_char *) string;
+         } else {
+diff --git a/agent/mibgroup/host/hr_swinst.c b/agent/mibgroup/host/hr_swinst.c
+index 91c660c..4aa4593 100644
+--- a/agent/mibgroup/host/hr_swinst.c
++++ b/agent/mibgroup/host/hr_swinst.c
+@@ -405,10 +405,8 @@ var_hrswinst(struct variable * vp,
+     case HRSWINST_UPDATE:
+         string[0] = '\0';
+ 
+-        if (swi->swi_directory != NULL) {
+-            strncpy(string, swi->swi_directory, sizeof(string));
+-            string[ sizeof(string)-1 ] = 0;
+-        }
++        if (swi->swi_directory != NULL)
++            strlcpy(string, swi->swi_directory, sizeof(string));
+ 
+         if (*string && (stat(string, &stat_buf) != -1)) {
+             if (stat_buf.st_mtime > starttime.tv_sec)
+@@ -436,7 +434,7 @@ var_hrswinst(struct variable * vp,
+ #ifdef HAVE_PKGINFO
+             char *pver;
+ # endif
+-            strncpy(string, swi->swi_name, sizeof(string) - 1);
++            strlcpy(string, swi->swi_name, sizeof(string));
+ 
+ /* If we are on a solaris machine, the package names do not include versioning info,
+  * so we must add it manually
+diff --git a/agent/mibgroup/host/hr_swrun.c b/agent/mibgroup/host/hr_swrun.c
+index 9e11f2e..644e7bd 100644
+--- a/agent/mibgroup/host/hr_swrun.c
++++ b/agent/mibgroup/host/hr_swrun.c
+@@ -657,14 +657,12 @@ var_hrswrun(struct variable * vp,
+         return (u_char *) & long_return;
+     case HRSWRUN_NAME:
+ #ifdef HAVE_SYS_PSTAT_H
+-        snprintf(string, sizeof(string), "%s", proc_buf.pst_cmd);
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, proc_buf.pst_cmd, sizeof(string));
+         cp = strchr(string, ' ');
+         if (cp != NULL)
+             *cp = '\0';
+ #elif defined(dynix)
+-        snprintf(string, sizeof(string), "%s", lowpsinfo.pr_fname);
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, lowpsinfo.pr_fname, sizeof(string));
+         cp = strchr(string, ' ');
+         if (cp != NULL)
+             *cp = '\0';
+@@ -673,19 +671,16 @@ var_hrswrun(struct variable * vp,
+         if (proc_buf) { 
+             char *pos=strchr(proc_buf->pr_psargs,' ');
+             if (pos != NULL) *pos = '\0';
+-            strlcpy(string, basename(proc_buf->pr_psargs),sizeof(string));
++            strlcpy(string, basename(proc_buf->pr_psargs), sizeof(string));
+             if (pos != NULL) *pos=' ';
+         } else {
+-            strcpy(string, "<exited>");
++            strlcpy(string, "<exited>", sizeof(string));
+         }
+-        string[ sizeof(string)-1 ] = 0;
+ #else
+-        strncpy(string, proc_buf->p_user.u_comm, sizeof(string));
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, proc_buf->p_user.u_comm, sizeof(string));
+ #endif
+ #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
+-        strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
+         cp = strchr(string, ' ');
+         if (cp != NULL)
+             *cp = '\0';
+@@ -806,8 +801,7 @@ var_hrswrun(struct variable * vp,
+         *cp1 = 0;
+ #endif
+ #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
+-        strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
+-        string[ sizeof(string)-1 ] = 0;
++        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
+         cp = strchr(string, ' ');
+         if (cp != NULL)
+             *cp = '\0';
+diff --git a/agent/mibgroup/host/hr_system.c b/agent/mibgroup/host/hr_system.c
+index da38c74..9fea4f4 100644
+--- a/agent/mibgroup/host/hr_system.c
++++ b/agent/mibgroup/host/hr_system.c
+@@ -469,9 +469,7 @@ static int set_solaris_eeprom_parameter(const char *key, const char *value,
+     } 
+ 
+     
+-    sprintf(pbuffer,"eeprom %s=\"",key);
+-    strncat(pbuffer,value,var_val_len);
+-    strcat(pbuffer,"\"\n");
++    sprintf(pbuffer, "eeprom %s=\"%.*s\"\n", key, var_val_len, value);
+ 
+     status=system(pbuffer);
+ 
+diff --git a/agent/mibgroup/host/hrh_filesys.c b/agent/mibgroup/host/hrh_filesys.c
+index fd84bde..4aab6a0 100644
+--- a/agent/mibgroup/host/hrh_filesys.c
++++ b/agent/mibgroup/host/hrh_filesys.c
+@@ -350,13 +350,13 @@ when_dumped(char *filesys, int level, size_t * length)
+                 continue;
+ 
+             ++cp2;
+-            while (isspace(*cp2))
++            while (isspace(0xFF & *cp2))
+                 ++cp2;          /* Now find the dump level */
+ 
+             if (level == FULL_DUMP) {
+                 if (*(cp2++) != '0')
+                     continue;   /* Not interested in partial dumps */
+-                while (isspace(*cp2))
++                while (isspace(0xFF & *cp2))
+                     ++cp2;
+ 
+                 dumpdate = ctime_to_timet(cp2);
+@@ -365,7 +365,7 @@ when_dumped(char *filesys, int level, size_t * length)
+             } else {            /* Partial Dump */
+                 if (*(cp2++) == '0')
+                     continue;   /* Not interested in full dumps */
+-                while (isspace(*cp2))
++                while (isspace(0xFF & *cp2))
+                     ++cp2;
+ 
+                 tmp = ctime_to_timet(cp2);
+@@ -390,17 +390,14 @@ cook_device(char *dev)
+     static char     cooked_dev[SNMP_MAXPATH+1];
+ 
+     if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {
+-        strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
+-        strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
+-                sizeof(cooked_dev)-strlen(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
++        strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev));
++        strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
++                sizeof(cooked_dev));
+     } else {
+-        strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);
+-        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
++        strlcpy(cooked_dev, dev, sizeof(cooked_dev));
+     }
+ 
+-    return (cooked_dev);
++    return cooked_dev;
+ }
+ 
+ 
+diff --git a/agent/mibgroup/host/hrh_storage.c b/agent/mibgroup/host/hrh_storage.c
+index 27841a4..ca2f854 100644
+--- a/agent/mibgroup/host/hrh_storage.c
++++ b/agent/mibgroup/host/hrh_storage.c
+@@ -408,8 +408,7 @@ really_try_next:
+         return (u_char *) storage_type_id;
+     case HRSTORE_DESCR:
+         if (store_idx > NETSNMP_MEM_TYPE_MAX) {
+-            strncpy(string, HRFS_entry->path, sizeof(string)-1);
+-            string[ sizeof(string)-1 ] = 0;
++            strlcpy(string, HRFS_entry->path, sizeof(string));
+             *var_len = strlen(string);
+             return (u_char *) string;
+         } else {
+diff --git a/agent/mibgroup/if-mib/data_access/interface_ioctl.c b/agent/mibgroup/if-mib/data_access/interface_ioctl.c
+index 66aec99..db2c245 100644
+--- a/agent/mibgroup/if-mib/data_access/interface_ioctl.c
++++ b/agent/mibgroup/if-mib/data_access/interface_ioctl.c
+@@ -70,8 +70,7 @@ _ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
+         }
+     }
+ 
+-    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+-    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
++    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+     rc = ioctl(fd, which, ifrq);
+     if (rc < 0) {
+         snmp_log(LOG_ERR,"ioctl %d returned %d\n", which, rc);
+@@ -157,6 +156,11 @@ netsnmp_access_interface_ioctl_physaddr_get(int fd,
+                 ifentry->type = IANAIFTYPE_TUNNEL;
+                 break;          /* tunnel */
+ #endif
++#ifdef ARPHRD_INFINIBAND
++            case ARPHRD_INFINIBAND:
++                ifentry->type = IANAIFTYPE_INFINIBAND;
++                break;
++#endif
+ #ifdef ARPHRD_SLIP
+             case ARPHRD_SLIP:
+             case ARPHRD_CSLIP:
+@@ -323,8 +327,7 @@ netsnmp_access_interface_ioctl_flags_set(int fd,
+         }
+     }
+ 
+-    strncpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name));
+-    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++    strlcpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name));
+     rc = ioctl(fd, SIOCGIFFLAGS, &ifrq);
+     if(rc < 0) {
+         snmp_log(LOG_ERR,"error getting flags\n");
+diff --git a/agent/mibgroup/if-mib/data_access/interface_linux.c b/agent/mibgroup/if-mib/data_access/interface_linux.c
+index 9810b15..e291b9f 100644
+--- a/agent/mibgroup/if-mib/data_access/interface_linux.c
++++ b/agent/mibgroup/if-mib/data_access/interface_linux.c
+@@ -589,6 +589,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
+     fd = socket(AF_INET, SOCK_DGRAM, 0);
+     if(fd < 0) {
+         snmp_log(LOG_ERR, "could not create socket\n");
++        fclose(devin);
+         return -2;
+     }
+ 
+@@ -727,6 +728,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
+                 {IANAIFTYPE_ISO88025TOKENRING, "tr"},
+                 {IANAIFTYPE_FASTETHER, "feth"},
+                 {IANAIFTYPE_GIGABITETHERNET,"gig"},
++                {IANAIFTYPE_INFINIBAND,"ib"},
+                 {IANAIFTYPE_PPP, "ppp"},
+                 {IANAIFTYPE_SLIP, "sl"},
+                 {IANAIFTYPE_TUNNEL, "sit"},
+@@ -891,40 +893,38 @@ unsigned long long
+ netsnmp_linux_interface_get_if_speed(int fd, const char *name,
+             unsigned long long defaultspeed)
+ {
++    int ret;
+     struct ifreq ifr;
+     struct ethtool_cmd edata;
++    uint16_t speed_hi;
++    uint32_t speed;
+ 
+     memset(&ifr, 0, sizeof(ifr));
++    memset(&edata, 0, sizeof(edata));
+     edata.cmd = ETHTOOL_GSET;
+-    edata.speed = 0;
+     
+-    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)-1);
++    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+     ifr.ifr_data = (char *) &edata;
+     
+-    if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
+-        DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed\n",
+-                    ifr.ifr_name));
+-        return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed);
+-    }
+-    
+-    if (edata.speed != SPEED_10 && edata.speed != SPEED_100
+-#ifdef SPEED_10000
+-        && edata.speed != SPEED_10000
+-#endif
+-#ifdef SPEED_2500
+-        && edata.speed != SPEED_2500
+-#endif
+-        && edata.speed != SPEED_1000 ) {
+-        DEBUGMSGTL(("mibII/interfaces", "fallback to mii for %s\n",
+-                    ifr.ifr_name));
+-        /* try MII */
++    ret = ioctl(fd, SIOCETHTOOL, &ifr);
++    if (ret == -1 || edata.speed == 0) {
++        DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed (%d / %d)\n",
++                    ifr.ifr_name, ret, edata.speed));
+         return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed);
+     }
+ 
++#ifdef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI
++    speed_hi = edata.speed_hi;
++#else
++    speed_hi = 0;
++#endif
++    speed = speed_hi << 16 | edata.speed;
++    if (speed == 0xffff || speed == 0xffffffffUL /*SPEED_UNKNOWN*/)
++        speed = defaultspeed;
+     /* return in bps */
+-    DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %d\n",
+-                ifr.ifr_name, edata.speed));
+-    return edata.speed*1000LL*1000LL;
++    DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %#x -> %d\n",
++                ifr.ifr_name, speed_hi << 16 | edata.speed, speed));
++    return speed * 1000LL * 1000LL;
+ }
+ #endif
+  
+@@ -954,8 +954,7 @@ netsnmp_linux_interface_get_if_speed(int fd, const char *name,
+     const unsigned long long media_speeds[] = {10000000, 10000000, 100000000, 100000000, 10000000, 0};
+     /* It corresponds to "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4", "Flow-control", 0, */
+ 
+-    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+-    ifr.ifr_name[ sizeof(ifr.ifr_name)-1 ] = 0;
++    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+     data[0] = 0;
+     
+     /*
+@@ -1042,6 +1041,10 @@ int netsnmp_prefix_listen()
+     unsigned           groups = 0;
+ 
+     int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
++    if (fd < 0) {
++        snmp_log(LOG_ERR, "netsnmp_prefix_listen: Cannot create socket.\n");
++        return -1;
++    }
+ 
+     memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl));
+ 
+@@ -1052,6 +1055,7 @@ int netsnmp_prefix_listen()
+ 
+     if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) < 0) {
+         snmp_log(LOG_ERR,"netsnmp_prefix_listen: Bind failed.\n");
++        close(fd);
+         return -1;
+     }
+ 
+@@ -1066,11 +1070,13 @@ int netsnmp_prefix_listen()
+     status = send(fd, &req, req.n.nlmsg_len, 0);
+     if (status < 0) {
+         snmp_log(LOG_ERR,"netsnmp_prefix_listen: send failed\n");
++        close(fd);
+         return -1;
+     }
+ 
+     if (register_readfd(fd, netsnmp_prefix_process, NULL) != 0) {
+         snmp_log(LOG_ERR,"netsnmp_prefix_listen: error registering netlink socket\n");
++        close(fd);
+         return -1;
+     }
+     return 0;
+diff --git a/agent/mibgroup/if-mib/data_access/interface_openbsd.c b/agent/mibgroup/if-mib/data_access/interface_openbsd.c
+index 552043a..8340dc6 100644
+--- a/agent/mibgroup/if-mib/data_access/interface_openbsd.c
++++ b/agent/mibgroup/if-mib/data_access/interface_openbsd.c
+@@ -343,12 +343,10 @@ netsnmp_openbsd_interface_get_if_speed(char *name, u_int *speed, u_int *speed_hi
+         return 0;
+     }
+ 
+-    (void) memset(&ifmr, 0, sizeof(ifmr));
+-    (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+-
+-    if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 ||
+-        ifmr.ifm_count == 0) {
++    memset(&ifmr, 0, sizeof(ifmr));
++    strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+ 
++    if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 || ifmr.ifm_count == 0) {
+         close(s);
+         return 0;
+     }
+diff --git a/agent/mibgroup/if-mib/data_access/interface_sysctl.c b/agent/mibgroup/if-mib/data_access/interface_sysctl.c
+index 0669ffc..81efbef 100644
+--- a/agent/mibgroup/if-mib/data_access/interface_sysctl.c
++++ b/agent/mibgroup/if-mib/data_access/interface_sysctl.c
+@@ -252,8 +252,8 @@ netsnmp_sysctl_get_if_speed(char *name, u_int *speed,
+         return 0;
+     }
+ 
+-    (void) memset(&ifmr, 0, sizeof(ifmr));
+-    (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
++    memset(&ifmr, 0, sizeof(ifmr));
++    strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
+ 
+     DEBUGMSGTL(("access:interface:container:sysctl"," speed in\n"));
+     if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 ||
+@@ -326,6 +326,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
+     int amask;
+     char *if_name;
+     int flags;
++#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC
++    struct timespec startspec;
++
++    TIMEVAL_TO_TIMESPEC(&starttime, &startspec);
++#endif
+ 
+     DEBUGMSGTL(("access:interface:container:sysctl",
+                 "load (flags %u)\n", load_flags));
+@@ -477,7 +482,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
+                             NETSNMP_INTERFACE_FLAGS_HAS_DROPS |
+                             NETSNMP_INTERFACE_FLAGS_HAS_MCAST_PKTS;
+ 
++#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC
++        if (timespeccmp(&ifp->ifm_data.ifi_lastchange, &startspec, >)) {
++#else
+         if (timercmp(&ifp->ifm_data.ifi_lastchange, &starttime, >)) {
++#endif
+             entry->lastchange = (ifp->ifm_data.ifi_lastchange.tv_sec -
+                                  starttime.tv_sec) * 100;
+             entry->ns_flags |= NETSNMP_INTERFACE_FLAGS_HAS_LASTCHANGE;
+@@ -502,7 +511,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
+ 
+         CONTAINER_INSERT(container, entry);
+         DEBUGMSGTL(("access:interface:container:sysctl",
+-                    "created entry %d for %s\n", entry->index, entry->name));
++                    "created entry %d for %s\n", (int)entry->index, entry->name));
+     } /* for (each interface entry) */
+ 
+     /* pass 2: walk addresses */
+diff --git a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
+index e82c2fd..6434b46 100644
+--- a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
++++ b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
+@@ -2021,7 +2021,7 @@ _ifXTable_container_row_restore(const char *token, char *buf)
+     }
+     rowreq_ctx = (ifXTable_rowreq_ctx*)CONTAINER_FIND(container, &index);
+     if (NULL == rowreq_ctx) {
+-        snmp_log(LOG_ERR, "error finding row index in "
++        snmp_log(LOG_DEBUG, "error finding row index in "
+                  "_ifXTable_container_row_restore\n");
+         return;
+     }
+diff --git a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
+index d620834..926ccb7 100644
+--- a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
++++ b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
+@@ -103,8 +103,7 @@ _load_ipv4(netsnmp_container* container, u_long *index )
+         /*
+          * temporary null terminated name
+          */
+-        strncpy(name, rtent_name, sizeof(name));
+-        name[ sizeof(name)-1 ] = 0;
++        strlcpy(name, rtent_name, sizeof(name));
+ 
+         /*
+          * don't bother to try and get the ifindex for routes with
+diff --git a/agent/mibgroup/ip-mib/data_access/arp_netlink.c b/agent/mibgroup/ip-mib/data_access/arp_netlink.c
+index 01a535a..2059c23 100644
+--- a/agent/mibgroup/ip-mib/data_access/arp_netlink.c
++++ b/agent/mibgroup/ip-mib/data_access/arp_netlink.c
+@@ -43,7 +43,7 @@ netsnmp_access_arp_create(u_int init_flags,
+     if (cache_timeout != NULL)
+         *cache_timeout = 5;
+     if (cache_flags != NULL)
+-        *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE;
++        *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD;
+     access->cache_expired = cache_expired;
+ 
+     DEBUGMSGTL(("access:netlink:arp", "create arp cache\n"));
+@@ -131,6 +131,7 @@ int netsnmp_access_arp_unload(netsnmp_arp_access *access)
+          unregister_readfd(fd);
+          close(fd);
+          access->arch_magic = NULL;
++	 access->synchronized = 0;
+     }
+     return 0;
+ }
+diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
+index b4f7e3a..ba145cb 100644
+--- a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
++++ b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
+@@ -230,7 +230,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container,
+         /* restore the interface name if we modifed it due to unaliasing
+          * above
+          */
+-        if (entry->flags | NETSNMP_ACCESS_IPADDRESS_ISALIAS) {
++        if (entry->flags & NETSNMP_ACCESS_IPADDRESS_ISALIAS) {
+             memcpy(ifrp->ifr_name, extras->name, sizeof(extras->name));
+         }
+ 
+@@ -242,7 +242,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container,
+         addr_info = netsnmp_access_other_info_get(entry->if_index, AF_INET);
+         if(addr_info.bcastflg) {
+            bcastentry = netsnmp_access_ipaddress_entry_create();
+-           if(NULL == entry) {
++           if(NULL == bcastentry) {
+               rc = -3;
+               break;
+            }
+@@ -491,11 +491,10 @@ _netsnmp_ioctl_ipaddress_set_v4(netsnmp_ipaddress_entry * entry)
+         alias_idx = _next_alias(name);
+         snprintf(ifrq.ifr_name,sizeof(ifrq.ifr_name), "%s:%d",
+                  name, alias_idx);
++        ifrq.ifr_name[sizeof(ifrq.ifr_name) - 1] = 0;
+     }
+     else
+-        strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
+-
+-    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
+ 
+     sin = (struct sockaddr_in*)&ifrq.ifr_addr;
+     sin->sin_family = AF_INET;
+@@ -543,8 +542,7 @@ _netsnmp_ioctl_ipaddress_delete_v4(netsnmp_ipaddress_entry * entry)
+ 
+     memset(&ifrq, 0, sizeof(ifrq));
+ 
+-    strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
+-    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++    strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
+ 
+     ifrq.ifr_flags = 0;
+ 
+diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
+index 1a7d169..e2485e3 100644
+--- a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
++++ b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
+@@ -191,7 +191,7 @@ _load_v4(netsnmp_container *container, int idx_offset)
+ 
+         entry->ns_ia_index = ++idx_offset;
+ 
+-        DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", 
++        DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", 
+                     entry->if_index, entry->ia_address_len));
+ 
+         if (CONTAINER_INSERT(container, entry) < 0) {
+@@ -276,7 +276,7 @@ _load_v6(netsnmp_container *container, int idx_offset)
+ 
+         entry->ns_ia_index = ++idx_offset;
+         
+-        DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", 
++        DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", 
+                     entry->if_index, entry->ia_address_len));
+ 
+         if (CONTAINER_INSERT(container, entry) < 0) {
+diff --git a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
+index 61a4855..717fc17 100644
+--- a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
++++ b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
+@@ -356,7 +356,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin)
+     char            line[1024];
+     char           *stats, *start = line;
+     int             len, rc;
+-    int             scan_count;
+     uintmax_t       scan_val;
+ 
+     /*
+@@ -516,8 +515,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin)
+         
+         if (rc)
+             DEBUGMSGTL(("access:systemstats", "unknown stat %s\n", line));
+-        else
+-            ++scan_count;
+     }
+     /*
+      * Let DiscontinuityTime and RefreshRate active
+diff --git a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
+index dd39b07..4437829 100644
+--- a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
++++ b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
+@@ -287,6 +287,7 @@ ipAddressPrefixTable_container_load(netsnmp_container *container)
+                      "error setting index while loading "
+                      "ipAddressPrefixTable data.\n");
+             ipAddressPrefixTable_release_rowreq_ctx(rowreq_ctx);
++            rowreq_ctx = NULL;
+             continue;
+         }
+ 
+diff --git a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
+index 84a98ff..c9e14ff 100644
+--- a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
++++ b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
+@@ -138,7 +138,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+              * yes.
+              */
+             DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
+-                        "inserted row for %d\n", entry->index));
++                        "inserted row for %" NETSNMP_PRIo "d\n", entry->index));
+             CONTAINER_INSERT(c, ift_rrc);
+             changed = 1;
+         }
+@@ -152,7 +152,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+              * no
+              */
+             DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
+-                        "removed  row for %d\n",
++                        "removed  row for %" NETSNMP_PRIo "d\n",
+                         ift_rrc->data.ifentry->index));
+             CONTAINER_REMOVE(c, ift_rrc);
+             changed = 1;
+@@ -164,7 +164,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+                  ift_rrc->data.ifentry->retransmit_v4) ||
+                 (entry->reasm_max_v4 != ift_rrc->data.ifentry->reasm_max_v4)) {
+                 DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
+-                            "row changed for %d\n",
++                            "row changed for %" NETSNMP_PRIo "d\n",
+                             ift_rrc->data.ifentry->index));
+                 changed = 1;
+             }
+diff --git a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
+index ef7d533..33c65a9 100644
+--- a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
++++ b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
+@@ -138,7 +138,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+              * yes.
+              */
+             DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
+-                        "inserted row for index %d\n", entry->index));
++                        "inserted row for index %" NETSNMP_PRIo "d\n", entry->index));
+             CONTAINER_INSERT(c, ift_rrc);
+             changed = 1;
+         }
+@@ -152,7 +152,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+              * no
+              */
+             DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
+-                        "removed  row for index %d\n",
++                        "removed  row for index %" NETSNMP_PRIo "d\n",
+                         ift_rrc->data.ifentry->index));
+             CONTAINER_REMOVE(c, ift_rrc);
+             changed = 1;
+@@ -190,7 +190,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
+                     && (entry->forwarding_v6 !=
+                         ift_rrc->data.ifentry->forwarding_v6))) {
+                 DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
+-                            "row changed for index %d\n",
++                            "row changed for index %" NETSNMP_PRIo "d\n",
+                             ift_rrc->data.ifentry->index));
+                 changed = 1;
+             }
+diff --git a/agent/mibgroup/kernel_sunos5.c b/agent/mibgroup/kernel_sunos5.c
+index 984fc77..9ee0284 100644
+--- a/agent/mibgroup/kernel_sunos5.c
++++ b/agent/mibgroup/kernel_sunos5.c
+@@ -469,8 +469,7 @@ getKstat(const char *statname, const char *varname, void *value)
+ 	    case KSTAT_DATA_CHAR:
+ 		DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c));
+ 		*(char **)v = buf;
+-		buf[sizeof(buf)-1] = 0;
+-		strncpy(buf, d->value.c, sizeof(buf)-1);
++		strlcpy(buf, d->value.c, sizeof(buf));
+ 		break;
+ #ifdef KSTAT_DATA_INT32         /* Solaris 2.6 and up */
+ 	    case KSTAT_DATA_INT32:
+@@ -623,8 +622,7 @@ getKstatString(const char *statname, const char *varname,
+         if (strcmp(d->name, varname) == 0) {
+             switch (d->data_type) {
+             case KSTAT_DATA_CHAR:
+-                value[value_len-1] = '\0';
+-                strncpy(value, d->value.c, value_len-1); 
++                strlcpy(value, d->value.c, value_len);
+                 DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c));
+                 break;
+             default:
+diff --git a/agent/mibgroup/mibII/icmp.c b/agent/mibgroup/mibII/icmp.c
+index 977effa..429fa0b 100644
+--- a/agent/mibgroup/mibII/icmp.c
++++ b/agent/mibgroup/mibII/icmp.c
+@@ -456,9 +456,11 @@ icmp_msg_stats_first_entry(void **loop_context,
+ void
+ init_icmp(void)
+ {
+-    netsnmp_handler_registration *reginfo;
++    netsnmp_handler_registration *scalar_reginfo = NULL;
++    int rc;
+ #ifdef linux
+-    netsnmp_handler_registration *msg_stats_reginfo;
++    netsnmp_handler_registration *msg_stats_reginfo = NULL;
++    netsnmp_handler_registration *table_reginfo = NULL;
+     netsnmp_iterator_info *iinfo;
+     netsnmp_iterator_info *msg_stats_iinfo;
+     netsnmp_table_registration_info *table_info;
+@@ -469,15 +471,17 @@ init_icmp(void)
+      * register ourselves with the agent as a group of scalars...
+      */
+     DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n"));
+-    reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
++    scalar_reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
+ 		    icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
++    rc = netsnmp_register_scalar_group(scalar_reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+     /*
+      * .... with a local cache
+      *    (except for HP-UX 11, which extracts objects individually)
+      */
+ #ifndef hpux11
+-    netsnmp_inject_handler( reginfo,
++    netsnmp_inject_handler( scalar_reginfo,
+ 		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+ 			   		icmp_load, icmp_free,
+ 					icmp_oid, OID_LENGTH(icmp_oid)));
+@@ -485,63 +489,64 @@ init_icmp(void)
+ #ifdef linux
+ 
+     /* register icmpStatsTable */
+-    reginfo = netsnmp_create_handler_registration("icmpStatsTable",
+-		icmp_stats_table_handler, icmp_stats_tbl_oid,
+-		OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
+-
+     table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+-    if (!table_info) {
+-        return;
+-    }
+-
++    if (!table_info)
++        goto bail;
+     netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0);
+     table_info->min_column = ICMP_STAT_INMSG;
+     table_info->max_column = ICMP_STAT_OUTERR;
+ 
+ 
+     iinfo      = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
+-    if (!iinfo) {
+-        return;
+-    }
++    if (!iinfo)
++        goto bail;
+     iinfo->get_first_data_point = icmp_stats_first_entry;
+     iinfo->get_next_data_point  = icmp_stats_next_entry;
+     iinfo->table_reginfo        = table_info;
+ 
+-    netsnmp_register_table_iterator2(reginfo, iinfo);
+-
+-    /* register icmpMsgStatsTable */
+-    msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
+-            icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
+-            OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
++    table_reginfo = netsnmp_create_handler_registration("icmpStatsTable",
++		icmp_stats_table_handler, icmp_stats_tbl_oid,
++		OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
+ 
+-    msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+-    if (!msg_stats_table_info) {
+-        return;
++    rc = netsnmp_register_table_iterator2(table_reginfo, iinfo);
++    if (rc != SNMPERR_SUCCESS) {
++        table_reginfo = NULL;
++        goto bail;
+     }
++    netsnmp_inject_handler( table_reginfo,
++		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
++			   		icmp_load, icmp_free,
++					icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
+ 
++    /* register icmpMsgStatsTable */
++    msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
++    if (!msg_stats_table_info)
++        goto bail;
+     netsnmp_table_helper_add_indexes(msg_stats_table_info, ASN_INTEGER, ASN_INTEGER, 0);
+     msg_stats_table_info->min_column = ICMP_MSG_STAT_IN_PKTS;
+     msg_stats_table_info->max_column = ICMP_MSG_STAT_OUT_PKTS;
+ 
+     msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
+-    if (!msg_stats_iinfo) {
+-        return;
+-    }
++    if (!msg_stats_iinfo)
++        goto bail;
+     msg_stats_iinfo->get_first_data_point = icmp_msg_stats_first_entry;
+     msg_stats_iinfo->get_next_data_point  = icmp_msg_stats_next_entry;
+     msg_stats_iinfo->table_reginfo        = msg_stats_table_info;
+ 
+-    netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
++    msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
++            icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
++            OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
++
++    rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
++    if (rc != SNMPERR_SUCCESS) {
++        msg_stats_reginfo = NULL;
++        goto bail;
++    }
++
+     netsnmp_inject_handler( msg_stats_reginfo,
+             netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+                 icmp_load, icmp_free,
+                 icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid)));
+-#ifndef hpux11
+-    netsnmp_inject_handler( reginfo,
+-		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+-			   		icmp_load, icmp_free,
+-					icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
+-#endif /* ! hpux11 */
+ #endif /* linux */
+ 
+ #ifdef USING_MIBII_IP_MODULE
+@@ -558,6 +563,17 @@ init_icmp(void)
+     init_kernel_sunos5();
+ #endif
+ #endif
++    return;
++
++#ifdef linux
++bail:
++    if (scalar_reginfo)
++        netsnmp_unregister_handler(scalar_reginfo);
++    if (table_reginfo)
++        netsnmp_unregister_handler(table_reginfo);
++    if (msg_stats_reginfo)
++        netsnmp_unregister_handler(msg_stats_reginfo);
++#endif
+ }
+ 
+ 
+diff --git a/agent/mibgroup/mibII/interfaces.c b/agent/mibgroup/mibII/interfaces.c
+index 08c2a85..41d7287 100644
+--- a/agent/mibgroup/mibII/interfaces.c
++++ b/agent/mibgroup/mibII/interfaces.c
+@@ -463,10 +463,8 @@ Interface_Scan_By_Index(int iindex,
+                     a = get_address(ifp + 1, ifp->ifm_addrs, RTA_IFP);
+                     if (a == NULL)
+                         return 0;
+-                    strncpy(if_name,
+-                            ((const struct sockaddr_in *) a)->sin_zero,
+-                            ((const u_char *) a)[5]);
+-                    if_name[((const u_char *) a)[5]] = 0;
++                    sprintf(if_name, "%.*s", ((const u_char *) a)[5],
++                            ((const struct sockaddr_in *) a)->sin_zero);
+                     *if_msg = *ifp;
+                     ++have_ifinfo;
+                 }
+@@ -1603,8 +1601,7 @@ Interface_Scan_Init(void)
+         }
+ 
+         *stats   = 0;
+-        strncpy(ifname_buf, ifstart, sizeof(ifname_buf));
+-        ifname_buf[ sizeof(ifname_buf)-1 ] = 0;
++        strlcpy(ifname_buf, ifstart, sizeof(ifname_buf));
+         *stats++ = ':';
+         while (*stats == ' ')
+             stats++;
+@@ -1671,31 +1668,27 @@ Interface_Scan_Init(void)
+         nnew->if_unit = strdup(*ptr ? ptr : "");
+         *ptr = 0;
+ 
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         if (ioctl(fd, SIOCGIFADDR, &ifrq) < 0)
+             memset((char *) &nnew->if_addr, 0, sizeof(nnew->if_addr));
+         else
+             nnew->if_addr = ifrq.ifr_addr;
+ 
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         if (ioctl(fd, SIOCGIFBRDADDR, &ifrq) < 0)
+             memset((char *) &nnew->ifu_broadaddr, 0,
+                    sizeof(nnew->ifu_broadaddr));
+         else
+             nnew->ifu_broadaddr = ifrq.ifr_broadaddr;
+ 
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         if (ioctl(fd, SIOCGIFNETMASK, &ifrq) < 0)
+             memset((char *) &nnew->ia_subnetmask, 0,
+                    sizeof(nnew->ia_subnetmask));
+         else
+             nnew->ia_subnetmask = ifrq.ifr_netmask;
+ 
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         nnew->if_flags = ioctl(fd, SIOCGIFFLAGS, &ifrq) < 0
+             ? 0 : ifrq.ifr_flags;
+ 
+@@ -1707,8 +1700,7 @@ Interface_Scan_Init(void)
+          * 4 bytes of sa_data.
+          */
+         memset(ifrq.ifr_hwaddr.sa_data, (0), IFHWADDRLEN);
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         if (ioctl(fd, SIOCGIFHWADDR, &ifrq) < 0)
+             memset(nnew->if_hwaddr, (0), IFHWADDRLEN);
+         else {
+@@ -1765,14 +1757,12 @@ Interface_Scan_Init(void)
+ #endif
+         }
+ 
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         nnew->if_metric = ioctl(fd, SIOCGIFMETRIC, &ifrq) < 0
+             ? 0 : ifrq.ifr_metric;
+ 
+ #ifdef SIOCGIFMTU
+-        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+-        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
++        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
+         nnew->if_mtu = (ioctl(fd, SIOCGIFMTU, &ifrq) < 0)
+             ? 0 : ifrq.ifr_mtu;
+ #else
+@@ -1882,14 +1872,13 @@ Interface_Scan_Next(short *Index,
+         }
+ #else
+         ifnet = *ifnetaddr;
+-        strncpy(saveName, ifnet.if_name, sizeof(saveName));
++        strlcpy(saveName, ifnet.if_name, sizeof(saveName));
+ #endif
+ 
+         saveName[sizeof(saveName) - 1] = '\0';
+         cp = (char *) strchr(saveName, '\0');
+ #ifdef linux
+-        strncat(cp, ifnet.if_unit, sizeof(saveName)-strlen(saveName)-1);
+-        saveName[sizeof(saveName) - 1] = '\0';
++        strlcat(saveName, ifnet.if_unit, sizeof(saveName));
+ #else
+ #ifdef NETSNMP_FEATURE_CHECKIN
+         /* this exists here just so we don't copy ifdef logic elsewhere */
+@@ -2000,7 +1989,7 @@ Interface_Scan_Next(short *Index,
+         }
+ #if HAVE_STRUCT_IFNET_IF_XNAME
+ #if defined(netbsd1) || defined(openbsd2)
+-        strncpy(saveName, ifnet.if_xname, sizeof saveName);
++        strlcpy(saveName, ifnet.if_xname, sizeof(saveName));
+ #else
+         if (!NETSNMP_KLOOKUP(ifnet.if_xname, (char *) saveName, sizeof saveName)) {
+             DEBUGMSGTL(("mibII/interfaces:Interface_Scan_Next", "klookup failed\n"));
+diff --git a/agent/mibgroup/mibII/ip.c b/agent/mibgroup/mibII/ip.c
+index 56de408..40b5d2f 100644
+--- a/agent/mibgroup/mibII/ip.c
++++ b/agent/mibgroup/mibII/ip.c
+@@ -151,6 +151,7 @@ void
+ init_ip(void)
+ {
+     netsnmp_handler_registration *reginfo;
++    int rc;
+ 
+     /*
+      * register ourselves with the agent as a group of scalars...
+@@ -158,7 +159,9 @@ init_ip(void)
+     DEBUGMSGTL(("mibII/ip", "Initialising IP group\n"));
+     reginfo = netsnmp_create_handler_registration("ip", ip_handler,
+                             ip_oid, OID_LENGTH(ip_oid), HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS);
++    rc = netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+ 
+     /*
+      * .... with a local cache
+diff --git a/agent/mibgroup/mibII/ipv6.c b/agent/mibgroup/mibII/ipv6.c
+index a372ca4..5714647 100644
+--- a/agent/mibgroup/mibII/ipv6.c
++++ b/agent/mibgroup/mibII/ipv6.c
+@@ -817,8 +817,7 @@ var_ifv6Entry(register struct variable * vp,
+ 
+             memset(&ifr, 0, sizeof(ifr));
+             ifr.ifr_addr.sa_family = AF_INET6;
+-            strncpy(ifr.ifr_name, if_getname(interface),
+-                    sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
+             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) {
+@@ -1019,8 +1018,7 @@ var_ifv6Entry(register struct variable * vp,
+             int             s;
+ 
+             memset(&ifr, 0, sizeof(ifr));
+-            strncpy(ifr.ifr_name, if_getname(interface),
+-                    sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
+             if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFSTAT_IN6, (caddr_t) & ifr) < 0) {
+@@ -1176,8 +1174,7 @@ var_icmpv6Entry(register struct variable * vp,
+             int             s;
+ 
+             memset(&ifr, 0, sizeof(ifr));
+-            strncpy(ifr.ifr_name, if_getname(interface),
+-                    sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
+             if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFSTAT_ICMP6, (caddr_t) & ifr) < 0) {
+@@ -2101,7 +2098,7 @@ var_ifv6Entry(register struct variable * vp,
+                 break;
+             memset(&ifr, 0, sizeof(ifr));
+             ifr.ifr_addr.sa_family = AF_INET6;
+-            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
+             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) {
+@@ -2121,7 +2118,7 @@ var_ifv6Entry(register struct variable * vp,
+                 break;
+             memset(&ifr, 0, sizeof(ifr));
+             ifr.ifr_addr.sa_family = AF_INET6;
+-            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
+             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
+@@ -2150,7 +2147,7 @@ var_ifv6Entry(register struct variable * vp,
+                 break;
+             memset(&ifr, 0, sizeof(ifr));
+             ifr.ifr_addr.sa_family = AF_INET6;
+-            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
++            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
+             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
+                 break;
+             if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
+diff --git a/agent/mibgroup/mibII/kernel_linux.c b/agent/mibgroup/mibII/kernel_linux.c
+index dfa0b2b..b21a166 100644
+--- a/agent/mibgroup/mibII/kernel_linux.c
++++ b/agent/mibgroup/mibII/kernel_linux.c
+@@ -66,8 +66,8 @@ decode_icmp_msg(char *line, char *data, struct icmp4_msg_mib *msg)
+      * getting modified. So we take a local copy for this purpose even though
+      * its expensive.
+      */
+-    strncpy(line_cpy, line, sizeof(line_cpy));
+-    strncpy(data_cpy, data, sizeof(data_cpy));
++    strlcpy(line_cpy, line, sizeof(line_cpy));
++    strlcpy(data_cpy, data, sizeof(data_cpy));
+ 
+     lineptr = line_cpy;
+     dataptr = data_cpy;
+diff --git a/agent/mibgroup/mibII/kernel_netbsd.c b/agent/mibgroup/mibII/kernel_netbsd.c
+index 7f0a690..93f38b7 100644
+--- a/agent/mibgroup/mibII/kernel_netbsd.c
++++ b/agent/mibgroup/mibII/kernel_netbsd.c
+@@ -32,8 +32,8 @@
+ int
+ netbsd_read_icmp_stat(struct icmp_mib *mib)
+ {
+-    size_t   size;
+     uint64_t icmpstat[ICMP_NSTATS];
++    size_t   size = sizeof(icmpstat);
+     int      i;
+ 
+     (void)memset(mib, 0, sizeof(*mib));
+@@ -89,8 +89,8 @@ netbsd_read_icmp_stat(struct icmp_mib *mib)
+ int
+ netbsd_read_ip_stat(struct ip_mib *mib)
+ {
+-    size_t   size;
+     uint64_t ipstat[IP_NSTATS];
++    size_t   size = sizeof(ipstat);
+     int      i;
+     static   int sname[4] = { 4, 2, 0, 0 }; /* CTL_NET, PF_INET, IPPROTO_IP, 0 */
+     size_t   len;
+@@ -141,8 +141,8 @@ netbsd_read_ip_stat(struct ip_mib *mib)
+ int
+ netbsd_read_tcp_stat(struct tcp_mib *mib)
+ {
+-    size_t   size;
+     uint64_t tcpstat[TCP_NSTATS];
++    size_t   size = sizeof(tcpstat);
+ 
+     (void)memset(mib, 0, sizeof(*mib));
+ 
+@@ -177,8 +177,8 @@ netbsd_read_tcp_stat(struct tcp_mib *mib)
+ int
+ netbsd_read_udp_stat(struct udp_mib *mib)
+ {
+-    size_t   size;
+     uint64_t udpstat[UDP_NSTATS];
++    size_t   size = sizeof(udpstat);
+ 
+     (void)memset(mib, 0, sizeof(*mib));
+ 
+diff --git a/agent/mibgroup/mibII/mta_sendmail.c b/agent/mibgroup/mibII/mta_sendmail.c
+index 79a5182..00397d3 100644
+--- a/agent/mibgroup/mibII/mta_sendmail.c
++++ b/agent/mibgroup/mibII/mta_sendmail.c
+@@ -853,8 +853,7 @@ read_sendmailcf(BOOL config)
+                 }
+ 
+                 if (strncasecmp(line + 2, "StatusFile", 10) == 0) {
+-                    strncpy(sendmailst_fn, filename, sizeof(sendmailst_fn));
+-                    sendmailst_fn[ sizeof(sendmailst_fn)-1 ] = 0;
++                    strlcpy(sendmailst_fn, filename, sizeof(sendmailst_fn));
+                     found_sendmailst = TRUE;
+                     DEBUGMSGTL(("mibII/mta_sendmail.c:read_sendmailcf",
+                                 "found statatistics file \"%s\"\n",
+@@ -975,11 +974,7 @@ read_sendmailcf(BOOL config)
+         linenr++;
+     }
+ 
+-    for (i = 0; i < 10 && fclose(sendmailcf_fp) != 0; i++) {
+-        /*
+-         * nothing to do 
+-         */
+-    }
++    fclose(sendmailcf_fp);
+ 
+     for (i = mailers; i < MAXMAILERS; i++) {
+         mailernames[i][0] = '\0';
+diff --git a/agent/mibgroup/mibII/route_write.c b/agent/mibgroup/mibII/route_write.c
+index b2e941b..5820ee1 100644
+--- a/agent/mibgroup/mibII/route_write.c
++++ b/agent/mibgroup/mibII/route_write.c
+@@ -434,11 +434,6 @@ write_rte(int action,
+ 
+             memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len);
+ 
+-            if (var_val_type != ASN_IPADDRESS) {
+-                snmp_log(LOG_ERR, "not IP address 2");
+-                return SNMP_ERR_WRONGTYPE;
+-            }
+-
+             rp->xx_dst = *((u_long *) buf);
+ 
+ 
+@@ -509,16 +504,12 @@ write_rte(int action,
+ 
+             memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len);
+ 
+-            if (var_val_type != ASN_IPADDRESS) {
+-                snmp_log(LOG_ERR, "not right5");
+-                return SNMP_ERR_WRONGTYPE;
+-            }
+-
+             rp->xx_nextIR = *((u_long *) buf);
+ 
+         } else if (action == COMMIT) {
+             rp->rt_nextIR = rp->xx_nextIR;
+         }
++	break;
+ 
+ 
+     case IPROUTETYPE:
+diff --git a/agent/mibgroup/mibII/system_mib.c b/agent/mibgroup/mibII/system_mib.c
+index 7ca1227..65b0b7c 100644
+--- a/agent/mibgroup/mibII/system_mib.c
++++ b/agent/mibgroup/mibII/system_mib.c
+@@ -262,9 +262,9 @@ init_system_mib(void)
+     extmp.type = EXECPROC;
+     extmp.next = NULL;
+     exec_command(&extmp);
+-    strncpy(version_descr, extmp.output, sizeof(version_descr));
+-    version_descr[sizeof(version_descr) - 1] = 0;
+-    version_descr[strlen(version_descr) - 1] = 0;       /* chomp new line */
++    strlcpy(version_descr, extmp.output, sizeof(version_descr));
++    if (strlen(version_descr) >= 1)
++        version_descr[strlen(version_descr) - 1] = 0; /* chomp new line */
+ #else
+ #if (defined (WIN32) && defined (HAVE_WIN32_PLATFORM_SDK)) || defined (mingw32)
+     windowsOSVersionString(version_descr, sizeof(version_descr));
+@@ -278,7 +278,7 @@ init_system_mib(void)
+     gethostname(sysName, sizeof(sysName));
+ #else
+ #ifdef HAVE_UNAME
+-    strncpy(sysName, utsName.nodename, sizeof(sysName));
++    strlcpy(sysName, utsName.nodename, sizeof(sysName));
+ #else
+ #if defined (HAVE_EXECV) && !defined (mingw32)
+     sprintf(extmp.command, "%s -n", UNAMEPROG);
+@@ -288,8 +288,9 @@ init_system_mib(void)
+     extmp.type = EXECPROC;
+     extmp.next = NULL;
+     exec_command(&extmp);
+-    strncpy(sysName, extmp.output, sizeof(sysName));
+-    sysName[strlen(sysName) - 1] = 0;   /* chomp new line */
++    strlcpy(sysName, extmp.output, sizeof(sysName));
++    if (strlen(sysName) >= 1)
++        sysName[strlen(sysName) - 1] = 0; /* chomp new line */
+ #else
+     strcpy(sysName, "unknown");
+ #endif                          /* HAVE_EXECV */
+diff --git a/agent/mibgroup/mibII/tcp.c b/agent/mibgroup/mibII/tcp.c
+index d68e699..3c79fad 100644
+--- a/agent/mibgroup/mibII/tcp.c
++++ b/agent/mibgroup/mibII/tcp.c
+@@ -113,6 +113,7 @@ void
+ init_tcp(void)
+ {
+     netsnmp_handler_registration *reginfo;
++    int rc;
+ 
+     /*
+      * register ourselves with the agent as a group of scalars...
+@@ -120,7 +121,9 @@ init_tcp(void)
+     DEBUGMSGTL(("mibII/tcpScalar", "Initialising TCP scalar group\n"));
+     reginfo = netsnmp_create_handler_registration("tcp", tcp_handler,
+ 		    tcp_oid, OID_LENGTH(tcp_oid), HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS);
++    rc = netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+ 
+     /*
+      * .... with a local cache
+diff --git a/agent/mibgroup/mibII/tcpTable.c b/agent/mibgroup/mibII/tcpTable.c
+index 01d00e5..088dd06 100644
+--- a/agent/mibgroup/mibII/tcpTable.c
++++ b/agent/mibgroup/mibII/tcpTable.c
+@@ -147,6 +147,7 @@ init_tcpTable(void)
+     netsnmp_table_registration_info *table_info;
+     netsnmp_iterator_info           *iinfo;
+     netsnmp_handler_registration    *reginfo;
++    int                              rc;
+ 
+     DEBUGMSGTL(("mibII/tcpTable", "Initialising TCP Table\n"));
+     /*
+@@ -186,7 +187,9 @@ init_tcpTable(void)
+             tcpTable_handler,
+             tcpTable_oid, OID_LENGTH(tcpTable_oid),
+             HANDLER_CAN_RONLY),
+-    netsnmp_register_table_iterator2(reginfo, iinfo);
++    rc = netsnmp_register_table_iterator2(reginfo, iinfo);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+ 
+     /*
+      * .... with a local cache
+diff --git a/agent/mibgroup/mibII/udp.c b/agent/mibgroup/mibII/udp.c
+index 8d2654d..1ddcbc5 100644
+--- a/agent/mibgroup/mibII/udp.c
++++ b/agent/mibgroup/mibII/udp.c
+@@ -74,6 +74,7 @@ void
+ init_udp(void)
+ {
+     netsnmp_handler_registration *reginfo;
++    int rc;
+ 
+     /*
+      * register ourselves with the agent as a group of scalars...
+@@ -81,7 +82,9 @@ init_udp(void)
+     DEBUGMSGTL(("mibII/udpScalar", "Initialising UDP scalar group\n"));
+     reginfo = netsnmp_create_handler_registration("udp", udp_handler,
+ 		    udp_oid, OID_LENGTH(udp_oid), HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS);
++    rc = netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+ 
+     /*
+      * .... with a local cache
+diff --git a/agent/mibgroup/mibII/udpTable.c b/agent/mibgroup/mibII/udpTable.c
+index 162de1b..64f6dfb 100644
+--- a/agent/mibgroup/mibII/udpTable.c
++++ b/agent/mibgroup/mibII/udpTable.c
+@@ -129,6 +129,7 @@ init_udpTable(void)
+     netsnmp_table_registration_info *table_info;
+     netsnmp_iterator_info           *iinfo;
+     netsnmp_handler_registration    *reginfo;
++    int                              rc;
+ 
+     DEBUGMSGTL(("mibII/udpTable", "Initialising UDP Table\n"));
+     /*
+@@ -166,7 +167,9 @@ init_udpTable(void)
+             udpTable_handler,
+             udpTable_oid, OID_LENGTH(udpTable_oid),
+             HANDLER_CAN_RONLY),
+-    netsnmp_register_table_iterator2(reginfo, iinfo);
++    rc = netsnmp_register_table_iterator2(reginfo, iinfo);
++    if (rc != SNMPERR_SUCCESS)
++        return;
+ 
+     /*
+      * .... with a local cache
+@@ -496,6 +499,7 @@ udpTable_load(netsnmp_cache *cache, void *vmagic)
+         if (state != 7)         /* fix me:  UDP_LISTEN ??? */
+             continue;
+ 
++        memset(&pcb, 0, sizeof(pcb));
+         /* store in network byte order */
+         pcb.inp_laddr.s_addr = htonl(pcb.inp_laddr.s_addr);
+         pcb.inp_lport = htons((unsigned short) (lport));
+diff --git a/agent/mibgroup/mibII/vacm_conf.c b/agent/mibgroup/mibII/vacm_conf.c
+index f62c6cc..f2faf86 100644
+--- a/agent/mibgroup/mibII/vacm_conf.c
++++ b/agent/mibgroup/mibII/vacm_conf.c
+@@ -201,8 +201,7 @@ vacm_parse_group(const char *token, char *param)
+         config_perror("failed to create group entry");
+         return;
+     }
+-    strncpy(gp->groupName, group, sizeof(gp->groupName));
+-    gp->groupName[ sizeof(gp->groupName)-1 ] = 0;
++    strlcpy(gp->groupName, group, sizeof(gp->groupName));
+     gp->storageType = SNMP_STORAGE_PERMANENT;
+     gp->status = SNMP_ROW_ACTIVE;
+     free(gp->reserved);
+@@ -542,10 +541,6 @@ vacm_parse_setaccess(const char *token, char *param)
+         config_perror("failed to create access entry");
+         return;
+     }
+-    if (!ap) {
+-        config_perror("failed to create access entry");
+-        return;
+-    }
+ 
+     strcpy(ap->views[viewnum], viewval);
+     ap->contextMatch = iprefix;
+@@ -990,11 +985,9 @@ vacm_create_simple(const char *token, char *confline,
+             sprintf(viewname,"viewUSM%d",commcount);
+         }
+         if ( strcmp( token, "authgroup" ) == 0 ) {
+-            strncpy(grpname, community, sizeof(grpname));
+-            grpname[ sizeof(grpname)-1 ] = 0;
++            strlcpy(grpname, community, sizeof(grpname));
+         } else {
+-            strncpy(secname, community, sizeof(secname));
+-            secname[ sizeof(secname)-1 ] = 0;
++            strlcpy(secname, community, sizeof(secname));
+ 
+             /*
+              * sec->group mapping 
+@@ -1419,7 +1412,7 @@ vacm_check_view_contents(netsnmp_pdu *pdu, oid * name, size_t namelen,
+      * NULL termination of the pdu field is ugly here.  Do in PDU parsing? 
+      */
+     if (pdu->contextName)
+-        strncpy(contextNameIndex, pdu->contextName, pdu->contextNameLen);
++        memcpy(contextNameIndex, pdu->contextName, pdu->contextNameLen);
+     else
+         contextNameIndex[0] = '\0';
+ 
+diff --git a/agent/mibgroup/mibII/vacm_vars.c b/agent/mibgroup/mibII/vacm_vars.c
+index 7860573..85cef94 100644
+--- a/agent/mibgroup/mibII/vacm_vars.c
++++ b/agent/mibgroup/mibII/vacm_vars.c
+@@ -1084,7 +1084,7 @@ write_vacmAccessStatus(int action,
+ {
+     static long     long_ret;
+     int             model, level;
+-    char           *newGroupName, *newContextPrefix;
++    char           *newGroupName = NULL, *newContextPrefix = NULL;
+     size_t          groupNameLen, contextPrefixLen;
+     struct vacm_accessEntry *aptr = NULL;
+ 
+diff --git a/agent/mibgroup/mibII/var_route.c b/agent/mibgroup/mibII/var_route.c
+index b5daed0..8488019 100644
+--- a/agent/mibgroup/mibII/var_route.c
++++ b/agent/mibgroup/mibII/var_route.c
+@@ -919,7 +919,7 @@ load_rtentries(struct radix_node *pt)
+             }
+ #if HAVE_STRUCT_IFNET_IF_XNAME
+ #if defined(netbsd1) || defined(openbsd2)
+-            strncpy(name, ifnet.if_xname, sizeof name);
++            strlcpy(name, ifnet.if_xname, sizeof(name));
+ #else
+             if (!NETSNMP_KLOOKUP(ifnet.if_xname, name, sizeof name)) {
+                 DEBUGMSGTL(("mibII/var_route", "klookup failed\n"));
+@@ -1366,8 +1366,7 @@ Route_Scan_Reload(void)
+                         &(((struct sockaddr_in *) &(rtent.rt_genmask))->sin_addr.s_addr)))
+             continue;
+ 
+-        strncpy(name, rt->rt_dev, sizeof(name));
+-        name[ sizeof(name)-1 ] = 0;
++        strlcpy(name, rt->rt_dev, sizeof(name));
+ 
+         rt->rt_flags = flags, rt->rt_refcnt = refcnt;
+         rt->rt_use = use, rt->rt_metric = metric;
+diff --git a/agent/mibgroup/notification-log-mib/notification_log.c b/agent/mibgroup/notification-log-mib/notification_log.c
+index 86efb34..a12a338 100644
+--- a/agent/mibgroup/notification-log-mib/notification_log.c
++++ b/agent/mibgroup/notification-log-mib/notification_log.c
+@@ -136,11 +136,9 @@ check_log_size(unsigned int clientreg, void *clientarg)
+     netsnmp_table_row *row;
+     netsnmp_table_data_set_storage *data;
+     u_long          count = 0;
+-    struct timeval  now;
+     u_long          uptime;
+ 
+-    gettimeofday(&now, NULL);
+-    uptime = netsnmp_timeval_uptime(&now);
++    uptime = netsnmp_get_agent_uptime();
+ 
+     if (!nlmLogTable || !nlmLogTable->table )  {
+         DEBUGMSGTL(("notification_log", "missing log table\n"));
+@@ -580,7 +578,6 @@ void
+ log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport)
+ {
+     long            tmpl;
+-    struct timeval  now;
+     netsnmp_table_row *row;
+ 
+     static u_long   default_num = 0;
+@@ -620,8 +617,7 @@ log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport)
+     /*
+      * add the data 
+      */
+-    gettimeofday(&now, NULL);
+-    tmpl = netsnmp_timeval_uptime(&now);
++    tmpl = netsnmp_get_agent_uptime();
+     netsnmp_set_row_column(row, COLUMN_NLMLOGTIME, ASN_TIMETICKS,
+                            &tmpl, sizeof(tmpl));
+     time(&timetnow);
+diff --git a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
+index ac7f2ab..b12cdc8 100644
+--- a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
++++ b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
+@@ -194,6 +194,7 @@ parse_snmpNotifyFilterProfileTable(const char *token, char *line)
+                               &StorageTmp->snmpNotifyFilterProfileNameLen);
+     if (StorageTmp->snmpNotifyFilterProfileName == NULL) {
+         config_perror("invalid specification for snmpNotifyFilterProfileName");
++        SNMP_FREE(StorageTmp);
+         return;
+     }
+ 
+diff --git a/agent/mibgroup/notification/snmpNotifyTable.c b/agent/mibgroup/notification/snmpNotifyTable.c
+index 649b19e..8d09c59 100644
+--- a/agent/mibgroup/notification/snmpNotifyTable.c
++++ b/agent/mibgroup/notification/snmpNotifyTable.c
+@@ -317,9 +317,15 @@ notifyTable_register_notifications(int major, int minor,
+     /*
+      * address 
+      */
++    t = snmp_sess_transport(snmp_sess_pointer(ss));
++    if (!t) {
++        snmp_log(LOG_ERR,
++                "Cannot add new trap destination, transport is closed.");
++        snmp_sess_close(ss);
++        return 0;
++    }
+     ptr = snmpTargetAddrTable_create();
+     ptr->name = strdup(buf);
+-    t = snmp_sess_transport(snmp_sess_pointer(ss));
+     memcpy(ptr->tDomain, t->domain, t->domain_length * sizeof(oid));
+     ptr->tDomainLen = t->domain_length;
+     ptr->tAddressLen = t->remote_length;
+@@ -346,8 +352,10 @@ notifyTable_register_notifications(int major, int minor,
+         pptr->secModel = ss->securityModel;
+         pptr->secLevel = ss->securityLevel;
+         pptr->secName = (char *) malloc(ss->securityNameLen + 1);
+-        if (pptr->secName == NULL)
++        if (pptr->secName == NULL) {
++            snmpTargetParamTable_dispose(pptr);
+             return 0;
++        }
+         memcpy((void *) pptr->secName, (void *) ss->securityName,
+                ss->securityNameLen);
+         pptr->secName[ss->securityNameLen] = 0;
+@@ -363,8 +371,10 @@ notifyTable_register_notifications(int major, int minor,
+         pptr->secName = NULL;
+         if (ss->community && (ss->community_len > 0)) {
+             pptr->secName = (char *) malloc(ss->community_len + 1);
+-            if (pptr->secName == NULL)
++            if (pptr->secName == NULL) {
++                snmpTargetParamTable_dispose(pptr);
+                 return 0;
++            }
+             memcpy((void *) pptr->secName, (void *) ss->community,
+                    ss->community_len);
+             pptr->secName[ss->community_len] = 0;
+@@ -573,6 +583,7 @@ parse_snmpNotifyTable(const char *token, char *line)
+                               &StorageTmp->snmpNotifyNameLen);
+     if (StorageTmp->snmpNotifyName == NULL) {
+         config_perror("invalid specification for snmpNotifyName");
++        SNMP_FREE(StorageTmp);
+         return;
+     }
+ 
+@@ -582,6 +593,7 @@ parse_snmpNotifyTable(const char *token, char *line)
+                               &StorageTmp->snmpNotifyTagLen);
+     if (StorageTmp->snmpNotifyTag == NULL) {
+         config_perror("invalid specification for snmpNotifyTag");
++        SNMP_FREE(StorageTmp);
+         return;
+     }
+ 
+diff --git a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
+index cd35d09..d4b6e69 100644
+--- a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
++++ b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
+@@ -46,8 +46,8 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval)
+                 *retval = -2;
+                 return NULL;
+             }
+-            memset (list_head, 0, sizeof (struct ifname));
+-            strncpy (list_head->name, p->ifa_name, IF_NAMESIZE);
++            memset(list_head, 0, sizeof(struct ifname));
++            strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE);
+             continue;
+         }
+          for (nameptr1 = list_head; nameptr1; nameptr2 = nameptr1, nameptr1 = nameptr1->ifn_next)
+@@ -67,10 +67,9 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval)
+             return NULL;
+         }
+         nameptr2 = nameptr2->ifn_next;
+-        memset (nameptr2, 0, sizeof (struct ifname));
+-        strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE);
++        memset(nameptr2, 0, sizeof(struct ifname));
++        strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE);
+         continue;
+-
+     }
+ 
+     freeifaddrs(addrs);
+@@ -162,7 +161,7 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd,
+                 "called\n"));
+ 
+     memset(&ifr, 0, sizeof(ifr));
+-    strcpy(ifr.ifr_name, name);
++    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+ 
+     memset(&driver_info, 0, sizeof(driver_info));
+     driver_info.cmd = ETHTOOL_GDRVINFO;
+@@ -238,8 +237,8 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd,
+     for (i = 0; i < nstats; i++) {
+         char s[ETH_GSTRING_LEN];
+ 
+-        strncpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
+-            ETH_GSTRING_LEN);
++        strlcpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
++                sizeof(s));
+         
+         if (ETHERSTATSJABBERS(s)) {
+             data->etherStatsJabbers = (u_long)eth_stats->data[i];
+@@ -300,8 +299,7 @@ _etherStats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
+         }
+     }
+ 
+-    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+-    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
++    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
+     rc = ioctl(fd, which, ifrq);
+     if (rc < 0) {
+         DEBUGMSGTL(("access:etherStatsTable:ioctl",
+diff --git a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
+index bc22430..d6023e5 100644
+--- a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
++++ b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
+@@ -102,6 +102,7 @@ initialize_table_sctpAssocLocalAddrTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpAssocLocalAddrTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
+index bea3978..38ca8a3 100644
+--- a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
++++ b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
+@@ -101,6 +101,7 @@ initialize_table_sctpAssocRemAddrTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpAssocRemAddrTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpAssocTable.c b/agent/mibgroup/sctp-mib/sctpAssocTable.c
+index 951f778..9919075 100644
+--- a/agent/mibgroup/sctp-mib/sctpAssocTable.c
++++ b/agent/mibgroup/sctp-mib/sctpAssocTable.c
+@@ -135,6 +135,7 @@ initialize_table_sctpAssocTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpAssocTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
+index f40db3a..1a6fd35 100644
+--- a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
++++ b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
+@@ -97,6 +97,7 @@ initialize_table_sctpLookupLocalPortTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpLookupLocalPortTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
+index cfbceab..ae2ec91 100644
+--- a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
++++ b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
+@@ -99,6 +99,7 @@ initialize_table_sctpLookupRemHostNameTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpLookupRemHostNameTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
+index c95bdf1..368dd51 100644
+--- a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
++++ b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
+@@ -98,6 +98,7 @@ initialize_table_sctpLookupRemIPAddrTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpLookupRemIPAddrTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
+index eb1828b..c8a8874 100644
+--- a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
++++ b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
+@@ -97,6 +97,7 @@ initialize_table_sctpLookupRemPortTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpLookupRemPortTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
+index 44d384f..d9966fc 100644
+--- a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
++++ b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
+@@ -99,6 +99,7 @@ initialize_table_sctpLookupRemPrimIPAddrTable(void)
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,
+                  "error registering table handler for sctpLookupRemPrimIPAddrTable\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpScalars.c b/agent/mibgroup/sctp-mib/sctpScalars.c
+index 6bcefd2..821079a 100644
+--- a/agent/mibgroup/sctp-mib/sctpScalars.c
++++ b/agent/mibgroup/sctp-mib/sctpScalars.c
+@@ -18,6 +18,7 @@ init_sctpScalars(void)
+ {
+     netsnmp_handler_registration *reginfo_stats;
+     netsnmp_handler_registration *reginfo_params;
++    int rc;
+ 
+     DEBUGMSGTL(("sctp:scalars:init", "Initializing\n"));
+ 
+@@ -27,8 +28,14 @@ init_sctpScalars(void)
+                                             sctp_stats_oid,
+                                             OID_LENGTH(sctp_stats_oid),
+                                             HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB,
++    if (!reginfo_stats)
++        return;
++
++    rc = netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB,
+                                   SCTP_DISCONTINUITYTIME);
++    if (rc != SNMPERR_SUCCESS)
++        return;
++
+     netsnmp_inject_handler(reginfo_stats,
+                            netsnmp_get_cache_handler
+                            (SCTP_STATS_CACHE_TIMEOUT,
+@@ -43,8 +50,13 @@ init_sctpScalars(void)
+                                             sctp_params_oid,
+                                             OID_LENGTH(sctp_params_oid),
+                                             HANDLER_CAN_RONLY);
+-    netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM,
++    if (!reginfo_params)
++        return;
++
++    rc = netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM,
+                                   SCTP_MAXINITRETR);
++    if (!rc)
++        return;
+     netsnmp_inject_handler(reginfo_params,
+                            netsnmp_get_cache_handler
+                            (SCTP_PARAMS_CACHE_TIMEOUT,
+diff --git a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
+index a62b788..b8c723f 100644
+--- a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
++++ b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
+@@ -60,9 +60,7 @@ netsnmp_access_sctp_params_arch_init()
+ int
+ netsnmp_access_sctp_params_arch_load(netsnmp_sctp_params * sctp_params)
+ {
+-    int             ret;
+ 	size_t len = sizeof(uint32_t);
+-	unsigned int cnt = 0;
+ 
+     sctp_params->rto_algorithm = NETSNMP_SCTP_ALGORITHM_VANJ;
+     sctp_params->max_assocs =  SCTP_MAX_NUM_OF_ASOC; 
+diff --git a/agent/mibgroup/sctp-mib/sctpScalars_linux.c b/agent/mibgroup/sctp-mib/sctpScalars_linux.c
+index 8cbe90f..2e5b5af 100644
+--- a/agent/mibgroup/sctp-mib/sctpScalars_linux.c
++++ b/agent/mibgroup/sctp-mib/sctpScalars_linux.c
+@@ -35,6 +35,7 @@ load_uint_file(const char *filename, u_int * value)
+     if (ret != 1) {
+         DEBUGMSGTL(("sctp:scalars:arch:load", "Malformed file %s\n",
+                     filename));
++        fclose(f);
+         return -2;
+     }
+ 
+@@ -71,6 +72,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
+         if (delimiter == NULL) {
+             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
+                         "Malformed line, cannot find '\\t'!\n"));
++            fclose(f);
+             return -1;
+         }
+         errno = 0;
+@@ -78,6 +80,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
+         if (errno != 0) {
+             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
+                         "Malformed value!'\n"));
++            fclose(f);
+             return -1;
+         }
+ 
+@@ -136,11 +139,13 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
+         if (ret < 0) {
+             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
+                         "Unknown entry!'\n"));
++            fclose(f);
+             return ret;
+         }
+     }
+ 
+     sctp_stats->discontinuity_time = 0;
++    fclose(f);
+     return 0;
+ }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpTables_common.c b/agent/mibgroup/sctp-mib/sctpTables_common.c
+index 899d8d5..b28ea03 100644
+--- a/agent/mibgroup/sctp-mib/sctpTables_common.c
++++ b/agent/mibgroup/sctp-mib/sctpTables_common.c
+@@ -435,7 +435,7 @@ sctpTables_load(void)
+ 
+     ret = sctpTables_arch_load(&containers, &flags);
+ 
+-    if (flags | SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) {
++    if (flags & SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) {
+         sctpAssocTable_delete_invalid(containers.sctpAssocTable);
+         sctpAssocRemAddrTable_delete_invalid(containers.
+                                              sctpAssocRemAddrTable);
+@@ -443,7 +443,7 @@ sctpTables_load(void)
+                                                sctpAssocLocalAddrTable);
+     }
+ 
+-    if (flags | SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) {
++    if (flags & SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) {
+         ret = sctpTables_fill_lookup(&containers);
+     }
+ 
+diff --git a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
+index db73e00..516e9f5 100644
+--- a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
++++ b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
+@@ -58,8 +58,6 @@ parse_assoc_local_addresses(sctpTables_containers * containers,
+ static int
+ parse_assoc_xstcb(sctpTables_containers * containers, struct xsctp_tcb *xstcb)
+ {
+-  long            inode;
+-  char           *token;
+   int             ret;
+   sctpAssocTable_entry *entry;
+ 
+@@ -124,7 +122,6 @@ static int
+ parse_remaddr_xraddr(sctpTables_containers * containers,
+ 					 struct xsctp_raddr *xraddr)
+ {
+-  char           *token;
+   int             ret;
+   sctpAssocRemAddrTable_entry *entry;
+ 
+@@ -184,8 +181,6 @@ sctpTables_arch_load(sctpTables_containers * containers, u_long * flags)
+   struct xsctp_tcb *xstcb;
+   struct xsctp_laddr *xladdr;
+   struct xsctp_raddr *xraddr;
+-  sa_family_t family;
+-  void *addr;
+ 
+ 
+   *flags |= SCTP_TABLES_LOAD_FLAG_DELETE_INVALID;
+diff --git a/agent/mibgroup/smux/smux.c b/agent/mibgroup/smux/smux.c
+index fdb5e11..2055974 100644
+--- a/agent/mibgroup/smux/smux.c
++++ b/agent/mibgroup/smux/smux.c
+@@ -91,7 +91,7 @@ static u_char  *smux_parse(u_char *, oid *, size_t *, size_t *, u_char *);
+ static u_char  *smux_parse_var(u_char *, size_t *, oid *, size_t *,
+                                size_t *, u_char *);
+ static void     smux_send_close(int, int);
+-static void     smux_list_detach(smux_reg **, smux_reg **);
++static void     smux_list_detach(smux_reg **, smux_reg *);
+ static void     smux_replace_active(smux_reg *, smux_reg *);
+ static void     smux_peer_cleanup(int);
+ static int      smux_auth_peer(oid *, size_t, char *, int);
+@@ -145,6 +145,7 @@ smux_parse_peer_auth(const char *token, char *cptr)
+     }
+     if (nauths == SMUX_MAX_PEERS) {
+ 	config_perror("Too many smuxpeers");
++	free(aptr);
+ 	return;
+     }
+ 
+@@ -169,10 +170,8 @@ smux_parse_peer_auth(const char *token, char *cptr)
+         /*
+          * password 
+          */
+-        if (*password_cptr) {
+-            strncpy(aptr->sa_passwd, password_cptr, SMUXMAXSTRLEN-1);
+-            aptr->sa_passwd[SMUXMAXSTRLEN-1] = '\0';
+-        }
++        if (*password_cptr)
++            strlcpy(aptr->sa_passwd, password_cptr, sizeof(aptr->sa_passwd));
+     } else {
+         /*
+          * null passwords OK 
+@@ -369,6 +368,11 @@ var_smux_write(int action,
+             break;
+     }
+ 
++    if (!rptr) {
++        DEBUGMSGTL(("smux", "[var_smux_write] unknown registration\n"));
++        return SNMP_ERR_GENERR;
++    }
++
+     switch (action) {
+     case RESERVE1:
+         DEBUGMSGTL(("smux", "[var_smux_write] entering RESERVE1\n"));
+@@ -1049,7 +1053,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
+                 /*
+                  * no replacement found 
+                  */
+-                smux_list_detach(&ActiveRegs, &rptr);
++                smux_list_detach(&ActiveRegs, rptr);
+                 free(rptr);
+             }
+             smux_send_rrsp(sd, rpriority);
+@@ -1063,7 +1067,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
+                             priority);
+         if (rptr) {
+             rpriority = rptr->sr_priority;
+-            smux_list_detach(&PassiveRegs, &rptr);
++            smux_list_detach(&PassiveRegs, rptr);
+             free(rptr);
+             smux_send_rrsp(sd, rpriority);
+             return ptr;
+@@ -1104,7 +1108,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
+                 snmp_oid_compare(oid_name, oid_name_len, rptr->sr_name,
+                                  rptr->sr_name_len);
+             if (result == 0) {
+-                if ((oid_name_len == rptr->sr_name_len)) {
++                if (oid_name_len == rptr->sr_name_len) {
+                     if ((nrptr->sr_priority == -1)) {
+                         nrptr->sr_priority = rptr->sr_priority;
+                         do {
+@@ -1154,9 +1158,17 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
+         if (nrptr->sr_priority == -1)
+             nrptr->sr_priority = 0;
+         smux_list_add(&ActiveRegs, nrptr);
+-        register_mib("smux", (struct variable *)
+-                     smux_variables, sizeof(struct variable2),
+-                     1, nrptr->sr_name, nrptr->sr_name_len);
++        if (register_mib("smux", (struct variable *)
++                             smux_variables, sizeof(struct variable2),
++                             1, nrptr->sr_name, nrptr->sr_name_len)
++                     != SNMPERR_SUCCESS) {
++		DEBUGMSGTL(("smux", "[smux_rreq_process] Failed to register subtree\n"));
++		smux_list_detach(&ActiveRegs, nrptr);
++		free(nrptr);
++		smux_send_rrsp(sd, -1);
++		return NULL;
++	}
++
+       done:
+         smux_send_rrsp(sd, nrptr->sr_priority);
+         return ptr;
+@@ -1202,10 +1214,10 @@ smux_find_match(smux_reg * regs, int sd, oid * oid_name,
+ static void
+ smux_replace_active(smux_reg * actptr, smux_reg * pasptr)
+ {
+-    smux_list_detach(&ActiveRegs, &actptr);
++    smux_list_detach(&ActiveRegs, actptr);
+     unregister_mib(actptr->sr_name, actptr->sr_name_len);
+ 
+-    smux_list_detach(&PassiveRegs, &pasptr);
++    smux_list_detach(&PassiveRegs, pasptr);
+     (void) smux_list_add(&ActiveRegs, pasptr);
+ 
+     register_mib("smux", (struct variable *) smux_variables,
+@@ -1215,7 +1227,7 @@ smux_replace_active(smux_reg * actptr, smux_reg * pasptr)
+ }
+ 
+ static void
+-smux_list_detach(smux_reg ** head, smux_reg ** m_remove)
++smux_list_detach(smux_reg ** head, smux_reg * m_remove)
+ {
+     smux_reg       *rptr, *rptr2;
+ 
+@@ -1223,15 +1235,13 @@ smux_list_detach(smux_reg ** head, smux_reg ** m_remove)
+         DEBUGMSGTL(("smux", "[smux_list_detach] Ouch!"));
+         return;
+     }
+-    if (*head == *m_remove) {
+-        *m_remove = *head;
++    if (*head == m_remove) {
+         *head = (*head)->sr_next;
+         return;
+     }
+     for (rptr = *head, rptr2 = rptr->sr_next; rptr2;
+          rptr2 = rptr2->sr_next, rptr = rptr->sr_next) {
+-        if (rptr2 == *m_remove) {
+-            *m_remove = rptr2;
++        if (rptr2 == m_remove) {
+             rptr->sr_next = rptr2->sr_next;
+             return;
+         }
+@@ -1337,7 +1347,7 @@ smux_find_replacement(oid * name, size_t name_len)
+         if (!snmp_oidtree_compare(rptr->sr_name, rptr->sr_name_len,
+                                   name, name_len)) {
+             if ((difflen = rptr->sr_name_len - name_len)
+-                < bestlen) {
++                < bestlen || !bestptr) {
+                 bestlen = difflen;
+                 bestptr = rptr;
+             } else if ((difflen == bestlen) &&
+@@ -1759,7 +1769,7 @@ smux_peer_cleanup(int sd)
+     for (rptr = PassiveRegs; rptr; rptr = nrptr) {
+         nrptr = rptr->sr_next;
+         if (rptr->sr_fd == sd) {
+-            smux_list_detach(&PassiveRegs, &rptr);
++            smux_list_detach(&PassiveRegs, rptr);
+             free(rptr);
+         }
+         rptr = nrptr;
+@@ -1770,12 +1780,12 @@ smux_peer_cleanup(int sd)
+     for (rptr = ActiveRegs; rptr; rptr = rptr2) {
+         rptr2 = rptr->sr_next;
+         if (rptr->sr_fd == sd) {
+-            smux_list_detach(&ActiveRegs, &rptr);
++            smux_list_detach(&ActiveRegs, rptr);
+             unregister_mib(rptr->sr_name, rptr->sr_name_len);
+             if ((nrptr = smux_find_replacement(rptr->sr_name,
+                                                rptr->sr_name_len)) !=
+                 NULL) {
+-                smux_list_detach(&PassiveRegs, &nrptr);
++                smux_list_detach(&PassiveRegs, nrptr);
+                 smux_list_add(&ActiveRegs, nrptr);
+                 register_mib("smux", (struct variable *)
+                              smux_variables, sizeof(struct variable2),
+diff --git a/agent/mibgroup/smux/snmp_bgp.c b/agent/mibgroup/smux/snmp_bgp.c
+index 70596a1..16b0185 100644
+--- a/agent/mibgroup/smux/snmp_bgp.c
++++ b/agent/mibgroup/smux/snmp_bgp.c
+@@ -109,8 +109,6 @@ init_snmp_bdp(void)
+                  bgp_variables_oid);
+ }
+ 
+-
+-#endif
+ static oid      max_bgp_mib[] =
+     { 1, 3, 6, 1, 2, 1, 15, 5, 1, 6, 255, 255, 255, 255 };
+ static oid      min_bgp_mib[] = { 1, 3, 6, 1, 2, 1, 15, 1, 0 };
+diff --git a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
+index fd7ab8e..942a865 100644
+--- a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
++++ b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
+@@ -247,7 +247,7 @@ snmpNotifyFilterTable_container_load(netsnmp_container *container)
+     }
+ 
+     DEBUGMSGT(("verbose:snmpNotifyFilterTable:snmpNotifyFilterTable_container_load",
+-               "inserted %lu records\n", (long)count));
++               "inserted %" NETSNMP_PRIz "u records\n", count));
+ 
+     return MFD_SUCCESS;
+ }                               /* snmpNotifyFilterTable_container_load */
+diff --git a/agent/mibgroup/target/snmpTargetAddrEntry.c b/agent/mibgroup/target/snmpTargetAddrEntry.c
+index ac77d52..50cfed6 100644
+--- a/agent/mibgroup/target/snmpTargetAddrEntry.c
++++ b/agent/mibgroup/target/snmpTargetAddrEntry.c
+@@ -372,9 +372,7 @@ snmpTargetAddr_addName(struct targetAddrTable_struct *entry, char *cptr)
+                         "ERROR snmpTargetAddrEntry: name out of range in config string\n"));
+             return (0);
+         }
+-        entry->name = (char *) malloc(len + 1);
+-        strncpy(entry->name, cptr, len);
+-        entry->name[len] = '\0';
++        entry->name = strdup(cptr);
+     }
+     return (1);
+ }                               /* addName */
+@@ -508,9 +506,7 @@ snmpTargetAddr_addTagList(struct targetAddrTable_struct *entry, char *cptr)
+             return (0);
+         }
+         SNMP_FREE(entry->tagList);
+-        entry->tagList = (char *) malloc(len + 1);
+-        strncpy(entry->tagList, cptr, len);
+-        entry->tagList[len] = '\0';
++        entry->tagList = strdup(cptr);
+     }
+     return (1);
+ }                               /* snmpTargetAddr_addTagList */
+@@ -534,9 +530,7 @@ snmpTargetAddr_addParams(struct targetAddrTable_struct *entry, char *cptr)
+                         "ERROR snmpTargetAddrEntry: params out of range in config string\n"));
+             return (0);
+         }
+-        entry->params = (char *) malloc(len + 1);
+-        strncpy(entry->params, cptr, len);
+-        entry->params[len] = '\0';
++        entry->params = strdup(cptr);
+     }
+     return (1);
+ }                               /* snmpTargetAddr_addParams */
+@@ -725,10 +719,7 @@ store_snmpTargetAddrEntry(int majorID, int minorID, void *serverarg,
+                             (int) curr_struct->tDomain[i]);
+                     line[ sizeof(line)-1 ] = 0;
+                 }
+-                if ( strlen(line)+2 < sizeof(line) ) {
+-                    line[ strlen(line)+1 ] = 0;
+-                    line[ strlen(line)   ] = ' ';
+-                }
++                strlcat(line, " ", sizeof(line));
+                 read_config_save_octet_string(&line[strlen(line)],
+                                               curr_struct->tAddress,
+                                               curr_struct->tAddressLen);
+@@ -860,7 +851,7 @@ var_snmpTargetAddrEntry(struct variable * vp,
+ 
+     case SNMPTARGETADDRTAGLIST:
+         if (temp_struct->tagList != NULL) {
+-            strcpy(string, temp_struct->tagList);
++            strlcpy(string, temp_struct->tagList, sizeof(string));
+             *var_len = strlen(string);
+             return (unsigned char *) string;
+         } else {
+@@ -870,7 +861,7 @@ var_snmpTargetAddrEntry(struct variable * vp,
+     case SNMPTARGETADDRPARAMS:
+         if (temp_struct->params == NULL)
+             return NULL;
+-        strcpy(string, temp_struct->params);
++        strlcpy(string, temp_struct->params, sizeof(string));
+         *var_len = strlen(string);
+         return (unsigned char *) string;
+ 
+@@ -1342,7 +1333,7 @@ write_snmpTargetAddrParams(int action,
+             }
+ 
+             old_params = target->params;
+-            target->params = (char*)malloc(var_val_len + 1);
++            target->params = malloc(var_val_len + 1);
+             if (target->params == NULL) {
+                 return SNMP_ERR_RESOURCEUNAVAILABLE;
+             }
+diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.c b/agent/mibgroup/target/snmpTargetParamsEntry.c
+index 3a796c8..eed43f0 100644
+--- a/agent/mibgroup/target/snmpTargetParamsEntry.c
++++ b/agent/mibgroup/target/snmpTargetParamsEntry.c
+@@ -319,9 +319,7 @@ snmpTargetParams_addParamName(struct targetParamTable_struct *entry,
+                         "ERROR snmpTargetParamsEntry: param name out of range in config string\n"));
+             return (0);
+         }
+-        entry->paramName = (char *) malloc(len + 1);
+-        strncpy(entry->paramName, cptr, len);
+-        entry->paramName[len] = '\0';
++        entry->paramName = strdup(cptr);
+     }
+     return (1);
+ }
+@@ -382,16 +380,12 @@ int
+ snmpTargetParams_addSecName(struct targetParamTable_struct *entry,
+                             char *cptr)
+ {
+-    size_t          len;
+     if (cptr == NULL) {
+         DEBUGMSGTL(("snmpTargetParamsEntry",
+                     "ERROR snmpTargetParamsEntry: no security name in config string\n"));
+         return (0);
+     } else {
+-        len = strlen(cptr);
+-        entry->secName = (char *) malloc(len + 1);
+-        strncpy(entry->secName, cptr, len);
+-        entry->secName[len] = '\0';
++        entry->secName = strdup(cptr);
+     }
+     return (1);
+ }                               /* snmpTargetParams_addSecName  */
+diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.h b/agent/mibgroup/target/snmpTargetParamsEntry.h
+index 2bd6e25..bd30582 100644
+--- a/agent/mibgroup/target/snmpTargetParamsEntry.h
++++ b/agent/mibgroup/target/snmpTargetParamsEntry.h
+@@ -47,6 +47,7 @@
+                                                 targetParamTable_struct
+                                                 *newEntry);
+        struct targetParamTable_struct *snmpTargetParamTable_create(void);
++       void snmpTargetParamTable_dispose(struct targetParamTable_struct *);
+  
+   /*
+    * function definitions 
+diff --git a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
+index ec0cbf0..9a5b466 100644
+--- a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
++++ b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
+@@ -291,7 +291,7 @@ _load6(netsnmp_container *container, u_int load_flags)
+      */
+     while (fgets(line, sizeof(line), in)) {
+         netsnmp_tcpconn_entry *entry;
+-        int             state, rc, local_port, remote_port, tmp_state;
++        int             state, local_port, remote_port, tmp_state;
+         unsigned long long  inode;
+         size_t          buf_len, offset;
+         char            local_addr[48], remote_addr[48];
+diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
+index f8df440..5493ff9 100644
+--- a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
++++ b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
+@@ -1415,8 +1415,7 @@ _tlstmAddrTable_row_restore_mib(const char *token, char *buf)
+         addr->hashType = hashType;
+         addr->flags = TLSTM_ADDR_FROM_MIB | TLSTM_ADDR_NONVOLATILE;
+ 
+-        if (netsnmp_tlstmAddr_add(addr) != 0)
+-            netsnmp_tlstmAddr_free(addr);
++        netsnmp_tlstmAddr_add(addr);
+     }
+     else {
+         netsnmp_tdata_row     *row;
+diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
+index 7027114..cd54452 100644
+--- a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
++++ b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
+@@ -1275,7 +1275,7 @@ _tlstmParamsTable_row_restore_mib(const char *token, char *buf)
+         entry = row->data;
+         
+         entry->hashType = params->hashType;
+-        strncpy(entry->snmpTlstmParamsClientFingerprint,params->fingerprint,
++        strlcpy(entry->snmpTlstmParamsClientFingerprint, params->fingerprint,
+                 sizeof(entry->snmpTlstmParamsClientFingerprint));
+         entry->snmpTlstmParamsClientFingerprint_len =
+             strlen(entry->snmpTlstmParamsClientFingerprint);
+diff --git a/agent/mibgroup/ucd-snmp/disk.c b/agent/mibgroup/ucd-snmp/disk.c
+index 70f67f5..324fbc4 100644
+--- a/agent/mibgroup/ucd-snmp/disk.c
++++ b/agent/mibgroup/ucd-snmp/disk.c
+@@ -409,9 +409,8 @@ add_device(char *path, char *device, int minspace, int minpercent, int override)
+     /* add if and only if the device was found */
+     if(device[0] != 0) {
+       /* The following buffers are cleared above, no need to add '\0' */
+-      strncpy(disks[numdisks].path, path, sizeof(disks[numdisks].path) - 1);
+-      strncpy(disks[numdisks].device, device,
+-              sizeof(disks[numdisks].device) - 1);
++      strlcpy(disks[numdisks].path, path, sizeof(disks[numdisks].path));
++      strlcpy(disks[numdisks].device, device, sizeof(disks[numdisks].device));
+       disks[numdisks].minimumspace = minspace;
+       disks[numdisks].minpercent   = minpercent;
+       numdisks++;  
+@@ -595,8 +594,7 @@ find_device(char *path)
+   }
+   while (mntfp && NULL != (mntent = getmntent(mntfp)))
+     if (strcmp(path, mntent->mnt_dir) == 0) {
+-      strncpy(device, mntent->mnt_fsname, sizeof(device));
+-      device[sizeof(device) - 1] = '\0';
++      strlcpy(device, mntent->mnt_fsname, sizeof(device));
+       DEBUGMSGTL(("ucd-snmp/disk", "Disk:  %s\n",
+ 		  mntent->mnt_fsname));
+       break;
+@@ -620,18 +618,14 @@ find_device(char *path)
+ 		  path, mnttab.mnt_mountp));
+     }
+   fclose(mntfp);
+-  if (i == 0) {
+-    strncpy(device, mnttab.mnt_special, sizeof(device));
+-    device[sizeof(device) - 1] = '\0';
+-  }
++  if (i == 0)
++    strlcpy(device, mnttab.mnt_special, sizeof(device));
+ #endif /* HAVE_SETMNTENT */
+ #elif HAVE_FSTAB_H
+   stat(path, &stat1);
+   setfsent();
+-  if ((fstab = getfsfile(path))) {
+-    strncpy(device, fstab->fs_spec, sizeof(device));
+-    device[sizeof(device) - 1] = '\0';
+-  }
++  if ((fstab = getfsfile(path)))
++    strlcpy(device, fstab->fs_spec, sizeof(device));
+   endfsent();
+   if (device[0] != '\0') {
+      /*
+@@ -641,8 +635,7 @@ find_device(char *path)
+ 
+ #elif HAVE_STATFS
+   if (statfs(path, &statf) == 0) {
+-    strncpy(device, statf.f_mntfromname, sizeof(device) - 1);
+-    device[sizeof(device) - 1] = '\0';
++    strlcpy(device, statf.f_mntfromname, sizeof(device));
+     DEBUGMSGTL(("ucd-snmp/disk", "Disk:  %s\n",
+ 		statf.f_mntfromname));
+   }
+diff --git a/agent/mibgroup/ucd-snmp/disk_hw.c b/agent/mibgroup/ucd-snmp/disk_hw.c
+index 6fb9418..ba26479 100644
+--- a/agent/mibgroup/ucd-snmp/disk_hw.c
++++ b/agent/mibgroup/ucd-snmp/disk_hw.c
+@@ -1,5 +1,5 @@
+ /*
+- * disk.c
++ * disk_hw.c
+  */
+ 
+ #include <net-snmp/net-snmp-config.h>
+@@ -137,6 +137,7 @@ disk_free_config(void)
+   if (disks) {
+      free( disks );
+      disks = NULL;
++     maxdisks = numdisks = 0;
+   }
+   allDisksIncluded = 0;
+ }
+@@ -321,7 +322,7 @@ tryAgain:
+ 
+     switch (vp->magic) {
+     case MIBINDEX:
+-        long_ret = disknum;
++        long_ret = disknum + 1;
+         return ((u_char *) (&long_ret));
+     case ERRORNAME:            /* DISKPATH */
+         *var_len = strlen(entry->path);
+diff --git a/agent/mibgroup/ucd-snmp/diskio.c b/agent/mibgroup/ucd-snmp/diskio.c
+index 769a365..4d6d05c 100644
+--- a/agent/mibgroup/ucd-snmp/diskio.c
++++ b/agent/mibgroup/ucd-snmp/diskio.c
+@@ -502,7 +502,8 @@ getstats(void)
+ {
+     time_t          now;
+     char           *t, *tp;
+-    int             size, dkn_size, i;
++    size_t          size, dkn_size;
++    int             i;
+ 
+     now = time(NULL);
+     if (cache_time + CACHE_TIMEOUT > now) {
+@@ -526,6 +527,7 @@ getstats(void)
+         if (ndisk == 0)
+             return 0;
+         dkname = malloc(ndisk * sizeof(char *));
++        dkn_size = 0;
+         if (sysctl(nmib, 2, NULL, &dkn_size, NULL, 0) < 0) {
+             perror("Can't get size of HW_DISKNAMES mib");
+             return 0;
+diff --git a/agent/mibgroup/ucd-snmp/dlmod.c b/agent/mibgroup/ucd-snmp/dlmod.c
+index eecd38f..e9742f2 100644
+--- a/agent/mibgroup/ucd-snmp/dlmod.c
++++ b/agent/mibgroup/ucd-snmp/dlmod.c
+@@ -18,8 +18,6 @@
+ #include <net-snmp/net-snmp-includes.h>
+ #include <net-snmp/agent/net-snmp-agent-includes.h>
+ 
+-#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
+-
+ #include <dlfcn.h>
+ #include "dlmod.h"
+ 
+@@ -124,7 +122,7 @@ dlmod_load_module(struct dlmod *dlm)
+                 dlm->status = DLMOD_ERROR;
+             }
+         }
+-        strncpy(dlm->path, tmp_path, sizeof(dlm->path));
++        strlcpy(dlm->path, tmp_path, sizeof(dlm->path));
+         if (dlm->status == DLMOD_ERROR)
+             return;
+     }
+@@ -219,16 +217,16 @@ dlmod_parse_config(const char *token, char *cptr)
+         dlmod_delete_module(dlm);
+         return;
+     }
+-    strncpy(dlm->name, dlm_name, sizeof(dlm->name));
++    strlcpy(dlm->name, dlm_name, sizeof(dlm->name));
+ 
+     /*
+      * dynamic module path
+      */
+     dlm_path = strtok_r(NULL, "\t ", &st);
+     if (dlm_path)
+-        strncpy(dlm->path, dlm_path, sizeof(dlm->path));
++        strlcpy(dlm->path, dlm_path, sizeof(dlm->path));
+     else
+-        strncpy(dlm->path, dlm_name, sizeof(dlm->path));
++        strlcpy(dlm->path, dlm_name, sizeof(dlm->path));
+ 
+     dlmod_load_module(dlm);
+ 
+@@ -573,9 +571,6 @@ static oid dlmod_variables_oid[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 14 };
+ void
+ init_dlmod(void)
+ {
+-    char           *p;
+-    int             len;
+-
+     REGISTER_MIB("dlmod", dlmod_variables, variable4, dlmod_variables_oid);
+ 
+     /*
+@@ -588,20 +583,23 @@ init_dlmod(void)
+                                   dlmod_free_config,
+                                   "module-name module-path");
+ 
+-    p = getenv("SNMPDLMODPATH");
+-    strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path));
+-    dlmod_path[ sizeof(dlmod_path)-1 ] = 0;
+-    if (p) {
+-        if (p[0] == ':') {
+-            len = strlen(dlmod_path);
+-            if (dlmod_path[len - 1] != ':') {
+-                strncat(dlmod_path, ":", sizeof(dlmod_path) - len -1);
+-                len++;
+-            }
+-            strncat(dlmod_path, p + 1,   sizeof(dlmod_path) - len);
+-        } else
+-            strncpy(dlmod_path, p, sizeof(dlmod_path));
++    {
++        const char * const p = getenv("SNMPDLMODPATH");
++        strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path));
++        dlmod_path[ sizeof(dlmod_path) - 1 ] = 0;
++        if (p) {
++            if (p[0] == ':') {
++                int len = strlen(dlmod_path);
++                if (dlmod_path[len - 1] != ':') {
++                    strncat(dlmod_path, ":", sizeof(dlmod_path) - len - 1);
++                    len++;
++                }
++                strncat(dlmod_path, p + 1,   sizeof(dlmod_path) - len);
++            } else
++                strncpy(dlmod_path, p, sizeof(dlmod_path));
++        }
+     }
++
+     dlmod_path[ sizeof(dlmod_path)-1 ] = 0;
+     DEBUGMSGTL(("dlmod", "dlmod_path: %s\n", dlmod_path));
+ }
+@@ -614,19 +612,3 @@ shutdown_dlmod(void)
+     snmpd_unregister_config_handler("dlmod");
+     unregister_mib(dlmod_variables_oid, OID_LENGTH(dlmod_variables_oid));
+ }
+-
+-#else                           /* no dlopen support */
+-
+-void
+-init_dlmod(void)
+-{
+-    DEBUGMSGTL(("dlmod",
+-                "Dynamic modules not support on this platform\n"));
+-}
+-
+-void
+-shutdown_dlmod(void)
+-{
+-}
+-
+-#endif
+diff --git a/agent/mibgroup/ucd-snmp/dlmod.h b/agent/mibgroup/ucd-snmp/dlmod.h
+index 79d960b..df8bef7 100644
+--- a/agent/mibgroup/ucd-snmp/dlmod.h
++++ b/agent/mibgroup/ucd-snmp/dlmod.h
+@@ -6,6 +6,10 @@
+ #ifndef MIBGROUP_DLMOD_H
+ #define MIBGROUP_DLMOD_H
+ 
++#if !defined(HAVE_DLFCN_H) || !defined(HAVE_DLOPEN)
++config_error(Dynamic modules not supported on this platform)
++#endif
++
+ config_add_mib(UCD-DLMOD-MIB)
+ 
+ void init_dlmod(void);
+diff --git a/agent/mibgroup/ucd-snmp/errormib.c b/agent/mibgroup/ucd-snmp/errormib.c
+index cbdd25b..7f3bcb1 100644
+--- a/agent/mibgroup/ucd-snmp/errormib.c
++++ b/agent/mibgroup/ucd-snmp/errormib.c
+@@ -137,8 +137,7 @@ seterrorstatus(const char *to, int prior)
+ {
+     if (errorstatusprior <= prior ||
+         (NETSNMP_ERRORTIMELENGTH < (time(NULL) - errorstatustime))) {
+-        strncpy(errorstring, to, sizeof(errorstring));
+-        errorstring[ sizeof(errorstring)-1 ] = 0;
++        strlcpy(errorstring, to, sizeof(errorstring));
+         errorstatusprior = prior;
+         errorstatustime = time(NULL);
+     }
+@@ -219,8 +218,7 @@ var_extensible_errors(struct variable *vp,
+         return ((u_char *) (&long_ret));
+     case ERRORMSG:
+         if ((NETSNMP_ERRORTIMELENGTH >= time(NULL) - errorstatustime) ? 1 : 0) {
+-            strncpy(errmsg, errorstring, sizeof(errmsg));
+-            errmsg[ sizeof(errmsg)-1 ] = 0;
++            strlcpy(errmsg, errorstring, sizeof(errmsg));
+         } else
+             errmsg[0] = 0;
+         *var_len = strlen(errmsg);
+diff --git a/agent/mibgroup/ucd-snmp/extensible.c b/agent/mibgroup/ucd-snmp/extensible.c
+index edea93a..d1752ef 100644
+--- a/agent/mibgroup/ucd-snmp/extensible.c
++++ b/agent/mibgroup/ucd-snmp/extensible.c
+@@ -262,8 +262,7 @@ extensible_parse_config(const char *token, char *cptr)
+         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#'; tcptr++)
+             if (*tcptr == ';' && ptmp->type == EXECPROC)
+                 break;
+-        strncpy(ptmp->command, cptr, tcptr - cptr);
+-        ptmp->command[tcptr - cptr] = 0;
++        sprintf(ptmp->command, "%.*s", (int) (tcptr - cptr), cptr);
+     }
+ #ifdef NETSNMP_EXECFIXCMD
+     sprintf(ptmp->fixcmd, NETSNMP_EXECFIXCMD, ptmp->name);
+@@ -419,8 +418,7 @@ execfix_parse_config(const char *token, char *cptr)
+         return;
+     }
+ 
+-    strncpy(execp->fixcmd, cptr, sizeof(execp->fixcmd));
+-    execp->fixcmd[ sizeof(execp->fixcmd)-1 ] = 0;
++    strlcpy(execp->fixcmd, cptr, sizeof(execp->fixcmd));
+ }
+ 
+ u_char         *
+@@ -623,8 +621,7 @@ var_extensible_relocatable(struct variable *vp,
+         cp = strchr(cp1, '\n');
+         if (cp)
+             *cp = 0;
+-        strncpy(errmsg, cp1, sizeof(errmsg));
+-        errmsg[ sizeof(errmsg)-1 ] = 0;
++        strlcpy(errmsg, cp1, sizeof(errmsg));
+         *var_len = strlen(errmsg);
+         if (errmsg[*var_len - 1] == '\n')
+             errmsg[--(*var_len)] = '\0';
+diff --git a/agent/mibgroup/ucd-snmp/lmSensors.c b/agent/mibgroup/ucd-snmp/lmSensors.c
+index d6436bf..05c60b7 100644
+--- a/agent/mibgroup/ucd-snmp/lmSensors.c
++++ b/agent/mibgroup/ucd-snmp/lmSensors.c
+@@ -331,7 +331,7 @@ var_lmSensorsTable(struct variable *vp,
+     case LMFANSENSORSDEVICE:
+     case LMVOLTSENSORSDEVICE:
+     case LMMISCSENSORSDEVICE:
+-        strncpy(string, s.name, SPRINT_MAX_LEN - 1);
++        strlcpy(string, s.name, sizeof(string));
+         *var_len = strlen(string);
+         ret = (unsigned char *) string;
+         goto leaving;
+@@ -891,32 +891,32 @@ else{
+                    DEBUGMSG(("ucd-snmp/lmSensors", "front panel value %d\n",enc_info->value));
+                    typ = 3; /* misc */
+                    sensor_array[typ].sensor[other].value = enc_info->value;
+-                   strncpy(sensor_array[typ].sensor[other].name,"FSP",MAX_NAME-1);
+-                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
++                   strlcpy(sensor_array[typ].sensor[other].name, "FSP",
++                           MAX_NAME);
+                    other++;
+                    break;
+                case ENVCTRL_ENCL_AMBTEMPR:
+                    DEBUGMSG(("ucd-snmp/lmSensors", "ambient temp mC %d\n",enc_info->value*1000));
+                    typ = 0; /* temperature sensor */
+                    sensor_array[typ].sensor[temp].value = enc_info->value*1000;
+-                   strncpy(sensor_array[typ].sensor[temp].name,"Ambient",MAX_NAME-1);
+-                   sensor_array[typ].sensor[temp].name[MAX_NAME-1]='\0'; /* null terminate */
++                   strlcpy(sensor_array[typ].sensor[temp].name, "Ambient",
++                           MAX_NAME);
+                    temp++;
+                    break;
+                case ENVCTRL_ENCL_BACKPLANE4:
+                    DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane4\n"));
+                    typ = 3; /* misc */
+                    sensor_array[typ].sensor[other].value = enc_info->value;
+-                   strncpy(sensor_array[typ].sensor[other].name,"Backplane4",MAX_NAME-1);
+-                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
++                   strlcpy(sensor_array[typ].sensor[other].name, "Backplane4",
++                           MAX_NAME);
+                    other++;
+                    break;
+                case ENVCTRL_ENCL_BACKPLANE8:
+                    DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane8\n"));
+                    typ = 3; /* misc */
+                    sensor_array[typ].sensor[other].value = enc_info->value;
+-                   strncpy(sensor_array[typ].sensor[other].name,"Backplane8",MAX_NAME-1);
+-                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
++                   strlcpy(sensor_array[typ].sensor[other].name, "Backplane8",
++                           MAX_NAME);
+                    other++;
+                    break;
+                case ENVCTRL_ENCL_CPUTEMPR:
+@@ -1029,7 +1029,7 @@ else{
+                     array->current_len = new_size / sizeof(_sensor);
+                     DEBUGMSG(("ucd-snmp/lmSensors", "type #%d increased to %d elements\n", type, (int)array->current_len));
+                 } /* end if array->current */
+-                strncpy(array->sensor[array->n].name, label, MAX_NAME);
++                strlcpy(array->sensor[array->n].name, label, MAX_NAME);
+                 array->sensor[array->n].value = (int) (val * mul);
+                 DEBUGMSGTL(("sensors","sensor %s, value %d\n",
+                             array->sensor[array->n].name,
+diff --git a/agent/mibgroup/ucd-snmp/loadave.c b/agent/mibgroup/ucd-snmp/loadave.c
+index 2321d29..6efc5e9 100644
+--- a/agent/mibgroup/ucd-snmp/loadave.c
++++ b/agent/mibgroup/ucd-snmp/loadave.c
+@@ -393,8 +393,7 @@ write_laConfig(int action,
+             double val;
+             char *endp;
+ 
+-            strncpy(buf, (char *)var_val, var_val_len);
+-            buf[var_val_len] = '\0';
++            sprintf(buf, "%.*s", (int) var_val_len, (char *)var_val);
+             val = strtod(buf, &endp);
+ 
+             if (errno == ERANGE || *endp != '\0' || val < 0 || val > 65536.00) {
+@@ -481,10 +480,12 @@ var_extensible_loadave(struct variable * vp,
+         if (maxload[name[*length - 1] - 1] != 0 &&
+             avenrun[name[*length - 1] - 1] >=
+             maxload[name[*length - 1] - 1]) {
+-            sprintf(errmsg, "%d min Load Average too high (= %.2f)",
++            snprintf(errmsg, sizeof(errmsg),
++                     "%d min Load Average too high (= %.2f)",
+                     (name[*length - 1] ==
+                      1) ? 1 : ((name[*length - 1] == 2) ? 5 : 15),
+                     avenrun[name[*length - 1] - 1]);
++            errmsg[sizeof(errmsg) - 1] = '\0';
+         } else {
+             errmsg[0] = 0;
+         }
+diff --git a/agent/mibgroup/ucd-snmp/logmatch.c b/agent/mibgroup/ucd-snmp/logmatch.c
+index eb21a68..abca5ce 100644
+--- a/agent/mibgroup/ucd-snmp/logmatch.c
++++ b/agent/mibgroup/ucd-snmp/logmatch.c
+@@ -110,7 +110,6 @@ static void
+ updateLogmatch(int iindex)
+ {
+ 
+-    regmatch_t      myMatch;
+     int             matchResultCode;
+     char            inbuf[1024];
+     char            perfilename[1024];
+@@ -288,7 +287,7 @@ updateLogmatch(int iindex)
+ 
+                 matchResultCode =
+                     regexec(&(logmatchTable[iindex].regexBuffer),
+-                            inbuf, 0, &myMatch, REG_NOTEOL);
++                            inbuf, 0, NULL, REG_NOTEOL);
+ 
+                 if (matchResultCode == 0) {
+                     logmatchTable[iindex].globalMatchCounter++;
+diff --git a/agent/mibgroup/ucd-snmp/pass.c b/agent/mibgroup/ucd-snmp/pass.c
+index 4440baa..ac14b41 100644
+--- a/agent/mibgroup/ucd-snmp/pass.c
++++ b/agent/mibgroup/ucd-snmp/pass.c
+@@ -33,6 +33,7 @@
+ 
+ #include "struct.h"
+ #include "pass.h"
++#include "pass_common.h"
+ #include "extensible.h"
+ #include "util_funcs.h"
+ 
+@@ -55,152 +56,6 @@ struct variable2 extensible_passthru_variables[] = {
+ 
+ 
+ 
+-/*
+- * lexicographical compare two object identifiers.
+- * * Returns -1 if name1 < name2,
+- * *          0 if name1 = name2,
+- * *          1 if name1 > name2
+- * *
+- * * This method differs from snmp_oid_compare
+- * * in that the comparison stops at the length
+- * * of the smallest object identifier.
+- */
+-int
+-snmp_oid_min_compare(const oid * in_name1,
+-                     size_t len1, const oid * in_name2, size_t len2)
+-{
+-    register int    len;
+-    register const oid *name1 = in_name1;
+-    register const oid *name2 = in_name2;
+-
+-    /*
+-     * len = minimum of len1 and len2 
+-     */
+-    if (len1 < len2)
+-        len = len1;
+-    else
+-        len = len2;
+-    /*
+-     * find first non-matching OID 
+-     */
+-    while (len-- > 0) {
+-        /*
+-         * these must be done in seperate comparisons, since
+-         * subtracting them and using that result has problems with
+-         * subids > 2^31. 
+-         */
+-        if (*(name1) < *(name2))
+-            return -1;
+-        if (*(name1++) > *(name2++))
+-            return 1;
+-    }
+-    /*
+-     * both OIDs equal up to length of shorter OID 
+-     */
+-
+-    return 0;
+-}
+-
+-
+-/*
+- * This is also called from pass_persist.c 
+- */
+-int
+-asc2bin(char *p)
+-{
+-    char           *r, *q = p;
+-    char            c;
+-    int             n = 0;
+-
+-    for (;;) {
+-        c = (char) strtol(q, &r, 16);
+-        if (r == q)
+-            break;
+-        *p++ = c;
+-        q = r;
+-        n++;
+-    }
+-    return n;
+-}
+-
+-/*
+- * This is also called from pass_persist.c 
+- */
+-int
+-bin2asc(char *p, size_t n)
+-{
+-    size_t          i, flag = 0;
+-    char            buffer[SNMP_MAXBUF];
+-
+-    /* prevent buffer overflow */
+-    if (n > (sizeof(buffer) - 1))
+-        n = sizeof(buffer) - 1;
+-
+-    for (i = 0; i < n; i++) {
+-        buffer[i] = p[i];
+-        if (!isprint((unsigned char)(p[i])))
+-            flag = 1;
+-    }
+-    if (flag == 0) {
+-        p[n] = 0;
+-        return n;
+-    }
+-    for (i = 0; i < n; i++) {
+-        sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff));
+-        p += 3;
+-    }
+-    *--p = 0;
+-    return 3 * n - 1;
+-}
+-
+-/*
+- * This is also called from pass_persist.c 
+- */
+-int
+-netsnmp_pass_str_to_errno(const char *buf)
+-{
+-    if (!strncasecmp(buf, "too-big", 7)) {
+-        /* Shouldn't happen */
+-        return SNMP_ERR_TOOBIG;
+-    } else if (!strncasecmp(buf, "no-such-name", 12)) {
+-        return SNMP_ERR_NOSUCHNAME;
+-    } else if (!strncasecmp(buf, "bad-value", 9)) {
+-        return SNMP_ERR_BADVALUE;
+-    } else if (!strncasecmp(buf, "read-only", 9)) {
+-        return SNMP_ERR_READONLY;
+-    } else if (!strncasecmp(buf, "gen-error", 9)) {
+-        return SNMP_ERR_GENERR;
+-    } else if (!strncasecmp(buf, "no-access", 9)) {
+-        return SNMP_ERR_NOACCESS;
+-    } else if (!strncasecmp(buf, "wrong-type", 10)) {
+-        return SNMP_ERR_WRONGTYPE;
+-    } else if (!strncasecmp(buf, "wrong-length", 12)) {
+-        return SNMP_ERR_WRONGLENGTH;
+-    } else if (!strncasecmp(buf, "wrong-encoding", 14)) {
+-        return SNMP_ERR_WRONGENCODING;
+-    } else if (!strncasecmp(buf, "wrong-value", 11)) {
+-        return SNMP_ERR_WRONGVALUE;
+-    } else if (!strncasecmp(buf, "no-creation", 11)) {
+-        return SNMP_ERR_NOCREATION;
+-    } else if (!strncasecmp(buf, "inconsistent-value", 18)) {
+-        return SNMP_ERR_INCONSISTENTVALUE;
+-    } else if (!strncasecmp(buf, "resource-unavailable", 20)) {
+-        return SNMP_ERR_RESOURCEUNAVAILABLE;
+-    } else if (!strncasecmp(buf, "commit-failed", 13)) {
+-        return SNMP_ERR_COMMITFAILED;
+-    } else if (!strncasecmp(buf, "undo-failed", 11)) {
+-        return SNMP_ERR_UNDOFAILED;
+-    } else if (!strncasecmp(buf, "authorization-error", 19)) {
+-        return SNMP_ERR_AUTHORIZATIONERROR;
+-    } else if (!strncasecmp(buf, "not-writable", 12)) {
+-        return SNMP_ERR_NOTWRITABLE;
+-    } else if (!strncasecmp(buf, "inconsistent-name", 17)) {
+-        return SNMP_ERR_INCONSISTENTNAME;
+-    }
+-
+-    return SNMP_ERR_NOERROR;
+-}
+-
+ void
+ init_pass(void)
+ {
+@@ -276,11 +131,9 @@ pass_parse_config(const char *token, char *cptr)
+     } else {
+         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';';
+              tcptr++);
+-        strncpy((*ppass)->command, cptr, tcptr - cptr);
+-        (*ppass)->command[tcptr - cptr] = 0;
++        sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr);
+     }
+-    strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
+-    (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0;
++    strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
+     (*ppass)->next = NULL;
+ 
+     register_mib_priority("pass", (struct variable *) extensible_passthru_variables,
+@@ -337,18 +190,14 @@ var_extensible_pass(struct variable *vp,
+ {
+     oid             newname[MAX_OID_LEN];
+     int             i, rtest, fd, newlen;
+-    static long     long_ret;
+-    static in_addr_t addr_ret;
+     char            buf[SNMP_MAXBUF];
+     static char     buf2[SNMP_MAXBUF];
+-    static oid      objid[MAX_OID_LEN];
+     struct extensible *passthru;
+     FILE           *file;
+ 
+-    long_ret = *length;
+     for (i = 1; i <= numpassthrus; i++) {
+         passthru = get_exten_instance(passthrus, i);
+-        rtest = snmp_oid_min_compare(name, *length,
++        rtest = snmp_oidtree_compare(name, *length,
+                                      passthru->miboid, passthru->miblen);
+         if ((exact && rtest == 0) || (!exact && rtest <= 0)) {
+             /*
+@@ -409,89 +258,7 @@ var_extensible_pass(struct variable *vp,
+                 fclose(file);
+                 wait_on_exec(passthru);
+ 
+-                /*
+-                 * buf contains the return type, and buf2 contains the data 
+-                 */
+-                if (!strncasecmp(buf, "string", 6)) {
+-                    buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
+-                    *var_len = strlen(buf2);
+-                    vp->type = ASN_OCTET_STR;
+-                    return ((unsigned char *) buf2);
+-                } 
+-                else if (!strncasecmp(buf, "integer64", 9)) {
+-                    static struct counter64 c64;
+-                    uint64_t v64 = strtoull(buf2, NULL, 10);
+-                    c64.high = (unsigned long)(v64 >> 32);
+-                    c64.low  = (unsigned long)(v64 & 0xffffffff);
+-                    *var_len = sizeof(c64);
+-                    vp->type = ASN_INTEGER64;
+-                    return ((unsigned char *) &c64);
+-                } 
+-                else if (!strncasecmp(buf, "integer", 7)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtol(buf2, NULL, 10);
+-                    vp->type = ASN_INTEGER;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "unsigned", 8)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_UNSIGNED;
+-                    return ((unsigned char *) &long_ret);
+-                } 
+-                else if (!strncasecmp(buf, "counter64", 9)) {
+-                    static struct counter64 c64;
+-                    uint64_t v64 = strtoull(buf2, NULL, 10);
+-                    c64.high = (unsigned long)(v64 >> 32);
+-                    c64.low  = (unsigned long)(v64 & 0xffffffff);
+-                    *var_len = sizeof(c64);
+-                    vp->type = ASN_COUNTER64;
+-                    return ((unsigned char *) &c64);
+-                } 
+-                else if (!strncasecmp(buf, "counter", 7)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_COUNTER;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "octet", 5)) {
+-                    *var_len = asc2bin(buf2);
+-                    vp->type = ASN_OCTET_STR;
+-                    return ((unsigned char *) buf2);
+-                } else if (!strncasecmp(buf, "opaque", 6)) {
+-                    *var_len = asc2bin(buf2);
+-                    vp->type = ASN_OPAQUE;
+-                    return ((unsigned char *) buf2);
+-                } else if (!strncasecmp(buf, "gauge", 5)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_GAUGE;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "objectid", 8)) {
+-                    newlen = parse_miboid(buf2, objid);
+-                    *var_len = newlen * sizeof(oid);
+-                    vp->type = ASN_OBJECT_ID;
+-                    return ((unsigned char *) objid);
+-                } else if (!strncasecmp(buf, "timetick", 8)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_TIMETICKS;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "ipaddress", 9)) {
+-                    newlen = parse_miboid(buf2, objid);
+-                    if (newlen != 4) {
+-                        snmp_log(LOG_ERR,
+-                                 "invalid ipaddress returned:  %s\n",
+-                                 buf2);
+-                        *var_len = 0;
+-                        return (NULL);
+-                    }
+-                    addr_ret =
+-                        (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
+-                        (objid[2] << 8) + objid[3];
+-                    addr_ret = htonl(addr_ret);
+-                    *var_len = sizeof(addr_ret);
+-                    vp->type = ASN_IPADDRESS;
+-                    return ((unsigned char *) &addr_ret);
+-                }
++                return netsnmp_internal_pass_parse(buf, buf2, var_len, vp);
+             }
+             *var_len = 0;
+             return (NULL);
+@@ -504,21 +271,16 @@ var_extensible_pass(struct variable *vp,
+ }
+ 
+ int
+-setPass(int action,
+-        u_char * var_val,
+-        u_char var_val_type,
++setPass(int action, u_char * var_val, u_char var_val_type,
+         size_t var_val_len, u_char * statP, oid * name, size_t name_len)
+ {
+     int             i, rtest;
+     struct extensible *passthru;
+-
+     char            buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF];
+-    long            tmp;
+-    unsigned long   utmp;
+ 
+     for (i = 1; i <= numpassthrus; i++) {
+         passthru = get_exten_instance(passthrus, i);
+-        rtest = snmp_oid_min_compare(name, name_len,
++        rtest = snmp_oidtree_compare(name, name_len,
+                                      passthru->miboid, passthru->miblen);
+         if (rtest <= 0) {
+             if (action != ACTION)
+@@ -533,60 +295,14 @@ setPass(int action,
+             snprintf(passthru->command, sizeof(passthru->command),
+                      "%s -s %s ", passthru->name, buf);
+             passthru->command[ sizeof(passthru->command)-1 ] = 0;
+-            switch (var_val_type) {
+-            case ASN_INTEGER:
+-            case ASN_COUNTER:
+-            case ASN_GAUGE:
+-            case ASN_TIMETICKS:
+-                tmp = *((long *) var_val);
+-                switch (var_val_type) {
+-                case ASN_INTEGER:
+-                    sprintf(buf, "integer %d\n", (int) tmp);
+-                    break;
+-                case ASN_COUNTER:
+-                    sprintf(buf, "counter %d\n", (int) tmp);
+-                    break;
+-                case ASN_GAUGE:
+-                    sprintf(buf, "gauge %d\n", (int) tmp);
+-                    break;
+-                case ASN_TIMETICKS:
+-                    sprintf(buf, "timeticks %d\n", (int) tmp);
+-                    break;
+-                }
+-                break;
+-            case ASN_IPADDRESS:
+-                utmp = *((u_long *) var_val);
+-                utmp = ntohl(utmp);
+-                sprintf(buf, "ipaddress %d.%d.%d.%d\n",
+-                        (int) ((utmp & 0xff000000) >> (8 * 3)),
+-                        (int) ((utmp & 0xff0000) >> (8 * 2)),
+-                        (int) ((utmp & 0xff00) >> (8)),
+-                        (int) ((utmp & 0xff)));
+-                break;
+-            case ASN_OCTET_STR:
+-                memcpy(buf2, var_val, var_val_len);
+-                if (var_val_len == 0)
+-                    sprintf(buf, "string \"\"\n");
+-                else if (bin2asc(buf2, var_val_len) == (int) var_val_len)
+-                    snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
+-                else
+-                    snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
+-                buf[ sizeof(buf)-1 ] = 0;
+-                break;
+-            case ASN_OBJECT_ID:
+-                sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid));
+-                snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
+-                buf[ sizeof(buf)-1 ] = 0;
+-                break;
+-            }
+-            strncat(passthru->command, buf, sizeof(passthru->command)-strlen(passthru->command)-1);
+-            passthru->command[ sizeof(passthru->command)-1 ] = 0;
++            netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len);
++            strlcat(passthru->command, buf, sizeof(passthru->command));
+             DEBUGMSGTL(("ucd-snmp/pass", "pass-running:  %s",
+                         passthru->command));
+             exec_command(passthru);
+             DEBUGMSGTL(("ucd-snmp/pass", "pass-running returned: %s",
+                         passthru->output));
+-            return netsnmp_pass_str_to_errno(passthru->output);
++            return netsnmp_internal_pass_str_to_errno(passthru->output);
+         }
+     }
+     if (snmp_get_do_debugging()) {
+diff --git a/agent/mibgroup/ucd-snmp/pass.h b/agent/mibgroup/ucd-snmp/pass.h
+index 089c9ca..51c0689 100644
+--- a/agent/mibgroup/ucd-snmp/pass.h
++++ b/agent/mibgroup/ucd-snmp/pass.h
+@@ -6,7 +6,9 @@
+ 
+ void            init_pass(void);
+ 
++config_require(ucd-snmp/pass_common)
+ config_require(util_funcs)
++config_require(utilities/execute)
+ config_add_mib(NET-SNMP-PASS-MIB)
+ 
+ extern FindVarMethod var_extensible_pass;
+diff --git a/agent/mibgroup/ucd-snmp/pass_common.c b/agent/mibgroup/ucd-snmp/pass_common.c
+new file mode 100644
+index 0000000..38a0443
+--- /dev/null
++++ b/agent/mibgroup/ucd-snmp/pass_common.c
+@@ -0,0 +1,264 @@
++#include <net-snmp/net-snmp-config.h>
++
++#include <ctype.h>
++#if HAVE_STDDEF_H
++#include <stddef.h>
++#endif
++#include <stdio.h>
++#if HAVE_STRING_H
++#include <string.h>
++#else
++#include <strings.h>
++#endif
++
++#include <net-snmp/net-snmp-includes.h>
++#include <net-snmp/agent/net-snmp-agent-includes.h>
++#include "mibgroup/util_funcs.h"
++#include "pass_common.h"
++
++static int
++netsnmp_internal_asc2bin(char *p)
++{
++    char           *r, *q = p;
++    char            c;
++    int             n = 0;
++
++    for (;;) {
++        c = (char) strtol(q, &r, 16);
++        if (r == q)
++            break;
++        *p++ = c;
++        q = r;
++        n++;
++    }
++    return n;
++}
++
++static int
++netsnmp_internal_bin2asc(char *p, size_t n)
++{
++    int             i, flag = 0;
++    char            buffer[SNMP_MAXBUF];
++
++    /* prevent buffer overflow */
++    if ((int)n > (sizeof(buffer) - 1))
++        n = sizeof(buffer) - 1;
++
++    for (i = 0; i < (int) n; i++) {
++        buffer[i] = p[i];
++        if (!isprint((unsigned char) (p[i])))
++            flag = 1;
++    }
++    if (flag == 0) {
++        p[n] = 0;
++        return n;
++    }
++    for (i = 0; i < (int) n; i++) {
++        sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff));
++        p += 3;
++    }
++    *--p = 0;
++    return 3 * n - 1;
++}
++
++int
++netsnmp_internal_pass_str_to_errno(const char *buf)
++{
++    if (!strncasecmp(buf, "too-big", 7)) {
++        /* Shouldn't happen */
++        return SNMP_ERR_TOOBIG;
++    } else if (!strncasecmp(buf, "no-such-name", 12)) {
++        return SNMP_ERR_NOSUCHNAME;
++    } else if (!strncasecmp(buf, "bad-value", 9)) {
++        return SNMP_ERR_BADVALUE;
++    } else if (!strncasecmp(buf, "read-only", 9)) {
++        return SNMP_ERR_READONLY;
++    } else if (!strncasecmp(buf, "gen-error", 9)) {
++        return SNMP_ERR_GENERR;
++    } else if (!strncasecmp(buf, "no-access", 9)) {
++        return SNMP_ERR_NOACCESS;
++    } else if (!strncasecmp(buf, "wrong-type", 10)) {
++        return SNMP_ERR_WRONGTYPE;
++    } else if (!strncasecmp(buf, "wrong-length", 12)) {
++        return SNMP_ERR_WRONGLENGTH;
++    } else if (!strncasecmp(buf, "wrong-encoding", 14)) {
++        return SNMP_ERR_WRONGENCODING;
++    } else if (!strncasecmp(buf, "wrong-value", 11)) {
++        return SNMP_ERR_WRONGVALUE;
++    } else if (!strncasecmp(buf, "no-creation", 11)) {
++        return SNMP_ERR_NOCREATION;
++    } else if (!strncasecmp(buf, "inconsistent-value", 18)) {
++        return SNMP_ERR_INCONSISTENTVALUE;
++    } else if (!strncasecmp(buf, "resource-unavailable", 20)) {
++        return SNMP_ERR_RESOURCEUNAVAILABLE;
++    } else if (!strncasecmp(buf, "commit-failed", 13)) {
++        return SNMP_ERR_COMMITFAILED;
++    } else if (!strncasecmp(buf, "undo-failed", 11)) {
++        return SNMP_ERR_UNDOFAILED;
++    } else if (!strncasecmp(buf, "authorization-error", 19)) {
++        return SNMP_ERR_AUTHORIZATIONERROR;
++    } else if (!strncasecmp(buf, "not-writable", 12)) {
++        return SNMP_ERR_NOTWRITABLE;
++    } else if (!strncasecmp(buf, "inconsistent-name", 17)) {
++        return SNMP_ERR_INCONSISTENTNAME;
++    }
++
++    return SNMP_ERR_NOERROR;
++}
++
++unsigned char *
++netsnmp_internal_pass_parse(char * buf,
++                            char * buf2,
++                            size_t * var_len,
++                            struct variable *vp)
++{
++    static long     long_ret;
++    static in_addr_t addr_ret;
++    int             newlen;
++    static oid      objid[MAX_OID_LEN];
++
++    /*
++     * buf contains the return type, and buf2 contains the data
++     */
++    if (!strncasecmp(buf, "string", 6)) {
++        buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
++        *var_len = strlen(buf2);
++        vp->type = ASN_OCTET_STR;
++        return ((unsigned char *) buf2);
++    }
++#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
++    else if (!strncasecmp(buf, "integer64", 9)) {
++        static struct counter64 c64;
++        uint64_t v64 = strtoull(buf2, NULL, 10);
++        c64.high = (unsigned long)(v64 >> 32);
++        c64.low  = (unsigned long)(v64 & 0xffffffff);
++        *var_len = sizeof(c64);
++        vp->type = ASN_INTEGER64;
++        return ((unsigned char *) &c64);
++    }
++#endif
++    else if (!strncasecmp(buf, "integer", 7)) {
++        *var_len = sizeof(long_ret);
++        long_ret = strtol(buf2, NULL, 10);
++        vp->type = ASN_INTEGER;
++        return ((unsigned char *) &long_ret);
++    } else if (!strncasecmp(buf, "unsigned", 8)) {
++        *var_len = sizeof(long_ret);
++        long_ret = strtoul(buf2, NULL, 10);
++        vp->type = ASN_UNSIGNED;
++        return ((unsigned char *) &long_ret);
++    }
++    else if (!strncasecmp(buf, "counter64", 9)) {
++        static struct counter64 c64;
++        uint64_t v64 = strtoull(buf2, NULL, 10);
++        c64.high = (unsigned long)(v64 >> 32);
++        c64.low  = (unsigned long)(v64 & 0xffffffff);
++        *var_len = sizeof(c64);
++        vp->type = ASN_COUNTER64;
++        return ((unsigned char *) &c64);
++    }
++    else if (!strncasecmp(buf, "counter", 7)) {
++        *var_len = sizeof(long_ret);
++        long_ret = strtoul(buf2, NULL, 10);
++        vp->type = ASN_COUNTER;
++        return ((unsigned char *) &long_ret);
++    } else if (!strncasecmp(buf, "octet", 5)) {
++        *var_len = netsnmp_internal_asc2bin(buf2);
++        vp->type = ASN_OCTET_STR;
++        return ((unsigned char *) buf2);
++    } else if (!strncasecmp(buf, "opaque", 6)) {
++        *var_len = netsnmp_internal_asc2bin(buf2);
++        vp->type = ASN_OPAQUE;
++        return ((unsigned char *) buf2);
++    } else if (!strncasecmp(buf, "gauge", 5)) {
++        *var_len = sizeof(long_ret);
++        long_ret = strtoul(buf2, NULL, 10);
++        vp->type = ASN_GAUGE;
++        return ((unsigned char *) &long_ret);
++    } else if (!strncasecmp(buf, "objectid", 8)) {
++        newlen = parse_miboid(buf2, objid);
++        *var_len = newlen * sizeof(oid);
++        vp->type = ASN_OBJECT_ID;
++        return ((unsigned char *) objid);
++    } else if (!strncasecmp(buf, "timetick", 8)) {
++        *var_len = sizeof(long_ret);
++        long_ret = strtoul(buf2, NULL, 10);
++        vp->type = ASN_TIMETICKS;
++        return ((unsigned char *) &long_ret);
++    } else if (!strncasecmp(buf, "ipaddress", 9)) {
++        newlen = parse_miboid(buf2, objid);
++        if (newlen != 4) {
++            snmp_log(LOG_ERR, "invalid ipaddress returned:  %s\n", buf2);
++            *var_len = 0;
++            return (NULL);
++        }
++        addr_ret =
++            (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
++            (objid[2] << 8) + objid[3];
++        addr_ret = htonl(addr_ret);
++        *var_len = sizeof(addr_ret);
++        vp->type = ASN_IPADDRESS;
++        return ((unsigned char *) &addr_ret);
++    }
++    *var_len = 0;
++    return (NULL);
++}
++
++void
++netsnmp_internal_pass_set_format(char *buf,
++                                 const u_char *var_val,
++                                 u_char var_val_type,
++                                 size_t var_val_len)
++{
++    char            buf2[SNMP_MAXBUF];
++    long            tmp;
++    unsigned long   utmp;
++
++    switch (var_val_type) {
++    case ASN_INTEGER:
++    case ASN_COUNTER:
++    case ASN_GAUGE:
++    case ASN_TIMETICKS:
++        tmp = *((const long *) var_val);
++        switch (var_val_type) {
++        case ASN_INTEGER:
++            sprintf(buf, "integer %d\n", (int) tmp);
++            break;
++        case ASN_COUNTER:
++            sprintf(buf, "counter %d\n", (int) tmp);
++            break;
++        case ASN_GAUGE:
++            sprintf(buf, "gauge %d\n", (int) tmp);
++            break;
++        case ASN_TIMETICKS:
++            sprintf(buf, "timeticks %d\n", (int) tmp);
++            break;
++        }
++        break;
++    case ASN_IPADDRESS:
++        utmp = *((const u_long *) var_val);
++        utmp = ntohl(utmp);
++        sprintf(buf, "ipaddress %d.%d.%d.%d\n",
++                (int) ((utmp & 0xff000000) >> (8 * 3)),
++                (int) ((utmp & 0xff0000) >> (8 * 2)),
++                (int) ((utmp & 0xff00) >> (8)),
++                (int) ((utmp & 0xff)));
++        break;
++    case ASN_OCTET_STR:
++        memcpy(buf2, var_val, var_val_len);
++        if (var_val_len == 0)
++            sprintf(buf, "string \"\"\n");
++        else if (netsnmp_internal_bin2asc(buf2, var_val_len) ==
++                 (int) var_val_len)
++            snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
++        else
++            snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
++        buf[ sizeof(buf)-1 ] = 0;
++        break;
++    case ASN_OBJECT_ID:
++        sprint_mib_oid(buf2, (const oid *) var_val, var_val_len/sizeof(oid));
++        snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
++        buf[ sizeof(buf)-1 ] = 0;
++        break;
++    }
++}
+diff --git a/agent/mibgroup/ucd-snmp/pass_common.h b/agent/mibgroup/ucd-snmp/pass_common.h
+new file mode 100644
+index 0000000..b1d7e4b
+--- /dev/null
++++ b/agent/mibgroup/ucd-snmp/pass_common.h
+@@ -0,0 +1,20 @@
++#ifndef NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H
++#define NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H
++
++/*
++ * This is an internal header file. The functions declared here might change
++ * or disappear at any time
++ */
++
++int
++netsnmp_internal_pass_str_to_errno(const char *buf);
++
++unsigned char *
++netsnmp_internal_pass_parse(char *buf, char *buf2, size_t *var_len,
++                            struct variable *vp);
++
++void
++netsnmp_internal_pass_set_format(char *buf, const u_char *var_val,
++                                 u_char var_val_type, size_t var_val_len);
++
++#endif /* !NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H */
+diff --git a/agent/mibgroup/ucd-snmp/pass_persist.c b/agent/mibgroup/ucd-snmp/pass_persist.c
+index c18a84c..6cce6f4 100644
+--- a/agent/mibgroup/ucd-snmp/pass_persist.c
++++ b/agent/mibgroup/ucd-snmp/pass_persist.c
+@@ -38,6 +38,7 @@
+ 
+ #include "struct.h"
+ #include "pass_persist.h"
++#include "pass_common.h"
+ #include "extensible.h"
+ #include "util_funcs.h"
+ 
+@@ -60,15 +61,6 @@ static void     destruct_persist_pipes(void);
+ static int      write_persist_pipe(int iindex, const char *data);
+ 
+ /*
+- * These are defined in pass.c 
+- */
+-extern int      asc2bin(char *p);
+-extern int      bin2asc(char *p, size_t n);
+-extern int      netsnmp_pass_str_to_errno(const char *buf);
+-extern int      snmp_oid_min_compare(const oid *, size_t, const oid *,
+-                                     size_t);
+-
+-/*
+  * the relocatable extensible commands variables 
+  */
+ struct variable2 extensible_persist_passthru_variables[] = {
+@@ -169,11 +161,9 @@ pass_persist_parse_config(const char *token, char *cptr)
+     } else {
+         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';';
+              tcptr++);
+-        strncpy((*ppass)->command, cptr, tcptr - cptr);
+-        (*ppass)->command[tcptr - cptr] = 0;
++        sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr);
+     }
+-    strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
+-    (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0;
++    strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
+     (*ppass)->next = NULL;
+ 
+     register_mib_priority("pass_persist",
+@@ -230,11 +220,8 @@ var_extensible_pass_persist(struct variable *vp,
+ {
+     oid             newname[MAX_OID_LEN];
+     int             i, rtest, newlen;
+-    static long     long_ret;
+-    static in_addr_t addr_ret;
+     char            buf[SNMP_MAXBUF];
+     static char     buf2[SNMP_MAXBUF];
+-    static oid      objid[MAX_OID_LEN];
+     struct extensible *persistpassthru;
+     FILE           *file;
+ 
+@@ -243,10 +230,9 @@ var_extensible_pass_persist(struct variable *vp,
+      */
+     init_persist_pipes();
+ 
+-    long_ret = *length;
+     for (i = 1; i <= numpersistpassthrus; i++) {
+         persistpassthru = get_exten_instance(persistpassthrus, i);
+-        rtest = snmp_oid_min_compare(name, *length,
++        rtest = snmp_oidtree_compare(name, *length,
+                                      persistpassthru->miboid,
+                                      persistpassthru->miblen);
+         if ((exact && rtest == 0) || (!exact && rtest <= 0)) {
+@@ -325,89 +311,7 @@ var_extensible_pass_persist(struct variable *vp,
+                     close_persist_pipe(i);
+                     return (NULL);
+                 }
+-                /*
+-                 * buf contains the return type, and buf2 contains the data 
+-                 */
+-                if (!strncasecmp(buf, "string", 6)) {
+-                    buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
+-                    *var_len = strlen(buf2);
+-                    vp->type = ASN_OCTET_STR;
+-                    return ((unsigned char *) buf2);
+-                } 
+-                else if (!strncasecmp(buf, "integer64", 9)) {
+-                    static struct counter64 c64;
+-                    uint64_t v64 = strtoull(buf2, NULL, 10);
+-                    c64.high = (unsigned long)(v64 >> 32);
+-                    c64.low  = (unsigned long)(v64 & 0xffffffff);
+-                    *var_len = sizeof(c64);
+-                    vp->type = ASN_INTEGER64;
+-                    return ((unsigned char *) &c64);
+-                } 
+-                else if (!strncasecmp(buf, "integer", 7)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtol(buf2, NULL, 10);
+-                    vp->type = ASN_INTEGER;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "unsigned", 8)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_UNSIGNED;
+-                    return ((unsigned char *) &long_ret);
+-                } 
+-                else if (!strncasecmp(buf, "counter64", 9)) {
+-                    static struct counter64 c64;
+-                    uint64_t v64 = strtoull(buf2, NULL, 10);
+-                    c64.high = (unsigned long)(v64 >> 32);
+-                    c64.low  = (unsigned long)(v64 & 0xffffffff);
+-                    *var_len = sizeof(c64);
+-                    vp->type = ASN_COUNTER64;
+-                    return ((unsigned char *) &c64);
+-                } 
+-                else if (!strncasecmp(buf, "counter", 7)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_COUNTER;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "octet", 5)) {
+-                    *var_len = asc2bin(buf2);
+-                    vp->type = ASN_OCTET_STR;
+-                    return ((unsigned char *) buf2);
+-                } else if (!strncasecmp(buf, "opaque", 6)) {
+-                    *var_len = asc2bin(buf2);
+-                    vp->type = ASN_OPAQUE;
+-                    return ((unsigned char *) buf2);
+-                } else if (!strncasecmp(buf, "gauge", 5)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_GAUGE;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "objectid", 8)) {
+-                    newlen = parse_miboid(buf2, objid);
+-                    *var_len = newlen * sizeof(oid);
+-                    vp->type = ASN_OBJECT_ID;
+-                    return ((unsigned char *) objid);
+-                } else if (!strncasecmp(buf, "timetick", 8)) {
+-                    *var_len = sizeof(long_ret);
+-                    long_ret = strtoul(buf2, NULL, 10);
+-                    vp->type = ASN_TIMETICKS;
+-                    return ((unsigned char *) &long_ret);
+-                } else if (!strncasecmp(buf, "ipaddress", 9)) {
+-                    newlen = parse_miboid(buf2, objid);
+-                    if (newlen != 4) {
+-                        snmp_log(LOG_ERR,
+-                                 "invalid ipaddress returned:  %s\n",
+-                                 buf2);
+-                        *var_len = 0;
+-                        return (NULL);
+-                    }
+-                    addr_ret =
+-                        (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
+-                        (objid[2] << 8) + objid[3];
+-                    addr_ret = htonl(addr_ret);
+-                    *var_len = sizeof(addr_ret);
+-                    vp->type = ASN_IPADDRESS;
+-                    return ((unsigned char *) &addr_ret);
+-                }
++                return netsnmp_internal_pass_parse(buf, buf2, var_len, vp);
+             }
+             *var_len = 0;
+             return (NULL);
+@@ -430,8 +334,6 @@ setPassPersist(int action,
+     struct extensible *persistpassthru;
+ 
+     char            buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF];
+-    long            tmp;
+-    unsigned long   utmp;
+ 
+     /*
+      * Make sure that our basic pipe structure is malloced 
+@@ -440,7 +342,7 @@ setPassPersist(int action,
+ 
+     for (i = 1; i <= numpersistpassthrus; i++) {
+         persistpassthru = get_exten_instance(persistpassthrus, i);
+-        rtest = snmp_oid_min_compare(name, name_len,
++        rtest = snmp_oidtree_compare(name, name_len,
+                                      persistpassthru->miboid,
+                                      persistpassthru->miblen);
+         if (rtest <= 0) {
+@@ -457,55 +359,9 @@ setPassPersist(int action,
+             snprintf(persistpassthru->command,
+                      sizeof(persistpassthru->command), "set\n%s\n", buf);
+             persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0;
+-            switch (var_val_type) {
+-            case ASN_INTEGER:
+-            case ASN_COUNTER:
+-            case ASN_GAUGE:
+-            case ASN_TIMETICKS:
+-                tmp = *((long *) var_val);
+-                switch (var_val_type) {
+-                case ASN_INTEGER:
+-                    sprintf(buf, "integer %d\n", (int) tmp);
+-                    break;
+-                case ASN_COUNTER:
+-                    sprintf(buf, "counter %d\n", (int) tmp);
+-                    break;
+-                case ASN_GAUGE:
+-                    sprintf(buf, "gauge %d\n", (int) tmp);
+-                    break;
+-                case ASN_TIMETICKS:
+-                    sprintf(buf, "timeticks %d\n", (int) tmp);
+-                    break;
+-                }
+-                break;
+-            case ASN_IPADDRESS:
+-                utmp = *((u_long *) var_val);
+-                utmp = ntohl(utmp);
+-                sprintf(buf, "ipaddress %d.%d.%d.%d\n",
+-                        (int) ((utmp & 0xff000000) >> (8 * 3)),
+-                        (int) ((utmp & 0xff0000) >> (8 * 2)),
+-                        (int) ((utmp & 0xff00) >> (8)),
+-                        (int) ((utmp & 0xff)));
+-                break;
+-            case ASN_OCTET_STR:
+-                memcpy(buf2, var_val, var_val_len);
+-                if (var_val_len == 0)
+-                    sprintf(buf, "string \"\"\n");
+-                else if (bin2asc(buf2, var_val_len) == (int) var_val_len)
+-                    snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
+-                else
+-                    snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
+-                buf[ sizeof(buf)-1 ] = 0;
+-                break;
+-            case ASN_OBJECT_ID:
+-                sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid));
+-                snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
+-                buf[ sizeof(buf)-1 ] = 0;
+-                break;
+-            }
+-            strncat(persistpassthru->command, buf,
+-                    sizeof(persistpassthru->command) -
+-                    strlen(persistpassthru->command) - 2);
++            netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len);
++            strlcat(persistpassthru->command, buf,
++                    sizeof(persistpassthru->command));
+             persistpassthru->command[ sizeof(persistpassthru->command)-2 ] = '\n';
+             persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0;
+ 
+@@ -526,7 +382,7 @@ setPassPersist(int action,
+                 return SNMP_ERR_NOTWRITABLE;
+             }
+ 
+-            return netsnmp_pass_str_to_errno(buf);
++            return netsnmp_internal_pass_str_to_errno(buf);
+         }
+     }
+     if (snmp_get_do_debugging()) {
+@@ -650,8 +506,8 @@ open_persist_pipe(int iindex, char *command)
+ {
+     static int      recurse = 0;        /* used to allow one level of recursion */
+ 
+-    DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s')\n",
+-                iindex, command));
++    DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s') recurse=%d\n",
++                iindex, command, recurse));
+     /*
+      * Open if it's not already open 
+      */
+@@ -683,6 +539,7 @@ open_persist_pipe(int iindex, char *command)
+          * Setup our -non-buffered-io- 
+          */
+         setbuf(persist_pipes[iindex].fOut, (char *) 0);
++        DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: opened the pipes\n"));
+     }
+ 
+     /*
+@@ -702,6 +559,7 @@ open_persist_pipe(int iindex, char *command)
+              * Recurse one time if we get a SIGPIPE 
+              */
+             if (!recurse) {
++                DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: recursing to reopen\n"));
+                 recurse = 1;
+                 return open_persist_pipe(iindex, command);
+             }
+@@ -717,7 +575,7 @@ open_persist_pipe(int iindex, char *command)
+         }
+         if (strncmp(buf, "PONG", 4)) {
+             DEBUGMSGTL(("ucd-snmp/pass_persist",
+-                        "open_persist_pipe: PONG not received!\n"));
++                        "open_persist_pipe: Got %s instead of PONG!\n", buf));
+             close_persist_pipe(iindex);
+             recurse = 0;
+             return 0;
+@@ -728,17 +586,6 @@ open_persist_pipe(int iindex, char *command)
+     return 1;
+ }
+ 
+-#if HAVE_STRUCT_SIGACTION_SA_SIGACTION
+-/*
+- * Generic handler 
+- */
+-void
+-sigpipe_handler(int sig, siginfo_t * sip, void *uap)
+-{
+-    return;
+-}
+-#endif
+-
+ static int
+ write_persist_pipe(int iindex, const char *data)
+ {
+@@ -750,16 +597,16 @@ write_persist_pipe(int iindex, const char *data)
+      * Don't write to a non-existant process 
+      */
+     if (persist_pipes[iindex].pid == NETSNMP_NO_SUCH_PROCESS) {
++        DEBUGMSGTL(("ucd-snmp/pass_persist",
++                    "write_persist_pipe: not writing %s, process is non-existent",
++                    data));
+         return 0;
+     }
+ 
+     /*
+-     * Setup our signal action to catch SIGPIPEs 
++     * Setup our signal action to ignore SIGPIPEs 
+      */
+-    sa.sa_handler = NULL;
+-#if HAVE_STRUCT_SIGACTION_SA_SIGACTION
+-    sa.sa_sigaction = &sigpipe_handler;
+-#endif
++    sa.sa_handler = SIG_IGN;
+     sigemptyset(&sa.sa_mask);
+     sa.sa_flags = 0;
+     if (sigaction(SIGPIPE, &sa, &osa)) {
+@@ -779,10 +626,10 @@ write_persist_pipe(int iindex, const char *data)
+     sigaction(SIGPIPE, &osa, (struct sigaction *) 0);
+ 
+     if (wret < 0) {
+-        if (werrno != EINTR) {
++        if (werrno != EPIPE) {
+             DEBUGMSGTL(("ucd-snmp/pass_persist",
+-                        "write_persist_pipe: write returned unknown error %d\n",
+-                        errno));
++                        "write_persist_pipe: write returned unknown error %d (%s)\n",
++                        werrno, strerror(werrno)));
+         }
+         close_persist_pipe(iindex);
+         return 0;
+diff --git a/agent/mibgroup/ucd-snmp/pass_persist.h b/agent/mibgroup/ucd-snmp/pass_persist.h
+index c7a2aa8..0537abc 100644
+--- a/agent/mibgroup/ucd-snmp/pass_persist.h
++++ b/agent/mibgroup/ucd-snmp/pass_persist.h
+@@ -4,7 +4,9 @@
+ #ifndef _MIBGROUP_PASS_PERSIST_H
+ #define _MIBGROUP_PASS_PERSIST_H
+ 
++config_require(ucd-snmp/pass_common)
+ config_require(util_funcs)
++config_require(utilities/execute)
+ 
+ void            init_pass_persist(void);
+ void            shutdown_pass_persist(void);
+diff --git a/agent/mibgroup/ucd-snmp/proc.c b/agent/mibgroup/ucd-snmp/proc.c
+index 32ac0df..e90c2e8 100644
+--- a/agent/mibgroup/ucd-snmp/proc.c
++++ b/agent/mibgroup/ucd-snmp/proc.c
+@@ -437,8 +437,7 @@ sh_count_procs(char *procname)
+     count = 0;
+ 
+     while(getprocs(&pinfo, sizeof(pinfo), NULL, 0, &index, 1) == 1) {
+-        strncpy(pinfo_name, pinfo.pi_comm, 256);
+-        pinfo_name[255] = 0;
++        strlcpy(pinfo_name, pinfo.pi_comm, sizeof(pinfo_name));
+         sep = strchr(pinfo_name, ' ');
+         if(sep != NULL) *sep = 0;
+         if(strcmp(procname, pinfo_name) == 0) count++;
+diff --git a/agent/mibgroup/ucd-snmp/proxy.c b/agent/mibgroup/ucd-snmp/proxy.c
+index ec1aac7..017fd5c 100644
+--- a/agent/mibgroup/ucd-snmp/proxy.c
++++ b/agent/mibgroup/ucd-snmp/proxy.c
+@@ -285,14 +285,13 @@ proxy_fill_in_session(netsnmp_mib_handler *handler,
+                 return 0;
+             }
+ 
+-            *configured = malloc(strlen("-c") + 1);
+-            strcpy((char*)*configured, "-c");
++            *configured = strdup("-c");
+             DEBUGMSGTL(("proxy", "pdu has community string\n"));
+             session->community_len = reqinfo->asp->pdu->community_len;
+-            session->community = (u_char*)malloc(session->community_len + 1);
+-            strncpy((char *)session->community,
+-                    (const char *)reqinfo->asp->pdu->community,
+-                    session->community_len);
++            session->community = malloc(session->community_len + 1);
++            sprintf((char *)session->community, "%.*s",
++                    (int) session->community_len,
++                    (const char *)reqinfo->asp->pdu->community);
+         }
+     }
+ #endif
+@@ -401,6 +400,8 @@ proxy_handler(netsnmp_mib_handler *handler,
+ 
+     if (!pdu || !sp) {
+         netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR);
++        if (pdu)
++            snmp_free_pdu(pdu);
+         return SNMP_ERR_NOERROR;
+     }
+ 
+@@ -561,7 +562,7 @@ proxy_got_response(int operation, netsnmp_session * sess, int reqid,
+                                                            REQUEST_IS_NOT_DELEGATED);
+             }
+ #ifndef NETSNMP_NO_WRITE_SUPPORT
+-	    else if ((cache->reqinfo->mode == MODE_SET_ACTION)) {
++	    else if (cache->reqinfo->mode == MODE_SET_ACTION) {
+ 		/*
+ 		 * In order for netsnmp_wrap_up_request to consider the
+ 		 * SET request complete,
+diff --git a/agent/mibgroup/ucd-snmp/versioninfo.c b/agent/mibgroup/ucd-snmp/versioninfo.c
+index 60a3c71..f7a8c63 100644
+--- a/agent/mibgroup/ucd-snmp/versioninfo.c
++++ b/agent/mibgroup/ucd-snmp/versioninfo.c
+@@ -108,22 +108,21 @@ var_extensible_version(struct variable *vp,
+         long_ret = name[8];
+         return ((u_char *) (&long_ret));
+     case VERTAG:
+-        strcpy(errmsg, netsnmp_get_version());
++        strlcpy(errmsg, netsnmp_get_version(), sizeof(errmsg));
+         *var_len = strlen(errmsg);
+         return ((u_char *) errmsg);
+     case VERDATE:
+-        sprintf(errmsg, "$Date$");
++        strlcpy(errmsg, "$Date$", sizeof(errmsg));
+         *var_len = strlen(errmsg);
+         return ((u_char *) errmsg);
+     case VERCDATE:
+         curtime = time(NULL);
+         cptr = ctime(&curtime);
+-        strcpy(errmsg, cptr);
+-        *var_len = strlen(errmsg) - 1;
++        strlcpy(errmsg, cptr, sizeof(errmsg));
++        *var_len = strlen(errmsg) - 1; /* - 1 to strip trailing newline */
+         return ((u_char *) errmsg);
+     case VERIDENT:
+-        sprintf(errmsg,
+-                "$Id$");
++        strlcpy(errmsg, "$Id$", sizeof(errmsg));
+         *var_len = strlen(errmsg);
+         return ((u_char *) errmsg);
+     case VERCONFIG:
+@@ -133,7 +132,7 @@ var_extensible_version(struct variable *vp,
+             *var_len = 1024;    /* mib imposed restriction */
+         return (u_char *) config_opts;
+ #else
+-        sprintf(errmsg, "");
++        strlcpy(errmsg, "", sizeof(errmsg)));
+         *var_len = strlen(errmsg);
+         return ((u_char *) errmsg);
+ #endif
+diff --git a/agent/mibgroup/ucd-snmp/vmstat.c b/agent/mibgroup/ucd-snmp/vmstat.c
+index b613ee1..d52a5b6 100644
+--- a/agent/mibgroup/ucd-snmp/vmstat.c
++++ b/agent/mibgroup/ucd-snmp/vmstat.c
+@@ -31,7 +31,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                netsnmp_request_info         *requests)
+ {
+     oid  obj;
+-    long value = 0;
++    unsigned long long value = 0;
+     char cp[300];
+     netsnmp_cpu_info *info = netsnmp_cpu_get_byIdx( -1, 0 );
+ 
+@@ -147,7 +147,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                  else
+                      value = 0;    /* or skip this entry */
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+         case CPUSYSTEM:
+@@ -159,7 +159,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                  else
+                      value = 0;    /* or skip this entry */
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+         case CPUIDLE:
+@@ -170,7 +170,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                  else
+                      value = 0;    /* or skip this entry */
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+ 		
+@@ -190,14 +190,14 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+              if ( info->history && info->history[0].total_hist ) {
+                  value  = (info->nInterrupts - info->history[0].intr_hist)/60;
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+         case SYSCONTEXT:
+              if ( info->history && info->history[0].total_hist ) {
+                  value  = (info->nCtxSwitches - info->history[0].ctx_hist)/60;
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+ 
+@@ -217,7 +217,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                  value  = (info->swapIn - info->history[0].swpi_hist)/60;
+                  /* ??? value *= PAGE_SIZE;  */
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+         case SWAPOUT:
+@@ -225,7 +225,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+                  value  = (info->swapOut - info->history[0].swpo_hist)/60;
+                  /* ??? value *= PAGE_SIZE;  */
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+ 
+@@ -244,14 +244,14 @@ vmstat_handler(netsnmp_mib_handler          *handler,
+              if ( info->history && info->history[0].total_hist ) {
+                  value  = (info->pageOut - info->history[0].pageo_hist)/60;
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+         case IORECEIVE:
+              if ( info->history && info->history[0].total_hist ) {
+                  value  = (info->pageIn - info->history[0].pagei_hist)/60;
+                  snmp_set_var_typed_integer(requests->requestvb,
+-                                            ASN_INTEGER, value);
++                                            ASN_INTEGER, value & 0x7fffffff);
+              }
+              break;
+ 
+diff --git a/agent/mibgroup/ucd_snmp.h b/agent/mibgroup/ucd_snmp.h
+index c371dd4..0d87ec1 100644
+--- a/agent/mibgroup/ucd_snmp.h
++++ b/agent/mibgroup/ucd_snmp.h
+@@ -8,7 +8,9 @@ config_require(ucd-snmp/loadave)
+ config_require(agent/extend)
+ config_require(ucd-snmp/errormib)
+ config_require(ucd-snmp/file)
++#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
+ config_require(ucd-snmp/dlmod)
++#endif
+ config_require(ucd-snmp/proxy)
+ config_require(ucd-snmp/logmatch)
+ config_require(ucd-snmp/memory)
+diff --git a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
+index 9ea23a9..0e25c21 100644
+--- a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
++++ b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
+@@ -239,7 +239,7 @@ udpEndpointTable_container_load(netsnmp_container *container)
+     if (NULL == ep_c)
+         return MFD_RESOURCE_UNAVAILABLE;
+     ep_it = CONTAINER_ITERATOR(ep_c);
+-    if (NULL == ep_c) {
++    if (NULL == ep_it) {
+         netsnmp_access_udp_endpoint_container_free(ep_c, 0);
+         return MFD_RESOURCE_UNAVAILABLE;
+     }
+diff --git a/agent/mibgroup/util_funcs.c b/agent/mibgroup/util_funcs.c
+index 55d80c5..69d7190 100644
+--- a/agent/mibgroup/util_funcs.c
++++ b/agent/mibgroup/util_funcs.c
+@@ -126,31 +126,7 @@ extern int      numprocs, numextens;
+ const char *
+ make_tempfile(void)
+ {
+-    static char     name[32];
+-    int             fd = -1;
+-
+-    strcpy(name, get_temp_file_pattern());
+-#ifdef HAVE_MKSTEMP
+-    fd = mkstemp(name);
+-#else
+-    if (mktemp(name)) {
+-# ifndef WIN32        
+-        fd = open(name, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
+-# else
+-        /*
+-          Win32 needs _S_IREAD | _S_IWRITE to set permissions on file after closing
+-        */
+-        fd = _open(name, _O_CREAT | _O_EXCL | _O_WRONLY, _S_IREAD | _S_IWRITE);
+-# endif
+-    }
+-#endif
+-    if (fd >= 0) {
+-        close(fd);
+-        DEBUGMSGTL(("make_tempfile", "temp file created: %s\n", name));
+-        return name;
+-    }
+-    snmp_log(LOG_ERR,"make_tempfile: error creating file %s\n", name);
+-    return NULL;
++    return netsnmp_mktemp();
+ }
+ 
+ #ifndef NETSNMP_FEATURE_REMOVE_SHELL_COMMAND
+@@ -718,14 +694,12 @@ print_mib_oid(oid name[], size_t len)
+ }
+ 
+ void
+-sprint_mib_oid(char *buf, oid name[], size_t len)
++sprint_mib_oid(char *buf, const oid *name, size_t len)
+ {
+     int             i;
+-    for (i = 0; i < (int) len; i++) {
+-        sprintf(buf, ".%d", (int) name[i]);
+-        while (*buf != 0)
+-            buf++;
+-    }
++
++    for (i = 0; i < (int) len; i++)
++        buf += sprintf(buf, ".%" NETSNMP_PRIo "u", name[i]);
+ }
+ 
+ /*
+@@ -798,7 +772,10 @@ parse_miboid(const char *buf, oid * oidout)
+     if (*buf == '.')
+         buf++;
+     for (i = 0; isdigit((unsigned char)(*buf)); i++) {
+-        oidout[i] = atoi(buf);
++        /* Subidentifiers are unsigned values, up to 2^32-1
++         * so we need to use 'strtoul' rather than 'atoi'
++         */
++        oidout[i] = strtoul(buf, NULL, 10) & 0xffffffff;
+         while (isdigit((unsigned char)(*buf++)));
+         if (*buf == '.')
+             buf++;
+@@ -1146,7 +1123,7 @@ int net_snmp_delete_prefix_info(prefix_cbx **head,
+     }
+     return 0;
+ }
+-#endif
++#endif /* NETSNMP_FEATURE_REMOVE_DELETE_PREFIX_INFO */
+ 
+ #endif /* HAVE_LINUX_RTNETLINK_H */
+          
+diff --git a/agent/mibgroup/util_funcs.h b/agent/mibgroup/util_funcs.h
+index 5bef2a8..7f59780 100644
+--- a/agent/mibgroup/util_funcs.h
++++ b/agent/mibgroup/util_funcs.h
+@@ -43,7 +43,7 @@ int             get_exec_pipes(char *cmd, int *fdIn, int *fdOut, pid_t *pid);
+ #endif
+ WriteMethod     clear_cache;
+ void            print_mib_oid(oid *, size_t);
+-void            sprint_mib_oid(char *, oid *, size_t);
++void            sprint_mib_oid(char *, const oid *, size_t);
+ int             checkmib(struct variable *, oid *, size_t *, int, size_t *,
+                          WriteMethod ** write_method, int);
+ char           *find_field(char *, int);
+diff --git a/agent/mibgroup/utilities/override.c b/agent/mibgroup/utilities/override.c
+index 298883e..2b083a9 100644
+--- a/agent/mibgroup/utilities/override.c
++++ b/agent/mibgroup/utilities/override.c
+@@ -216,6 +216,8 @@ netsnmp_parse_override(const char *token, char *line)
+     case ASN_OBJECT_ID:
+         read_config_read_objid(buf, (oid **) & thedata->value,
+                                &thedata->value_len);
++        /* We need the size of the value in bytes, not in oids */
++        thedata->value_len *= sizeof(oid);
+         break;
+ 
+     case ASN_NULL:
+diff --git a/agent/mibgroup/winExtDLL.c b/agent/mibgroup/winExtDLL.c
+index ddf613b..c693913 100644
+--- a/agent/mibgroup/winExtDLL.c
++++ b/agent/mibgroup/winExtDLL.c
+@@ -692,7 +692,6 @@ var_winExtDLL(netsnmp_mib_handler *handler,
+     winextdll      *ext_dll_info;
+     netsnmp_request_info *request;
+     UINT            nRequestType;
+-    const char     *mode_name;
+     int             rc;
+ 
+     netsnmp_assert(ext_dll_view_info);
+@@ -711,35 +710,27 @@ var_winExtDLL(netsnmp_mib_handler *handler,
+ 
+     switch (reqinfo->mode) {
+     case MODE_GET:
+-        mode_name = "GET";
+         nRequestType = SNMP_EXTENSION_GET;
+         netsnmp_assert(!context_info_head);
+         break;
+     case MODE_GETNEXT:
+-        mode_name = "GETNEXT";
+         nRequestType = SNMP_EXTENSION_GET_NEXT;
+         netsnmp_assert(!context_info_head);
+         break;
+     case MODE_SET_RESERVE1:
+-        mode_name = "SET_RESERVE1";
+         nRequestType = SNMP_EXTENSION_SET_TEST;
+         break;
+     case MODE_SET_RESERVE2:
+-        mode_name = "SET_RESERVE2";
+         return SNMP_ERR_NOERROR;
+     case MODE_SET_ACTION:
+-        mode_name = "SET_ACTION";
+         return SNMP_ERR_NOERROR;
+     case MODE_SET_UNDO:
+-        mode_name = "SET_UNDO";
+         nRequestType = SNMP_EXTENSION_SET_UNDO;
+         break;
+     case MODE_SET_COMMIT:
+-        mode_name = "SET_COMMIT";
+         nRequestType = SNMP_EXTENSION_SET_COMMIT;
+         break;
+     case MODE_SET_FREE:
+-        mode_name = "SET_FREE";
+         nRequestType = SNMP_EXTENSION_SET_CLEANUP;
+         break;
+     default:
+diff --git a/agent/snmp_agent.c b/agent/snmp_agent.c
+index b38ef4a..2532da1 100644
+--- a/agent/snmp_agent.c
++++ b/agent/snmp_agent.c
+@@ -662,8 +662,7 @@ agent_check_and_process(int block)
+          * The caller does not want us to block at all.  
+          */
+ 
+-        tvp->tv_sec = 0;
+-        tvp->tv_usec = 0;
++        timerclear(tvp);
+     }
+ 
+     count = select(numfds, &fdset, NULL, NULL, tvp);
+@@ -778,7 +777,7 @@ netsnmp_addrcache_add(const char *addr)
+                 /*
+                  * found a match
+                  */
+-                memcpy(&addrCache[i].lastHit, &now, sizeof(struct timeval));
++                addrCache[i].lastHit = now;
+                 if (timercmp(&addrCache[i].lastHit, &aged, <))
+ 		    rc = 1; /* should have expired, so is new */
+ 		else
+@@ -825,7 +824,7 @@ netsnmp_addrcache_add(const char *addr)
+              */
+             addrCache[unused].addr = strdup(addr);
+             addrCache[unused].status = SNMP_ADDRCACHE_USED;
+-            memcpy(&addrCache[unused].lastHit, &now, sizeof(struct timeval));
++            addrCache[unused].lastHit = now;
+         }
+         else { /* Otherwise, replace oldest entry */
+             if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
+@@ -835,7 +834,7 @@ netsnmp_addrcache_add(const char *addr)
+             
+             free(addrCache[oldest].addr);
+             addrCache[oldest].addr = strdup(addr);
+-            memcpy(&addrCache[oldest].lastHit, &now, sizeof(struct timeval));
++            addrCache[oldest].lastHit = now;
+         }
+         rc = 1;
+     }
+@@ -884,7 +883,7 @@ netsnmp_agent_check_packet(netsnmp_session * session,
+ {
+     char           *addr_string = NULL;
+ #ifdef  NETSNMP_USE_LIBWRAP
+-    char *tcpudpaddr, *name;
++    char *tcpudpaddr = NULL, *name;
+     short not_log_connection;
+ 
+     name = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
+@@ -918,12 +917,13 @@ netsnmp_agent_check_packet(netsnmp_session * session,
+     }
+ #ifdef  NETSNMP_USE_LIBWRAP
+     /* Catch udp,udp6,tcp,tcp6 transports using "[" */
+-    tcpudpaddr = strstr(addr_string, "[");
++    if (addr_string)
++        tcpudpaddr = strstr(addr_string, "[");
+     if ( tcpudpaddr != 0 ) {
+         char sbuf[64];
+         char *xp;
+-        strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
+-        sbuf[sizeof(sbuf)-1] = '\0';
++
++        strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
+         xp = strstr(sbuf, "]");
+         if (xp)
+             *xp = '\0';
+@@ -3310,57 +3310,6 @@ netsnmp_handle_request(netsnmp_agent_session *asp, int status)
+     return 1;
+ }
+ 
+-/**
+- * This function calls into netsnmp_set_mode_request_error,  sets 
+- * error_value given a reqinfo->mode value.  It's used to send specific
+- * errors back to the agent to process accordingly.
+- * 
+- * If error_value is set to SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE,
+- * or SNMP_ENDOFMIBVIEW the following is applicable:
+- * Sets the error_value to request->requestvb->type if 
+- * reqinfo->mode value is set to MODE_GET.  If the reqinfo->mode 
+- * value is set to MODE_GETNEXT or MODE_GETBULK the code calls 
+- * snmp_log logging an error message.
+- *
+- * Otherwise, the request->status value is checked, if it's < 0
+- * snmp_log is called with an error message and SNMP_ERR_GENERR is 
+- * assigned to request->status. If the request->status value is >= 0 the
+- * error_value is set to request->status.
+- *
+- * @param reqinfo  is a pointer to the netsnmp_agent_request_info struct.  It
+- *	contains the reqinfo->mode which is required to set error_value or
+- *	log error messages.
+- *
+- * @param request is a pointer to the netsnmp_request_info struct.  The 
+- *	error_value is set to request->requestvb->type
+- *
+- * @param error_value is the exception value you want to set, below are
+- *        possible values.
+- *      - SNMP_NOSUCHOBJECT
+- *      - SNMP_NOSUCHINSTANCE
+- *      - SNMP_ENDOFMIBVIEW
+- *      - SNMP_ERR_NOERROR
+- *      - SNMP_ERR_TOOBIG
+- *      - SNMP_ERR_NOSUCHNAME
+- *      - SNMP_ERR_BADVALUE
+- *      - SNMP_ERR_READONLY
+- *      - SNMP_ERR_GENERR
+- *      - SNMP_ERR_NOACCESS
+- *      - SNMP_ERR_WRONGTYPE
+- *      - SNMP_ERR_WRONGLENGTH
+- *      - SNMP_ERR_WRONGENCODING
+- *      - SNMP_ERR_WRONGVALUE
+- *      - SNMP_ERR_NOCREATION
+- *      - SNMP_ERR_INCONSISTENTVALUE
+- *      - SNMP_ERR_RESOURCEUNAVAILABLE
+- *      - SNMP_ERR_COMMITFAILED
+- *      - SNMP_ERR_UNDOFAILED
+- *      - SNMP_ERR_AUTHORIZATIONERROR
+- *      - SNMP_ERR_NOTWRITABLE
+- *      - SNMP_ERR_INCONSISTENTNAME
+- *
+- * @return Returns error_value under all conditions.
+- */
+ int
+ handle_pdu(netsnmp_agent_session *asp)
+ {
+@@ -3702,9 +3651,13 @@ netsnmp_request_set_error_all( netsnmp_request_info *requests, int error)
+     return result;
+ }
+ 
+-                /*
+-                 * Return the value of 'sysUpTime' at the given marker 
+-                 */
++/**
++ * Return the value of 'sysUpTime' at the given marker
++ *
++ * @note Use netsnmp_get_agent_runtime() instead of this function if you need
++ *   to know how much time elapsed since netsnmp_set_agent_starttime() has been
++ *   called.
++ */
+ u_long
+ netsnmp_marker_uptime(marker_t pm)
+ {
+@@ -3738,6 +3691,22 @@ netsnmp_get_agent_starttime(void)
+ }
+ 
+ /**
++ * Report the time that elapsed since the agent start time in hundredths of a
++ * second.
++ *
++ * @see See also netsnmp_set_agent_starttime().
++ */
++uint64_t
++netsnmp_get_agent_runtime(void)
++{
++    struct timeval now, delta;
++
++    gettimeofday(&now, NULL);
++    NETSNMP_TIMERSUB(&now, &starttime, &delta);
++    return delta.tv_sec * (uint64_t)100 + delta.tv_usec / 10000;
++}
++
++/**
+  * Set the time at which Net-SNMP started either to the current time
+  * (if s == NULL) or to *s (if s is not NULL).
+  */
+diff --git a/agent/snmp_perl.c b/agent/snmp_perl.c
+index f974023..48d9695 100644
+--- a/agent/snmp_perl.c
++++ b/agent/snmp_perl.c
+@@ -36,6 +36,7 @@ maybe_source_perl_startup(void)
+     const char     *perl_init_file = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
+ 							   NETSNMP_DS_AGENT_PERL_INIT_FILE);
+     char            init_file[SNMP_MAXBUF];
++    int             res;
+ 
+     static int      have_done_init = 0;
+ 
+@@ -57,8 +58,11 @@ maybe_source_perl_startup(void)
+     env = NULL;
+     PERL_SYS_INIT3(&argc, &argv, &env);
+     my_perl = perl_alloc();
+-    if (!my_perl)
++    if (!my_perl) {
++        snmp_log(LOG_ERR,
++                 "embedded perl support failed to initialize (perl_alloc())\n");
+         goto bail_out;
++    }
+ 
+     perl_construct(my_perl);
+ 
+@@ -66,11 +70,21 @@ maybe_source_perl_startup(void)
+     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
+ #endif
+ 
+-    if (perl_parse(my_perl, xs_init, 2, embedargs, NULL))
++    res = perl_parse(my_perl, xs_init, 2, embedargs, NULL);
++    if (res) {
++        snmp_log(LOG_ERR,
++                 "embedded perl support failed to initialize (perl_parse(%s)"
++                 " returned %d)\n", embedargs[1], res);
+         goto bail_out;
++    }
+ 
+-    if (perl_run(my_perl))
++    res = perl_run(my_perl);
++    if (res) {
++        snmp_log(LOG_ERR,
++                 "embedded perl support failed to initialize (perl_run()"
++                 " returned %d)\n", res);
+         goto bail_out;
++    }
+ 
+     free(embedargs[0]);
+     free(embedargs[1]);
+@@ -82,7 +96,6 @@ maybe_source_perl_startup(void)
+   bail_out:
+     free(embedargs[0]);
+     free(embedargs[1]);
+-    snmp_log(LOG_ERR, "embedded perl support failed to initialize\n");
+     netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, 
+ 			   NETSNMP_DS_AGENT_DISABLE_PERL, 1);
+     return;
+@@ -168,5 +181,6 @@ shutdown_perl(void)
+     }
+     DEBUGMSGTL(("perl", "shutting down perl\n"));
+     perl_destruct(my_perl);
++    my_perl = NULL;
+     DEBUGMSGTL(("perl", "finished shutting down perl\n"));
+ }
+diff --git a/agent/snmpd.c b/agent/snmpd.c
+index 0deff09..ee458c3 100644
+--- a/agent/snmpd.c
++++ b/agent/snmpd.c
+@@ -438,7 +438,6 @@ main(int argc, char *argv[])
+     int             arg, i, ret;
+     int             dont_fork = 0, do_help = 0;
+     int             log_set = 0;
+-    int             uid = 0, gid = 0;
+     int             agent_mode = -1;
+     char           *pid_file = NULL;
+     char            option_compatability[] = "-Le";
+@@ -446,12 +445,6 @@ main(int argc, char *argv[])
+     int fd;
+     FILE           *PID;
+ #endif
+-#if HAVE_GETPWNAM && HAVE_PWD_H
+-    struct passwd  *info;
+-#endif
+-#if HAVE_UNISTD_H
+-    const char     *persistent_dir;
+-#endif
+ 
+ #ifndef WIN32
+     /*
+@@ -602,19 +595,18 @@ main(int argc, char *argv[])
+                 int             gid;
+ 
+                 gid = strtoul(optarg, &ecp, 10);
++#if HAVE_GETGRNAM && HAVE_PWD_H
+                 if (*ecp) {
+-#if HAVE_GETPWNAM && HAVE_PWD_H
+                     struct group  *info;
++
+                     info = getgrnam(optarg);
+-                    if (info) {
+-                        gid = info->gr_gid;
+-                    } else {
+-#endif
+-                        fprintf(stderr, "Bad group id: %s\n", optarg);
+-                        exit(1);
+-#if HAVE_GETPWNAM && HAVE_PWD_H
+-                    }
++                    gid = info ? info->gr_gid : -1;
++                    endgrent();
++                }
+ #endif
++                if (gid < 0) {
++                    fprintf(stderr, "Bad group id: %s\n", optarg);
++                    exit(1);
+                 }
+                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 				   NETSNMP_DS_AGENT_GROUPID, gid);
+@@ -781,18 +773,18 @@ main(int argc, char *argv[])
+                 int             uid;
+ 
+                 uid = strtoul(optarg, &ecp, 10);
+-                if (*ecp) {
+ #if HAVE_GETPWNAM && HAVE_PWD_H
++                if (*ecp) {
++                    struct passwd  *info;
++
+                     info = getpwnam(optarg);
+-                    if (info) {
+-                        uid = info->pw_uid;
+-                    } else {
+-#endif
+-                        fprintf(stderr, "Bad user id: %s\n", optarg);
+-                        exit(1);
+-#if HAVE_GETPWNAM && HAVE_PWD_H
+-                    }
++                    uid = info ? info->pw_uid : -1;
++                    endpwent();
++                }
+ #endif
++                if (uid < 0) {
++                    fprintf(stderr, "Bad user id: %s\n", optarg);
++                    exit(1);
+                 }
+                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 				   NETSNMP_DS_AGENT_USERID, uid);
+@@ -1009,7 +1001,11 @@ main(int argc, char *argv[])
+     }
+ #endif
+ 
+-#if HAVE_UNISTD_H
++#if defined(HAVE_UNISTD_H) && (defined(HAVE_CHOWN) || defined(HAVE_SETGID) || defined(HAVE_SETUID))
++    {
++    const char     *persistent_dir;
++    int             uid, gid;
++
+     persistent_dir = get_persistent_directory();
+     mkdirhier( persistent_dir, NETSNMP_AGENT_DIRECTORY_MODE, 0 );
+    
+@@ -1025,7 +1021,7 @@ main(int argc, char *argv[])
+ 
+ #ifdef HAVE_SETGID
+     if ((gid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
+-				  NETSNMP_DS_AGENT_GROUPID)) != 0) {
++				  NETSNMP_DS_AGENT_GROUPID)) > 0) {
+         DEBUGMSGTL(("snmpd/main", "Changing gid to %d.\n", gid));
+         if (setgid(gid) == -1
+ #ifdef HAVE_SETGROUPS
+@@ -1042,8 +1038,10 @@ main(int argc, char *argv[])
+ #endif
+ #ifdef HAVE_SETUID
+     if ((uid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
+-				  NETSNMP_DS_AGENT_USERID)) != 0) {
++				  NETSNMP_DS_AGENT_USERID)) > 0) {
+ #if HAVE_GETPWNAM && HAVE_PWD_H && HAVE_INITGROUPS
++        struct passwd *info;
++
+         /*
+          * Set supplementary groups before changing UID
+          *   (which probably involves giving up privileges)
+@@ -1059,6 +1057,7 @@ main(int argc, char *argv[])
+                 }
+             }
+         }
++        endpwent();
+ #endif
+         DEBUGMSGTL(("snmpd/main", "Changing uid to %d.\n", uid));
+         if (setuid(uid) == -1) {
+@@ -1070,6 +1069,7 @@ main(int argc, char *argv[])
+         }
+     }
+ #endif
++    }
+ #endif
+ 
+     /*
+@@ -1273,7 +1273,7 @@ receive(void)
+         DEBUGMSGTL(("snmpd/select", "select( numfds=%d, ..., tvp=%p)\n",
+                     numfds, tvp));
+         if(tvp)
+-            DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, tvp->tv_usec));
++            DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, (long)tvp->tv_usec));
+         count = netsnmp_large_fd_set_select(numfds, &readfds, &writefds, &exceptfds,
+ 				     tvp);
+         DEBUGMSGTL(("snmpd/select", "returned, count = %d\n", count));
+diff --git a/apps/Makefile.in b/apps/Makefile.in
+index 43cb007..77404dd 100644
+--- a/apps/Makefile.in
++++ b/apps/Makefile.in
+@@ -84,9 +84,6 @@ USEAGENTLIBS	= $(MIBLIB) $(AGENTLIB) $(USELIBS)
+ MYSQL_LIBS	= @MYSQL_LIBS@
+ MYSQL_INCLUDES	= @MYSQL_INCLUDES@
+ 
+-#
+-# link path in src dir
+-LOCAL_LIBS	= -L../snmplib/.libs -L../snmplib -L../agent/.libs -L../agent
+ VAL_LIBS	= @VAL_LIBS@
+ LIBS		= $(USELIBS) $(VAL_LIBS) @LIBS@
+ PERLLDOPTS_FOR_APPS = @PERLLDOPTS_FOR_APPS@
+@@ -146,65 +143,65 @@ OTHERUNINSTALL=snmpinformuninstall snmptrapdperluninstall
+ # build rules
+ #
+ snmpwalk$(EXEEXT):    snmpwalk.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpbulkwalk$(EXEEXT):    snmpbulkwalk.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpbulkget$(EXEEXT):    snmpbulkget.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmptranslate$(EXEEXT):    snmptranslate.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpstatus$(EXEEXT):    snmpstatus.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpget$(EXEEXT):    snmpget.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpdelta$(EXEEXT):    snmpdelta.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmptable$(EXEEXT):    snmptable.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmptest$(EXEEXT):    snmptest.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmptrapd$(EXEEXT):    $(TRAPD_OBJECTS) $(USETRAPLIBS) $(INSTALLLIBS)
+-	$(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) $(LOCAL_LIBS) ${LDFLAGS} ${TRAPLIBS}
++	$(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) ${LDFLAGS} ${TRAPLIBS}
+ 
+ snmptrap$(EXEEXT):    snmptrap.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpinform$(EXEEXT): snmptrap$(EXEEXT)
+ 	rm -f snmpinform
+ 	$(LN_S) snmptrap$(EXEEXT) snmpinform$(EXEEXT)
+ 
+ snmpset$(EXEEXT):    snmpset.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpusm$(EXEEXT):    snmpusm.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpvacm$(EXEEXT):    snmpvacm.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmptls$(EXEEXT):    snmptls.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) ${LDFLAGS} ${LIBS} 
+ 
+ agentxtrap$(EXEEXT):    agentxtrap.$(OSUFFIX) $(USEAGENTLIBS)
+-	$(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS}
++	$(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS}
+ 
+ snmpgetnext$(EXEEXT):    snmpgetnext.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ encode_keychange$(EXEEXT):    encode_keychange.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ snmpdf$(EXEEXT):    snmpdf.$(OSUFFIX) $(USELIBS)
+-	$(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
++	$(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) ${LDFLAGS} ${LIBS}
+ 
+ libnetsnmptrapd.$(LIB_EXTENSION)$(LIB_VERSION): $(LLIBTRAPD_OBJS)
+ 	$(LIB_LD_CMD) $@ ${LLIBTRAPD_OBJS} $(MIBLIB) $(USELIBS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS)
+diff --git a/apps/encode_keychange.c b/apps/encode_keychange.c
+index bae2139..5bf8e4c 100644
+--- a/apps/encode_keychange.c
++++ b/apps/encode_keychange.c
+@@ -108,7 +108,7 @@ int             _getch(void);
+ int
+ main(int argc, char **argv)
+ {
+-    int             rval = SNMPERR_SUCCESS;
++    int             rval = 1;
+     size_t          oldKu_len = SNMP_MAXBUF_SMALL,
+         newKu_len = SNMP_MAXBUF_SMALL,
+         oldkul_len = SNMP_MAXBUF_SMALL,
+@@ -170,6 +170,7 @@ main(int argc, char **argv)
+             break;
+         case 'h':
+             rval = 0;
++	    /* fallthrough */
+         default:
+             usage_to_file(stdout);
+             exit(rval);
+@@ -201,7 +202,7 @@ main(int argc, char **argv)
+                 "Unrecognized hash transform: \"%s\".\n",
+                 transform_type_input);
+         usage_synopsis(stderr);
+-        QUITFUN(rval = SNMPERR_GENERR, main_quit);
++        QUITFUN(SNMPERR_GENERR, main_quit);
+     }
+ 
+     if (verbose) {
+@@ -254,12 +255,12 @@ main(int argc, char **argv)
+     if (strlen(oldpass) < USM_LENGTH_P_MIN) {
+         fprintf(stderr, "Old passphrase must be greater than %d "
+                 "characters in length.\n", USM_LENGTH_P_MIN);
+-        QUITFUN(rval = SNMPERR_GENERR, main_quit);
++        QUITFUN(SNMPERR_GENERR, main_quit);
+ 
+     } else if (strlen(newpass) < USM_LENGTH_P_MIN) {
+         fprintf(stderr, "New passphrase must be greater than %d "
+                 "characters in length.\n", USM_LENGTH_P_MIN);
+-        QUITFUN(rval = SNMPERR_GENERR, main_quit);
++        QUITFUN(SNMPERR_GENERR, main_quit);
+     }
+ 
+     if (verbose) {
+@@ -503,13 +504,13 @@ get_user_passphrases(void)
+      */
+     if (stat(path, &statbuf) < 0) {
+         fprintf(stderr, "Cannot access directory \"%s\".\n", path);
+-        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
++        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
+ #ifndef WIN32
+     } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) {
+         fprintf(stderr,
+                 "Directory \"%s\" is accessible by group or world.\n",
+                 path);
+-        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
++        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
+ #endif                          /* !WIN32 */
+     }
+ 
+@@ -520,12 +521,12 @@ get_user_passphrases(void)
+     path[ sizeof(path)-1 ] = 0;
+     if (stat(path, &statbuf) < 0) {
+         fprintf(stderr, "Cannot access file \"%s\".\n", path);
+-        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
++        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
+ #ifndef WIN32
+     } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) {
+         fprintf(stderr,
+                 "File \"%s\" is accessible by group or world.\n", path);
+-        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
++        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
+ #endif                          /* !WIN32 */
+     }
+ 
+@@ -534,7 +535,7 @@ get_user_passphrases(void)
+      */
+     if ((fp = fopen(path, "r")) == NULL) {
+         fprintf(stderr, "Cannot open \"%s\".", path);
+-        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
++        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
+     }
+ 
+     /*
+diff --git a/apps/snmpbulkwalk.c b/apps/snmpbulkwalk.c
+index 62874fa..379d2ae 100644
+--- a/apps/snmpbulkwalk.c
++++ b/apps/snmpbulkwalk.c
+@@ -184,7 +184,7 @@ main(int argc, char *argv[])
+     size_t          rootlen;
+     int             count;
+     int             running;
+-    int             status;
++    int             status = STAT_ERROR;
+     int             check;
+     int             exitval = 0;
+ 
+diff --git a/apps/snmpdelta.c b/apps/snmpdelta.c
+index e334698..08e2ebc 100644
+--- a/apps/snmpdelta.c
++++ b/apps/snmpdelta.c
+@@ -471,7 +471,7 @@ main(int argc, char *argv[])
+                 printf("\t%s", vip->descriptor);
+         } else {
+             vip->oidlen = 0;
+-            strcpy(vip->descriptor, SumFile);
++            strlcpy(vip->descriptor, SumFile, sizeof(vip->descriptor));
+         }
+         vip->value = 0;
+         zeroU64(&vip->c64value);
+diff --git a/apps/snmpnetstat/inet.c b/apps/snmpnetstat/inet.c
+index 00b14e0..0ae810d 100644
+--- a/apps/snmpnetstat/inet.c
++++ b/apps/snmpnetstat/inet.c
+@@ -249,7 +249,7 @@ tcpprotopr_bulkget(const char *name, oid *root, size_t root_len)
+ 	/*
+      * setup initial object name
+      */
+-	memmove(tcpConnState_oid, root, sizeof(root) * root_len);
++	memmove(tcpConnState_oid, root, sizeof(oid) * root_len);
+ 	tcpConnState_len = root_len;
+ 
+     /*
+diff --git a/apps/snmpnetstat/inet6.c b/apps/snmpnetstat/inet6.c
+index bad4db9..d4ad391 100644
+--- a/apps/snmpnetstat/inet6.c
++++ b/apps/snmpnetstat/inet6.c
+@@ -128,7 +128,7 @@ tcp6protopr(const char *name)
+         return;
+ 
+     for (vp = var; vp ; vp=vp->next_variable) {
+-        state = *var->val.integer;
++        state = *vp->val.integer;
+         if (!aflag && state == MIB_TCPCONNSTATE_LISTEN)
+             continue;
+ 
+@@ -144,12 +144,12 @@ tcp6protopr(const char *name)
+         
+         /* Extract the local/remote information from the index values */
+         for (i=0; i<16; i++)
+-            localAddr[i]  = var->name[ 10+i ];
+-        localPort    = var->name[ 26 ];
++            localAddr[i]  = vp->name[ 10+i ];
++        localPort    = vp->name[ 26 ];
+         for (i=0; i<16; i++)
+-            remoteAddr[i] = var->name[ 27+i ];
+-        remotePort   = var->name[ 43 ];
+-        ifIndex      = var->name[ 44 ];
++            remoteAddr[i] = vp->name[ 27+i ];
++        remotePort   = vp->name[ 43 ];
++        ifIndex      = vp->name[ 44 ];
+ 
+         printf("%-5.5s", name);
+         inet6print(localAddr,  localPort,  name, 1);
+@@ -196,9 +196,9 @@ udp6protopr(const char *name)
+          *   the IP address from the varbind value, (which is why
+          *   we walked udpLocalAddress rather than udpLocalPort)
+          */
+-        localPort = var->name[ var->name_length-2 ];
+-        ifIndex   = var->name[ var->name_length-1 ];
+-        inet6print(var->val.string, localPort, name, 1);
++        localPort = vp->name[ vp->name_length-2 ];
++        ifIndex   = vp->name[ vp->name_length-1 ];
++        inet6print(vp->val.string, localPort, name, 1);
+         printf(" %4d\n", ifIndex );
+     }
+     snmp_free_varbind( var );
+@@ -223,20 +223,21 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len,
+ {
+     netsnmp_variable_list *var, *vp;
+     struct stat_table     *sp;
+-    oid   *stats, stat;
++    long   *stats;
++    oid stat;
+     unsigned int max_stat = 0;
+     int    active   = 0;
+ 
+     var = NULL;
+     for (sp=stable; sp->entry; sp++) {
+         oid_buf[buf_len-1] = sp->entry;
+-        if (sp->entry>max_stat)
++        if (sp->entry > max_stat)
+             max_stat = sp->entry;
+         snmp_varlist_add_variable( &var, oid_buf, buf_len,
+                                    ASN_NULL, NULL,  0);
+     }
+     oid_buf[buf_len-1] = stable[0].entry;
+-    stats = (oid *)calloc(max_stat+1, sizeof(oid));
++    stats = (long *)calloc(max_stat+1, sizeof(long));
+     
+     /*
+      * Walk the specified column(s), and total the individual statistics
+@@ -244,12 +245,12 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len,
+     while (1) {
+         if (netsnmp_query_getnext( var, ss ) != SNMP_ERR_NOERROR)
+             break;
+-        if ( snmp_oid_compare( oid_buf,   buf_len-1,
+-                               var->name, buf_len-1) != 0 )
++        if ( snmp_oid_compare( oid_buf,   buf_len,
++                               var->name, buf_len) != 0 )
+             break;    /* End of Table */
+             
+         for ( vp=var; vp; vp=vp->next_variable ) {
+-            stat = var->name[ buf_len-1 ];
++            stat = vp->name[ buf_len-1 ];
+             stats[stat] += *vp->val.integer;
+         }
+         active=1;
+diff --git a/apps/snmpset.c b/apps/snmpset.c
+index aaacf8c..1b29a6c 100644
+--- a/apps/snmpset.c
++++ b/apps/snmpset.c
+@@ -171,6 +171,7 @@ main(int argc, char *argv[])
+             case '=':
+             case 'i':
+             case 'u':
++            case '3':
+             case 't':
+             case 'a':
+             case 'o':
+diff --git a/apps/snmptls.c b/apps/snmptls.c
+index 7dffcd9..93b648b 100644
+--- a/apps/snmptls.c
++++ b/apps/snmptls.c
+@@ -332,7 +332,7 @@ optProc(int argc, char *const *argv, int opt)
+ 
+ 	    case 's':
+                 if (optind < argc) {
+-                    if (isdigit(argv[optind][0]))
++                    if (isdigit(0xFF & argv[optind][0]))
+                         _storage_type = atoi(argv[optind++]);
+                     else
+                         _storage_type_str = argv[optind++];
+@@ -345,7 +345,7 @@ optProc(int argc, char *const *argv, int opt)
+                 
+ 	    case 'h':
+                 if (optind < argc) {
+-                    if (isdigit(argv[optind][0]))
++                    if (isdigit(0xFF & argv[optind][0]))
+                         _hash_type = atoi(argv[optind++]);
+                 }
+                 else {
+diff --git a/apps/snmptrapd.c b/apps/snmptrapd.c
+index 7742eff..1a52080 100644
+--- a/apps/snmptrapd.c
++++ b/apps/snmptrapd.c
+@@ -217,8 +217,6 @@ LPCTSTR         app_name_long = _T("Net-SNMP Trap Handler");     /* Application
+ 
+ const char     *app_name = "snmptrapd";
+ 
+-struct timeval  Now;
+-
+ void            trapd_update_config(void);
+ 
+ #ifdef WIN32SERVICE
+@@ -360,8 +358,8 @@ pre_parse(netsnmp_session * session, netsnmp_transport *transport,
+       if ( tcpudpaddr != 0 ) {
+ 	char sbuf[64];
+ 	char *xp;
+-	strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
+-        sbuf[sizeof(sbuf)-1] = '\0';
++
++	strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
+         xp = strstr(sbuf, "]");
+         if (xp)
+             *xp = '\0';
+@@ -423,15 +421,20 @@ void
+ parse_trapd_address(const char *token, char *cptr)
+ {
+     char buf[BUFSIZ];
++    char *p;
+     cptr = copy_nword(cptr, buf, sizeof(buf));
+ 
+     if (default_port == ddefault_port) {
+         default_port = strdup(buf);
+     } else {
+-        strcat( buf, "," );
+-        strcat( buf, default_port );
++        p = malloc(strlen(buf) + 1 + strlen(default_port) + 1);
++        if (p) {
++            strcat(p, buf);
++            strcat(p, ",");
++            strcat(p, default_port );
++        }
+         free(default_port);
+-        default_port = strdup(buf);
++        default_port = p;
+     }
+ }
+ 
+@@ -469,13 +472,10 @@ parse_config_pidFile(const char *token, char *cptr)
+ void
+ parse_config_agentuser(const char *token, char *cptr)
+ {
+-#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
+-    struct passwd  *info;
+-#endif
+-
+     if (cptr[0] == '#') {
+         char           *ecp;
+         int             uid;
++
+         uid = strtoul(cptr + 1, &ecp, 10);
+         if (*ecp != 0) {
+             config_perror("Bad number");
+@@ -483,44 +483,47 @@ parse_config_agentuser(const char *token, char *cptr)
+ 	    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 			       NETSNMP_DS_AGENT_USERID, uid);
+ 	}
+-    }
+ #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
+-    else if ((info = getpwnam(cptr)) != NULL) {
+-        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+-			   NETSNMP_DS_AGENT_USERID, info->pw_uid);
+     } else {
+-        config_perror("User not found in passwd database");
+-    }
+-    endpwent();
++        struct passwd *info;
++
++        info = getpwnam(cptr);
++        if (info)
++            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
++                               NETSNMP_DS_AGENT_USERID, info->pw_uid);
++        else
++            config_perror("User not found in passwd database");
++        endpwent();
+ #endif
++    }
+ }
+ 
+ void
+ parse_config_agentgroup(const char *token, char *cptr)
+ {
+-#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
+-    struct group   *info;
+-#endif
+-
+     if (cptr[0] == '#') {
+         char           *ecp;
+         int             gid = strtoul(cptr + 1, &ecp, 10);
++
+         if (*ecp != 0) {
+             config_perror("Bad number");
+ 	} else {
+             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 			       NETSNMP_DS_AGENT_GROUPID, gid);
+ 	}
+-    }
+ #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
+-    else if ((info = getgrnam(cptr)) != NULL) {
+-        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+-			   NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
+     } else {
+-        config_perror("Group not found in group database");
+-    }
+-    endpwent();
++        struct group   *info;
++
++        info = getgrnam(cptr);
++        if (info)
++            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
++                               NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
++        else
++            config_perror("Group not found in group database");
++        endgrent();
+ #endif
++    }
+ }
+ #endif
+ 
+@@ -550,6 +553,74 @@ parse_config_outputOption(const char *token, char *cptr)
+   }
+ }
+ 
++static void
++snmptrapd_main_loop(void)
++{
++    int             count, numfds, block;
++    fd_set          readfds,writefds,exceptfds;
++    struct timeval  timeout, *tvp;
++
++    while (netsnmp_running) {
++        if (reconfig) {
++                /*
++                 * If we are logging to a file, receipt of SIGHUP also
++                 * indicates that the log file should be closed and
++                 * re-opened.  This is useful for users that want to
++                 * rotate logs in a more predictable manner.
++                 */
++                netsnmp_logging_restart();
++                snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
++                         netsnmp_get_version());
++            trapd_update_config();
++            if (trap1_fmt_str_remember) {
++                parse_format( NULL, trap1_fmt_str_remember );
++            }
++            reconfig = 0;
++        }
++        numfds = 0;
++        FD_ZERO(&readfds);
++        FD_ZERO(&writefds);
++        FD_ZERO(&exceptfds);
++        block = 0;
++        tvp = &timeout;
++        timerclear(tvp);
++        tvp->tv_sec = 5;
++        snmp_select_info(&numfds, &readfds, tvp, &block);
++        if (block == 1)
++            tvp = NULL;         /* block without timeout */
++#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
++        netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds);
++#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
++        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
++        if (count > 0) {
++#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
++            netsnmp_dispatch_external_events(&count, &readfds, &writefds,
++                                             &exceptfds);
++#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
++            /* If there are any more events after external events, then
++             * try SNMP events. */
++            if (count > 0) {
++                snmp_read(&readfds);
++            }
++        } else {
++            switch (count) {
++            case 0:
++                snmp_timeout();
++                break;
++            case -1:
++                if (errno == EINTR)
++                    continue;
++                snmp_log_perror("select");
++                netsnmp_running = 0;
++                break;
++            default:
++                fprintf(stderr, "select returned %d\n", count);
++                netsnmp_running = 0;
++            }
++	}
++	run_alarms();
++    }
++}
+ 
+ /*******************************************************************-o-******
+  * main - Non Windows
+@@ -579,9 +650,6 @@ main(int argc, char *argv[])
+     netsnmp_transport *transport = NULL;
+     int             arg, i = 0;
+     int             uid = 0, gid = 0;
+-    int             count, numfds, block;
+-    fd_set          readfds,writefds,exceptfds;
+-    struct timeval  timeout, *tvp;
+     char           *cp, *listen_ports = NULL;
+ #if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
+     int             agentx_subagent = 1;
+@@ -732,7 +800,7 @@ main(int argc, char *argv[])
+                         *cp = ' ';
+                 } else {
+                     /* Old style: implicitly "print=format" */
+-                    trap1_fmt_str_remember = (char *)malloc(strlen(optarg) + 7);
++                    trap1_fmt_str_remember = malloc(strlen(optarg) + 7);
+                     sprintf( trap1_fmt_str_remember, "print %s", optarg );
+                 }
+             } else {
+@@ -863,19 +931,18 @@ main(int argc, char *argv[])
+                 char           *ecp;
+ 
+                 uid = strtoul(optarg, &ecp, 10);
+-                if (*ecp) {
+ #if HAVE_GETPWNAM && HAVE_PWD_H
++                if (*ecp) {
+                     struct passwd  *info;
++
+                     info = getpwnam(optarg);
+-                    if (info) {
+-                        uid = info->pw_uid;
+-                    } else {
+-#endif
+-                        fprintf(stderr, "Bad user id: %s\n", optarg);
+-                        exit(1);
+-#if HAVE_GETPWNAM && HAVE_PWD_H
+-                    }
++                    uid = info ? info->pw_uid : -1;
++                    endpwent();
++                }
+ #endif
++                if (uid < 0) {
++                    fprintf(stderr, "Bad user id: %s\n", optarg);
++                    exit(1);
+                 }
+                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
+ 				   NETSNMP_DS_AGENT_USERID, uid);
+@@ -916,7 +983,7 @@ main(int argc, char *argv[])
+         for (i = optind; i < argc; i++) {
+             char *astring;
+             if (listen_ports != NULL) {
+-                astring = (char *)malloc(strlen(listen_ports) + 2 + strlen(argv[i]));
++                astring = malloc(strlen(listen_ports) + 2 + strlen(argv[i]));
+                 if (astring == NULL) {
+                     fprintf(stderr, "malloc failure processing argv[%d]\n", i);
+                     exit(1);
+@@ -1247,66 +1314,8 @@ main(int argc, char *argv[])
+ #ifdef WIN32SERVICE
+     trapd_status = SNMPTRAPD_RUNNING;
+ #endif
+-    while (netsnmp_running) {
+-        if (reconfig) {
+-                /*
+-                 * If we are logging to a file, receipt of SIGHUP also
+-                 * indicates the the log file should be closed and
+-                 * re-opened.  This is useful for users that want to
+-                 * rotate logs in a more predictable manner.
+-                 */
+-                netsnmp_logging_restart();
+-                snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
+-                         netsnmp_get_version());
+-            trapd_update_config();
+-            if (trap1_fmt_str_remember) {
+-                parse_format( NULL, trap1_fmt_str_remember );
+-            }
+-            reconfig = 0;
+-        }
+-        numfds = 0;
+-        FD_ZERO(&readfds);
+-        FD_ZERO(&writefds);
+-        FD_ZERO(&exceptfds);
+-        block = 0;
+-        tvp = &timeout;
+-        timerclear(tvp);
+-        tvp->tv_sec = 5;
+-        snmp_select_info(&numfds, &readfds, tvp, &block);
+-        if (block == 1)
+-            tvp = NULL;         /* block without timeout */
+-#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
+-        netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds);
+-#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
+-        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
+-        gettimeofday(&Now, NULL);
+-        if (count > 0) {
+-#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
+-            netsnmp_dispatch_external_events(&count, &readfds, &writefds,
+-                                             &exceptfds);
+-#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
+-            /* If there are any more events after external events, then
+-             * try SNMP events. */
+-            if (count > 0) {
+-                snmp_read(&readfds);
+-            }
+-        } else
+-            switch (count) {
+-            case 0:
+-                snmp_timeout();
+-                break;
+-            case -1:
+-                if (errno == EINTR)
+-                    continue;
+-                snmp_log_perror("select");
+-                netsnmp_running = 0;
+-                break;
+-            default:
+-                fprintf(stderr, "select returned %d\n", count);
+-                netsnmp_running = 0;
+-            }
+-	run_alarms();
+-    }
++
++    snmptrapd_main_loop();
+ 
+     if (snmp_get_do_logging()) {
+         struct tm      *tm;
+diff --git a/apps/snmptrapd_log.c b/apps/snmptrapd_log.c
+index c1742f4..774f797 100644
+--- a/apps/snmptrapd_log.c
++++ b/apps/snmptrapd_log.c
+@@ -1020,6 +1020,8 @@ realloc_handle_auth_fmt(u_char ** buf, size_t * buf_len, size_t * out_len,
+ #if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C)
+             while ((*out_len + pdu->community_len + 1) >= *buf_len) {
+                 if (!(allow_realloc && snmp_realloc(buf, buf_len))) {
++                    if (temp_buf)
++                        free(temp_buf);
+                     return 0;
+                 }
+             }
+diff --git a/apps/snmptrapd_sql.c b/apps/snmptrapd_sql.c
+index c7433dc..ccba258 100644
+--- a/apps/snmptrapd_sql.c
++++ b/apps/snmptrapd_sql.c
+@@ -437,7 +437,11 @@ netsnmp_mysql_init(void)
+         return -1;
+     }
+ 
++#ifdef HAVE_BROKEN_LIBMYSQLCLIENT
++    my_init();
++#else
+     MY_INIT("snmptrapd");
++#endif
+ 
+     /** load .my.cnf values */
+     load_defaults ("my", _sql.groups, &not_argc, &not_argv);
+@@ -704,7 +708,7 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
+     struct tm   *cur_time;
+     size_t       tmp_size;
+     size_t       buf_host_len_t, buf_oid_len_t, buf_user_len_t;
+-    int          oid_overflow, rc, trap_oid_len;
++    int          oid_overflow, trap_oid_len;
+     netsnmp_variable_list *vars;
+ 
+     if ((NULL == sqlb) || (NULL == pdu) || (NULL == transport))
+@@ -727,8 +731,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
+     /** host name */
+     buf_host_len_t = 0;
+     tmp_size = sizeof(sqlb->host);
+-    rc = realloc_format_trap((u_char**)&sqlb->host, &tmp_size,
+-                             &buf_host_len_t, 1, "%B", pdu, transport);
++    realloc_format_trap((u_char**)&sqlb->host, &tmp_size,
++                        &buf_host_len_t, 1, "%B", pdu, transport);
+     sqlb->host_len = buf_host_len_t;
+ 
+     /* snmpTrapOID */
+@@ -782,8 +786,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
+     /** community string/user name */
+     tmp_size = 0;
+     buf_user_len_t = 0;
+-    rc = realloc_format_trap((u_char**)&sqlb->user, &tmp_size,
+-                             &buf_user_len_t, 1, "%u", pdu, transport);
++    realloc_format_trap((u_char**)&sqlb->user, &tmp_size,
++                        &buf_user_len_t, 1, "%u", pdu, transport);
+     sqlb->user_len = buf_user_len_t;
+ 
+     /** transport */
+diff --git a/apps/snmpwalk.c b/apps/snmpwalk.c
+index 7473b91..2bed0e8 100644
+--- a/apps/snmpwalk.c
++++ b/apps/snmpwalk.c
+@@ -185,7 +185,7 @@ main(int argc, char *argv[])
+     size_t          end_len = 0;
+     int             count;
+     int             running;
+-    int             status;
++    int             status = STAT_ERROR;
+     int             check;
+     int             exitval = 0;
+     struct timeval  tv1, tv2, tv_a, tv_b;
+diff --git a/configure b/configure
+index 8b2a66f..77c0475 100755
+--- a/configure
++++ b/configure
+@@ -3434,6 +3434,10 @@ if test "${with_openssl+set}" = set; then :
+     elif test "x$withval" = "xno"; then
+       tryopenssl=no
+     elif test -d "$withval"; then
++      if test -d "$withval/lib/MinGW"; then
++        LDFLAGS="-L$withval/lib/MinGW $LDFLAGS"
++        CPPFLAGS="-I$withval/include $CPPFLAGS"
++      else
+ 
+   if test "x$withval" != x -a -d $withval; then
+      if test -d $withval/lib; then
+@@ -3444,6 +3448,7 @@ if test "${with_openssl+set}" = set; then :
+      fi
+   fi
+ 
++      fi
+       tryopenssl=yes
+       askedopenssl=yes
+     fi
+@@ -16180,8 +16185,29 @@ fi
+ done
+ 
+ 
++#  Library and Agent:
++for ac_header in nlist.h
++do :
++  ac_fn_c_check_header_compile "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "
++$ac_includes_default
++
++#ifndef LIBBSD_DISABLE_DEPRECATED
++#define LIBBSD_DISABLE_DEPRECATED 1
++#endif
++
++"
++if test "x$ac_cv_header_nlist_h" = xyes; then :
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_NLIST_H 1
++_ACEOF
++
++fi
++
++done
++
++
+ #  Library:
+-for ac_header in fcntl.h    io.h       kstat.h                                   limits.h   locale.h   nlist.h                                   sys/file.h       sys/ioctl.h                           sys/sockio.h     sys/stat.h                            sys/systemcfg.h  sys/systeminfo.h                      sys/times.h      sys/uio.h                             sys/utsname.h                        netipx/ipx.h
++for ac_header in fcntl.h    io.h       kstat.h                                   limits.h   locale.h                                    sys/file.h       sys/ioctl.h                           sys/sockio.h     sys/stat.h                            sys/systemcfg.h  sys/systeminfo.h                      sys/times.h      sys/uio.h                             sys/utsname.h                        netipx/ipx.h
+ do :
+   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+@@ -16196,7 +16222,7 @@ done
+ 
+ 
+ #  Agent:
+-for ac_header in dlfcn.h    err.h      fcntl.h    fstab.h                                   grp.h      io.h                                      ioctls.h   kstat.h    kvm.h      limits.h                                  mntent.h   mtab.h                                    nlist.h    pkglocs.h             pwd.h                                     utmpx.h    utsname.h
++for ac_header in dlfcn.h    err.h      fcntl.h    fstab.h                                   grp.h      io.h                                      ioctls.h   kstat.h    kvm.h      limits.h                                  mntent.h   mtab.h                                               pkglocs.h             pwd.h                                     utmpx.h    utsname.h
+ do :
+   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+@@ -18318,7 +18344,7 @@ while test "x$new_transport_list" != "x"; do
+ /* end confdefs.h.  */
+ 
+ #include NETSNMP_SYSTEM_INCLUDE_FILE
+-#define NETSNMP_FEATURE_CHECKING
++#undef NETSNMP_MINIMAL_CODE
+ #define NET_SNMP_CONFIG_H
+ #undef config_require
+ #define config_require(foo) config_checkit_require(foo)
+@@ -19861,6 +19887,99 @@ done
+ 
+ LIBS="$netsnmp_save_LIBS"
+ 
++#
++#   dynamic module support
++#
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
++$as_echo_n "checking for library containing dlopen... " >&6; }
++if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  netsnmp_func_search_save_LIBS="$LIBS"
++     netsnmp_target_val="$LMIBLIBS"
++          netsnmp_temp_LIBS="${netsnmp_target_val} $LAGENTLIBS $LSNMPLIBS ${LIBS}"
++     netsnmp_result=no
++     LIBS="${netsnmp_temp_LIBS}"
++     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dlopen ();
++int
++main ()
++{
++return dlopen ();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  netsnmp_result="none required"
++else
++  for netsnmp_cur_lib in dl ; do
++              LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}"
++              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char dlopen ();
++int
++main ()
++{
++return dlopen ();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  netsnmp_result=-l${netsnmp_cur_lib}
++                   break
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++          done
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++     LIBS="${netsnmp_func_search_save_LIBS}"
++     netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}"
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5
++$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; }
++ if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then
++    if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then
++       LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}"
++    fi
++
++
++ fi
++
++netsnmp_save_LIBS="$LIBS"
++LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS"
++for ac_func in dlopen
++do :
++  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
++if test "x$ac_cv_func_dlopen" = xyes; then :
++  cat >>confdefs.h <<_ACEOF
++#define HAVE_DLOPEN 1
++_ACEOF
++
++fi
++done
++
++LIBS="$netsnmp_save_LIBS"
++
+ # -*- autoconf -*-
+ #
+ # generate empty files
+@@ -20087,7 +20206,8 @@ _ACEOF
+     module_type=mib_module
+     if test -f $srcdir/$mibdir/$i.h; then
+ 
+-      module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'`
++      module_type=`$MODULECPP module_tmp_header.h | \
++                   $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'`
+ 
+     fi
+     if test "x$module_type" = "x" ; then
+@@ -20188,7 +20308,8 @@ _ACEOF
+         # check if $i has any conflicts
+         #
+ 
+-	new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'`
++        new_list_excl=`$MODULECPP module_tmp_header.h | \
++                       $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'`
+ 	if test "x$new_list_excl" != "x"; then
+ 
+   if test $module_debug = 1; then
+@@ -20233,7 +20354,8 @@ EOF
+         #
+ 
+ 
+-        new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'`
++        new_list_arch=`$MODULECPP module_tmp_header.h | \
++                       $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'`
+ 
+ 	if test "x$new_list_arch" != "x"; then
+           for j in $new_list_arch
+@@ -20264,11 +20386,7 @@ EOF
+         #
+ 
+         new_list_alt3=`$MODULECPP module_tmp_header.h | \
+-            $GREP config_version_require | \
+-            $SED -e 's/  */ /g' \
+-                 -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \
+-                 -e 's/ *, */,/g' | \
+-            awk '
++            $AWK '
+                 BEGIN {
+                     if("'"$enable_new_features"'" == "yes")
+                         method="max";
+@@ -20280,7 +20398,10 @@ EOF
+                     split("'"$with_features_of"'", a);
+                     version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]);
+                 }
+-                {
++                /config_version_require/ {
++                    gsub("^.*config_version_require *\\\\(\\\\(", "");
++                    gsub("\\\\)\\\\).*$", "");
++                    gsub(", *", ",");
+                     FS = ",";
+                     n = split($0, a);
+                     FS = ".";
+@@ -20311,7 +20432,8 @@ EOF
+         # check if $i has any other required modules
+         #
+ 
+-	new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`"
++        new_list="$new_list `$MODULECPP module_tmp_header.h | \
++                  $SED -n 's/.*config_require(\(.*\)).*/\1/p'`"
+ 
+   if test $module_debug = 1; then
+     echo " $i will test: $new_list"
+@@ -20369,7 +20491,8 @@ EOF
+         # check if $i has any mibs to add
+         #
+ 
+-	new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'`
++        new_mibs=`$MODULECPP module_tmp_header.h | \
++                  $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'`
+ 	if test "x$new_mibs" != "x"; then
+ 	    for j in $new_mibs
+ 		do
+@@ -20410,7 +20533,7 @@ EOF
+         #-------------------
+         # check for unsupported config_load_mib
+         #
+-        if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then
++        if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then
+           { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mib module error" >&5
+ $as_echo "$as_me: WARNING: mib module error" >&2;}
+       	  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mib module \"$i\" uses the \"config_load_mib\" directive, which is no longer supported.  It probably won't work." >&5
+@@ -20423,7 +20546,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
+         #
+ 
+ 
+-        $MODULECPP module_tmp_header.h | $GREP config_parse_dot_conf | $SED 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@' >> $mibdir/mib_module_dot_conf.h
++        $MODULECPP module_tmp_header.h | \
++        $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h
+ 
+ 
+         #---------------------
+@@ -20433,7 +20557,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
+         # check if $i has any errors, or warnings
+         #
+ 
+-	error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'`
++        error=`$MODULECPP module_tmp_header.h | \
++               $SED -n 's/.*config_error(\(.*\)).*/\1/p'`
+ 	if test "x$error" != "x"; then
+           echo
+           echo
+@@ -20445,7 +20570,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
+       	#  - used to signal a configuration "warning" to be printed to the user
+         #
+ 
+-	warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'`
++        warning=`$MODULECPP module_tmp_header.h | \
++                 $SED -n 's/.*config_warning(\(.*\)).*/\1/p'`
+ 	if test "x$warning" != "x"; then
+           all_warnings="$all_warnings $warning
+ "
+@@ -21653,99 +21779,6 @@ $as_echo "#define HAVE_LIBKSTAT 1" >>confdefs.h
+ 
+ 
+ 
+-#   dynamic module support
+-#
+-
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
+-$as_echo_n "checking for library containing dlopen... " >&6; }
+-if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-  netsnmp_func_search_save_LIBS="$LIBS"
+-     netsnmp_target_val="$LMIBLIBS"
+-          netsnmp_temp_LIBS="${netsnmp_target_val}  ${LIBS}"
+-     netsnmp_result=no
+-     LIBS="${netsnmp_temp_LIBS}"
+-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-
+-/* Override any GCC internal prototype to avoid an error.
+-   Use char because int might match the return type of a GCC
+-   builtin and then its argument prototype would still apply.  */
+-#ifdef __cplusplus
+-extern "C"
+-#endif
+-char dlopen ();
+-int
+-main ()
+-{
+-return dlopen ();
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_link "$LINENO"; then :
+-  netsnmp_result="none required"
+-else
+-  for netsnmp_cur_lib in dl ; do
+-              LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}"
+-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+-
+-/* Override any GCC internal prototype to avoid an error.
+-   Use char because int might match the return type of a GCC
+-   builtin and then its argument prototype would still apply.  */
+-#ifdef __cplusplus
+-extern "C"
+-#endif
+-char dlopen ();
+-int
+-main ()
+-{
+-return dlopen ();
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_link "$LINENO"; then :
+-  netsnmp_result=-l${netsnmp_cur_lib}
+-                   break
+-fi
+-rm -f core conftest.err conftest.$ac_objext \
+-    conftest$ac_exeext conftest.$ac_ext
+-          done
+-fi
+-rm -f core conftest.err conftest.$ac_objext \
+-    conftest$ac_exeext conftest.$ac_ext
+-     LIBS="${netsnmp_func_search_save_LIBS}"
+-     netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}"
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5
+-$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; }
+- if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then
+-    if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then
+-       LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}"
+-    fi
+-
+-
+- fi
+-
+-netsnmp_save_LIBS="$LIBS"
+-LIBS="$LMIBLIBS $LIBS"
+-for ac_func in dlopen
+-do :
+-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+-if test "x$ac_cv_func_dlopen" = xyes; then :
+-  cat >>confdefs.h <<_ACEOF
+-#define HAVE_DLOPEN 1
+-_ACEOF
+-
+-fi
+-done
+-
+-LIBS="$netsnmp_save_LIBS"
+-
+-
+ ##
+ #   MIB-module-specific checks
+ ##
+@@ -22482,6 +22515,54 @@ $as_echo "#define HAVE_AES_CFB128_ENCRYPT 1" >>confdefs.h
+ 
+ fi
+ 
++
++            as_ac_Lib=`$as_echo "ac_cv_lib_${CRYPTO}''_EVP_MD_CTX_create" | $as_tr_sh`
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EVP_MD_CTX_create in -l${CRYPTO}" >&5
++$as_echo_n "checking for EVP_MD_CTX_create in -l${CRYPTO}... " >&6; }
++if eval \${$as_ac_Lib+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  ac_check_lib_save_LIBS=$LIBS
++LIBS="-l${CRYPTO}  $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char EVP_MD_CTX_create ();
++int
++main ()
++{
++return EVP_MD_CTX_create ();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  eval "$as_ac_Lib=yes"
++else
++  eval "$as_ac_Lib=no"
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++eval ac_res=\$$as_ac_Lib
++	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++$as_echo "$ac_res" >&6; }
++if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
++
++$as_echo "#define HAVE_EVP_MD_CTX_CREATE /**/" >>confdefs.h
++
++
++$as_echo "#define HAVE_EVP_MD_CTX_DESTROY /**/" >>confdefs.h
++
++fi
++
+         fi
+         if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
+ 	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DTLSv1_method in -lssl" >&5
+@@ -22984,6 +23065,38 @@ fi
+   fi
+   MYSQL_LIBS=`$MYSQLCONFIG --libs`
+   MYSQL_INCLUDES=`$MYSQLCONFIG --cflags`
++  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MY_INIT() works" >&5
++$as_echo_n "checking whether MY_INIT() works... " >&6; }
++  _libs="${LIBS}"
++  _cppflags="${CPPFLAGS}"
++  LIBS="${LIBS} ${MYSQL_LIBS}"
++  CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++#include <mysql/my_global.h>
++               #include <mysql/my_sys.h>
++int
++main ()
++{
++MY_INIT("my_init_test")
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++else
++  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++
++$as_echo "#define HAVE_BROKEN_LIBMYSQLCLIENT 1" >>confdefs.h
++
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++  CPPFLAGS="${_cppflags}"
++  LIBS="${_libs}"
+ 
+   cat >> configure-summary << EOF
+   MYSQL Trap Logging:         enabled
+@@ -24771,7 +24884,7 @@ done
+ 
+ 
+ #  Library:
+-for ac_func in closedir        fork            getipnodebyname                  gettimeofday    if_nametoindex  mkstemp                          opendir         readdir         regcomp                          setenv          setitimer       setlocale                        setsid          snprintf        strcasestr                       strdup          strerror        strncasecmp                      sysconf         times           vsnprintf
++for ac_func in closedir        fgetc_unlocked  flockfile                        fork            funlockfile     getipnodebyname                  gettimeofday    if_nametoindex  mkstemp                          opendir         readdir         regcomp                          setenv          setitimer       setlocale                        setsid          snprintf        strcasestr                       strdup          strerror        strncasecmp                      sysconf         times           vsnprintf
+ do :
+   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+@@ -24941,6 +25054,19 @@ esac
+ 
+ fi
+ 
++ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat"
++if test "x$ac_cv_func_strlcat" = xyes; then :
++  $as_echo "#define HAVE_STRLCAT 1" >>confdefs.h
++
++else
++  case " $LIBOBJS " in
++  *" strlcat.$ac_objext "* ) ;;
++  *) LIBOBJS="$LIBOBJS strlcat.$ac_objext"
++ ;;
++esac
++
++fi
++
+ ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
+ if test "x$ac_cv_func_strlcpy" = xyes; then :
+   $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h
+@@ -25651,6 +25777,28 @@ _ACEOF
+ fi
+ 
+ 
++#       struct ethtool_cmd
++#
++if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then
++ac_fn_c_check_member "$LINENO" "struct ethtool_cmd" "speed_hi" "ac_cv_member_struct_ethtool_cmd_speed_hi" "
++    $ac_includes_default
++
++#ifdef HAVE_LINUX_ETHTOOL_H
++#include <linux/ethtool.h>
++#endif
++
++"
++if test "x$ac_cv_member_struct_ethtool_cmd_speed_hi" = xyes; then :
++
++cat >>confdefs.h <<_ACEOF
++#define HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI 1
++_ACEOF
++
++
++fi
++
++fi
++
+ #       struct ipstat
+ #   Agent:
+ #
+@@ -26526,6 +26674,50 @@ _ACEOF
+ fi
+ 
+ 
++#       extern timezone
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking extern timezone" >&5
++$as_echo_n "checking extern timezone... " >&6; }
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
++
++#if TIME_WITH_SYS_TIME
++# include <sys/time.h>
++# include <time.h>
++#else
++# if HAVE_SYS_TIME_H
++#  include <sys/time.h>
++# else
++#  include <time.h>
++# endif
++#endif
++
++int
++main ()
++{
++
++  return timezone;
++
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++$as_echo "yes" >&6; }
++
++$as_echo "#define HAVE_TIMEZONE_VARIABLE 1" >>confdefs.h
++
++
++else
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++
++fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++
+ #       struct timezone
+ #   Library:
+ #
+diff --git a/configure.d/config_modules_agent b/configure.d/config_modules_agent
+index 87ec3a5..3272679 100644
+--- a/configure.d/config_modules_agent
++++ b/configure.d/config_modules_agent
+@@ -189,7 +189,8 @@ while test "x$new_module_list" != "x"; do
+     module_type=mib_module
+     if test -f $srcdir/$mibdir/$i.h; then
+       changequote(, )
+-      module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'`
++      module_type=`$MODULECPP module_tmp_header.h | \
++                   $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'`
+       changequote([, ])
+     fi
+     if test "x$module_type" = "x" ; then
+@@ -270,7 +271,8 @@ while test "x$new_module_list" != "x"; do
+         # check if $i has any conflicts
+         #
+         AH_TOP([#define config_exclude(x)])
+-	new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'`
++        new_list_excl=`$MODULECPP module_tmp_header.h | \
++                       $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'`
+ 	if test "x$new_list_excl" != "x"; then
+           AC_MSG_MODULE_DBG("$i excludes $new_list_excl")
+ 	  for j in $new_list_excl
+@@ -299,7 +301,8 @@ while test "x$new_module_list" != "x"; do
+         #
+         AH_TOP([#define config_arch_require(x,y)])
+         changequote(, )
+-        new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'`
++        new_list_arch=`$MODULECPP module_tmp_header.h | \
++                       $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'`
+         changequote([, ])
+ 	if test "x$new_list_arch" != "x"; then
+           for j in $new_list_arch
+@@ -320,11 +323,7 @@ while test "x$new_module_list" != "x"; do
+         #
+         AH_TOP([#define config_version_require(x)])
+         [new_list_alt3=`$MODULECPP module_tmp_header.h | \
+-            $GREP config_version_require | \
+-            $SED -e 's/  */ /g' \
+-                 -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \
+-                 -e 's/ *, */,/g' | \
+-            awk '
++            $AWK '
+                 BEGIN {
+                     if("'"$enable_new_features"'" == "yes")
+                         method="max";
+@@ -336,7 +335,10 @@ while test "x$new_module_list" != "x"; do
+                     split("'"$with_features_of"'", a);
+                     version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]);
+                 }
+-                {
++                /config_version_require/ {
++                    gsub("^.*config_version_require *\\\\(\\\\(", "");
++                    gsub("\\\\)\\\\).*$", "");
++                    gsub(", *", ",");
+                     FS = ",";
+                     n = split($0, a);
+                     FS = ".";
+@@ -362,7 +364,8 @@ while test "x$new_module_list" != "x"; do
+         # check if $i has any other required modules
+         #
+         AH_TOP([#define config_require(x)])
+-	new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`"
++        new_list="$new_list `$MODULECPP module_tmp_header.h | \
++                  $SED -n 's/.*config_require(\(.*\)).*/\1/p'`"
+         AC_MSG_MODULE_DBG(" $i will test: $new_list")
+ 	if test "x$new_list" != "x"; then
+ 	  for j in $new_list
+@@ -398,7 +401,8 @@ while test "x$new_module_list" != "x"; do
+         # check if $i has any mibs to add
+         #
+         AH_TOP([#define config_add_mib(x)])
+-	new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'`
++        new_mibs=`$MODULECPP module_tmp_header.h | \
++                  $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'`
+ 	if test "x$new_mibs" != "x"; then
+ 	    for j in $new_mibs
+ 		do
+@@ -434,7 +438,7 @@ while test "x$new_module_list" != "x"; do
+         #-------------------
+         # check for unsupported config_load_mib
+         #
+-        if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then
++        if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then
+           AC_MSG_WARN([mib module error])
+       	  AC_MSG_WARN([mib module "$i" uses the "config_load_mib" directive, which is no longer supported.  It probably won't work.])
+         fi # grep config_load_mib
+@@ -445,7 +449,8 @@ while test "x$new_module_list" != "x"; do
+         #
+         AH_TOP([#define config_parse_dot_conf(w,x,y,z)])
+         changequote(, )
+-        $MODULECPP module_tmp_header.h | $GREP config_parse_dot_conf | $SED 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@' >> $mibdir/mib_module_dot_conf.h
++        $MODULECPP module_tmp_header.h | \
++        $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h
+ 	changequote([, ])
+ 
+         #---------------------
+@@ -455,7 +460,8 @@ while test "x$new_module_list" != "x"; do
+         # check if $i has any errors, or warnings
+         #
+         AH_TOP([#define config_error(x)])
+-	error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'`
++        error=`$MODULECPP module_tmp_header.h | \
++               $SED -n 's/.*config_error(\(.*\)).*/\1/p'`
+ 	if test "x$error" != "x"; then
+           echo
+           echo
+@@ -467,7 +473,8 @@ while test "x$new_module_list" != "x"; do
+       	#  - used to signal a configuration "warning" to be printed to the user
+         #
+         AH_TOP([#define config_warning(x)])
+-	warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'`
++        warning=`$MODULECPP module_tmp_header.h | \
++                 $SED -n 's/.*config_warning(\(.*\)).*/\1/p'`
+ 	if test "x$warning" != "x"; then
+           all_warnings="$all_warnings $warning
+ "
+diff --git a/configure.d/config_modules_transports b/configure.d/config_modules_transports
+index 2a49da8..b10b960 100644
+--- a/configure.d/config_modules_transports
++++ b/configure.d/config_modules_transports
+@@ -71,7 +71,7 @@ while test "x$new_transport_list" != "x"; do
+       rm -f conftest.$ac_ext module_tmp_header.h
+       AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+ #include NETSNMP_SYSTEM_INCLUDE_FILE
+-#define NETSNMP_FEATURE_CHECKING
++#undef NETSNMP_MINIMAL_CODE
+ #define NET_SNMP_CONFIG_H
+ #undef config_require
+ #define config_require(foo) config_checkit_require(foo)
+diff --git a/configure.d/config_os_functions b/configure.d/config_os_functions
+index 7736994..3c5385b 100644
+--- a/configure.d/config_os_functions
++++ b/configure.d/config_os_functions
+@@ -31,7 +31,8 @@ AC_CHECK_FUNCS([lrand48         rand          random    ] dnl
+                [signal          sigset                  ] )
+ 
+ #  Library:
+-AC_CHECK_FUNCS([closedir        fork            getipnodebyname  ] dnl
++AC_CHECK_FUNCS([closedir        fgetc_unlocked  flockfile        ] dnl
++               [fork            funlockfile     getipnodebyname  ] dnl
+                [gettimeofday    if_nametoindex  mkstemp          ] dnl
+                [opendir         readdir         regcomp          ] dnl
+                [setenv          setitimer       setlocale        ] dnl
+@@ -82,8 +83,8 @@ esac
+ AC_CONFIG_LIBOBJ_DIR([snmplib])
+ 
+ AC_REPLACE_FUNCS([getopt        inet_ntop     inet_pton        ] dnl
+-                 [strlcpy       strtok_r      strtol           ] dnl
+-                 [strtoul       strtoull                       ] )
++                 [strlcat       strlcpy       strtok_r         ] dnl
++                 [strtol        strtoul       strtoull         ] )
+ 
+ #  Agent:
+ AC_CHECK_FUNCS([cgetnext        chown          execv           ] dnl
+@@ -133,7 +134,7 @@ fi
+ AC_MSG_CHECKING([[for two-argument statfs with struct fs_data (Ultrix)]])
+ AC_CACHE_VAL(
+     fu_cv_sys_stat_fs_data,
+-    [AC_TRY_RUN([
++    [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #ifdef HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif
+@@ -150,10 +151,10 @@ struct fs_data fsd;
+ /* Ultrix's statfs returns 1 for success,
+    0 for not mounted, -1 for failure.  */
+ exit (statfs (".", &fsd) != 1);
+-}],
+-    fu_cv_sys_stat_fs_data=yes,
+-    fu_cv_sys_stat_fs_data=no,
+-    fu_cv_sys_stat_fs_data=no)])
++}]])],
++    [fu_cv_sys_stat_fs_data=yes],
++    [fu_cv_sys_stat_fs_data=no],
++    [fu_cv_sys_stat_fs_data=no])])
+ AC_MSG_RESULT($fu_cv_sys_stat_fs_data)
+ if test $fu_cv_sys_stat_fs_data = yes; then
+     AC_DEFINE(STAT_STATFS_FS_DATA, 1,
+@@ -309,10 +310,11 @@ if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
+        [
+         oldLIBS="$LIBS"
+         LIBS="$LIBS -lcrypto"
+-        AC_TRY_LINK(
+-         [#include <openssl/bio.h>],
+-         [BIO_dgram_get_peer(NULL, NULL);],,
+-         AC_MSG_ERROR([DTLS support requires a newer version of OpenSSL]))
++        AC_LINK_IFELSE(
++          [AC_LANG_PROGRAM(
++            [[#include <openssl/bio.h>]],
++            [[BIO_dgram_get_peer(NULL, NULL);]])], [],
++          [AC_MSG_ERROR(DTLS support requires a newer version of OpenSSL)])
+ 
+         LIBS="$oldLIBS"
+        ]
+diff --git a/configure.d/config_os_headers b/configure.d/config_os_headers
+index 23cc38d..d903f58 100644
+--- a/configure.d/config_os_headers
++++ b/configure.d/config_os_headers
+@@ -30,9 +30,18 @@ AC_CHECK_HEADERS([getopt.h   pthread.h  regex.h      ] dnl
+                  [sys/timeb.h        ] dnl
+                  [sys/un.h           ])
+ 
++#  Library and Agent:
++AC_CHECK_HEADERS([nlist.h],,,[
++AC_INCLUDES_DEFAULT
++[
++#ifndef LIBBSD_DISABLE_DEPRECATED
++#define LIBBSD_DISABLE_DEPRECATED 1
++#endif
++]])
++
+ #  Library:
+ AC_CHECK_HEADERS([fcntl.h    io.h       kstat.h                 ] dnl
+-                 [limits.h   locale.h   nlist.h                 ] dnl
++                 [limits.h   locale.h                  ] dnl
+                  [sys/file.h       sys/ioctl.h         ] dnl
+                  [sys/sockio.h     sys/stat.h          ] dnl
+                  [sys/systemcfg.h  sys/systeminfo.h    ] dnl
+@@ -45,7 +54,7 @@ AC_CHECK_HEADERS([dlfcn.h    err.h      fcntl.h    fstab.h      ] dnl
+                  [           grp.h      io.h                    ] dnl
+                  [ioctls.h   kstat.h    kvm.h      limits.h     ] dnl
+                  [           mntent.h   mtab.h                  ] dnl
+-                 [nlist.h    pkglocs.h             pwd.h        ] dnl
++                 [           pkglocs.h             pwd.h        ] dnl
+                  [           utmpx.h    utsname.h               ])
+ 
+ AC_CHECK_HEADERS([sys/diskio.h  sys/dkio.h                                 ] dnl
+diff --git a/configure.d/config_os_libs1 b/configure.d/config_os_libs1
+index ce33d34..35f052a 100644
+--- a/configure.d/config_os_libs1
++++ b/configure.d/config_os_libs1
+@@ -84,3 +84,12 @@ netsnmp_save_LIBS="$LIBS"
+ LIBS="$LAGENTLIBS $LMIBLIBS $LIBS"
+ AC_CHECK_FUNCS([kvm_openfiles kvm_getprocs kvm_getproc2 kvm_getswapinfo])
+ LIBS="$netsnmp_save_LIBS"
++
++#
++#   dynamic module support
++#
++NETSNMP_SEARCH_LIBS([dlopen], [dl],,, [$LAGENTLIBS $LSNMPLIBS], [LMIBLIBS])
++netsnmp_save_LIBS="$LIBS"
++LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS"
++AC_CHECK_FUNCS([dlopen])
++LIBS="$netsnmp_save_LIBS"
+diff --git a/configure.d/config_os_libs2 b/configure.d/config_os_libs2
+index 22ab764..fa846c8 100644
+--- a/configure.d/config_os_libs2
++++ b/configure.d/config_os_libs2
+@@ -158,15 +158,6 @@ NETSNMP_SEARCH_LIBS(kstat_lookup, kstat,
+         LNETSNMPLIBS)
+ 
+ 
+-#   dynamic module support
+-#
+-NETSNMP_SEARCH_LIBS(dlopen, dl,,,,LMIBLIBS)
+-netsnmp_save_LIBS="$LIBS"
+-LIBS="$LMIBLIBS $LIBS"
+-AC_CHECK_FUNCS([dlopen])
+-LIBS="$netsnmp_save_LIBS"
+-
+-
+ ##
+ #   MIB-module-specific checks
+ ##
+@@ -277,6 +268,12 @@ if test "x$tryopenssl" != "xno" -a "x$tryopenssl" != "xinternal"; then
+             AC_CHECK_LIB(${CRYPTO}, AES_cfb128_encrypt, 
+                 AC_DEFINE(HAVE_AES_CFB128_ENCRYPT, 1,
+                     [Define to 1 if you have the `AES_cfb128_encrypt' function.]))
++
++            AC_CHECK_LIB(${CRYPTO}, EVP_MD_CTX_create,
++                AC_DEFINE([HAVE_EVP_MD_CTX_CREATE], [],
++                    [Define to 1 if you have the `EVP_MD_CTX_create' function.])
++                AC_DEFINE([HAVE_EVP_MD_CTX_DESTROY], [],
++                    [Define to 1 if you have the `EVP_MD_CTX_destroy' function.]))
+         fi
+         if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
+ 	    AC_CHECK_LIB(ssl, DTLSv1_method,
+@@ -408,12 +405,11 @@ if test "$with_libwrap" != "no"; then
+   LIBS="$LIBS -lwrap"
+   AC_MSG_CHECKING([for TCP wrappers library -lwrap])
+   # XXX: should check for hosts_ctl
+-  AC_TRY_LINK(
+-    [#include <sys/types.h>
++  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+      #include <tcpd.h>
+      int allow_severity = 0;
+-     int deny_severity  = 0;],
+-    [hosts_access((void *)0)],
++     int deny_severity  = 0;]],
++    [[hosts_access((void *)0)]])],
+     [AC_MSG_RESULT([yes])
+      AC_DEFINE(NETSNMP_USE_LIBWRAP)
+      test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
+@@ -423,12 +419,11 @@ if test "$with_libwrap" != "no"; then
+      AC_CHECK_FUNC(yp_get_default_domain, ,
+        AC_CHECK_LIB(nsl, yp_get_default_domain))
+      AC_MSG_CHECKING([for TCP wrappers library -lwrap linked with -lnsl])
+-     AC_TRY_LINK(
+-       [#include <sys/types.h>
++     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+ 	#include <tcpd.h>
+ 	int allow_severity = 0;
+-	int deny_severity  = 0;],
+-       [hosts_access((void *)0)],
++	int deny_severity  = 0;]],
++       [[hosts_access((void *)0)]])],
+        [AC_MSG_RESULT(yes)
+ 	AC_DEFINE(NETSNMP_USE_LIBWRAP)
+ 	test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
+@@ -454,6 +449,17 @@ if test "x$with_mysql" = "xyes" ; then
+   fi
+   MYSQL_LIBS=`$MYSQLCONFIG --libs`
+   MYSQL_INCLUDES=`$MYSQLCONFIG --cflags`
++  AC_MSG_CHECKING([whether MY_INIT() works])
++  _libs="${LIBS}"
++  _cppflags="${CPPFLAGS}"
++  LIBS="${LIBS} ${MYSQL_LIBS}"
++  CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
++  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mysql/my_global.h>
++               #include <mysql/my_sys.h>]], [[MY_INIT("my_init_test")]])],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)
++               AC_DEFINE([HAVE_BROKEN_LIBMYSQLCLIENT], 1,
++	                 [Define if using MY_INIT() causes a linker error])])
++  CPPFLAGS="${_cppflags}"
++  LIBS="${_libs}"
+   AC_MSG_CACHE_ADD(MYSQL Trap Logging:         enabled)
+ else
+   AC_MSG_CACHE_ADD(MYSQL Trap Logging:         unavailable)
+diff --git a/configure.d/config_os_struct_members b/configure.d/config_os_struct_members
+index 17bb489..9f015ac 100644
+--- a/configure.d/config_os_struct_members
++++ b/configure.d/config_os_struct_members
+@@ -57,6 +57,18 @@ AC_CHECK_MEMBERS([struct dirent.d_type],,,[
+ #endif
+     ]])
+ 
++#       struct ethtool_cmd
++#
++if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then
++AC_CHECK_MEMBERS([struct ethtool_cmd.speed_hi],,,[
++    AC_INCLUDES_DEFAULT()
++    [
++#ifdef HAVE_LINUX_ETHTOOL_H
++#include <linux/ethtool.h>
++#endif
++    ]])
++fi
++
+ #       struct ipstat
+ #   Agent:
+ #
+@@ -310,6 +322,28 @@ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[
+ #endif
+     ]])
+ 
++#       extern timezone
++AC_MSG_CHECKING([extern timezone])
++AC_LINK_IFELSE([AC_LANG_PROGRAM([[
++#if TIME_WITH_SYS_TIME
++# include <sys/time.h>
++# include <time.h>
++#else
++# if HAVE_SYS_TIME_H
++#  include <sys/time.h>
++# else
++#  include <time.h>
++# endif
++#endif
++]], [[
++  return timezone;
++]])], [
++AC_MSG_RESULT([yes])
++AC_DEFINE([HAVE_TIMEZONE_VARIABLE], [1], [Define if a timezone variable is declared in <sys/time.h>])
++], [
++AC_MSG_RESULT([no])
++])
++
+ #       struct timezone
+ #   Library:
+ #
+diff --git a/configure.d/config_project_with_enable b/configure.d/config_project_with_enable
+index 732742b..2cf7aec 100644
+--- a/configure.d/config_project_with_enable
++++ b/configure.d/config_project_with_enable
+@@ -93,7 +93,12 @@ NETSNMP_ARG_WITH(openssl,
+     elif test "x$withval" = "xno"; then
+       tryopenssl=no
+     elif test -d "$withval"; then
+-      AC_ADD_SEARCH_PATH($withval)
++      if test -d "$withval/lib/MinGW"; then
++        LDFLAGS="-L$withval/lib/MinGW $LDFLAGS"
++        CPPFLAGS="-I$withval/include $CPPFLAGS"
++      else
++        AC_ADD_SEARCH_PATH($withval)
++      fi
+       tryopenssl=yes
+       askedopenssl=yes
+     fi,
+diff --git a/dist/extractnews b/dist/extractnews
+index 848909a..bce94c9 100755
+--- a/dist/extractnews
++++ b/dist/extractnews
+@@ -19,12 +19,13 @@ LocalGetOptions(\%opts,
+ 		"",
+ 		['c|changes-file=s','A file to save CHANGES entries to'],
+ 		['n|news-file=s','A file to save NEWS entries to'],
++		['d|debug-line=s', 'Debugging output for lines matching STRING'],
+ 		"",
+ 		['GUI:otherargs_text','Input files to parse'],
+ 	       );
+ 
+ my $maybecontinue = 0;
+-my $lasttext = 0;
++my $lasttext = "";
+ my $lastfile;
+ my $lastcomponent;
+ 
+@@ -41,32 +42,51 @@ foreach my $argv (@ARGV) {
+ 
+ 	last if ($opts{'e'} && /$opts{e}/o);
+ 
++	print STDERR "here: $_" if ($opts{'d'} && /$opts{'d'}/o);
++
+ 	# don't use this:
+ 	#   FILE: BUGS: 123,456: text
+ 	($file, $patbug, $nums, $text) = 
+ 	  /(NEWS|CHANGES):\s*-*\s*\[*(BUG|PATCH)(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/;
+ 
++	print STDERR "  1:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
++
+ 	# or this:
+ 	#   FILE: component - text
+ 	($file, $component, $text) = 
+ 	  /(NEWS|CHANGES):\s*(\w+)\s*-+\s*(.*)/ if (!$file);
+ 
++	print STDERR "  2:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
++
+ 	# what you should use:
+-	#   FILE: component: text
+-	#      or
+ 	#   FILE: component: BUGS: 123,456: text
+ 	#
+ 	#      or
+ 	#   FILE: component: PATCH: 123,456: from someone text
+ 	#   FILE: component: PATCH: 123,456: from "someone long" text
+ 	($file, $component, $patbug, $nums, $text) = 
+-	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file);
++	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)(?:ES|S):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file);
++
++	print STDERR "  3:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
++
++	#      or at least:
++	#   FILE: component: text
++	($file, $component, $text) = 
++	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*(.*)/ if (!$file);
++
++	print STDERR "  4:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
+ 
+ 	# component left out
+ 	# FILE: [BUGS: 123,456]: text
+ 	($file, $patbug, $nums, $text) = 
+ 	  /(NEWS|CHANGES):\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/ if (!$file);
+ 	
++	print STDERR "  5:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
++
++	if ($opts{'d'} && /$opts{'d'}/o) {
++	    my $bogus = 1; # breakable point
++	}
++
+ 	if (!$file && $maybecontinue) {
+ 	    if (/^\s*(.+)$/) {
+ 		$text = $1;
+@@ -94,7 +114,8 @@ foreach my $argv (@ARGV) {
+ 	} else {
+ 	    $lasttext .= " $text";
+ 	}
+-	$lasttext =~ s/^ //;
++	$lasttext =~ s/^ //;                   # get rid of leading spaces
++	$lasttext =~ s/^([a-z])/uc($1)/e;      # capitalize the first letter 
+ 	$text = wrap("      - ","        ","$lasttext") . "\n";
+ 	
+ 	#
+@@ -108,6 +129,7 @@ foreach my $argv (@ARGV) {
+ 	$component =~ s/^snmp/0snmp/;
+ 	$component =~ s/^agent/0snmpd/;		# Merge "agent" into "snmpd"
+ 	$component =~ s/^([A-Z])/zz\1/;
++	print STDERR "  t:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
+ 	push @{$output{$opts{'c'}}{$component}}, $text;
+ 	push @{$output{$opts{'n'}}{$component}}, $text if ($file eq 'NEWS');
+ 	$lastfile = $file;
+diff --git a/dist/makerelease.xml b/dist/makerelease.xml
+index 1d65e2c..758e889 100644
+--- a/dist/makerelease.xml
++++ b/dist/makerelease.xml
+@@ -33,6 +33,15 @@
+ 	    should be labeled ".rcN" like 5.4.1.rc1.
+ 	  </text>
+ 	</step>
++	<step type="prompt" prompt="Enter the last version number:"
++	  title="Enter the last version number"
++	  parameter="LASTVERSION">
++	  <text>
++	    Please enter the last version number that the changelog should be
++            generated from.  This should be easy for a new release on a branch,
++            but may be more tricky for a main release.
++	  </text>
++	</step>
+ 	<step type="perl" title="Defining a second internal version string"
+ 	  mandatory="1">
+ 	  <perl>
+@@ -41,6 +50,9 @@
+ 	      $self->{'parameters'}{'VERSIONTAGNAME'} =
+     	          "v" . $self->{'parameters'}{'VERSION'};
+ 
++	      $self->{'parameters'}{'LASTVERSIONTAGNAME'} =
++    	          "v" . $self->{'parameters'}{'LASTVERSION'};
++
+ 	      # target version number (without preN/rcN)
+ 	      $self->{'parameters'}{'VERSIONTARGET'} =
+     	          $self->{'parameters'}{'VERSION'};
+@@ -361,22 +373,19 @@
+ 	    <command>git commit -m "make depend for {VERSION}" `find . -name Makefile.depend`</command>
+ 	  </commands>
+ 	</step>
+-	<step type="system" stepname="changelog:svn2cl" title="changelog:svn2cl">
++	<step type="system" stepname="changelog:create" title="Creating a changelog update">
+           <text>We need to extract the portions of the change logs
+           committed to the repository.</text>
+-	  <!-- XXX: git2cl needs to be truncated quite a bit rather than searching the whole history -->
+-	  <!-- XXX: following branches properly may prove to be interesting -->
+ 	  <commands>
+-	    <command>git2cl | head -10000 &gt; ChangeLog.add</command>
+-	    <command>perl dist/changelogfix  &lt; ChangeLog.add &gt; ChangeLog.reallyadd</command>
++	    <command>git log --no-merges {LASTVERSIONTAGNAME}..HEAD &gt; ChangeLog.add</command>
+ 	  </commands>
+ 	</step>
+ 	<step type="informational" pause="true" stepname="changelog:manualedit" title="changelog:manualedit">
+ 	  <text>
+ 	    You need to manually insert the *relevent* portions of
+-	    'ChangeLog.reallyadd' into the ChangeLog file.
++	    'ChangeLog.add' into the ChangeLog file.
+ 
+-            I also suggest truncating ChangeLog.reallyadd to only contain
++            I also suggest truncating ChangeLog.add to only contain
+             the *relevent* portions for this release, as this will make
+             CHANGES.new2 and NEWS.new2 more accurate later on.
+ 
+@@ -396,7 +405,7 @@
+ 	</step>
+ 	<step type="system" stepname="docs:newnews" title="docs:newnews">
+ 	  <commands>
+-	    <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.reallyadd</command>
++	    <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.add</command>
+ 	  </commands>
+ 	</step>
+ 	<step type="informational" pause="true" stepname="docs:README-and-NEWS" title="docs:README">
+diff --git a/dist/release b/dist/release
+index 9e02b5c..52b45b1 100644
+--- a/dist/release
++++ b/dist/release
+@@ -4,4 +4,4 @@
+ # a branch name followed by 'rc' when the branch is in rc phase of a release.
+ #
+ #master rc
+-V5-7-patches rc
++#V5-7-patches rc
+diff --git a/doxygen.conf b/doxygen.conf
+index 6b5eb58..20e457d 100644
+--- a/doxygen.conf
++++ b/doxygen.conf
+@@ -280,7 +280,7 @@ WARNINGS               = YES
+ # for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+ # automatically be disabled.
+ 
+-WARN_IF_UNDOCUMENTED   = YES
++WARN_IF_UNDOCUMENTED   = NO
+ 
+ # The WARN_FORMAT tag determines the format of the warning messages that 
+ # doxygen can produce. The string should contain the $file, $line, and $text 
+diff --git a/include/net-snmp/agent/auto_nlist.h b/include/net-snmp/agent/auto_nlist.h
+index c7cd872..21b6b8c 100644
+--- a/include/net-snmp/agent/auto_nlist.h
++++ b/include/net-snmp/agent/auto_nlist.h
+@@ -12,9 +12,9 @@ extern          "C" {
+ #endif
+ 
+ #ifdef NETSNMP_CAN_USE_NLIST
+-int             auto_nlist(const char *, char *, int);
++int             auto_nlist(const char *, char *, size_t);
+ long            auto_nlist_value(const char *);
+-int             KNLookup(struct nlist *, int, char *, int);
++int             KNLookup(struct nlist *, int, char *, size_t);
+ #else
+ int             auto_nlist_noop(void);
+ #	define auto_nlist(x,y,z) auto_nlist_noop()
+diff --git a/include/net-snmp/agent/hardware/cpu.h b/include/net-snmp/agent/hardware/cpu.h
+index bc6f75b..f6e43e5 100644
+--- a/include/net-snmp/agent/hardware/cpu.h
++++ b/include/net-snmp/agent/hardware/cpu.h
+@@ -3,18 +3,18 @@ extern int cpu_num;
+ 
+                  /* For rolling averages */
+ struct netsnmp_cpu_history {
+-     long user_hist;
+-     long sys_hist;
+-     long idle_hist;
+-     long nice_hist;
+-     long total_hist;
++     unsigned long long user_hist;
++     unsigned long long sys_hist;
++     unsigned long long idle_hist;
++     unsigned long long nice_hist;
++     unsigned long long total_hist;
+ 
+-     long ctx_hist;
+-     long intr_hist;
+-     long swpi_hist;
+-     long swpo_hist;
+-     long pagei_hist;
+-     long pageo_hist;
++     unsigned long long ctx_hist;
++     unsigned long long intr_hist;
++     unsigned long long swpi_hist;
++     unsigned long long swpo_hist;
++     unsigned long long pagei_hist;
++     unsigned long long pageo_hist;
+ };
+ 
+ struct netsnmp_cpu_info_s {
+@@ -25,30 +25,30 @@ struct netsnmp_cpu_info_s {
+      int  status;
+ 
+                  /* For UCD cpu stats */
+-     long user_ticks;
+-     long nice_ticks;
+-     long sys_ticks;
+-     long idle_ticks;
+-     long wait_ticks;
+-     long kern_ticks;
+-     long intrpt_ticks;
+-     long sirq_ticks;
+-     long steal_ticks;
+-     long guest_ticks;
+-     long guestnice_ticks;
++     unsigned long long user_ticks;
++     unsigned long long nice_ticks;
++     unsigned long long sys_ticks;
++     unsigned long long idle_ticks;
++     unsigned long long wait_ticks;
++     unsigned long long kern_ticks;
++     unsigned long long intrpt_ticks;
++     unsigned long long sirq_ticks;
++     unsigned long long steal_ticks;
++     unsigned long long guest_ticks;
++     unsigned long long guestnice_ticks;
+ 
+-     long total_ticks;
+-     long sys2_ticks;  /* For non-atomic system counts */
++     unsigned long long total_ticks;
++     unsigned long long sys2_ticks;  /* For non-atomic system counts */
+ 
+                  /* For paging-related UCD stats */
+               /* XXX - Do these belong elsewhere ?? */
+               /* XXX - Do Not Use - Subject to Change */
+-     long pageIn;
+-     long pageOut;
+-     long swapIn;
+-     long swapOut;
+-     long nInterrupts;
+-     long nCtxSwitches;
++     unsigned long long pageIn;
++     unsigned long long pageOut;
++     unsigned long long swapIn;
++     unsigned long long swapOut;
++     unsigned long long nInterrupts;
++     unsigned long long nCtxSwitches;
+ 
+      struct netsnmp_cpu_history *history;
+ 
+diff --git a/include/net-snmp/agent/snmp_agent.h b/include/net-snmp/agent/snmp_agent.h
+index 240ca94..aad8837 100644
+--- a/include/net-snmp/agent/snmp_agent.h
++++ b/include/net-snmp/agent/snmp_agent.h
+@@ -271,6 +271,7 @@ extern          "C" {
+     u_long          netsnmp_marker_uptime(marker_t pm);
+     u_long          netsnmp_timeval_uptime(struct timeval *tv);
+     const_marker_t  netsnmp_get_agent_starttime(void);
++    uint64_t        netsnmp_get_agent_runtime(void);
+     void            netsnmp_set_agent_starttime(marker_t s);
+     u_long          netsnmp_get_agent_uptime(void);
+     void            netsnmp_set_agent_uptime(u_long hsec);
+diff --git a/include/net-snmp/library/default_store.h b/include/net-snmp/library/default_store.h
+index e1b2e24..3c3c519 100644
+--- a/include/net-snmp/library/default_store.h
++++ b/include/net-snmp/library/default_store.h
+@@ -37,7 +37,8 @@ extern          "C" {
+      * begin storage definitions 
+      */
+ /**
+- * @def NETSNMP_DS_LIBRARY_ID These definitions correspond with the "storid" argument to the API 
++ * @def NETSNMP_DS_LIBRARY_ID
++ * These definitions correspond with the "storid" argument to the API.
+  */
+ #define NETSNMP_DS_LIBRARY_ID     0
+ #define NETSNMP_DS_APPLICATION_ID 1
+diff --git a/include/net-snmp/library/large_fd_set.h b/include/net-snmp/library/large_fd_set.h
+index 67a473c..9b547cd 100644
+--- a/include/net-snmp/library/large_fd_set.h
++++ b/include/net-snmp/library/large_fd_set.h
+@@ -16,7 +16,7 @@
+ #include <sys/select.h>
+ #endif
+ 
+-#if defined(HAVE_WINSOCK_H) && ! defined(_WINSOCKAPI_) && ! defined(_WINSOCK_H)
++#if defined(HAVE_WINSOCK_H) && !defined(_WINSOCKAPI_) && !defined(_WINSOCK_H)
+ #error <winsock.h> or <winsock2.h> must have been included before this file.
+ #endif
+ 
+@@ -44,15 +44,19 @@ extern "C" {
+ 
+ /**
+  * Test whether set *fdset contains socket fd.
+- * Do nothing if fd >= fdset->lfs_setsize.
++ * Evaluates to zero (false) if fd >= fdset->lfs_setsize.
+  */
+ #define NETSNMP_LARGE_FD_ISSET(fd, fdset) \
+                     netsnmp_large_fd_is_set(fd, fdset)
+ 
+-#if ! defined(cygwin) && defined(HAVE_WINSOCK_H)
++#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
+ 
+-/** Number of bytes needed to store setsize file descriptors. */
+-#define NETSNMP_FD_SET_BYTES(setsize) (sizeof(fd_set) + sizeof(SOCKET) * (setsize - FD_SETSIZE))
++/**
++ * Number of bytes needed to store a number of file descriptors as a
++ * struct fd_set.
++ */
++#define NETSNMP_FD_SET_BYTES(setsize)                           \
++    (sizeof(fd_set) + ((setsize) - FD_SETSIZE) * sizeof(SOCKET))
+ 
+ /** Remove all sockets from the set *fdset. */
+ #define NETSNMP_LARGE_FD_ZERO(fdset) \
+@@ -74,28 +78,29 @@ int    netsnmp_large_fd_is_set(SOCKET fd, netsnmp_large_fd_set *fdset);
+  * According to SUSv2, this array must have the name fds_bits. See also
+  * <a href="http://www.opengroup.org/onlinepubs/007908775/xsh/systime.h.html">The Single UNIX Specification, Version 2, &lt;sys/time.h&gt;</a>.
+  */
+-#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits)
++#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits[0])
+ 
+-/** Number of bits in one element of the fd_set::fds_bits array. */
++/** Number of bits in one element of the fd_set.fds_bits array. */
+ #define NETSNMP_BITS_PER_FD_MASK (8 * NETSNMP_FD_MASK_SIZE)
+ 
+ /** Number of elements needed for the fds_bits array. */
+ #define NETSNMP_FD_SET_ELEM_COUNT(setsize) \
+     (setsize + NETSNMP_BITS_PER_FD_MASK - 1) / NETSNMP_BITS_PER_FD_MASK
+ 
+-/** Number of bytes needed to store setsize file descriptors. */
+-#define NETSNMP_FD_SET_BYTES(setsize) \
+-    (NETSNMP_FD_SET_ELEM_COUNT(setsize) * NETSNMP_FD_MASK_SIZE)
++/**
++ * Number of bytes needed to store a number of file descriptors as a
++ * struct fd_set.
++ */
++#define NETSNMP_FD_SET_BYTES(setsize)                                   \
++    (sizeof(fd_set) + NETSNMP_FD_SET_ELEM_COUNT((setsize) - FD_SETSIZE) \
++     * NETSNMP_FD_MASK_SIZE)
+ 
+ /** Remove all file descriptors from the set *fdset. */
+-#define NETSNMP_LARGE_FD_ZERO(fdset)                       \
+-  do {                                                     \
+-    int __i;                                               \
+-    fd_set *__arr = &(fdset)->lfs_set;                     \
+-    __i = NETSNMP_FD_SET_ELEM_COUNT((fdset)->lfs_setsize); \
+-    for ( ; __i > 0; __i--)                                \
+-      __arr->fds_bits[__i - 1] = 0;                        \
+-  } while (0)
++#define NETSNMP_LARGE_FD_ZERO(fdset)                            \
++    do {                                                        \
++        memset((fdset)->lfs_setptr, 0,                          \
++               NETSNMP_FD_SET_BYTES((fdset)->lfs_setsize));     \
++    } while (0)
+ 
+ 
+ void   netsnmp_large_fd_setfd( int fd, netsnmp_large_fd_set *fdset);
+@@ -118,8 +123,10 @@ void   netsnmp_large_fd_set_init(   netsnmp_large_fd_set *fdset, int setsize);
+ /**
+  * Modify the size of a file descriptor set and preserve the first
+  * min(fdset->lfs_setsize, setsize) file descriptors.
++ *
++ * Returns 1 upon success or 0 if memory allocation failed.
+  */
+-void   netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize);
++int    netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize);
+ 
+ /**
+  * Synchronous I/O multiplexing for large file descriptor sets.
+diff --git a/include/net-snmp/library/oid.h b/include/net-snmp/library/oid.h
+index 5468713..e7adf41 100644
+--- a/include/net-snmp/library/oid.h
++++ b/include/net-snmp/library/oid.h
+@@ -7,7 +7,7 @@
+ 
+ #ifndef EIGHTBIT_SUBIDS
+ typedef u_long oid;
+-#define MAX_SUBID   0xFFFFFFFF
++#define MAX_SUBID   0xFFFFFFFFUL
+ #define NETSNMP_PRIo "l"
+ #else
+ typedef uint8_t oid;
+diff --git a/include/net-snmp/library/snmp_alarm.h b/include/net-snmp/library/snmp_alarm.h
+index 0fe2cf1..8437c1d 100644
+--- a/include/net-snmp/library/snmp_alarm.h
++++ b/include/net-snmp/library/snmp_alarm.h
+@@ -55,6 +55,8 @@ extern          "C" {
+     NETSNMP_IMPORT void run_alarms(void);
+     RETSIGTYPE      alarm_handler(int a);
+     void            set_an_alarm(void);
++    int             netsnmp_get_next_alarm_time(struct timeval *alarm_tm,
++                                                const struct timeval *now);
+     int             get_next_alarm_delay_time(struct timeval *delta);
+ 
+ 
+diff --git a/include/net-snmp/library/snmp_api.h b/include/net-snmp/library/snmp_api.h
+index e32d62b..f57b678 100644
+--- a/include/net-snmp/library/snmp_api.h
++++ b/include/net-snmp/library/snmp_api.h
+@@ -418,7 +418,6 @@ typedef struct request_list {
+ #endif
+ 
+     int             create_user_from_session(netsnmp_session * session);
+-    int snmp_get_fd_for_session(struct snmp_session *sessp);
+     int snmpv3_probe_contextEngineID_rfc5343(void *slp,
+                                              netsnmp_session *session);
+ 
+diff --git a/include/net-snmp/library/snmp_enum.h b/include/net-snmp/library/snmp_enum.h
+index 3ab470e..237891d 100644
+--- a/include/net-snmp/library/snmp_enum.h
++++ b/include/net-snmp/library/snmp_enum.h
+@@ -94,10 +94,11 @@ extern          "C" {
+      * Persistent enumeration lists
+      */
+     void            se_store_enum_list(struct snmp_enum_list *new_list,
+-                                       const char *token, char *type);
+-    void            se_store_list(unsigned int major, unsigned int minor, char *type);
++                                       const char *token, const char *type);
++    void            se_store_list(unsigned int major, unsigned int minor,
++                                  const char *type);
+     void            se_clear_slist(const char *listname);
+-    void            se_store_slist(const char *listname, char *type);
++    void            se_store_slist(const char *listname, const char *type);
+     int             se_store_slist_callback(int majorID, int minorID,
+                                            void *serverargs, void *clientargs);
+     void            se_read_conf(const char *word, char *cptr);
+diff --git a/include/net-snmp/library/snmp_parse_args.h b/include/net-snmp/library/snmp_parse_args.h
+index 384aff0..1ad63e0 100644
+--- a/include/net-snmp/library/snmp_parse_args.h
++++ b/include/net-snmp/library/snmp_parse_args.h
+@@ -1,8 +1,5 @@
+ #ifndef SNMP_PARSE_ARGS_H
+ #define SNMP_PARSE_ARGS_H
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+ 
+ /**
+  * @file snmp_parse_args.h
+@@ -11,6 +8,10 @@ extern "C" {
+  * line arguments
+  */
+ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
+ /** Don't enable any logging even if there is no -L argument */
+ #define NETSNMP_PARSE_ARGS_NOLOGGING    0x0001
+ /** Don't zero out sensitive arguments as they are not on the command line
+@@ -47,11 +48,12 @@ extern "C" {
+  *  from it.
+  *  @param argc Number of elements in argv
+  *  @param argv string array of at least argc elements
++ *  @param session
+  *  @param localOpts Additional option characters to accept
+  *  @param proc function pointer used to process any unhandled arguments
+  *  @param flags flags directing how to handle the string
+  *
+- *  @reval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success
++ *  @retval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success
+  *  @retval #NETSNMP_PARSE_ARGS_SUCCESS_EXIT when the application is expected
+  *  to exit with zero exit code (e.g. '-V' option was found)
+  *  @retval #NETSNMP_PARSE_ARGS_ERROR_USAGE when the function failed to parse
+diff --git a/include/net-snmp/library/system.h b/include/net-snmp/library/system.h
+index 9ae1067..5c58e4a 100644
+--- a/include/net-snmp/library/system.h
++++ b/include/net-snmp/library/system.h
+@@ -194,6 +194,11 @@ SOFTWARE.
+     NETSNMP_IMPORT
+     size_t            strlcpy(char *, const char *, size_t);
+ #endif
++#ifndef HAVE_STRLCAT
++    NETSNMP_IMPORT
++    size_t            strlcat(char * __restrict, const char * __restrict,
++                              size_t);
++#endif
+ 
+     int             netsnmp_os_prematch(const char *ospmname,
+                                         const char *ospmrelprefix);
+diff --git a/include/net-snmp/library/testing.h b/include/net-snmp/library/testing.h
+index aabe52f..ec6135a 100644
+--- a/include/net-snmp/library/testing.h
++++ b/include/net-snmp/library/testing.h
+@@ -7,10 +7,10 @@
+ static int __test_counter = 0;
+ static int __did_plan = 0;
+ 
+-#define OK(isok, description) { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); }
++#define OK(isok, description) do { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); } while (0)
+ 
+-#define OKF(isok, description) { printf("%s %d - \n", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); }
++#define OKF(isok, description) do { printf("%s %d - ", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); } while (0)
+ 
+-#define PLAN(number) { printf("1..%d\n", number); __did_plan = 1;}
++#define PLAN(number) do { printf("1..%d\n", number); __did_plan = 1; } while (0)
+ 
+ #endif /* NETSNMP_LIBRARY_TESTING_H */
+diff --git a/include/net-snmp/library/tools.h b/include/net-snmp/library/tools.h
+index d3514b7..66415da 100644
+--- a/include/net-snmp/library/tools.h
++++ b/include/net-snmp/library/tools.h
+@@ -113,7 +113,7 @@ extern          "C" {
+  *  Expands to string with value of the s. 
+  *  If s is macro, the resulting string is value of the macro.
+  *  Example: 
+- *   #define TEST 1234
++ *   \#define TEST 1234
+  *   SNMP_MACRO_VAL_TO_STR(TEST) expands to "1234"
+  *   SNMP_MACRO_VAL_TO_STR(TEST+1) expands to "1234+1"
+  */
+@@ -286,8 +286,8 @@ extern          "C" {
+     NETSNMP_IMPORT
+     u_long          uatime_hdiff(const_marker_t first, const_marker_t second);      /* 1/100th sec */
+     NETSNMP_IMPORT
+-    int             atime_ready(const_marker_t pm, int deltaT);
+-    int             uatime_ready(const_marker_t pm, unsigned int deltaT);
++    int             atime_ready(const_marker_t pm, int delta_ms);
++    int             uatime_ready(const_marker_t pm, unsigned int delta_ms);
+ 
+     int             marker_tticks(const_marker_t pm);
+     int             timeval_tticks(const struct timeval *tv);
+diff --git a/include/net-snmp/net-snmp-config.h.in b/include/net-snmp/net-snmp-config.h.in
+index d9b9d15..d6ef3ab 100644
+--- a/include/net-snmp/net-snmp-config.h.in
++++ b/include/net-snmp/net-snmp-config.h.in
+@@ -96,6 +96,9 @@
+ /* Define to 1 if you have the <asm/types.h> header file. */
+ #undef HAVE_ASM_TYPES_H
+ 
++/* Define if using MY_INIT() causes a linker error */
++#undef HAVE_BROKEN_LIBMYSQLCLIENT
++
+ /* Define to 1 if you have the `cgetnext' function. */
+ #undef HAVE_CGETNEXT
+ 
+@@ -140,6 +143,12 @@
+ /* Define to 1 if you have the `eval_pv' function. */
+ #undef HAVE_EVAL_PV
+ 
++/* Define to 1 if you have the `EVP_MD_CTX_create' function. */
++#undef HAVE_EVP_MD_CTX_CREATE
++
++/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */
++#undef HAVE_EVP_MD_CTX_DESTROY
++
+ /* Define if you have EVP_sha224/256 in openssl */
+ #undef HAVE_EVP_SHA224
+ 
+@@ -152,12 +161,21 @@
+ /* Define to 1 if you have the <fcntl.h> header file. */
+ #undef HAVE_FCNTL_H
+ 
++/* Define to 1 if you have the `fgetc_unlocked' function. */
++#undef HAVE_FGETC_UNLOCKED
++
++/* Define to 1 if you have the `flockfile' function. */
++#undef HAVE_FLOCKFILE
++
+ /* Define to 1 if you have the `fork' function. */
+ #undef HAVE_FORK
+ 
+ /* Define to 1 if you have the <fstab.h> header file. */
+ #undef HAVE_FSTAB_H
+ 
++/* Define to 1 if you have the `funlockfile' function. */
++#undef HAVE_FUNLOCKFILE
++
+ /* Define to 1 if you have the `gai_strerror' function. */
+ #undef HAVE_GAI_STRERROR
+ 
+@@ -746,6 +764,9 @@
+ /* Define to 1 if you have the <string.h> header file. */
+ #undef HAVE_STRING_H
+ 
++/* Define to 1 if you have the `strlcat' function. */
++#undef HAVE_STRLCAT
++
+ /* Define to 1 if you have the `strlcpy' function. */
+ #undef HAVE_STRLCPY
+ 
+@@ -773,6 +794,9 @@
+ /* Define to 1 if `d_type' is a member of `struct dirent'. */
+ #undef HAVE_STRUCT_DIRENT_D_TYPE
+ 
++/* Define to 1 if `speed_hi' is a member of `struct ethtool_cmd'. */
++#undef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI
++
+ /* Define to 1 if `ifa_next' is a member of `struct ifaddr'. */
+ #undef HAVE_STRUCT_IFADDR_IFA_NEXT
+ 
+@@ -1166,6 +1190,9 @@
+ /* Define to 1 if you have the `times' function. */
+ #undef HAVE_TIMES
+ 
++/* Define if a timezone variable is declared in <sys/time.h> */
++#undef HAVE_TIMEZONE_VARIABLE
++
+ /* Define to 1 if you have the <ufs/ffs/fs.h> header file. */
+ #undef HAVE_UFS_FFS_FS_H
+ 
+diff --git a/include/net-snmp/session_api.h b/include/net-snmp/session_api.h
+index 9721fc4..88dbc41 100644
+--- a/include/net-snmp/session_api.h
++++ b/include/net-snmp/session_api.h
+@@ -147,12 +147,6 @@ extern          "C" {
+     int             snmp_select_info2(int *, netsnmp_large_fd_set *,
+                                       struct timeval *, int *);
+ 
+-    /*
+-     * snmp_sess_select_info_flags() and
+-     * snmp_sess_select_info2_flags() is similar to
+-     * snmp_sess_select_info() and snmp_sess_select_info2(), but
+-     * accepts a list of flags to control aspects of its behavior.
+-     */
+ #define NETSNMP_SELECT_NOFLAGS  0x00
+ #define NETSNMP_SELECT_NOALARMS 0x01
+     NETSNMP_IMPORT
+diff --git a/include/net-snmp/system/netbsd.h b/include/net-snmp/system/netbsd.h
+index c67260d..1f22a44 100644
+--- a/include/net-snmp/system/netbsd.h
++++ b/include/net-snmp/system/netbsd.h
+@@ -34,8 +34,36 @@
+ 
+ #define UDP_ADDRESSES_IN_HOST_ORDER 1
+ 
++#ifdef netbsdelf6
++#define netbsd6
++#define netbsdelf5
++#endif
++#ifdef netbsdelf5
++#define netbsd5
++#define netbsdelf4
++#endif
++#ifdef netbsdelf4
++#define netbsd4
++#define netbsdelf3
++#endif
++#ifdef netbsdelf3
++#define netbsd3
++#endif
++
++#if defined(netbsd6) && !defined(netbsd5)
++#define netbsd5 netbsd5
++#endif
++#if defined(netbsd5) && !defined(netbsd4)
++#define netbsd4 netbsd4
++#endif
++#if defined(netbsd4) && !defined(netbsd3)
++#define netbsd3 netbsd3
++#endif
++#if defined(netbsd3) && !defined(netbsd2)
++#define netbsd2 netbsd2
++#endif
+ #ifndef netbsd1
+-# define netbsd1 netbsd1
++#define netbsd1 netbsd1
+ #endif
+ 
+ #if __NetBSD_Version__ >= 499005800
+diff --git a/local/mib2c.container.conf b/local/mib2c.container.conf
+index c051b4c..e76621f 100644
+--- a/local/mib2c.container.conf
++++ b/local/mib2c.container.conf
+@@ -174,6 +174,7 @@ initialize_table_$i(void)
+      */
+     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
+         snmp_log(LOG_ERR,"error registering table handler for $i\n");
++        reg = NULL; /* it was freed inside netsnmp_register_table */
+         goto bail;
+     }
+ 
+diff --git a/local/mib2c.notify.conf b/local/mib2c.notify.conf
+index a8ee7e3..77f3330 100644
+--- a/local/mib2c.notify.conf
++++ b/local/mib2c.notify.conf
+@@ -30,7 +30,7 @@ int send_${i}_trap(void);
+ #include <net-snmp/agent/net-snmp-agent-includes.h>
+ #include "${name}.h"
+ 
+-extern const oid snmptrap_oid;
++extern const oid snmptrap_oid[];
+ extern const size_t snmptrap_oid_len;
+ 
+ @foreach $i notifications@
+diff --git a/local/mib2c.table_data.conf b/local/mib2c.table_data.conf
+index d263914..2cc665c 100644
+--- a/local/mib2c.table_data.conf
++++ b/local/mib2c.table_data.conf
+@@ -348,6 +348,9 @@ ${i}_handler(
+          */
+     case MODE_GET:
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+             table_info  =     netsnmp_extract_table_info( request);
+@@ -386,6 +389,9 @@ ${i}_handler(
+          */
+     case MODE_SET_RESERVE1:
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+             table_info  =     netsnmp_extract_table_info( request);
+@@ -425,6 +431,9 @@ ${i}_handler(
+     case MODE_SET_RESERVE2:
+ @if $i.creatable@
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_row  = netsnmp_tdata_extract_row(  request);
+             table_data = netsnmp_tdata_extract_table(request);
+             table_info = netsnmp_extract_table_info( request);
+@@ -492,6 +501,9 @@ ${i}_handler(
+     case MODE_SET_FREE:
+ @if $i.creatable@
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+             table_row   =     netsnmp_tdata_extract_row(  request);
+@@ -530,6 +542,9 @@ ${i}_handler(
+ 
+     case MODE_SET_ACTION:
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+             table_info  =     netsnmp_extract_table_info( request);
+@@ -591,6 +606,9 @@ ${i}_handler(
+ 
+     case MODE_SET_UNDO:
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+             table_row   =     netsnmp_tdata_extract_row(  request);
+@@ -667,6 +685,9 @@ ${i}_handler(
+     case MODE_SET_COMMIT:
+ @if $i.creatable@
+         for (request=requests; request; request=request->next) {
++            if (request->processed)
++                continue;
++
+             table_entry = (struct ${i}_entry *)
+                               netsnmp_tdata_extract_entry(request);
+ @if $i.rowstatus@
+diff --git a/local/pass_persisttest b/local/pass_persisttest
+index 4f37c11..f4045cc 100755
+--- a/local/pass_persisttest
++++ b/local/pass_persisttest
+@@ -5,17 +5,23 @@
+ # put the following in your snmpd.conf file to call this script:
+ #
+ # Unix systems and Cygwin:
+-# pass_persist .1.3.6.1.4.1.2021.255 /path/to/pass_persisttest
++# pass_persist .1.3.6.1.4.1.8072.2.255 /path/to/pass_persisttest
+ # Windows systems except Cygwin:
+-# pass_persist .1.3.6.1.4.1.2021.255 perl /path/to/pass_persisttest
++# pass_persist .1.3.6.1.4.1.8072.2.255 perl /path/to/pass_persisttest
+ 
+ # Forces a buffer flush after every print
+ $|=1;
+ 
++# Save my PID, to help kill this instance.
++$PIDFILE=$ENV{'PASS_PERSIST_PIDFILE'} || "/tmp/pass_persist.pid";
++open(PIDFILE, ">$PIDFILE");
++print PIDFILE "$$\n";
++close(PIDFILE);
++
+ use strict;
+ 
+ my $counter = 0;
+-my $place = ".1.3.6.1.4.1.2021.255";
++my $place = ".1.3.6.1.4.1.8072.2.255";
+ 
+ while (<>){
+   if (m!^PING!){
+@@ -30,21 +36,33 @@ while (<>){
+   chomp($req);
+ 
+   if ( $cmd eq "getnext" ) {
+-    if ($req eq $place) {
+-      $ret = "$place.1";
+-    } elsif ($req eq "$place.1") {
+-      $ret = "$place.2.1";
+-    } elsif ($req eq "$place.2.1") {
+-      $ret = "$place.2.2";
+-    } elsif ($req eq "$place.2.2") {
+-      $ret = "$place.3";
+-    } elsif ($req eq "$place.3") {
+-      $ret = "$place.4";
+-    } elsif ($req eq "$place.4") {
+-      $ret = "$place.5";
+-    } elsif ($req eq "$place.5") {
+-      $ret = "$place.6";
+-    } else {
++     if (($req eq  "$place")         ||
++         ($req eq  "$place.0")       ||
++         ($req =~ m/$place\.0\..*/)  ||
++         ($req eq  "$place.1"))       { $ret = "$place.1.0";}       # netSnmpPassString.0
++  elsif (($req =~ m/$place\.1\..*/)  ||
++         ($req eq  "$place.2")       ||
++         ($req eq  "$place.2.0")     ||
++         ($req =~ m/$place\.2\.0\..*/)    ||
++         ($req eq  "$place.2.1")          ||
++         ($req eq  "$place.2.1.0")        ||
++         ($req =~ m/$place\.2\.1\.0\..*/) ||
++         ($req eq  "$place.2.1.1")        ||
++         ($req =~ m/$place\.2\.1\.1\..*/) ||
++         ($req eq  "$place.2.1.2")        ||
++         ($req eq  "$place.2.1.2.0")) { $ret = "$place.2.1.2.1";}   # netSnmpPassInteger.1
++  elsif (($req =~ m/$place\.2\.1\.2\..*/) ||
++         ($req eq  "$place.2.1.3")   ||
++         ($req eq  "$place.2.1.3.0")) { $ret = "$place.2.1.3.1";}   # netSnmpPassOID.1
++  elsif (($req =~ m/$place\.2\..*/)  ||
++         ($req eq  "$place.3"))       { $ret = "$place.3.0";}       # netSnmpPassTimeTicks.0
++  elsif (($req =~ m/$place\.3\..*/)  ||
++         ($req eq  "$place.4"))       { $ret = "$place.4.0";}       # netSnmpPassIpAddress.0
++  elsif (($req =~ m/$place\.4\..*/)  ||
++         ($req eq  "$place.5"))       { $ret = "$place.5.0";}       # netSnmpPassCounter.0
++  elsif (($req =~ m/$place\.5\..*/)  ||
++         ($req eq  "$place.6"))       { $ret = "$place.6.0";}       # netSnmpPassGauge.0
++  else   {
+       print "NONE\n";
+       next;
+     }
+@@ -59,20 +77,20 @@ while (<>){
+ 
+   print "$ret\n";
+ 
+-  if ($ret eq "$place.1") {
+-    print "string\nlife the universe and everything\n";
+-  } elsif ($ret eq "$place.2.1") {
+-    print "integer\n423\n";
+-  } elsif ($ret eq "$place.2.2") {
+-    print "objectid\n.1.3.6.1.4.42.42.42\n";
+-  } elsif ($ret eq "$place.3") {
++  if ($ret eq "$place.1.0") {
++    print "string\nLife, the Universe, and Everything\n";
++  } elsif ($ret eq "$place.2.1.2.1") {
++    print "integer\n42\n";
++  } elsif ($ret eq "$place.2.1.3.1") {
++    print "objectid\n$place.99\n";
++  } elsif ($ret eq "$place.3.0") {
+     print "timeticks\n363136200\n";
+-  } elsif ($ret eq "$place.4") {
++  } elsif ($ret eq "$place.4.0") {
+     print "ipaddress\n127.0.0.1\n";
+-  } elsif ($ret eq "$place.5") {
++  } elsif ($ret eq "$place.5.0") {
+     $counter++;
+     print "counter\n$counter\n";
+-  } elsif ($ret eq "$place.6") {
++  } elsif ($ret eq "$place.6.0") {
+     print "gauge\n42\n";
+   } else {
+     print  "string\nack... $ret $req\n";
+diff --git a/local/passtest b/local/passtest
+index dc5735c..40209c9 100755
+--- a/local/passtest
++++ b/local/passtest
+@@ -1,7 +1,5 @@
+ #!/bin/sh -f
+ 
+-PATH=$path:/bin:/usr/bin:/usr/ucb
+-
+ PLACE=".1.3.6.1.4.1.8072.2.255"  # NET-SNMP-PASS-MIB::netSnmpPassExamples
+ REQ="$2"                         # Requested OID
+ 
+@@ -20,34 +18,34 @@ fi
+ #
+ if [ "$1" = "-n" ]; then
+   case "$REQ" in
+-    $PLACE|
+-    $PLACE.0|
+-    $PLACE.0.*|
++    $PLACE|		\
++    $PLACE.0|		\
++    $PLACE.0.*|		\
+     $PLACE.1)       RET=$PLACE.1.0 ;;     # netSnmpPassString.0
+ 
+-    $PLACE.1.*|
+-    $PLACE.2|
+-    $PLACE.2.0|
+-    $PLACE.2.0.*|
+-    $PLACE.2.1|
+-    $PLACE.2.1.0|
+-    $PLACE.2.1.0.*|
+-    $PLACE.2.1.1|
+-    $PLACE.2.1.1.*|
+-    $PLACE.2.1.2|
++    $PLACE.1.*|		\
++    $PLACE.2|		\
++    $PLACE.2.0|		\
++    $PLACE.2.0.*|	\
++    $PLACE.2.1|		\
++    $PLACE.2.1.0|	\
++    $PLACE.2.1.0.*|	\
++    $PLACE.2.1.1|	\
++    $PLACE.2.1.1.*|	\
++    $PLACE.2.1.2|	\
+     $PLACE.2.1.2.0) RET=$PLACE.2.1.2.1 ;; # netSnmpPassInteger.1
+ 
+-    $PLACE.2.1.2.*|
+-    $PLACE.2.1.3|
++    $PLACE.2.1.2.*|	\
++    $PLACE.2.1.3|	\
+     $PLACE.2.1.3.0) RET=$PLACE.2.1.3.1 ;; # netSnmpPassOID.1
+ 
+-    $PLACE.2.*|
++    $PLACE.2.*|		\
+     $PLACE.3)       RET=$PLACE.3.0 ;;     # netSnmpPassTimeTicks.0
+-    $PLACE.3.*|
++    $PLACE.3.*|		\
+     $PLACE.4)       RET=$PLACE.4.0 ;;     # netSnmpPassIpAddress.0
+-    $PLACE.4.*|
++    $PLACE.4.*|		\
+     $PLACE.5)       RET=$PLACE.5.0 ;;     # netSnmpPassCounter.0
+-    $PLACE.5.*|
++    $PLACE.5.*|		\
+     $PLACE.6)       RET=$PLACE.6.0 ;;     # netSnmpPassGauge.0
+ 
+     *)         	    exit 0 ;;
+@@ -57,12 +55,12 @@ else
+ #  GET requests - check for valid instance
+ #
+   case "$REQ" in
+-    $PLACE.1.0|
+-    $PLACE.2.1.2.1|
+-    $PLACE.2.1.3.1|
+-    $PLACE.3.0|
+-    $PLACE.4.0|
+-    $PLACE.5.0|
++    $PLACE.1.0|		\
++    $PLACE.2.1.2.1|	\
++    $PLACE.2.1.3.1|	\
++    $PLACE.3.0|		\
++    $PLACE.4.0|		\
++    $PLACE.5.0|		\
+     $PLACE.6.0)     RET=$REQ ;;
+     *)         	    exit 0 ;;
+   esac
+diff --git a/local/passtest.pl b/local/passtest.pl
+index 049cf45..c87fe18 100755
+--- a/local/passtest.pl
++++ b/local/passtest.pl
+@@ -66,7 +66,7 @@ else {
+ print "$ret\n";
+    if ($ret eq "$place.1.0")     { print "string\nLife, the Universe, and Everything\n"; exit 0;}
+ elsif ($ret eq "$place.2.1.2.1") { print "integer\n42\n";                                exit 0;}
+-elsif ($ret eq "$place.2.1.3.1") { print "objectid\n.1.3.6.1.4.42.42.42\n";              exit 0;}
++elsif ($ret eq "$place.2.1.3.1") { print "objectid\n$place.99\n";                        exit 0;}
+ elsif ($ret eq "$place.3.0")     { print "timeticks\n363136200\n";                       exit 0;}
+ elsif ($ret eq "$place.4.0")     { print "ipaddress\n127.0.0.1\n";                       exit 0;}
+ elsif ($ret eq "$place.5.0")     { print "counter\n42\n";                                exit 0;}
+diff --git a/local/snmp-bridge-mib b/local/snmp-bridge-mib
+index a4c2c80..4a9415e 100644
+--- a/local/snmp-bridge-mib
++++ b/local/snmp-bridge-mib
+@@ -1004,7 +1004,7 @@ sub readindexes()
+ 		next if  $if eq "..";
+ 
+ 		my $port=hex(readfile($brifdir.$if."/port_no", 0));
+-		my $index=readfile($netdir.$if."/ifindex", STP_PROP_HEX);
++		my $index=readfile($netdir.$if."/ifindex", 0);
+ 
+ 		$indexes{$bridge}{$port}=$index;
+ 		$interfaces{$bridge}{$port}=$if;
+@@ -1063,17 +1063,16 @@ sub tracevlan{
+ 			my $pif=$1;
+ 			$brifdir=$netdir.$pif."/brport/bridge/brif/";
+ 			$port=hex(readfile($brifdir.$pif."/port_no", 0));
+-			$index=readfile($netdir.$pif."/ifindex", STP_PROP_HEX);
++			$index=readfile($netdir.$pif."/ifindex", 0);
+ 			#$indexes{$bridge}{$port}=$index;
+ 			#$interfaces{$bridge}{$port}=$if;
+ 			$tagged{$vlan}{$port}=1;
+ 		}else{
+-			my $brid=readfile($netdir.$if."/brport/bridge/ifindex",
+-						STP_PROP_HEX);
++			my $brid=readfile($netdir.$if."/brport/bridge/ifindex",	0);
+ 			$brifdir=$netdir.$if."/brport/bridge/brif/";
+ 			$port=hex(readfile($brifdir.$if."/port_no", 0));
+ 			$port=$brid*1000+$port; #create a unique port number
+-			$index=readfile($netdir.$if."/ifindex", STP_PROP_HEX);
++			$index=readfile($netdir.$if."/ifindex", 0);
+ 			$indexes{$bridge}{$port}=$index;
+ 			$interfaces{$bridge}{$port}=$if;
+ 			$tagged{$vlan}{$port}=0;
+@@ -1083,8 +1082,7 @@ sub tracevlan{
+ 	}
+ 	close(DIR);
+ 
+-	my $brid=readfile($netdir.$interface."/brport/bridge/ifindex",
+-					 STP_PROP_HEX);
++	my $brid=readfile($netdir.$interface."/brport/bridge/ifindex", 0);
+ 	my $fdb=$netdir.$interface."/brport/bridge/brforward";
+ 
+ 	my $vbridge=$bridge."_vlan".$vlan;
+diff --git a/man/Makefile.in b/man/Makefile.in
+index bfe8279..5627cc0 100644
+--- a/man/Makefile.in
++++ b/man/Makefile.in
+@@ -26,6 +26,8 @@ MAN1G = $(AGENTXTRAP) snmpbulkget.1 snmpcmd.1 snmpget.1 snmpset.1 snmpwalk.1 \
+ 	net-snmp-config.1 mib2c-update.1 tkmib.1 traptoemail.1 \
+ 	net-snmp-create-v3-user.1
+ 
++# If MAN3 is populated again, then remember to re-enable the corresponding
++# action line within the 'maninstall' target
+ MAN3  = 
+ MAN3_API = netsnmp_mib_api.3 netsnmp_config_api.3 snmp_alarm.3 \
+ 	netsnmp_session_api.3 netsnmp_sess_api.3 netsnmp_trap_api.3 netsnmp_varbind_api.3 netsnmp_pdu_api.3 
+@@ -241,7 +243,7 @@ maninstall:  maninstalldirs $(MAN1) $(MAN1G) $(MAN3) $(MAN5G) $(MAN8) $(MANALIAS
+ 	@for i in $(MAN1) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man1dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done
+ 	@$(INSTALL_DATA) $(MAN1G) $(INSTALL_PREFIX)$(man1dir)
+ 	@for i in $(MAN1G) ; do echo "install:  installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done
+-	@for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
++	#EMPTY LIST#@for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
+ 	@$(INSTALL_DATA) $(MAN3G) $(INSTALL_PREFIX)$(man3dir)
+ 	@for i in $(MAN3G) ; do echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
+ 	@$(INSTALL_DATA) $(MANALIASES) $(INSTALL_PREFIX)$(man3dir)
+diff --git a/mibs/IANA-RTPROTO-MIB.txt b/mibs/IANA-RTPROTO-MIB.txt
+index 6f04143..f50992e 100644
+--- a/mibs/IANA-RTPROTO-MIB.txt
++++ b/mibs/IANA-RTPROTO-MIB.txt
+@@ -5,7 +5,7 @@ IMPORTS
+     TEXTUAL-CONVENTION               FROM SNMPv2-TC;
+ 
+ ianaRtProtoMIB  MODULE-IDENTITY
+-    LAST-UPDATED "200009260000Z" -- September 26, 2000
++    LAST-UPDATED "201107220000Z" -- July 22, 2011
+     ORGANIZATION "IANA"
+     CONTACT-INFO
+             " Internet Assigned Numbers Authority
+@@ -28,6 +28,9 @@ ianaRtProtoMIB  MODULE-IDENTITY
+             will be selected by the IESG Area Director(s) of the Routing
+             Area."
+ 
++    REVISION     "201107220000Z"  -- July 22, 2011 
++    DESCRIPTION  "Added rpl(18) ."
++
+     REVISION     "200009260000Z"  -- September 26, 2000 
+     DESCRIPTION  "Original version, published in coordination
+                  with RFC 2932."
+@@ -60,7 +63,8 @@ IANAipRouteProtocol ::= TEXTUAL-CONVENTION
+                 bgp        (14), -- Border Gateway Protocol
+                 idpr       (15), -- InterDomain Policy Routing
+                 ciscoEigrp (16), -- Cisco EIGRP
+-                dvmrp      (17)  -- DVMRP
++                dvmrp      (17), -- DVMRP
++                rpl        (18)  -- RPL [RFC-ietf-roll-rpl-19]
+                }
+ 
+ IANAipMRouteProtocol ::= TEXTUAL-CONVENTION
+diff --git a/mibs/IANAifType-MIB.txt b/mibs/IANAifType-MIB.txt
+index 856156a..896adc8 100644
+--- a/mibs/IANAifType-MIB.txt
++++ b/mibs/IANAifType-MIB.txt
+@@ -5,7 +5,7 @@
+        TEXTUAL-CONVENTION          FROM SNMPv2-TC;
+ 
+    ianaifType MODULE-IDENTITY
+-       LAST-UPDATED "201002110000Z"  -- February 11, 2010
++       LAST-UPDATED "201110260000Z"  -- October 26, 2011
+        ORGANIZATION "IANA"
+        CONTACT-INFO "        Internet Assigned Numbers Authority
+ 
+@@ -19,6 +19,24 @@
+                      Convention, and thus the enumerated values of
+                      the ifType object defined in MIB-II's ifTable."
+ 
++       REVISION     "201110260000Z"  -- October 26, 2011
++       DESCRIPTION  "Registration of new IANAifType 262."
++
++       REVISION     "201109070000Z"  -- September 7, 2011
++       DESCRIPTION  "Registration of new IANAifTypes 260 and 261."
++
++       REVISION     "201107220000Z"  -- July 22, 2011
++       DESCRIPTION  "Registration of new IANAifType 259."
++
++       REVISION     "201106030000Z"  -- June 03, 2011
++       DESCRIPTION  "Registration of new IANAifType 258."
++
++       REVISION     "201009210000Z"  -- September 21, 2010
++       DESCRIPTION  "Registration of new IANAifTypes 256 and 257."
++
++       REVISION     "201007210000Z"  -- July 21, 2010
++       DESCRIPTION  "Registration of new IANAifType 255."
++
+        REVISION     "201002110000Z"  -- February 11, 2010
+        DESCRIPTION  "Registration of new IANAifType 254."
+ 
+@@ -334,7 +352,7 @@
+                    ieee80212(55),      -- 100BaseVG
+                    fibreChannel(56),   -- Fibre Channel
+                    hippiInterface(57), -- HIPPI interfaces     
+-                   frameRelayInterconnect(58), -- Obsolete use either
++                   frameRelayInterconnect(58), -- Obsolete, use either
+                                        -- frameRelay(32) or 
+                                        -- frameRelayService(44).
+                    aflane8023(59),     -- ATM Emulated LAN for 802.3
+@@ -541,7 +559,15 @@
+                    vdsl2 (251), -- Very high speed digital subscriber line Version 2 (as per ITU-T Recommendation G.993.2)
+                    capwapDot11Profile (252), -- WLAN Profile Interface
+                    capwapDot11Bss (253), -- WLAN BSS Interface
+-                   capwapWtpVirtualRadio (254) -- WTP Virtual Radio Interface
++                   capwapWtpVirtualRadio (254), -- WTP Virtual Radio Interface
++                   bits (255), -- bitsport
++                   docsCableUpstreamRfPort (256), -- DOCSIS CATV Upstream RF Port
++                   cableDownstreamRfPort (257), -- CATV downstream RF port
++                   vmwareVirtualNic (258), -- VMware Virtual Network Interface
++                   ieee802154 (259), -- IEEE 802.15.4 WPAN interface
++                   otnOdu (260), -- OTN Optical Data Unit
++                   otnOtu (261), -- OTN Optical channel Transport Unit
++                   ifVfiType (262) -- VPLS Forwarding Instance Interface Type
+                    }
+ 
+ IANAtunnelType ::= TEXTUAL-CONVENTION
+diff --git a/mibs/rfclist b/mibs/rfclist
+index 7f84150..35f301e 100644
+--- a/mibs/rfclist
++++ b/mibs/rfclist
+@@ -1,4 +1,4 @@
+-# updated 2011-03-14
++# updated 2011-11-16
+ 1155	RFC1155-SMI
+ 1213	RFC1213-MIB
+ 1227	SMUX-MIB
+@@ -254,6 +254,9 @@
+ 5833	CAPWAP-BASE-MIB
+ 5834	CAPWAP-DOT11-MIB
+ 5907	NTPv4-MIB
+-5953	SNMP-TLS-TM-MIB
+ 6065	SNMP-VACM-AAA-MIB
+ 6173	IFCP-MGMT-MIB
++6240	PW-CEP-STD-MIB
++6340	FLOAT-TC-MIB
++6353	SNMP-TLS-TM-MIB
++6445	MPLS-FRR-GENERAL-STD-MIB:MPLS-FRR-ONE2ONE-STD-MIB:MPLS-FRR-FACILITY-STD-MIB
+diff --git a/net-snmp-config.in b/net-snmp-config.in
+index 303cdda..3ba60e3 100644
+--- a/net-snmp-config.in
++++ b/net-snmp-config.in
+@@ -194,7 +194,7 @@ else
+       echo $NSC_LIBDIR $NSC_BASE_SNMP_LIBS
+       ;;
+     --external-libs)
+-      echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS
++      echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS @PERLLDOPTS_FOR_APPS@
+       ;;
+     #################################################### agent lib
+     --base-agent-libs)
+diff --git a/perl/ASN/ASN.pm b/perl/ASN/ASN.pm
+index 3961bd5..4195573 100644
+--- a/perl/ASN/ASN.pm
++++ b/perl/ASN/ASN.pm
+@@ -77,7 +77,7 @@ sub AUTOLOAD {
+     ($constname = $AUTOLOAD) =~ s/.*:://;
+     croak "& not defined" if $constname eq 'constant';
+     my $val;
+-    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
++    ($!, $val) = constant($constname);
+     if ($! != 0) {
+ 	if ($! =~ /Invalid/ || $!{EINVAL}) {
+ 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
+diff --git a/perl/ASN/ASN.xs b/perl/ASN/ASN.xs
+index bbfa69b..e3f6181 100644
+--- a/perl/ASN/ASN.xs
++++ b/perl/ASN/ASN.xs
+@@ -78,9 +78,11 @@ static int constant_ASN_U(double *value, const char *name, const int len)
+     case '\0':
+ 	TEST_CONSTANT(value, name, ASN_UNSIGNED);
+         break;
++#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
+     case '6':
+ 	TEST_CONSTANT(value, name, ASN_UNSIGNED64);
+         break;
++#endif
+     }
+     return EINVAL;
+ }
+@@ -91,9 +93,11 @@ static int constant_ASN_IN(double *value, const char *name, const int len)
+     case '\0':
+         TEST_CONSTANT(value, name, ASN_INTEGER);
+         break;
++#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
+     case '6':
+         TEST_CONSTANT(value, name, ASN_INTEGER64);
+         break;
++#endif
+     }
+     return EINVAL;
+ }
+@@ -123,12 +127,14 @@ static int constant(double *value, const char *const name, const int len)
+ 	return constant_ASN_B(value, name, len);
+     case 'C':
+ 	return constant_ASN_C(value, name, len);
++#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
+     case 'D':
+         TEST_CONSTANT(value, name, ASN_DOUBLE);
+         break;
+     case 'F':
+         TEST_CONSTANT(value, name, ASN_FLOAT);
+         break;
++#endif
+     case 'G':
+         TEST_CONSTANT(value, name, ASN_GAUGE);
+         break;
+@@ -155,13 +161,12 @@ MODULE = NetSNMP::ASN		PACKAGE = NetSNMP::ASN
+ 
+ 
+ void
+-constant(sv,arg)
++constant(sv)
+     PREINIT:
+ 	STRLEN		len;
+     INPUT:
+ 	SV *		sv
+ 	char *		s = SvPV(sv, len);
+-	int		arg
+     INIT:
+         int status;
+         double value;
+diff --git a/perl/OID/OID.pm b/perl/OID/OID.pm
+index 3ab12aa..a9d9369 100644
+--- a/perl/OID/OID.pm
++++ b/perl/OID/OID.pm
+@@ -153,7 +153,7 @@ sub AUTOLOAD {
+     ($constname = $AUTOLOAD) =~ s/.*:://;
+     croak "& not defined" if $constname eq 'constant';
+     my $val;
+-    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
++    ($!, $val) = constant($constname);
+     if ($! != 0) {
+ 	if ($! =~ /Invalid/ || $!{EINVAL}) {
+ 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
+diff --git a/perl/OID/OID.xs b/perl/OID/OID.xs
+index ff3693e..10485f9 100644
+--- a/perl/OID/OID.xs
++++ b/perl/OID/OID.xs
+@@ -125,7 +125,7 @@ int flag;
+           break;
+ 
+         case ASN_BIT_STR:
+-            snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL);
++            snprint_bitstring(buf, buf_len, var, NULL, NULL, NULL);
+             len = strlen(buf);
+             break;
+ 
+@@ -173,13 +173,12 @@ nso_newptr(initstring)
+         RETVAL
+ 
+ void
+-constant(sv,arg)
++constant(sv)
+     PREINIT:
+ 	STRLEN		len;
+     INPUT:
+ 	SV *		sv
+ 	char *		s = SvPV(sv, len);
+-	int		arg
+     INIT:
+         int status;
+         double value;
+diff --git a/perl/SNMP/SNMP.pm b/perl/SNMP/SNMP.pm
+index d1b39c3..a7f6faa 100644
+--- a/perl/SNMP/SNMP.pm
++++ b/perl/SNMP/SNMP.pm
+@@ -135,6 +135,12 @@ $replace_newer = 0; # determine whether or not to tell the parser to replace
+                     # older MIB modules with newer ones when loading MIBs.
+                     # WARNING: This can cause an incorrect hierarchy.
+ 
++sub register_debug_tokens {
++    my $tokens = shift;
++
++    SNMP::_register_debug_tokens($tokens);
++}
++
+ sub getenv {
+     my $name = shift;
+ 
+@@ -161,10 +167,10 @@ sub setMib {
+ }
+ 
+ sub initMib {
+-# eqivalent to calling the snmp library init_mib if Mib is NULL
++# equivalent to calling the snmp library init_mib if Mib is NULL
+ # if Mib is already loaded this function does nothing
+-# Pass a zero valued argument to get minimal mib tree initialzation
+-# If non zero agrgument or no argument then full mib initialization
++# Pass a zero valued argument to get minimal mib tree initialization
++# If non zero argument or no argument then full mib initialization
+ 
+   SNMP::init_snmp("perl");
+   return;
+@@ -1529,7 +1535,7 @@ init_snmp properly, which means it will read configuration files and
+ use those defaults where appropriate automatically parse MIB files,
+ etc.  This will likely affect your perl applications if you have, for
+ instance, default values set up in your snmp.conf file (as the perl
+-module will now make use of those defaults).  The docmuentation,
++module will now make use of those defaults).  The documentation,
+ however, has sadly not been updated yet (aside from this note), nor is
+ the read_config default usage implementation fully complete.
+ 
+@@ -1540,7 +1546,7 @@ aspects of a connection between the management application and the
+ managed agent. Internally the class is implemented as a blessed hash
+ reference. This class supplies 'get', 'getnext', 'set', 'fget', and
+ 'fgetnext' method calls. The methods take a variety of input argument
+-formats and support both syncronous and asyncronous operation through
++formats and support both synchronous and asynchronous operation through
+ a polymorphic API (i.e., method behaviour varies dependent on args
+ passed - see below).
+ 
+@@ -1835,7 +1841,7 @@ do SNMP GET, multiple <vars> formats accepted.
+ for syncronous operation <vars> will be updated
+ with value(s) and type(s) and will also return
+ retrieved value(s). If <callback> supplied method
+-will operate asyncronously
++will operate asynchronously
+ 
+ =item $sess->fget(E<lt>varsE<gt> [,E<lt>callbackE<gt>])
+ 
+@@ -1852,7 +1858,7 @@ and <type>
+ 
+ Note: simple string <vars>,(e.g., 'sysDescr.0')
+ form is not updated. If <callback> supplied method
+-will operate asyncronously
++will operate asynchronously
+ 
+ =item $sess->fgetnext(E<lt>varsE<gt> [,E<lt>callbackE<gt>])
+ 
+@@ -1868,7 +1874,7 @@ format (i.e., well known format) to ensure unambiguous
+ translation to SNMP MIB data value (see discussion of
+ canonical value format <vars> description section),
+ returns snmp_errno. If <callback> supplied method
+-will operate asyncronously
++will operate asynchronously
+ 
+ =item $sess->getbulk(E<lt>non-repeatersE<gt>, E<lt>max-repeatersE<gt>, E<lt>varsE<gt>)
+ 
+@@ -1985,7 +1991,7 @@ collect all the columns defined in the MIB table.
+ Specifies a GETBULK repeat I<COUNT>.  IE, it will request this many
+ varbinds back per column when using the GETBULK operation.  Shortening
+ this will mean smaller packets which may help going through some
+-systems.  By default, this value is calculated and attepmts to guess
++systems.  By default, this value is calculated and attempts to guess
+ at what will fit all the results into 1000 bytes.  This calculation is
+ fairly safe, hopefully, but you can either raise or lower the number
+ using this option if desired.  In lossy networks, you want to make
+@@ -1997,7 +2003,7 @@ one way to help that.
+ Force the use of GETNEXT rather than GETBULK.  (always true for
+ SNMPv1, as it doesn't have GETBULK anyway).  Some agents are great
+ implementers of GETBULK and this allows you to force the use of
+-GETNEXT oprations instead.
++GETNEXT operations instead.
+ 
+ =item callback => \&subroutine
+ 
+@@ -2023,7 +2029,7 @@ versions prior to 5.04 and 5.04 and up, the following should work:
+       $no_mainloop = 1;
+   }
+ 
+-Deciding on whether to use SNMP::MainLoop is left as an excersize to
++Deciding on whether to use SNMP::MainLoop is left as an exercise to
+ the reader since it depends on whether your code uses other callbacks
+ as well.
+ 
+@@ -2238,9 +2244,9 @@ will be undef.
+ to be used with async SNMP::Session
+ calls. MainLoop must be called after initial async calls
+ so return packets from the agent will not be processed.
+-If no args suplied this function enters an infinite loop
++If no args supplied this function enters an infinite loop
+ so program must be exited in a callback or externally
+-interupted. If <timeout(sic)
++interrupted. If <timeout(sic)
+ 
+ =item &SNMP::finish()
+ 
+@@ -2322,7 +2328,7 @@ initialization
+ 
+ =item $SNMP::debugging
+ 
+-default '0', controlls debugging output level
++default '0', controls debugging output level
+ within SNMP module and libsnmp
+ 
+ =over
+@@ -2346,6 +2352,12 @@ level 2 plus snmp_set_dump_packet(1)
+ default '0', set [non-]zero to independently set
+ snmp_set_dump_packet()
+ 
++=item SNMP::register_debug_tokens()
++
++Allows to register one or more debug tokens, just like the -D option of snmpd.
++Each debug token enables a group of debug statements. An example:
++SNMP::register_debug_tokens("tdomain,netsnmp_unix");
++
+ =back
+ 
+ =head1 %SNMP::MIB
+@@ -2459,7 +2471,7 @@ returns true if the last object in the INDEX is IMPLIED
+ =item &SNMP::setMib(<file>)
+ 
+ allows dynamic parsing of the mib and explicit
+-specification of mib file independent of enviroment
++specification of mib file independent of environment
+ variables. called with no args acts like initMib,
+ loading MIBs indicated by environment variables (see
+ Net-SNMP mib_api docs). passing non-zero second arg
+diff --git a/perl/SNMP/SNMP.xs b/perl/SNMP/SNMP.xs
+index a0cfe69..ff84919 100644
+--- a/perl/SNMP/SNMP.xs
++++ b/perl/SNMP/SNMP.xs
+@@ -1,4 +1,4 @@
+-/* -*- C -*-
++/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*-
+      SNMP.xs -- Perl 5 interface to the Net-SNMP toolkit
+ 
+      written by G. S. Marzot (marz@users.sourceforge.net)
+@@ -221,7 +221,15 @@ __snprint_oid(const oid *objid, size_t objidlen) {
+ #else	/* DEBUGGING */
+ #define DBDCL(x) 
+ #define DBOUT
+-#define	DBPRT(severity, otherargs)	/* Ignore */
++/* Do nothing but in such a way that the compiler sees "otherargs". */
++#define	DBPRT(severity, otherargs) \
++    do { if (0) printf otherargs; } while(0)
++
++static char *
++__snprint_oid(const oid *objid, size_t objidlen)
++{
++    return "(debugging is disabled)";
++}
+ 
+ #endif	/* DEBUGGING */
+ 
+@@ -451,8 +459,7 @@ int flag;
+            if (flag == USE_ENUMS) {
+               for(ep = tp->enums; ep; ep = ep->next) {
+                  if (ep->value == *var->val.integer) {
+-                    strncpy(buf, ep->label, buf_len);
+-                    buf[buf_len-1] = '\0';
++                    strlcpy(buf, ep->label, buf_len);
+                     len = strlen(buf);
+                     break;
+                  }
+@@ -929,19 +936,22 @@ oid *doid_arr;
+ size_t *doid_arr_len;
+ char * soid_str;
+ {
+-   char soid_buf[STR_BUF_SIZE];
++   char *soid_buf;
+    char *cp;
+    char *st;
+ 
+    if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */
+    if (*soid_str == '.') soid_str++;
+-   strcpy(soid_buf, soid_str);
++   soid_buf = strdup(soid_str);
++   if (!soid_buf)
++       return FAILURE;
+    cp = strtok_r(soid_buf,".",&st);
+    while (cp) {
+      sscanf(cp, "%" NETSNMP_PRIo "u", &(doid_arr[(*doid_arr_len)++]));
+      /* doid_arr[(*doid_arr_len)++] =  atoi(cp); */
+      cp = strtok_r(NULL,".",&st);
+    }
++   free(soid_buf);
+    return(SUCCESS);
+ }
+ 
+@@ -1040,7 +1050,7 @@ OCT:
+         vars->type = ASN_IPADDRESS;
+         vars->val.integer = netsnmp_malloc(sizeof(in_addr_t));
+         if (val)
+-            *(vars->val.integer) = inet_addr(val);
++            *((in_addr_t *)vars->val.integer) = inet_addr(val);
+         else {
+             ret = FAILURE;
+             *(vars->val.integer) = 0;
+@@ -1584,7 +1594,7 @@ _bulkwalk_done(walk_context *context)
+  	** walks still in progress.
+  	*/
+  	DBPRT(1, (DBOUT "Ignoring %s request oid %s\n",
+- 	      bt_entry->norepeat? "nonrepeater" : "completed",
++ 	      bt_entry->norepeat ? "nonrepeater" : "completed",
+  	      __snprint_oid(bt_entry->req_oid, bt_entry->req_len)));
+ 
+  	/* Ignore this OID in any further packets. */
+@@ -1894,7 +1904,7 @@ _bulkwalk_recv_pdu(walk_context *context, netsnmp_pdu *pdu)
+    int		i;
+    AV		*varbind;
+    SV		*rv;
+-   DBDCL(SV**sess_ptr_sv=hv_fetch((HV*)SvRV(context->sess_ref),"SessPtr",7,1);)
++   SV **sess_ptr_sv = hv_fetch((HV*)SvRV(context->sess_ref), "SessPtr", 7, 1);
+    SV **err_str_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorStr", 8, 1);
+    SV **err_num_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorNum", 8, 1);
+    SV **err_ind_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorInd", 8, 1);
+@@ -2930,6 +2940,8 @@ snmp_add_mib_dir(mib_dir,force=0)
+ 	int result = 0;      /* Avoid use of uninitialized variable below. */
+         int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04));
+ 
++        DBPRT(999, (DBOUT "force=%d\n", force));
++
+         if (mib_dir && *mib_dir) {
+ 	   result = add_mibdir(mib_dir);
+         }
+@@ -2979,6 +2991,8 @@ snmp_read_mib(mib_file, force=0)
+         {
+         int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04));
+ 
++        DBPRT(999, (DBOUT "force=%d\n", force));
++
+         if ((mib_file == NULL) || (*mib_file == '\0')) {
+            if (get_tree_head() == NULL) {
+               if (verbose) warn("snmp_read_mib: initializing MIB\n");
+@@ -3541,11 +3555,11 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback)
+                     varbind = (AV*) SvRV(*varbind_ref);
+ 
+                     /* If the varbind includes the module prefix, capture it for use later */
+-                    strncpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE);
++                    strlcpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE);
+                     tmp_prefix_ptr = strstr(tmp_buf_prefix,"::");
+                     if (tmp_prefix_ptr) {
+                       tmp_prefix_ptr = strtok_r(tmp_buf_prefix, "::", &st);
+-                      strncpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE);
++                      strlcpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE);
+                     }
+                     else {
+                       *str_buf_prefix = '\0';
+@@ -3657,9 +3671,9 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback)
+ 
+                     /* Prepend the module prefix to the next OID if needed */
+                     if (*str_buf_prefix) {
+-                      strncat(str_buf_prefix, "::", STR_BUF_SIZE - strlen(str_buf_prefix) - 2);
+-                      strncat(str_buf_prefix, str_buf, STR_BUF_SIZE - strlen(str_buf_prefix));
+-                      strncpy(str_buf, str_buf_prefix, STR_BUF_SIZE);
++                      strlcat(str_buf_prefix, "::", STR_BUF_SIZE);
++                      strlcat(str_buf_prefix, str_buf, STR_BUF_SIZE);
++                      strlcpy(str_buf, str_buf_prefix, STR_BUF_SIZE);
+                     }
+                     
+                     if (__is_leaf(tp)) {
+@@ -4242,15 +4256,16 @@ snmp_bulkwalk(sess_ref, nonrepeaters, maxrepetitions, varlist_ref,perl_callback)
+ 
+ 	/* Handle error cases and clean up after ourselves. */
+         err:
+-	   if (context->req_oids && context->nreq_oids) {
+-	      bt_entry = context->req_oids;
+-	      for (i = 0; i < context->nreq_oids; i++, bt_entry++)
+-		 av_clear(bt_entry->vars);
+-	   }
+-	   if (context->req_oids)
+-	      Safefree(context->req_oids);
+-	   if (context)
++	   if (context) {
++	      if (context->req_oids && context->nreq_oids) {
++	         bt_entry = context->req_oids;
++	         for (i = 0; i < context->nreq_oids; i++, bt_entry++)
++		    av_clear(bt_entry->vars);
++	      }
++	      if (context->req_oids)
++	         Safefree(context->req_oids);
+ 	      Safefree(context);
++	   }
+ 	   if (pdu)
+ 	      snmp_free_pdu(pdu);
+ 
+@@ -4437,7 +4452,7 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref)
+ 	   
+            New (0, oid_arr, MAX_OID_LEN, oid);
+ 
+-           if (oid_arr && SvROK(sess_ref) && SvROK(varlist_ref)) {
++           if (oid_arr && SvROK(sess_ref)) {
+ 
+               sess_ptr_sv = hv_fetch((HV*)SvRV(sess_ref), "SessPtr", 7, 1);
+ 	      ss = (SnmpSession *)SvIV((SV*)SvRV(*sess_ptr_sv));
+@@ -4451,8 +4466,13 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref)
+ 	      
+               pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
+ 
+-              varlist = (AV*) SvRV(varlist_ref);
+-              varlist_len = av_len(varlist);
++              if (SvROK(varlist_ref)) {
++                  varlist = (AV*) SvRV(varlist_ref);
++                  varlist_len = av_len(varlist);
++              } else {
++                  varlist = NULL;
++                  varlist_len = -1;
++              }
+ 	      /************************************************/
+               res = __add_var_val_str(pdu, sysUpTime, SYS_UPTIME_OID_LEN,
+ 				uptime, strlen(uptime), TYPE_TIMETICKS);
+@@ -4838,10 +4858,10 @@ snmp_translate_obj(var,mode,use_long,auto_init,best_guess,include_module_name)
+ 		  if (((status=__get_label_iid(str_buf_temp,
+ 		       &label, &iid, NO_FLAGS)) == SUCCESS)
+ 		      && label) {
+-		     strcpy(str_buf_temp, label);
++		     strlcpy(str_buf_temp, label, sizeof(str_buf_temp));
+ 		     if (iid && *iid) {
+-		       strcat(str_buf_temp, ".");
+-		       strcat(str_buf_temp, iid);
++		       strlcat(str_buf_temp, ".", sizeof(str_buf_temp));
++		       strlcat(str_buf_temp, iid, sizeof(str_buf_temp));
+ 		     }
+  	          }
+ 	        }
+@@ -4902,6 +4922,15 @@ snmp_set_debugging(val)
+ 	}
+ 
+ void
++snmp_register_debug_tokens(tokens)
++	char *tokens
++	CODE:
++	{
++            debug_register_tokens(tokens);
++            snmp_set_do_debugging(1);
++	}
++
++void
+ snmp_debug_internals(val)
+ 	int     val
+ 	CODE:
+diff --git a/perl/SNMP/examples/pingmib.pl b/perl/SNMP/examples/pingmib.pl
+old mode 100644
+new mode 100755
+index 22dbe69..e6aa792
+--- a/perl/SNMP/examples/pingmib.pl
++++ b/perl/SNMP/examples/pingmib.pl
+@@ -1,3 +1,9 @@
++#!/usr/bin/env perl
++
++# Ping a host via the CISCO-PING-MIB. For more information about the
++# CISCO-PING-MIB, see also
++# http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-PING-MIB.
++
+ use strict;
+ use SNMP;
+ 
+@@ -13,8 +19,9 @@ my $community = shift || 'private';
+         my $dec = pack("C*",split /\./, $target);
+         my $oid = ".1.3.6.1.4.1.9.9.16.1.1.1";
+         my $row = "300";
++        my $res;
+ 
+-        $sess->set([
++        $res = $sess->set([
+                 ["$oid.16", $row, 6, "INTEGER"],
+                 ["$oid.16", $row, 5, "INTEGER"],
+                 ["$oid.15", $row, "MoNDS", "OCTETSTR"],
+@@ -22,8 +29,11 @@ my $community = shift || 'private';
+                 ["$oid.4", $row, 20, "INTEGER"],
+                 ["$oid.5", $row, 150, "INTEGER"],
+                 ["$oid.3", $row, $dec, "OCTETSTR"]]);
++        defined($res) || die "row creation failed";
++                
++        $res = $sess->set([["$oid.16", $row, 1, "INTEGER"]]);
++        defined($res) || die "row activation failed";
+ 
+-        $sess->set([["$oid.16", $row, 1, "INTEGER"]]);
+         sleep 30;
+         my ($sent, $received, $low, $avg, $high, $completed) = $sess->get([
+                 ["$oid.9", $row], ["$oid.10", $row], ["$oid.11", $row],
+diff --git a/perl/SNMP/t/async.t b/perl/SNMP/t/async.t
+index b1c86c6..f3fb38d 100644
+--- a/perl/SNMP/t/async.t
++++ b/perl/SNMP/t/async.t
+@@ -17,7 +17,7 @@ use SNMP;
+ use vars qw($agent_port $comm $agent_host);
+ 
+ if ($^O =~ /win32/i) {
+-  warn "Win32 detected - skipping async calls\n";
++  warn "Win32/Win64 detected - skipping async calls\n";
+   exit;
+ }
+ 
+diff --git a/perl/SNMP/t/bulkwalk.t b/perl/SNMP/t/bulkwalk.t
+index 60f10b5..2d13e7b 100644
+--- a/perl/SNMP/t/bulkwalk.t
++++ b/perl/SNMP/t/bulkwalk.t
+@@ -326,7 +326,7 @@ $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
+ 			    ['ifSpeed'], ['ifDescr']);	 # Repeated variables.
+ 
+ if ($^O =~ /win32/i) {
+-  warn "Win32 detected - skipping async calls\n";
++  warn "Win32/Win64 detected - skipping async calls\n";
+ }
+ else {
+   @list = $s1->bulkwalk(2, 16, $vars, [ \&async_cb1, $vars ] );
+diff --git a/perl/SNMP/t/notify.t b/perl/SNMP/t/notify.t
+index 434237f..72600fa 100644
+--- a/perl/SNMP/t/notify.t
++++ b/perl/SNMP/t/notify.t
+@@ -10,7 +10,7 @@ BEGIN {
+     $ENV{'MIBDIRS'} = '+' . abs_path("../../mibs");
+ }
+ use Test;
+-BEGIN { $n = 10; plan tests => $n }
++BEGIN { $n = 11; plan tests => $n }
+ use SNMP;
+ use vars qw($agent_port $comm $comm2 $trap_port $agent_host $sec_name $priv_pass $auth_pass $bad_name);
+ require 't/startagent.pl';
+@@ -21,20 +21,20 @@ my $enterprise = '.1.3.6.1.2.1.1.1.0';
+ my $generic = 'specific';
+ 
+ #                         V1 trap testing
+-######################  1  #############################
++########################  1  ############################
+ # Fire up a trap session.
+ my $s1 =
+     new SNMP::Session (DestHost=>$agent_host,Version=>1,Community=>$comm,RemotePort=>$trap_port);
+ ok(defined($s1));
+ 
+-##########################  2  ####################################
++########################  2  ############################
+ # test v1 trap
+ if (defined($s1)) {
+   $res = $s1->trap(enterprise => $enterprise, agent=>$agent_host, generic=>$generic,[[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
+ }
+ ok($res =~ /^0 but true/);
+ 
+-########################### 3 #############################
++########################  3  ############################
+ # test with wrong varbind
+ undef $res;
+ if (defined($s1)) {
+@@ -45,12 +45,12 @@ ok(!defined($res));
+ #########################################################
+ 
+ #                      V2 testing
+-########################## 4 ############################
++########################  4  ############################
+ # Fire up a v2 trap session.
+ my $s2 =
+     new SNMP::Session (Version=>2, DestHost=>$agent_host,Community=>$comm2,RemotePort=>$trap_port);
+ ok(defined($s2));
+-#########################  5  ###########################
++########################  5  ############################
+ # test v2 trap
+ undef $res;
+ if (defined($s2)) {
+@@ -58,7 +58,7 @@ if (defined($s2)) {
+   #print("res is $res\n");
+ }
+ ok($res =~ /^0 but true/);
+-##########################  6  ##########################
++########################  6  ############################
+ # no trapoid and uptime given. Should take defaults...
+ my $ret;
+ if (defined($s2)) {
+@@ -66,27 +66,35 @@ if (defined($s2)) {
+   #print("res is $ret\n");
+ }
+ ok(defined($ret));
++########################  7  ############################
++# no varbind list given.
++undef $res;
++if (defined($s2)) {
++  $res = $s2->trap(trapoid=>'coldStart');
++  #print("res is $res\n");
++}
++ok(defined($res) && $res =~ /^0 but true/);
+ 
+ #########################################################
+ 
+ #                     v3 testing
+-########################  7  ############################
++########################  8  ############################
+ # Fire up a v3 trap session.
+ my $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name);
+ ok(defined($s3));
+ 
+-########################  8  ###########################
++########################  9  ############################
+ if (defined($s3)) {
+   $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
+ }
+ ok($res =~ /^0 but true/);
+ 
+-#################### 9 #####################
++######################## 10  ############################
+ # Fire up a v3 trap session.
+ $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name, SecLevel => authPriv, AuthPass => $auth_pass, PrivPass => $priv_pass);
+ ok(defined($s3));
+ 
+-########################  10  ###########################
++######################## 11  ############################
+ undef $res;
+ if (defined($s3)) {
+     $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
+diff --git a/perl/agent/agent.pm b/perl/agent/agent.pm
+index 7a71a17..78421cb 100644
+--- a/perl/agent/agent.pm
++++ b/perl/agent/agent.pm
+@@ -98,7 +98,7 @@ sub AUTOLOAD {
+     ($constname = $AUTOLOAD) =~ s/.*:://;
+     croak "& not defined" if $constname eq 'constant';
+     my $val;
+-    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
++    ($!, $val) = constant($constname);
+     if ($! != 0) {
+ 	if ($! =~ /Invalid/ || $!{EINVAL}) {
+ 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
+@@ -199,6 +199,12 @@ sub agent_check_and_process {
+     __agent_check_and_process($blocking || 0);
+ }
+ 
++sub uptime {
++    my $self = shift;
++    $self->maybe_init_lib();
++    return _uptime();
++}
++
+ bootstrap NetSNMP::agent $VERSION;
+ 
+ # Preloaded methods go here.
+diff --git a/perl/agent/agent.xs b/perl/agent/agent.xs
+index ee77d50..c7b5d9a 100644
+--- a/perl/agent/agent.xs
++++ b/perl/agent/agent.xs
+@@ -215,13 +215,12 @@ handler_wrapper(netsnmp_mib_handler          *handler,
+ MODULE = NetSNMP::agent		PACKAGE = NetSNMP::agent		
+ 
+ void
+-constant(sv,arg)
++constant(sv)
+     PREINIT:
+ 	STRLEN		len;
+     INPUT:
+ 	SV *		sv
+ 	char *		s = SvPV(sv, len);
+-	int		arg
+     INIT:
+         int status;
+         double value;
+@@ -239,6 +238,13 @@ __agent_check_and_process(block = 1)
+     OUTPUT:
+ 	RETVAL
+ 
++int
++_uptime()
++    CODE:
++        RETVAL = netsnmp_get_agent_uptime();
++    OUTPUT:
++	RETVAL
++
+ void
+ init_mib()
+     CODE:
+@@ -272,6 +278,8 @@ na_shutdown(me)
+     SV *me;
+     CODE:
+     {
++        if (0)
++            printf("me = %p\n", me);
+         snmp_shutdown("perl");
+     }
+ 
+@@ -284,6 +292,8 @@ na_errlog(me,value)
+         char * stringptr;
+     CODE:
+     {
++        if (0)
++            printf("me = %p\n", me);
+         stringptr = SvPV(value, stringlen);
+         snmp_log(LOG_ERR, "%s", stringptr );
+     }
+@@ -340,13 +350,27 @@ nsahr_register(me)
+         SV *me;
+         PREINIT:
+         netsnmp_handler_registration *reginfo;
++        handler_cb_data *cb_data = NULL;
+         CODE:
+             {
+                 reginfo = (netsnmp_handler_registration *) SvIV(SvRV(me));
++                if (reginfo && reginfo->handler && reginfo->handler->myvoid)
++                    cb_data = (handler_cb_data *) (reginfo->handler->myvoid);
+                 RETVAL = netsnmp_register_handler(reginfo);
+                 if (!RETVAL) {
+                     /* the agent now has a "reference" to this reg pointer */
+                     SvREFCNT_inc(me);
++                } else {
++                    /*
++                     * The reginfo was freed by netsnmp_register_handler,
++                     * don't touch it in nsahr_DESTROY!
++                     */
++                    sv_setiv(SvRV(me), 0);
++                    if (cb_data) {
++                        /* And just free the callback. */
++                        SvREFCNT_dec(cb_data->perl_cb);
++                        free(cb_data);
++                    }
+                 }
+             }
+     OUTPUT:
+diff --git a/perl/agent/default_store/default_store.xs b/perl/agent/default_store/default_store.xs
+index 815f9fd..bff1485 100644
+--- a/perl/agent/default_store/default_store.xs
++++ b/perl/agent/default_store/default_store.xs
+@@ -622,7 +622,7 @@ constant(sv)
+ #endif
+ 	STRLEN		len;
+         int		type;
+-	IV		iv;
++	IV		iv = 0;
+ 	/* NV		nv;	Uncomment this if you need to return NVs */
+ 	/* const char	*pv;	Uncomment this if you need to return PVs */
+     INPUT:
+diff --git a/perl/agent/test.pl b/perl/agent/test.pl
+index a7ac8f9..88cba56 100644
+--- a/perl/agent/test.pl
++++ b/perl/agent/test.pl
+@@ -9,7 +9,7 @@
+ BEGIN { $| = 1; 
+         $ENV{'SNMPCONFPATH'} = 'nopath';
+         $ENV{'MIBS'} = '';
+-        print "1..5\n";
++        print "1..6\n";
+       }
+ END {print "not ok 1\n" unless $loaded;}
+ use NetSNMP::agent (':all');
+@@ -76,6 +76,12 @@ $regitem = $agent->register("test_reg", ".1.3.6.1.8888", \&testsub);
+ print it($regitem, 4);
+ #print STDERR $regitem,":",ref($regitem),"\n";
+ print it(ref($regitem) eq "NetSNMP::agent::netsnmp_handler_registration", 5);
++
++my $uptime1 = $agent->uptime();
++my $uptime2 = $agent->uptime(666);
++my $uptime3 = $agent->uptime(555, 444);
++print it($uptime1 <= $uptime2 && $uptime2 <= $uptime3, 6);
++
+ exit;
+ 
+ while(1) {
+diff --git a/perl/default_store/default_store.xs b/perl/default_store/default_store.xs
+index e2b8a34..ca252fb 100644
+--- a/perl/default_store/default_store.xs
++++ b/perl/default_store/default_store.xs
+@@ -1261,7 +1261,7 @@ constant(sv)
+ #endif
+ 	STRLEN		len;
+         int		type;
+-	IV		iv;
++	IV		iv = 0;
+ 	/* NV		nv;	Uncomment this if you need to return NVs */
+ 	/* const char	*pv;	Uncomment this if you need to return PVs */
+     INPUT:
+diff --git a/python/netsnmp/client_intf.c b/python/netsnmp/client_intf.c
+index f2abf0b..559a9c0 100644
+--- a/python/netsnmp/client_intf.c
++++ b/python/netsnmp/client_intf.c
+@@ -1,5 +1,11 @@
+ #include <Python.h>
+ 
++#if PY_VERSION_HEX < 0x02050000
++typedef int Py_ssize_t;
++#define PY_SSIZE_T_MAX INT_MAX
++#define PY_SSIZE_T_MIN INT_MIN
++#endif
++
+ #include <net-snmp/net-snmp-config.h>
+ #include <net-snmp/net-snmp-includes.h>
+ #include <sys/types.h>
+@@ -67,8 +73,6 @@
+ 
+ typedef netsnmp_session SnmpSession;
+ typedef struct tree SnmpMibNode;
+-static void __recalc_timeout (struct timeval*,struct timeval*,
+-                                struct timeval*,struct timeval*, int* );
+ static int __is_numeric_oid (char*);
+ static int __is_leaf (struct tree*);
+ static int __translate_appl_type (char*);
+@@ -80,10 +84,6 @@ static int __sprint_num_objid (char *, oid *, int);
+ static int __scan_num_objid (char *, oid *, size_t *);
+ static int __get_type_str (int, char *);
+ static int __get_label_iid (char *, char **, char **, int);
+-static int __oid_cmp (oid *, int, oid *, int);
+-static int __tp_sprint_num_objid (char*,SnmpMibNode *);
+-static SnmpMibNode * __get_next_mib_node (SnmpMibNode *);
+-static struct tree * __oid2tp (oid*, int, struct tree *, int*);
+ static struct tree * __tag2oid (char *, char *, oid  *, int  *, int *, int);
+ static int __concat_oid_str (oid *, int *, char *);
+ static int __add_var_val_str (netsnmp_pdu *, oid *, int, char *,
+@@ -129,46 +129,6 @@ __libraries_init(char *appname)
+ 		     NETSNMP_OID_OUTPUT_SUFFIX);
+ }
+ 
+-static void
+-__recalc_timeout (tvp, ctvp, ltvp, itvp, block)
+-struct timeval* tvp;
+-struct timeval* ctvp;
+-struct timeval* ltvp;
+-struct timeval* itvp;
+-int *block;
+-{
+-   struct timeval now;
+-
+-   if (!timerisset(itvp)) return;  /* interval zero means loop forever */
+-   *block = 0;
+-   gettimeofday(&now,(struct timezone *)0);
+-
+-   if (ctvp->tv_sec < 0) { /* first time or callback just fired */
+-      timersub(&now,ltvp,ctvp);
+-      timersub(ctvp,itvp,ctvp);
+-      timersub(itvp,ctvp,ctvp);
+-      timeradd(ltvp,itvp,ltvp);
+-   } else {
+-      timersub(&now,ltvp,ctvp);
+-      timersub(itvp,ctvp,ctvp);
+-   }
+-
+-   /* flag is set for callback but still hasnt fired so set to something
+-    * small and we will service packets first if there are any ready
+-    * (also guard against negative timeout - should never happen?)
+-    */
+-   if (!timerisset(ctvp) || ctvp->tv_sec < 0 || ctvp->tv_usec < 0) {
+-      ctvp->tv_sec = 0;
+-      ctvp->tv_usec = 10;
+-   }
+-
+-   /* if snmp timeout > callback timeout or no more requests to process */
+-   if (timercmp(tvp, ctvp, >) || !timerisset(tvp)) {
+-      *tvp = *ctvp; /* use the smaller non-zero timeout */
+-      timerclear(ctvp); /* used as a flag to let callback fire on timeout */
+-   }
+-}
+-
+ static int
+ __is_numeric_oid (oidstr)
+ char* oidstr;
+@@ -189,21 +149,6 @@ struct tree* tp;
+ 		  (tp->parent && __get_type_str(tp->parent->type,buf) )));
+ }
+ 
+-static SnmpMibNode*
+-__get_next_mib_node (tp)
+-SnmpMibNode* tp;
+-{
+-   /* printf("tp = %lX, parent = %lX, peer = %lX, child = %lX\n",
+-              tp, tp->parent, tp->next_peer, tp->child_list); */
+-   if (tp->child_list) return(tp->child_list);
+-   if (tp->next_peer) return(tp->next_peer);
+-   if (!tp->parent) return(NULL);
+-   for (tp = tp->parent; !tp->next_peer; tp = tp->parent) {
+-      if (!tp->parent) return(NULL);
+-   }
+-   return(tp->next_peer);
+-}
+-
+ static int
+ __translate_appl_type(typestr)
+ char* typestr;
+@@ -261,50 +206,36 @@ int type;
+    switch (type) {
+         case ASN_INTEGER:
+             return(TYPE_INTEGER);
+-	    break;
+ 	case ASN_OCTET_STR:
+             return(TYPE_OCTETSTR);
+-	    break;
+ 	case ASN_OPAQUE:
+             return(TYPE_OPAQUE);
+-	    break;
+ 	case ASN_OBJECT_ID:
+             return(TYPE_OBJID);
+-	    break;
+ 	case ASN_TIMETICKS:
+             return(TYPE_TIMETICKS);
+-	    break;
+ 	case ASN_GAUGE:
+             return(TYPE_GAUGE);
+-	    break;
+ 	case ASN_COUNTER:
+             return(TYPE_COUNTER);
+-	    break;
+ 	case ASN_IPADDRESS:
+             return(TYPE_IPADDR);
+-	    break;
+ 	case ASN_BIT_STR:
+             return(TYPE_BITSTRING);
+-	    break;
+ 	case ASN_NULL:
+             return(TYPE_NULL);
+-	    break;
+ 	/* no translation for these exception type values */
+ 	case SNMP_ENDOFMIBVIEW:
+ 	case SNMP_NOSUCHOBJECT:
+ 	case SNMP_NOSUCHINSTANCE:
+ 	    return(type);
+-	    break;
+ 	case ASN_UINTEGER:
+             return(TYPE_UINTEGER);
+-	    break;
+ 	case ASN_COUNTER64:
+             return(TYPE_COUNTER64);
+-	    break;
+ 	default:
+-            return(TYPE_OTHER);
+             fprintf(stderr, "translate_asn_type: unhandled asn type (%d)\n",type);
+-            break;
++            return(TYPE_OTHER);
+         }
+ }
+ 
+@@ -335,8 +266,7 @@ int flag;
+            if (flag == USE_ENUMS) {
+               for(ep = tp->enums; ep; ep = ep->next) {
+                  if (ep->value == *var->val.integer) {
+-                    strncpy(buf, ep->label, buf_len);
+-                    buf[buf_len -1] = 0;
++                    strlcpy(buf, ep->label, buf_len);
+                     len = STRLEN(buf);
+                     break;
+                  }
+@@ -445,21 +375,6 @@ int len;
+ }
+ 
+ static int
+-__tp_sprint_num_objid (buf, tp)
+-char *buf;
+-SnmpMibNode *tp;
+-{
+-   oid newname[MAX_OID_LEN], *op;
+-   /* code taken from get_node in snmp_client.c */
+-   for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) {
+-      *op = tp->subid;
+-      tp = tp->parent;
+-      if (tp == NULL) break;
+-   }
+-   return __sprint_num_objid(buf, op, newname + MAX_OID_LEN - op);
+-}
+-
+-static int
+ __scan_num_objid (buf, objid, len)
+ char *buf;
+ oid *objid;
+@@ -674,24 +589,6 @@ int flag;
+    return(SUCCESS);
+ }
+ 
+-
+-static int
+-__oid_cmp(oida_arr, oida_arr_len, oidb_arr, oidb_arr_len)
+-oid *oida_arr;
+-int oida_arr_len;
+-oid *oidb_arr;
+-int oidb_arr_len;
+-{
+-   for (;oida_arr_len && oidb_arr_len;
+-	oida_arr++, oida_arr_len--, oidb_arr++, oidb_arr_len--) {
+-	if (*oida_arr == *oidb_arr) continue;
+-	return(*oida_arr > *oidb_arr ? 1 : -1);
+-   }
+-   if (oida_arr_len == oidb_arr_len) return(0);
+-   return(oida_arr_len > oidb_arr_len ? 1 : -1);
+-}
+-
+-
+ /* Convert a tag (string) to an OID array              */
+ /* Tag can be either a symbolic name, or an OID string */
+ static struct tree *
+@@ -708,9 +605,6 @@ int    best_guess;
+    oid newname[MAX_OID_LEN], *op;
+    size_t newname_len = 0;
+ 
+-   char str_buf[STR_BUF_SIZE];
+-   str_buf[0] = '\0';
+-
+    if (type) *type = TYPE_UNKNOWN;
+    if (oid_arr_len) *oid_arr_len = 0;
+    if (!tag) goto done;
+@@ -796,43 +690,10 @@ int    best_guess;
+       }
+    }
+  done:
+-   if (iid && *iid) __concat_oid_str(oid_arr, oid_arr_len, iid);
++   if (iid && *iid && oid_arr_len)
++       __concat_oid_str(oid_arr, oid_arr_len, iid);
+    return(rtp);
+ }
+-/* searches down the mib tree for the given oid
+-   returns the last found tp and its index in lastind
+- */
+-static struct tree *
+-__oid2tp (oidp, len, subtree, lastind)
+-oid* oidp;
+-int len;
+-struct tree * subtree;
+-int* lastind;
+-{
+-    struct tree    *return_tree = NULL;
+-
+-
+-    for (; subtree; subtree = subtree->next_peer) {
+-	if (*oidp == subtree->subid){
+-	    goto found;
+-	}
+-    }
+-    *lastind=0;
+-    return NULL;
+-
+-found:
+-    if (len > 1){
+-       return_tree =
+-          __oid2tp(oidp + 1, len - 1, subtree->child_list, lastind);
+-       (*lastind)++;
+-    } else {
+-       *lastind=1;
+-    }
+-    if (return_tree)
+-	return return_tree;
+-    else
+-	return subtree;
+-}
+ 
+ /* function: __concat_oid_str
+  *
+@@ -848,19 +709,22 @@ oid *doid_arr;
+ int *doid_arr_len;
+ char * soid_str;
+ {
+-   char soid_buf[STR_BUF_SIZE];
++   char *soid_buf;
+    char *cp;
+    char *st;
+ 
+    if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */
+    if (*soid_str == '.') soid_str++;
+-   strcpy(soid_buf, soid_str);
++   soid_buf = strdup(soid_str);
++   if (!soid_buf)
++       return FAILURE;
+    cp = strtok_r(soid_buf,".",&st);
+    while (cp) {
+      sscanf(cp, "%lu", &(doid_arr[(*doid_arr_len)++]));
+      /* doid_arr[(*doid_arr_len)++] =  atoi(cp); */
+      cp = strtok_r(NULL,".",&st);
+    }
++   free(soid_buf);
+    return(SUCCESS);
+ }
+ 
+@@ -1004,7 +868,7 @@ char *err_str;
+ int *err_num;
+ int *err_ind;
+ {
+-   int status;
++   int status = 0;
+    long command = pdu->command;
+    char *tmp_err_str;
+ 
+@@ -1017,7 +881,7 @@ int *err_ind;
+    if (ss == NULL) {
+        *err_num = 0;
+        *err_ind = SNMPERR_BAD_SESSION;
+-       strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1);
++       strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE);
+        goto done;
+    }
+ 
+@@ -1025,7 +889,7 @@ int *err_ind;
+    if (tmp_err_str == NULL) {
+        *err_num = errno;
+        *err_ind = SNMPERR_MALLOC;
+-       strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1);
++       strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE);
+        goto done;
+    }
+ 
+@@ -1070,8 +934,8 @@ retry:
+             /* in SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */
+             case SNMP_ERR_INCONSISTENTNAME:
+             default:
+-               strncpy(err_str, (char*)snmp_errstring((*response)->errstat),
+-		       STR_BUF_SIZE - 1);
++               strlcpy(err_str, (char*)snmp_errstring((*response)->errstat),
++		       STR_BUF_SIZE);
+                *err_num = (int)(*response)->errstat;
+ 	       *err_ind = (*response)->errindex;
+                status = (*response)->errstat;
+@@ -1082,8 +946,7 @@ retry:
+       case STAT_TIMEOUT:
+       case STAT_ERROR:
+ 	  snmp_sess_error(ss, err_num, err_ind, &tmp_err_str);
+-	  strncpy(err_str, tmp_err_str, STR_BUF_SIZE - 1);
+-	  err_str[STR_BUF_SIZE - 1] = '\0';
++	  strlcpy(err_str, tmp_err_str, STR_BUF_SIZE);
+          break;
+ 
+       default:
+@@ -1368,8 +1231,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args)
+ 			     USM_AUTH_PROTO_SHA_LEN);
+       session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
+     } else if (!strcmp(auth_proto, "DEFAULT")) {
+-      session.securityAuthProto = 
+-	get_default_authtype(&session.securityAuthProtoLen);
++      const oid* a = get_default_authtype(&session.securityAuthProtoLen);
++      session.securityAuthProto
++        = snmp_duplicate_objid(a, session.securityAuthProtoLen);
+     } else {
+       if (verbose)
+ 	printf("error:snmp_new_v3_session:Unsupported authentication protocol(%s)\n", auth_proto);
+@@ -1403,8 +1267,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args)
+ 			     USM_PRIV_PROTO_AES_LEN);
+       session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
+     } else if (!strcmp(priv_proto, "DEFAULT")) {
+-      session.securityPrivProto = 
+-	get_default_privtype(&session.securityPrivProtoLen);
++      const oid *p = get_default_privtype(&session.securityPrivProtoLen);
++      session.securityPrivProto
++        = snmp_duplicate_objid(p, session.securityPrivProtoLen);
+     } else {
+       if (verbose)
+ 	printf("error:snmp_new_v3_session:Unsupported privacy protocol(%s)\n", priv_proto);
+@@ -1448,7 +1313,6 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args)
+   int  timeout;
+   char *  sec_name;
+   int     sec_level;
+-  char *  sec_eng_id;
+   char *  context_eng_id;
+   char *  context;
+   char *  our_identity;
+@@ -1525,7 +1389,11 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args)
+ 
+   if (!ss)
+       return NULL;
+-  return Py_BuildValue("i", (int)ss);
++  /*
++   * Note: on a 64-bit system the statement below discards the upper 32 bits of
++   * "ss", which is most likely a bug.
++   */
++  return Py_BuildValue("i", (int)(uintptr_t)ss);
+ }
+ 
+ static PyObject *
+@@ -1563,7 +1431,6 @@ netsnmp_get(PyObject *self, PyObject *args)
+   int oid_arr_len = MAX_OID_LEN;
+   int type;
+   char type_str[MAX_TYPE_NAME_LEN];
+-  int status;
+   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
+   size_t str_buf_len = sizeof(str_buf);
+   size_t out_len = 0;
+@@ -1646,8 +1513,8 @@ netsnmp_get(PyObject *self, PyObject *args)
+       }
+     }
+ 
+-    status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
+-			     err_str, &err_num, &err_ind);
++    __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
++                    &err_ind);
+     __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
+ 
+     /*
+@@ -1698,8 +1565,8 @@ netsnmp_get(PyObject *self, PyObject *args)
+ 					       &out_len, 0, &buf_over,
+ 					       vars->name,vars->name_length);
+ 	if (_debug_level) 
+-	  printf("netsnmp_get:str_bufp:%s:%d:%d\n",
+-		 str_bufp,str_buf_len,out_len);
++            printf("netsnmp_get:str_bufp:%s:%d:%d\n", str_bufp,
++                   (int)str_buf_len, (int)out_len);
+ 
+ 	str_buf[sizeof(str_buf)-1] = '\0';
+ 
+@@ -1715,20 +1582,19 @@ netsnmp_get(PyObject *self, PyObject *args)
+ 	
+ 	if (_debug_level) printf("netsnmp_get:str_buf:%s\n",str_buf);
+ 
+-	__get_label_iid(str_buf, &tag, &iid, getlabel_flag);
++	__get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
+ 
+ 	py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag));
+ 	py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid));
+ 
+ 	__get_type_str(type, type_str);
+ 
+-	py_netsnmp_attr_set_string(varbind, "type", type_str, 
+-				   STRLEN(type_str));
++	py_netsnmp_attr_set_string(varbind, "type", type_str, strlen(type_str));
+ 
+-	len = __snprint_value(str_buf,sizeof(str_buf),
+-			    vars,tp,type,sprintval_flag);
++	len = __snprint_value((char *) str_buf, sizeof(str_buf),
++                              vars, tp, type, sprintval_flag);
+ 	str_buf[len] = '\0';
+-	py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
++	py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
+ 
+ 	/* save in return tuple as well */
+ 	PyTuple_SetItem(val_tuple, varlist_ind, 
+@@ -1772,13 +1638,12 @@ netsnmp_getnext(PyObject *self, PyObject *args)
+   int oid_arr_len = MAX_OID_LEN;
+   int type;
+   char type_str[MAX_TYPE_NAME_LEN];
+-  int status;
+   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
+   size_t str_buf_len = sizeof(str_buf);
+   size_t out_len = 0;
+   int buf_over = 0;
+   char *tag;
+-  char *iid;
++  char *iid = NULL;
+   int getlabel_flag = NO_FLAGS;
+   int sprintval_flag = USE_BASIC;
+   int verbose = py_netsnmp_verbose();
+@@ -1862,8 +1727,8 @@ netsnmp_getnext(PyObject *self, PyObject *args)
+       }
+     }
+ 
+-    status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
+-			     err_str, &err_num, &err_ind);
++    __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
++                    &err_ind);
+     __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
+ 
+     /*
+@@ -1924,7 +1789,7 @@ netsnmp_getnext(PyObject *self, PyObject *args)
+ 	  type = __translate_asn_type(vars->type);
+ 	}
+ 
+-	__get_label_iid(str_buf, &tag, &iid, getlabel_flag);
++	__get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
+ 
+ 	if (_debug_level) 
+ 	  printf("netsnmp_getnext: filling response: %s:%s\n", tag, iid);
+@@ -1935,13 +1800,13 @@ netsnmp_getnext(PyObject *self, PyObject *args)
+ 	__get_type_str(type, type_str);
+ 
+ 	py_netsnmp_attr_set_string(varbind, "type", type_str, 
+-				   STRLEN(type_str));
++				   strlen(type_str));
+ 
+-	len = __snprint_value(str_buf,sizeof(str_buf),
+-			    vars,tp,type,sprintval_flag);
++	len = __snprint_value((char *) str_buf, sizeof(str_buf),
++                              vars, tp, type, sprintval_flag);
+ 	str_buf[len] = '\0';
+ 
+-	py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
++	py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
+ 
+ 	/* save in return tuple as well */
+ 	PyTuple_SetItem(val_tuple, varlist_ind, 
+@@ -1984,10 +1849,10 @@ netsnmp_walk(PyObject *self, PyObject *args)
+   netsnmp_variable_list *vars, *oldvars;
+   struct tree *tp;
+   int len;
+-  oid **oid_arr;
+-  int *oid_arr_len;
+-  oid **oid_arr_broken_check;
+-  int *oid_arr_broken_check_len;
++  oid **oid_arr = NULL;
++  int *oid_arr_len = NULL;
++  oid **oid_arr_broken_check = NULL;
++  int *oid_arr_broken_check_len = NULL;
+   int type;
+   char type_str[MAX_TYPE_NAME_LEN];
+   int status;
+@@ -1996,7 +1861,7 @@ netsnmp_walk(PyObject *self, PyObject *args)
+   size_t out_len = 0;
+   int buf_over = 0;
+   char *tag;
+-  char *iid;
++  char *iid = NULL;
+   int getlabel_flag = NO_FLAGS;
+   int sprintval_flag = USE_BASIC;
+   int verbose = py_netsnmp_verbose();
+@@ -2102,7 +1967,8 @@ netsnmp_walk(PyObject *self, PyObject *args)
+       varlist_ind++;
+     }
+ 
+-    Py_DECREF(varlist_iter);
++    if (varlist_iter)
++        Py_DECREF(varlist_iter);
+ 
+     if (PyErr_Occurred()) {
+       /* propagate error */
+@@ -2246,7 +2112,7 @@ netsnmp_walk(PyObject *self, PyObject *args)
+                       type = __translate_asn_type(vars->type);
+                   }
+ 
+-                  __get_label_iid(str_buf, &tag, &iid, getlabel_flag);
++                  __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
+ 
+                   if (_debug_level) printf("netsnmp_walk: filling response: %s:%s\n", tag, iid);
+ 
+@@ -2256,13 +2122,14 @@ netsnmp_walk(PyObject *self, PyObject *args)
+                   __get_type_str(type, type_str);
+ 
+                   py_netsnmp_attr_set_string(varbind, "type", type_str,
+-                                             STRLEN(type_str));
++                                             strlen(type_str));
+ 
+-                  len = __snprint_value(str_buf,sizeof(str_buf),
++                  len = __snprint_value((char *) str_buf,sizeof(str_buf),
+                                         vars,tp,type,sprintval_flag);
+                   str_buf[len] = '\0';
+ 
+-                  py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
++                  py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf,
++                                             len);
+             
+                   /* push the varbind onto the return varbinds */
+                   PyList_Append(varbinds, varbind);
+@@ -2345,7 +2212,6 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
+   int oid_arr_len = MAX_OID_LEN;
+   int type;
+   char type_str[MAX_TYPE_NAME_LEN];
+-  int status;
+   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
+   size_t str_buf_len = sizeof(str_buf);
+   size_t out_len = 0;
+@@ -2434,8 +2300,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
+ 	goto done;
+       }
+ 
+-      status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
+-			       err_str, &err_num, &err_ind);
++      __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
++                      &err_ind);
+       __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
+ 
+       /*
+@@ -2505,7 +2371,7 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
+ 	      type = __translate_asn_type(vars->type);
+ 	    }
+ 
+-	    __get_label_iid(str_buf, &tag, &iid, getlabel_flag);
++	    __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
+ 
+ 	    py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag));
+ 	    py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid));
+@@ -2513,13 +2379,13 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
+ 	    __get_type_str(type, type_str);
+ 
+ 	    py_netsnmp_attr_set_string(varbind, "type", type_str, 
+-				       STRLEN(type_str));
++				       strlen(type_str));
+ 
+-	    len = __snprint_value(str_buf,sizeof(str_buf),
+-				  vars,tp,type,sprintval_flag);
++	    len = __snprint_value((char *) str_buf, sizeof(str_buf),
++				  vars, tp, type, sprintval_flag);
+ 	    str_buf[len] = '\0';
+ 
+-	    py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
++	    py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
+ 
+ 	    /* push varbind onto varbinds */
+ 	    PyList_Append(varbinds, varbind);
+@@ -2556,7 +2422,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
+       /* propagate error */
+       if (verbose)
+ 	printf("error: getbulk response processing: unknown python error");
+-      Py_DECREF(val_tuple);
++      if (val_tuple)
++          Py_DECREF(val_tuple);
+       val_tuple = NULL;
+     }
+   }
+@@ -2663,14 +2530,15 @@ netsnmp_set(PyObject *self, PyObject *args)
+ 	if (type==TYPE_INTEGER && use_enums && tp && tp->enums) {
+ 	  for(ep = tp->enums; ep; ep = ep->next) {
+ 	    if (val && !strcmp(ep->label, val)) {
+-	      strcpy(tmp_val_str, ep->value);
++              snprintf((char *) tmp_val_str, sizeof(tmp_val_str), "%d",
++                      ep->value);
+ 	      break;
+ 	    }
+ 	  }
+ 	}
+ 	len = (int)tmplen;
+ 	status = __add_var_val_str(pdu, oid_arr, oid_arr_len,
+-				tmp_val_str, len, type);
++                                   (char *) tmp_val_str, len, type);
+ 
+ 	if (verbose && status == FAILURE)
+ 	  printf("error: set: adding variable/value to PDU");
+diff --git a/snmplib/Makefile.in b/snmplib/Makefile.in
+index 48beb38..506b8d4 100644
+--- a/snmplib/Makefile.in
++++ b/snmplib/Makefile.in
+@@ -243,7 +243,3 @@ libsnmp.$(LIB_EXTENSION)$(LIB_VERSION):    $(TOBJS)
+ parse:  mib.o parse.c
+ 	$(CC) $(CFLAGS) -DTEST parse.c -o $@ \
+ 		`$(top_srcdir)/net-snmp-config --libs`
+-
+-test_binary_array: test_binary_array.c
+-	$(CC) $(CFLAGS) test_binary_array.c -o $@ \
+-		`$(top_srcdir)/net-snmp-config --libs`
+diff --git a/snmplib/asn1.c b/snmplib/asn1.c
+index 030fa63..e4da6be 100644
+--- a/snmplib/asn1.c
++++ b/snmplib/asn1.c
+@@ -1371,7 +1371,7 @@ asn_parse_objid(u_char * data,
+             }
+         }
+ #if defined(EIGHTBIT_SUBIDS) || (SIZEOF_LONG != 4)
+-        if (subidentifier > (u_long) MAX_SUBID) {
++        if (subidentifier > MAX_SUBID) {
+             ERROR_MSG("subidentifier too large");
+             return NULL;
+         }
+@@ -1540,13 +1540,8 @@ asn_build_objid(u_char * data,
+      */
+     for (i = 1, objid_val = first_objid_val, op = objid + 2;
+          i < (int) objidlength; i++) {
+-        if (i != 1) {
+-            objid_val = *op++;
+-#if SIZEOF_LONG != 4
+-            if (objid_val > 0xffffffff) /* already logged warning above */
+-                objid_val &= 0xffffffff;
+-#endif
+-        }
++        if (i != 1)
++            objid_val = (uint32_t)(*op++); /* already logged warning above */
+         switch (objid_size[i]) {
+         case 1:
+             *data++ = (u_char) objid_val;
+diff --git a/snmplib/callback.c b/snmplib/callback.c
+index 16026e9..dfe537a 100644
+--- a/snmplib/callback.c
++++ b/snmplib/callback.c
+@@ -249,7 +249,7 @@ snmp_register_callback(int major, int minor, SNMPCallback * new_callback,
+  * @param minor        Minor callback event type.
+  * @param new_callback Callback function being registered.
+  * @param arg          Argument that will be passed to the callback function.
+- * @priority           Handler invocation priority. When multiple handlers have
++ * @param priority     Handler invocation priority. When multiple handlers have
+  *   been registered for the same (major, minor) callback event type, handlers
+  *   with the numerically lowest priority will be invoked first. Handlers with
+  *   identical priority are invoked in the order they have been registered.
+diff --git a/snmplib/cert_util.c b/snmplib/cert_util.c
+index 6d9efe5..246a6c9 100644
+--- a/snmplib/cert_util.c
++++ b/snmplib/cert_util.c
+@@ -751,7 +751,6 @@ _certindex_add( const char *dirname, int i )
+     if (SE_OK != rc) {
+         snmp_log(LOG_ERR, "adding certindex dirname failed; "
+                  "%d (%s) not added\n", i, dirname);
+-        free(dirname_copy);
+         return -1;
+     }
+ 
+@@ -791,7 +790,7 @@ _certindexes_load( void )
+      * Create a list of which directory each file refers to
+      */
+     while ((file = readdir( dir ))) {
+-        if ( !isdigit(file->d_name[0]))
++        if ( !isdigit(0xFF & file->d_name[0]))
+             continue;
+         i = atoi( file->d_name );
+ 
+@@ -801,7 +800,6 @@ _certindexes_load( void )
+         fp = fopen( filename, "r" );
+         if ( !fp ) {
+             DEBUGMSGT(("cert:index:load", "error opening index (%d)\n", i));
+-            fclose(fp);
+             continue;
+         }
+         cp = fgets( line, sizeof(line), fp );
+@@ -1179,12 +1177,6 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
+         return;
+     }
+ 
+-    snprintf(filename, sizeof(filename), "%s", key->info.filename);
+-    pos = strrchr(filename, '.');
+-    if (NULL == pos)
+-        return;
+-    *pos = 0;
+-
+     if(key) {
+         if (key->cert) {
+             DEBUGMSGT(("cert:partner", "key already has partner\n"));
+@@ -1192,6 +1184,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
+         }
+         DEBUGMSGT(("9:cert:partner", "%s looking for partner near %s\n",
+                    key->info.filename, key->info.dir));
++        snprintf(filename, sizeof(filename), "%s", key->info.filename);
++        pos = strrchr(filename, '.');
++        if (NULL == pos)
++            return;
++        *pos = 0;
+ 
+         matching = _cert_find_subset_fn( filename, key->info.dir );
+         if (!matching)
+@@ -1220,6 +1217,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
+         }
+         DEBUGMSGT(("9:cert:partner", "%s looking for partner\n",
+                    cert->info.filename));
++        snprintf(filename, sizeof(filename), "%s", cert->info.filename);
++        pos = strrchr(filename, '.');
++        if (NULL == pos)
++            return;
++        *pos = 0;
+ 
+         matching = _key_find_subset(filename);
+         if (!matching)
+@@ -1714,7 +1716,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp)
+             break;
+         }
+         else
+-            *pos = isalpha(*pos) ? tolower(*pos) : *pos;
++            *pos = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos;
+     }
+     if (!*pos)
+         return;
+@@ -1723,7 +1725,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp)
+     for (++pos; *pos; ++pos) {
+         if (':' == *pos)
+             continue;
+-        *dest++ = isalpha(*pos) ? tolower(*pos) : *pos;
++        *dest++ = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos;
+     }
+     *dest = *pos; /* nul termination */
+ }
+@@ -2011,7 +2013,8 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert)
+ {
+     X509_STORE     *certstore;
+     X509           *cert;
+-    
++    char           *fingerprint;
++
+     /* ensure all needed pieces are present */
+     netsnmp_assert_or_msgreturn(NULL != thiscert, "NULL certificate passed in",
+                                 SNMPERR_GENERR);
+@@ -2033,10 +2036,11 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert)
+                                 SNMPERR_GENERR);
+ 
+     /* Put the certificate into the store */
++    fingerprint = netsnmp_openssl_cert_get_fingerprint(cert, -1);
+     DEBUGMSGTL(("cert:trust",
+                 "putting trusted cert %p = %s in certstore %p\n", cert,
+-                netsnmp_openssl_cert_get_fingerprint(cert, -1),
+-                certstore));
++                fingerprint, certstore));
++    SNMP_FREE(fingerprint);
+     X509_STORE_add_cert(certstore, cert);
+ 
+     return SNMPERR_SUCCESS;
+@@ -2132,7 +2136,7 @@ _cert_find_fp(const char *fingerprint)
+     if (NULL == fingerprint)
+         return NULL;
+ 
+-    strncpy(fp, fingerprint, sizeof(fp));
++    strlcpy(fp, fingerprint, sizeof(fp));
+     netsnmp_fp_lowercase_and_strip_colon(fp);
+ 
+     /** clear search key */
+@@ -2222,7 +2226,7 @@ _reduce_subset_dir(netsnmp_void_array *matching, const char *directory)
+      *
+      * so we want to backup up on directory for compares..
+      */
+-    strncpy(dir,directory,sizeof(dir));
++    strlcpy(dir, directory, sizeof(dir));
+     pos = strrchr(dir, '/');
+     if (NULL == pos) {
+         DEBUGMSGTL(("cert:subset:dir", "no '/' in directory %s\n", directory));
+@@ -2690,7 +2694,7 @@ netsnmp_certToTSN_parse_common(char **line)
+     tmp = buf;
+     *line = read_config_read_octet_string(*line, (u_char **)&tmp, &len);
+     tmp[len] = 0;
+-    if (!isdigit(tmp[0])) {
++    if (!isdigit(0xFF & tmp[0])) {
+         netsnmp_config_error("could not parse priority");
+         return NULL;
+     }
+@@ -3050,8 +3054,8 @@ netsnmp_tlstmParams_add(snmpTlstmParams *stp)
+                 stp->name));
+ 
+     if (CONTAINER_INSERT(_tlstmParams, stp) != 0) {
+-        netsnmp_tlstmParams_free(stp);
+         snmp_log(LOG_ERR, "error inserting tlstmParams %s", stp->name);
++        netsnmp_tlstmParams_free(stp);
+         return -1;
+     }
+ 
+@@ -3260,8 +3264,8 @@ netsnmp_tlstmAddr_add(snmpTlstmAddr *entry)
+     DEBUGMSGTL(("tlstmAddr:add", "adding entry 0x%lx %s %s\n",
+                 (u_long)entry, entry->name, entry->fingerprint));
+     if (CONTAINER_INSERT(_tlstmAddr, entry) != 0) {
+-        netsnmp_tlstmAddr_free(entry);
+         snmp_log(LOG_ERR, "could not insert addr %s", entry->name);
++        netsnmp_tlstmAddr_free(entry);
+         return -1;
+     }
+ 
+@@ -3314,10 +3318,7 @@ _parse_addr(const char *token, char *line)
+     if (id_len)
+         entry->identity = strdup(id);
+ 
+-    if (netsnmp_tlstmAddr_add(entry) != 0)
+-        netsnmp_tlstmAddr_free(entry);
+-
+-    return;
++    netsnmp_tlstmAddr_add(entry);
+ }
+ 
+ static char *
+diff --git a/snmplib/container_binary_array.c b/snmplib/container_binary_array.c
+index 41f1d24..249a3a9 100644
+--- a/snmplib/container_binary_array.c
++++ b/snmplib/container_binary_array.c
+@@ -487,7 +487,7 @@ binary_search_for_start(netsnmp_index *val, netsnmp_container *c)
+ void          **
+ netsnmp_binary_array_get_subset(netsnmp_container *c, void *key, int *len)
+ {
+-    binary_array_table *t = (binary_array_table*)c->container_data;
++    binary_array_table *t;
+     void          **subset;
+     int             start, end;
+     size_t          i;
+diff --git a/snmplib/data_list.c b/snmplib/data_list.c
+index 15f2de2..505d4fc 100644
+--- a/snmplib/data_list.c
++++ b/snmplib/data_list.c
+@@ -240,9 +240,14 @@ netsnmp_register_save_list(netsnmp_data_list **datalist,
+                            const char *type, const char *token,
+                            Netsnmp_Save_List_Data *data_list_save_ptr,
+                            Netsnmp_Read_List_Data *data_list_read_ptr,
+-                           Netsnmp_Free_List_Data *data_list_free_ptr) {
+-    netsnmp_data_list_saveinfo *info =
+-        SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo);
++                           Netsnmp_Free_List_Data *data_list_free_ptr)
++{
++    netsnmp_data_list_saveinfo *info;
++
++    if (!data_list_save_ptr && !data_list_read_ptr)
++        return;
++
++    info = SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo);
+ 
+     if (!info) {
+         snmp_log(LOG_ERR, "couldn't malloc a netsnmp_data_list_saveinfo typedef");
+diff --git a/snmplib/dir_utils.c b/snmplib/dir_utils.c
+index 89bba6b..cbb6d00 100644
+--- a/snmplib/dir_utils.c
++++ b/snmplib/dir_utils.c
+@@ -122,7 +122,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
+         dirname_len = 0;
+     else {
+         dirname_len = strlen(dirname);
+-        strncpy(path, dirname, sizeof(path));
++        strlcpy(path, dirname, sizeof(path));
+         if ((dirname_len + 2) > sizeof(path)) {
+             /** not enough room for files */
+             closedir(dir);
+@@ -131,7 +131,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
+             return NULL;
+         }
+         path[dirname_len] = '/';
+-        path[++dirname_len] = 0;
++        path[++dirname_len] = '\0';
+     }
+ 
+     /** iterate over dir */
+@@ -146,7 +146,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
+              ((file->d_name[1] == '.') && ((file->d_name[2] == 0)))))
+             continue;
+ 
+-        strncpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len);
++        strlcpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len);
+         if (NULL != filter) {
+             if (flags & NETSNMP_DIR_NSFILE_STATS) {
+                 /** use local vars for now */
+diff --git a/snmplib/int64.c b/snmplib/int64.c
+index 5db2375..2c71b17 100644
+--- a/snmplib/int64.c
++++ b/snmplib/int64.c
+@@ -1,9 +1,10 @@
+-/** file: test.c - test of 64-bit integer stuff
+-*
+-*
+-* 21-jan-1998: David Perkins <dperkins@dsperkins.com>
+-*
+-*/
++/**
++ * @file int64.c
++ *
++ * @brief Functions for 64-bit integer computations.
++ *
++ * 21-jan-1998: David Perkins <dperkins@dsperkins.com>
++ */
+ 
+ #include <net-snmp/net-snmp-config.h>
+ #include <sys/types.h>
+@@ -24,17 +25,13 @@
+ 
+ #include <net-snmp/net-snmp-features.h>
+ 
+-#define TRUE 1
+-#define FALSE 0
+-
+-/** divBy10 - divide an unsigned 64-bit integer by 10
+-*
+-* call with:
+-*   u64 - number to be divided
+-*   pu64Q - location to store quotient
+-*   puR - location to store remainder
+-*
+-*/
++/**
++ * Divide an unsigned 64-bit integer by 10.
++ *
++ * @param[in]  u64   Number to be divided.
++ * @param[out] pu64Q Quotient.
++ * @param[out] puR   Remainder.
++ */
+ void
+ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
+ {
+@@ -42,7 +39,6 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
+     unsigned long   ulQ;
+     unsigned long   ulR;
+ 
+-
+     /*
+      * top 16 bits 
+      */
+@@ -78,18 +74,14 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
+     pu64Q->low = pu64Q->low | ulQ;
+ 
+     *puR = (unsigned int) (ulR);
++}
+ 
+-
+-}                               /* divBy10 */
+-
+-
+-/** multBy10 - multiply an unsigned 64-bit integer by 10
+-*
+-* call with:
+-*   u64 - number to be multiplied
+-*   pu64P - location to store product
+-*
+-*/
++/**
++ * Multiply an unsigned 64-bit integer by 10.
++ *
++ * @param[in]  u64   Number to be multiplied.
++ * @param[out] pu64P Product.
++ */
+ void
+ multBy10(U64 u64, U64 * pu64P)
+ {
+@@ -97,7 +89,6 @@ multBy10(U64 u64, U64 * pu64P)
+     unsigned long   ulP;
+     unsigned long   ulK;
+ 
+-
+     /*
+      * lower 16 bits 
+      */
+@@ -129,159 +120,122 @@ multBy10(U64 u64, U64 * pu64P)
+     ulP = (ulT * 10) + ulK;
+     ulK = ulP >> 16;
+     pu64P->high = (ulP & 0x0ffff) << 16 | pu64P->high;
++}
+ 
+-
+-}                               /* multBy10 */
+-
+-
+-/** incrByU16 - add an unsigned 16-bit int to an unsigned 64-bit integer
+-*
+-* call with:
+-*   pu64 - number to be incremented
+-*   u16 - amount to add
+-*
+-*/
++/**
++ * Add an unsigned 16-bit int to an unsigned 64-bit integer.
++ *
++ * @param[in,out] pu64 Number to be incremented.
++ * @param[in]     u16  Amount to add.
++ *
++ */
+ void
+ incrByU16(U64 * pu64, unsigned int u16)
+ {
+-    unsigned long   ulT1;
+-    unsigned long   ulT2;
+-    unsigned long   ulR;
+-    unsigned long   ulK;
+-
+-
+-    /*
+-     * lower 16 bits 
+-     */
+-    ulT1 = pu64->low;
+-    ulT2 = ulT1 & 0x0ffff;
+-    ulR = ulT2 + u16;
+-    ulK = ulR >> 16;
+-    if (ulK == 0) {
+-        pu64->low = ulT1 + u16;
+-        return;
+-    }
+-
+-    /*
+-     * next 16 bits 
+-     */
+-    ulT2 = (ulT1 >> 16) & 0x0ffff;
+-    ulR = ulT2 + 1;
+-    ulK = ulR >> 16;
+-    if (ulK == 0) {
+-        pu64->low = ulT1 + u16;
+-        return;
+-    }
+-
+-    /*
+-     * next 32 - ignore any overflow 
+-     */
+-    pu64->low = (ulT1 + u16) & 0x0FFFFFFFFL;
+-    pu64->high++;
+-#if SIZEOF_LONG != 4
+-    pu64->high &= 0xffffffff;
+-#endif
+-}                               /* incrByV16 */
++    incrByU32(pu64, u16);
++}
+ 
++/**
++ * Add an unsigned 32-bit int to an unsigned 64-bit integer.
++ *
++ * @param[in,out] pu64 Number to be incremented.
++ * @param[in]     u32  Amount to add.
++ *
++ */
+ void
+ incrByU32(U64 * pu64, unsigned int u32)
+ {
+-    unsigned int    tmp;
++    uint32_t tmp;
++
+     tmp = pu64->low;
+-    pu64->low += u32;
+-#if SIZEOF_LONG != 4
+-    pu64->low &= 0xffffffff;
+-#endif
+-    if (pu64->low < tmp) {
+-        pu64->high++;
+-#if SIZEOF_LONG != 4
+-        pu64->high &= 0xffffffff;
+-#endif
+-    }
++    pu64->low = (uint32_t)(tmp + u32);
++    if (pu64->low < tmp)
++        pu64->high = (uint32_t)(pu64->high + 1);
+ }
+ 
+ /**
+- * pu64out = pu64one - pu64two 
++ * Subtract two 64-bit numbers.
++ *
++ * @param[in] pu64one Number to start from.
++ * @param[in] pu64two Amount to subtract.
++ * @param[out] pu64out pu64one - pu64two.
+  */
+ void
+ u64Subtract(const U64 * pu64one, const U64 * pu64two, U64 * pu64out)
+ {
+-    if (pu64one->low < pu64two->low) {
+-        pu64out->low = 0xffffffff - pu64two->low + pu64one->low + 1;
+-        pu64out->high = pu64one->high - pu64two->high - 1;
+-    } else {
+-        pu64out->low = pu64one->low - pu64two->low;
+-        pu64out->high = pu64one->high - pu64two->high;
+-    }
++    int carry;
++
++    carry = pu64one->low < pu64two->low;
++    pu64out->low = (uint32_t)(pu64one->low - pu64two->low);
++    pu64out->high = (uint32_t)(pu64one->high - pu64two->high - carry);
+ }
+ 
+ /**
+- * pu64out += pu64one
++ * Add two 64-bit numbers.
++ *
++ * @param[in] pu64one Amount to add.
++ * @param[in,out] pu64out pu64out += pu64one.
+  */
+ void
+ u64Incr(U64 * pu64out, const U64 * pu64one)
+ {
+-    pu64out->high += pu64one->high;
+-#if SIZEOF_LONG != 4
+-    pu64out->high &= 0xffffffff;
+-#endif
++    pu64out->high = (uint32_t)(pu64out->high + pu64one->high);
+     incrByU32(pu64out, pu64one->low);
+ }
+ 
+ /**
+- * pu64out += (pu64one - pu64two)
++ * Add the difference of two 64-bit numbers to a 64-bit counter.
++ *
++ * @param[in] pu64one
++ * @param[in] pu64two
++ * @param[out] pu64out pu64out += (pu64one - pu64two)
+  */
+ void
+ u64UpdateCounter(U64 * pu64out, const U64 * pu64one, const U64 * pu64two)
+ {
+     U64 tmp;
++
+     u64Subtract(pu64one, pu64two, &tmp);
+     u64Incr(pu64out, &tmp);
+ }
+ 
+-/**
+- * pu64one = pu64two 
+- */
+ netsnmp_feature_child_of(u64copy, netsnmp_unused)
+ #ifndef NETSNMP_FEATURE_REMOVE_U64COPY
++/**
++ * Copy a 64-bit number.
++ *
++ * @param[in] pu64two Number to be copied.
++ * @param[out] pu64one Where to store the copy - *pu64one = *pu64two.
++ */
+ void
+ u64Copy(U64 * pu64one, const U64 * pu64two)
+ {
+-    pu64one->high = pu64two->high;
+-    pu64one->low =  pu64two->low;
++    *pu64one = *pu64two;
+ }
+ #endif /* NETSNMP_FEATURE_REMOVE_U64COPY */
+ 
+-/** zeroU64 - set an unsigned 64-bit number to zero
+-*
+-* call with:
+-*   pu64 - number to be zero'ed
+-*
+-*/
++/**
++ * Set an unsigned 64-bit number to zero.
++ *
++ * @param[in] pu64 Number to be zeroed.
++ */
+ void
+ zeroU64(U64 * pu64)
+ {
+     pu64->low = 0;
+     pu64->high = 0;
+-}                               /* zeroU64 */
+-
++}
+ 
+-/** isZeroU64 - check if an unsigned 64-bit number is
+-*
+-* call with:
+-*   pu64 - number to be zero'ed
+-*
+-*/
++/**
++ * Check if an unsigned 64-bit number is zero.
++ *
++ * @param[in] pu64 Number to be checked.
++ */
+ int
+ isZeroU64(const U64 * pu64)
+ {
+-
+-    if ((pu64->low == 0) && (pu64->high == 0))
+-        return (TRUE);
+-    else
+-        return (FALSE);
+-
+-}                               /* isZeroU64 */
++    return pu64->low == 0 && pu64->high == 0;
++}
+ 
+ /**
+  * check the old and new values of a counter64 for 32bit wrapping
+@@ -292,7 +246,7 @@ isZeroU64(const U64 * pu64)
+  * @param old_val
+  * @param new_val
+  *
+- *@Note:
++ * @note
+  * The old and new values must be be from within a time period
+  * which would only allow the 32bit portion of the counter to
+  * wrap once. i.e. if the 32bit portion of the counter could
+@@ -331,16 +285,11 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val,
+      */
+     if (new_val->high == old_val->high) {
+         DEBUGMSGTL(("c64:check_wrap", "32 bit wrap\n"));
+-        if (adjust) {
+-            ++new_val->high;
+-#if SIZEOF_LONG != 4
+-            new_val->high &= 0xffffffff;
+-#endif
+-        }
++        if (adjust)
++            new_val->high = (uint32_t)(new_val->high + 1);
+         return 32;
+     }
+-    else if ((new_val->high == (old_val->high + 1)) ||
+-             ((0 == new_val->high) && (0xffffffff == old_val->high))) {
++    else if (new_val->high == (uint32_t)(old_val->high + 1)) {
+         DEBUGMSGTL(("c64:check_wrap", "64 bit wrap\n"));
+         return 64;
+     }
+@@ -357,7 +306,7 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val,
+  * @param need_wrap_check: pointer to integer indicating if wrap check is needed
+  *                         flag may be cleared if 64 bit counter is detected
+  *
+- *@Note:
++ * @note
+  * The old_prev_val and new_val values must be be from within a time
+  * period which would only allow the 32bit portion of the counter to
+  * wrap once. i.e. if the 32bit portion of the counter could
+@@ -438,9 +387,11 @@ netsnmp_c64_check32_and_update(struct counter64 *prev_val, struct counter64 *new
+     return 0;
+ }
+ 
++/** Convert an unsigned 64-bit number to ASCII. */
+ void
+-printU64(char *buf,     /* char [I64CHARSZ+1]; */
+-                         const U64 * pu64) {
++printU64(char *buf, /* char [I64CHARSZ+1]; */
++         const U64 * pu64)
++{
+     U64             u64a;
+     U64             u64b;
+ 
+@@ -448,57 +399,37 @@ printU64(char *buf,     /* char [I64CHARSZ+1]; */
+     unsigned int    u;
+     int             j;
+ 
+-    u64a.high = pu64->high;
+-    u64a.low = pu64->low;
++    u64a = *pu64;
+     aRes[I64CHARSZ] = 0;
+     for (j = 0; j < I64CHARSZ; j++) {
+         divBy10(u64a, &u64b, &u);
+         aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u);
+-        u64a.high = u64b.high;
+-        u64a.low = u64b.low;
++        u64a = u64b;
+         if (isZeroU64(&u64a))
+             break;
+     }
+     strcpy(buf, &aRes[(I64CHARSZ - 1) - j]);
+ }
+ 
++/** Convert a signed 64-bit number to ASCII. */
+ void
+-printI64(char *buf,     /* char [I64CHARSZ+1]; */
+-                         const U64 * pu64) {
++printI64(char *buf, /* char [I64CHARSZ+1]; */
++         const U64 * pu64)
++{
+     U64             u64a;
+-    U64             u64b;
+-
+-    char            aRes[I64CHARSZ + 1];
+-    unsigned int    u;
+-    int             j, sign = 0;
+ 
+     if (pu64->high & 0x80000000) {
+-        u64a.high = ~pu64->high;
+-        u64a.low = ~pu64->low;
+-        sign = 1;
++        u64a.high = (uint32_t) ~pu64->high;
++        u64a.low = (uint32_t) ~pu64->low;
+         incrByU32(&u64a, 1);    /* bit invert and incr by 1 to print 2s complement */
++        buf[0] = '-';
++        printU64(buf + 1, &u64a);
+     } else {
+-        u64a.high = pu64->high;
+-        u64a.low = pu64->low;
+-    }
+-
+-    aRes[I64CHARSZ] = 0;
+-    for (j = 0; j < I64CHARSZ; j++) {
+-        divBy10(u64a, &u64b, &u);
+-        aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u);
+-        u64a.high = u64b.high;
+-        u64a.low = u64b.low;
+-        if (isZeroU64(&u64a))
+-            break;
+-    }
+-    if (sign == 1) {
+-        aRes[(I64CHARSZ - 1) - j - 1] = '-';
+-        strcpy(buf, &aRes[(I64CHARSZ - 1) - j - 1]);
+-        return;
++        printU64(buf, pu64);
+     }
+-    strcpy(buf, &aRes[(I64CHARSZ - 1) - j]);
+ }
+ 
++/** Convert a signed 64-bit integer from ASCII to U64. */
+ int
+ read64(U64 * i64, const char *str)
+ {
+@@ -517,75 +448,14 @@ read64(U64 * i64, const char *str)
+         ok = 1;
+         u = *str - '0';
+         multBy10(*i64, &i64p);
+-        memcpy(i64, &i64p, sizeof(i64p));
++        *i64 = i64p;
+         incrByU16(i64, u);
+         str++;
+     }
+     if (sign) {
+-        i64->high = ~i64->high;
+-        i64->low = ~i64->low;
++        i64->high = (uint32_t) ~i64->high;
++        i64->low = (uint32_t) ~i64->low;
+         incrByU16(i64, 1);
+     }
+     return ok;
+ }
+-
+-
+-
+-
+-#ifdef TESTING
+-void
+-main(int argc, char *argv[])
+-{
+-    int             i;
+-    int             j;
+-    int             l;
+-    unsigned int    u;
+-    U64             u64a;
+-    U64             u64b;
+-#define MXSZ 20
+-    char            aRes[MXSZ + 1];
+-
+-
+-    if (argc < 2) {
+-        printf("This program takes numbers from the command line\n"
+-               "and prints them out.\n" "Usage: test <unsignedInt>...\n");
+-        exit(1);
+-    }
+-
+-    aRes[MXSZ] = 0;
+-
+-    for (i = 1; i < argc; i++) {
+-        l = strlen(argv[i]);
+-        zeroU64(&u64a);
+-        for (j = 0; j < l; j++) {
+-            if (!isdigit(argv[i][j])) {
+-                printf("Argument is not a number \"%s\"\n", argv[i]);
+-                exit(1);
+-            }
+-            u = argv[i][j] - '0';
+-            multBy10(u64a, &u64b);
+-            u64a = u64b;
+-            incrByU16(&u64a, u);
+-        }
+-
+-        printf("number \"%s\" in hex is '%08x%08x'h\n",
+-               argv[i], u64a.high, u64a.low);
+-
+-        printf("number is \"%s\"\n", printU64(&u64a));
+-        for (j = 0; j < MXSZ; j++) {
+-            divBy10(u64a, &u64b, &u);
+-            aRes[(MXSZ - 1) - j] = (char) ('0' + u);
+-            u64a = u64b;
+-            if (isZeroU64(&u64a))
+-                break;
+-        }
+-
+-        printf("number is \"%s\"\n", &aRes[(MXSZ - 1) - j]);
+-    }
+-    exit(0);
+-}                               /* main */
+-#endif                          /* TESTING */
+-
+-/*
+- * file: test.c 
+- */
+diff --git a/snmplib/keytools.c b/snmplib/keytools.c
+index 810a063..0faa0de 100644
+--- a/snmplib/keytools.c
++++ b/snmplib/keytools.c
+@@ -118,13 +118,11 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+     u_char          buf[USM_LENGTH_KU_HASHBLOCK], *bufp;
+ 
+ #ifdef NETSNMP_USE_OPENSSL
+-    EVP_MD_CTX     *ctx = (EVP_MD_CTX *)malloc(sizeof(EVP_MD_CTX));
+-    unsigned int    tmp_len;
++    EVP_MD_CTX     *ctx = NULL;
+ #elif NETSNMP_USE_INTERNAL_CRYPTO
+     SHA_CTX csha1;
+     MD5_CTX cmd5;
+     char    cryptotype = 0;
+-    unsigned int    tmp_len;
+ #define TYPE_MD5  1
+ #define TYPE_SHA1 2
+ #else
+@@ -151,6 +149,12 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+      */
+ #ifdef NETSNMP_USE_OPENSSL
+ 
++#ifdef HAVE_EVP_MD_CTX_CREATE
++    ctx = EVP_MD_CTX_create();
++#else
++    ctx = malloc(sizeof(*ctx));
++    EVP_MD_CTX_init(ctx);
++#endif
+ #ifndef NETSNMP_DISABLE_MD5
+     if (ISTRANSFORM(hashtype, HMACMD5Auth))
+         EVP_DigestInit(ctx, EVP_md5());
+@@ -158,10 +162,8 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+ #endif
+         if (ISTRANSFORM(hashtype, HMACSHA1Auth))
+         EVP_DigestInit(ctx, EVP_sha1());
+-    else {
+-        free(ctx);
+-        return (SNMPERR_GENERR);
+-    }
++    else
++        QUITFUN(SNMPERR_GENERR, generate_Ku_quit);
+ #elif NETSNMP_USE_INTERNAL_CRYPTO
+ #ifndef NETSNMP_DISABLE_MD5
+     if (ISTRANSFORM(hashtype, HMACMD5Auth)) {
+@@ -205,14 +207,17 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+     }
+ 
+ #ifdef NETSNMP_USE_OPENSSL
++    {
++    unsigned int    tmp_len;
++
+     tmp_len = *kulen;
+     EVP_DigestFinal(ctx, (unsigned char *) Ku, &tmp_len);
+     *kulen = tmp_len;
+     /*
+      * what about free() 
+      */
++    }
+ #elif NETSNMP_USE_INTERNAL_CRYPTO
+-    tmp_len = *kulen;
+     if (TYPE_SHA1 == cryptotype) {
+         SHA1_Final(Ku, &csha1);
+     } else {
+@@ -248,7 +253,14 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+   generate_Ku_quit:
+     memset(buf, 0, sizeof(buf));
+ #ifdef NETSNMP_USE_OPENSSL
+-    free(ctx);
++    if (ctx) {
++#ifdef HAVE_EVP_MD_CTX_DESTROY
++        EVP_MD_CTX_destroy(ctx);
++#else
++        EVP_MD_CTX_cleanup(ctx);
++        free(ctx);
++#endif
++    }
+ #endif
+     return rval;
+ 
+@@ -638,7 +650,8 @@ decode_keychange(const oid * hashtype, u_int hashtype_len,
+ 
+   decode_keychange_quit:
+     if (rval != SNMPERR_SUCCESS) {
+-        memset(newkey, 0, properlength);
++        if (newkey)
++            memset(newkey, 0, properlength);
+     }
+     memset(tmp_buf, 0, SNMP_MAXBUF);
+     SNMP_FREE(tmpbuf);
+diff --git a/snmplib/large_fd_set.c b/snmplib/large_fd_set.c
+index 1176a5b..32f57b3 100644
+--- a/snmplib/large_fd_set.c
++++ b/snmplib/large_fd_set.c
+@@ -19,7 +19,7 @@
+ #include <net-snmp/library/large_fd_set.h>
+ 
+ 
+-#if ! defined(cygwin) && defined(HAVE_WINSOCK_H)
++#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
+ 
+ void
+ netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset)
+@@ -39,7 +39,7 @@ netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset)
+     if (i == fdset->lfs_set.fd_count
+         && fdset->lfs_set.fd_count < fdset->lfs_setsize) {
+         fdset->lfs_set.fd_count++;
+-        fdset->lfs_set.fd_array[i] = (fd);
++        fdset->lfs_set.fd_array[i] = fd;
+     }
+ }
+ 
+@@ -51,7 +51,7 @@ netsnmp_large_fd_clr(SOCKET fd, netsnmp_large_fd_set * fdset)
+     netsnmp_assert(fd != INVALID_SOCKET);
+ 
+     for (i = 0; i < fdset->lfs_set.fd_count; i++) {
+-        if (fdset->lfs_set.fd_array[i] == (fd)) {
++        if (fdset->lfs_set.fd_array[i] == fd) {
+             while (i < fdset->lfs_set.fd_count - 1) {
+                 fdset->lfs_set.fd_array[i] =
+                     fdset->lfs_set.fd_array[i + 1];
+@@ -95,7 +95,7 @@ netsnmp_large_fd_clr(int fd, netsnmp_large_fd_set * fdset)
+ {
+     netsnmp_assert(fd >= 0);
+ 
+-    if (fd < (int)fdset->lfs_setsize)
++    if ((unsigned)fd < fdset->lfs_setsize)
+         FD_CLR(fd, fdset->lfs_setptr);
+ }
+ 
+@@ -104,7 +104,7 @@ netsnmp_large_fd_is_set(int fd, netsnmp_large_fd_set * fdset)
+ {
+     netsnmp_assert(fd >= 0);
+ 
+-    return fd < (int)fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr);
++    return (unsigned)fd < fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr);
+ }
+ 
+ #endif
+@@ -114,6 +114,9 @@ netsnmp_large_fd_set_init(netsnmp_large_fd_set * fdset, int setsize)
+ {
+     fdset->lfs_setsize = 0;
+     fdset->lfs_setptr  = NULL;
++#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
++    fdset->lfs_set.fd_count = 0;
++#endif
+     netsnmp_large_fd_set_resize(fdset, setsize);
+ }
+ 
+@@ -135,25 +138,32 @@ netsnmp_large_fd_set_select(int numfds, netsnmp_large_fd_set *readfds,
+     /* Array representation: no resizing is necessary. */
+ #endif
+ 
+-    return select(numfds, readfds->lfs_setptr, writefds->lfs_setptr,
+-                  exceptfds->lfs_setptr, timeout);
++    return select(numfds,
++            readfds ? readfds->lfs_setptr : NULL,
++            writefds ? writefds->lfs_setptr : NULL,
++            exceptfds ? exceptfds->lfs_setptr : NULL,
++            timeout);
+ }
+ 
+-void
++int
+ netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize)
+ {
+     int             fd_set_bytes;
+ 
+     if (fdset->lfs_setsize == setsize)
+-        return;
++        goto success;
+ 
+     if (setsize > FD_SETSIZE) {
+         fd_set_bytes = NETSNMP_FD_SET_BYTES(setsize);
+-        if (fdset->lfs_setsize > FD_SETSIZE)
+-            fdset->lfs_setptr = (fd_set *)realloc(fdset->lfs_setptr, fd_set_bytes);
+-        else {
+-            fdset->lfs_setptr = (fd_set *)malloc(fd_set_bytes);
+-           *fdset->lfs_setptr = fdset->lfs_set;
++        if (fdset->lfs_setsize > FD_SETSIZE) {
++            fdset->lfs_setptr = realloc(fdset->lfs_setptr, fd_set_bytes);
++            if (!fdset->lfs_setptr)
++                goto out_of_mem;
++        } else {
++            fdset->lfs_setptr = malloc(fd_set_bytes);
++            if (!fdset->lfs_setptr)
++                goto out_of_mem;
++            *fdset->lfs_setptr = fdset->lfs_set;
+         }
+     } else {
+         if (fdset->lfs_setsize > FD_SETSIZE) {
+@@ -163,20 +173,33 @@ netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize)
+         fdset->lfs_setptr = &fdset->lfs_set;
+     }
+ 
+-#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H))
++#if defined(cygwin) || !defined(HAVE_WINSOCK_H)
+     {
+         int             i;
+ 
+-	/*
+-	 * Unix: clear the file descriptors defined in the resized *fdset
+-	 * but that were not defined in the original *fdset.
+-	 */
+-	for (i = fdset->lfs_setsize; i < setsize; i++)
+-	    FD_CLR(i, fdset->lfs_setptr);
++        /*
++         * Unix: when enlarging, clear the file descriptors defined in the
++         * resized *fdset but that were not defined in the original *fdset.
++         */
++        for (i = fdset->lfs_setsize; i < setsize; i++)
++            FD_CLR(i, fdset->lfs_setptr);
+     }
+ #endif
+ 
+     fdset->lfs_setsize = setsize;
++#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
++    if (setsize < fdset->lfs_set.fd_count)
++        fdset->lfs_set.fd_count = setsize;
++#endif
++success:
++    return 1;
++
++out_of_mem:
++    fdset->lfs_setsize = 0;
++#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
++    fdset->lfs_set.fd_count = 0;
++#endif
++    return 0;
+ }
+ 
+ void
+@@ -207,13 +230,13 @@ netsnmp_copy_large_fd_set_to_fd_set(fd_set * dst,
+ 
+     *dst = *src->lfs_setptr;
+ 
+-#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H))
++#if !(!defined(cygwin) && defined(HAVE_WINSOCK_H))
+     {
+         int             i;
+ 
+-	/* Unix: clear any file descriptors defined in *dst but not in *src. */
+-	for (i = src->lfs_setsize; i < FD_SETSIZE; ++i)
+-	  FD_CLR(i, dst);
++        /* Unix: clear any file descriptors defined in *dst but not in *src. */
++        for (i = src->lfs_setsize; i < FD_SETSIZE; ++i)
++            FD_CLR(i, dst);
+     }
+ #endif
+ 
+diff --git a/snmplib/mib.c b/snmplib/mib.c
+index 7c8af9c..549d206 100644
+--- a/snmplib/mib.c
++++ b/snmplib/mib.c
+@@ -462,7 +462,7 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len,
+     const char     *saved_hint = hint;
+     int             hex = 0, x = 0;
+     u_char         *cp;
+-    int             output_format, len_needed;
++    int             output_format, cnt;
+ 
+     if ((var->type != ASN_OCTET_STR) && 
+         (!netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICKE_PRINT))) {
+@@ -571,18 +571,11 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len,
+                     break;
+                 case 't': /* new in rfc 3411 */
+                 case 'a':
+-                    /* A string hint gives the max size - we may not need this much */
+-                    len_needed = SNMP_MIN( width, ecp-cp );
+-                    while ((*out_len + len_needed + 1) >= *buf_len) {
+-                        if (!(allow_realloc && snmp_realloc(buf, buf_len))) {
+-                            return 0;
+-                        }
+-                    }
+-                    for (x = 0; x < width && cp < ecp; x++) {
+-                        *(*buf + *out_len) = *cp++;
+-                        (*out_len)++;
+-                    }
+-                    *(*buf + *out_len) = '\0';
++                    cnt = SNMP_MIN(width, ecp - cp);
++                    if (!sprint_realloc_asciistring(buf, buf_len, out_len,
++                                                    allow_realloc, cp, cnt))
++                        return 0;
++                    cp += cnt;
+                     break;
+                 default:
+                     *out_len = saved_out_len;
+@@ -2800,6 +2793,8 @@ netsnmp_mibindex_load( void )
+               get_persistent_directory(), i );
+         tmpbuf[sizeof(tmpbuf)-1] = 0;
+         fp = fopen( tmpbuf, "r" );
++        if (!fp)
++            continue;
+         cp = fgets( tmpbuf2, sizeof(tmpbuf2), fp );
+         if ( !cp ) {
+             DEBUGMSGTL(("mibindex", "Empty MIB index (%d)\n", i));
+@@ -3057,14 +3052,11 @@ read_objid(const char *input, oid * output, size_t * out_len)
+          * get past leading '.', append '.' to Prefix. 
+          */
+         if (*Prefix == '.')
+-            strncpy(buf, Prefix + 1, sizeof(buf)-1);
++            strlcpy(buf, Prefix + 1, sizeof(buf));
+         else
+-            strncpy(buf, Prefix, sizeof(buf)-1);
+-        buf[ sizeof(buf)-1 ] = 0;
+-        strcat(buf, ".");
+-        buf[ sizeof(buf)-1 ] = 0;
+-        strncat(buf, input, sizeof(buf)-strlen(buf));
+-        buf[ sizeof(buf)-1 ] = 0;
++            strlcpy(buf, Prefix, sizeof(buf));
++        strlcat(buf, ".", sizeof(buf));
++        strlcat(buf, input, sizeof(buf));
+         input = buf;
+     }
+ #endif /* NETSNMP_DISABLE_MIB_LOADING */
+@@ -5106,8 +5098,7 @@ print_tree_node(u_char ** buf, size_t * buf_len,
+                 else
+                     if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc, ", "))
+                         return 0;
+-                snprintf(str, sizeof(str), "%s", vp->vblabel);
+-                str[ sizeof(str)-1 ] = 0;
++                strlcpy(str, vp->vblabel, sizeof(str));
+                 len = strlen(str);
+                 if (pos + len + 2 > width) {
+                     if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc,
+@@ -5720,8 +5711,7 @@ get_node(const char *name, oid * objid, size_t * objidlen)
+         module = (char *) malloc((size_t) (cp - name + 1));
+         if (!module)
+             return SNMPERR_GENERR;
+-        memcpy(module, name, (size_t) (cp - name));
+-        module[cp - name] = 0;
++        sprintf(module, "%.*s", (int) (cp - name), name);
+         cp++;                   /* cp now point to the subidentifier */
+         if (*cp == ':')
+             cp++;
+diff --git a/snmplib/oid_stash.c b/snmplib/oid_stash.c
+index 02c53a9..8a79897 100644
+--- a/snmplib/oid_stash.c
++++ b/snmplib/oid_stash.c
+@@ -305,6 +305,8 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root,
+ }
+ #endif /* NETSNMP_FEATURE_REMOVE_OID_STASH_GET_DATA */
+ 
++netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all)
++#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL
+ /** a wrapper around netsnmp_oid_stash_store for use with a snmp_alarm.
+  * when calling snmp_alarm, you can list this as a callback.  The
+  * clientarg should be a pointer to a netsnmp_oid_stash_save_info
+@@ -316,8 +318,6 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root,
+  * @param serverarg
+  * @param clientarg A pointer to a netsnmp_oid_stash_save_info structure.
+  */
+-netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all)
+-#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL
+ int
+ netsnmp_oid_stash_store_all(int majorID, int minorID,
+                             void *serverarg, void *clientarg) {
+diff --git a/snmplib/openssl/openssl_cfb128.c b/snmplib/openssl/openssl_cfb128.c
+index 7e78905..5e0bc1e 100644
+--- a/snmplib/openssl/openssl_cfb128.c
++++ b/snmplib/openssl/openssl_cfb128.c
+@@ -98,7 +98,7 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out,
+ 			(*block)(ivec, ivec, key);
+ 			for (n=0; n<16; n+=sizeof(size_t)) {
+ 				*(size_t*)(out+n) =
+-				*(size_t*)(ivec+n) ^= *(size_t*)(in+n);
++				*(size_t*)(ivec+n) ^= *(const size_t*)(in+n);
+ 			}
+ 			len -= 16;
+ 			out += 16;
+@@ -142,8 +142,8 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out,
+ 		while (len>=16) {
+ 			(*block)(ivec, ivec, key);
+ 			for (n=0; n<16; n+=sizeof(size_t)) {
+-				size_t t = *(size_t*)(in+n);
+-				*(size_t*)(out+n) = *(size_t*)(ivec+n) ^ t;
++				size_t t = *(const size_t*)(in+n);
++				*(size_t*)(out+n) = *(const size_t*)(ivec+n) ^ t;
+ 				*(size_t*)(ivec+n) = t;
+ 			}
+ 			len -= 16;
+diff --git a/snmplib/parse.c b/snmplib/parse.c
+index bfe5cad..1114586 100644
+--- a/snmplib/parse.c
++++ b/snmplib/parse.c
+@@ -2021,11 +2021,19 @@ parse_objectid(FILE * fp, char *name)
+                  * The name for this node is the label for this entry 
+                  */
+                 np->label = strdup(name);
++                if (np->label == NULL) {
++                    SNMP_FREE(np->parent);
++                    SNMP_FREE(np);
++                    return (NULL);
++                }
+             } else {
+                 if (!nop->label) {
+                     nop->label = (char *) malloc(20 + ANON_LEN);
+-                    if (nop->label == NULL)
++                    if (nop->label == NULL) {
++                        SNMP_FREE(np->parent);
++                        SNMP_FREE(np);
+                         return (NULL);
++                    }
+                     sprintf(nop->label, "%s%d", ANON, anonymous++);
+                 }
+                 np->label = strdup(nop->label);
+@@ -2694,29 +2702,12 @@ parse_objecttype(FILE * fp, char *name)
+                         break;
+                     else if (type == LEFTBRACKET)
+                         level++;
+-                    if (type == QUOTESTRING) {
+-                        if (strlen(defbuf)+2 < sizeof(defbuf)) {
+-                            defbuf[ strlen(defbuf)+2 ] = 0;
+-                            defbuf[ strlen(defbuf)+1 ] = '"';
+-                            defbuf[ strlen(defbuf)   ] = '\\';
+-                        }
+-                        defbuf[ sizeof(defbuf)-1 ] = 0;
+-                    }
+-                    strncat(defbuf, quoted_string_buffer,
+-                            sizeof(defbuf)-strlen(defbuf)-1);
+-                    defbuf[ sizeof(defbuf)-1 ] = 0;
+-                    if (type == QUOTESTRING) {
+-                        if (strlen(defbuf)+2 < sizeof(defbuf)) {
+-                            defbuf[ strlen(defbuf)+2 ] = 0;
+-                            defbuf[ strlen(defbuf)+1 ] = '"';
+-                            defbuf[ strlen(defbuf)   ] = '\\';
+-                        }
+-                        defbuf[ sizeof(defbuf)-1 ] = 0;
+-                    }
+-                    if (strlen(defbuf)+1 < sizeof(defbuf)) {
+-                        defbuf[ strlen(defbuf)+1 ] = 0;
+-                        defbuf[ strlen(defbuf)   ] = ' ';
+-                    }
++                    if (type == QUOTESTRING)
++                        strlcat(defbuf, "\\\"", sizeof(defbuf));
++                    strlcat(defbuf, quoted_string_buffer, sizeof(defbuf));
++                    if (type == QUOTESTRING)
++                        strlcat(defbuf, "\\\"", sizeof(defbuf));
++                    strlcat(defbuf, " ", sizeof(defbuf));
+                 }
+ 
+                 if (type != RIGHTBRACKET) {
+@@ -3910,6 +3901,9 @@ read_module_internal(const char *name)
+                 snmp_log_perror(mp->file);
+                 return rval;
+             }
++#ifdef HAVE_FLOCKFILE
++            flockfile(fp);
++#endif
+             mp->no_imports = 0; /* Note that we've read the file */
+             File = mp->file;
+             mibLine = 1;
+@@ -3918,6 +3912,9 @@ read_module_internal(const char *name)
+              * Parse the file
+              */
+             np = parse(fp, NULL);
++#ifdef HAVE_FUNLOCKFILE
++            funlockfile(fp);
++#endif
+             fclose(fp);
+             File = oldFile;
+             mibLine = oldLine;
+@@ -4400,8 +4397,7 @@ parse(FILE * fp, struct node *root)
+         case ENDOFFILE:
+             continue;
+         default:
+-            strncpy(name, token, sizeof(name));
+-            name[sizeof(name)-1] = '\0';
++            strlcpy(name, token, sizeof(name));
+             type = get_token(fp, token, MAXTOKEN);
+             nnp = NULL;
+             if (type == MACRO) {
+@@ -4419,8 +4415,7 @@ parse(FILE * fp, struct node *root)
+                 print_error(name, "is a reserved word", lasttype);
+             continue;           /* see if we can parse the rest of the file */
+         }
+-        strncpy(name, token, sizeof(name));
+-        name[sizeof(name)-1] = '\0';
++        strlcpy(name, token, sizeof(name));
+         type = get_token(fp, token, MAXTOKEN);
+         nnp = NULL;
+ 
+@@ -4610,6 +4605,21 @@ is_labelchar(int ich)
+     return 0;
+ }
+ 
++/**
++ * Read a single character from a file. Assumes that the caller has invoked
++ * flockfile(). Uses fgetc_unlocked() instead of getc() since the former is
++ * implemented as an inline function in glibc. See also bug 3447196
++ * (http://sourceforge.net/tracker/?func=detail&aid=3447196&group_id=12694&atid=112694).
++ */
++static int netsnmp_getc(FILE *stream)
++{
++#ifdef HAVE_FGETC_UNLOCKED
++    return fgetc_unlocked(stream);
++#else
++    return getc(stream);
++#endif
++}
++
+ /*
+  * Parses a token from the file.  The type of the token parsed is returned,
+  * and the text is placed in the string pointed to by token.
+@@ -4629,7 +4639,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+      * skip all white space 
+      */
+     do {
+-        ch = getc(fp);
++        ch = netsnmp_getc(fp);
+         if (ch == '\n')
+             mibLine++;
+     }
+@@ -4643,7 +4653,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+         return parseQuoteString(fp, token, maxtlen);
+     case '\'':                 /* binary or hex constant */
+         seenSymbols = bdigits;
+-        while ((ch = getc(fp)) != EOF && ch != '\'') {
++        while ((ch = netsnmp_getc(fp)) != EOF && ch != '\'') {
+             switch (seenSymbols) {
+             case bdigits:
+                 if (ch == '0' || ch == '1')
+@@ -4662,7 +4672,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+         if (ch == '\'') {
+             unsigned long   val = 0;
+             char           *run = token + 1;
+-            ch = getc(fp);
++            ch = netsnmp_getc(fp);
+             switch (ch) {
+             case EOF:
+                 return ENDOFFILE;
+@@ -4721,25 +4731,25 @@ get_token(FILE * fp, char *token, int maxtlen)
+     case '|':
+         return BAR;
+     case '.':
+-        ch_next = getc(fp);
++        ch_next = netsnmp_getc(fp);
+         if (ch_next == '.')
+             return RANGE;
+         ungetc(ch_next, fp);
+         return LABEL;
+     case ':':
+-        ch_next = getc(fp);
++        ch_next = netsnmp_getc(fp);
+         if (ch_next != ':') {
+             ungetc(ch_next, fp);
+             return LABEL;
+         }
+-        ch_next = getc(fp);
++        ch_next = netsnmp_getc(fp);
+         if (ch_next != '=') {
+             ungetc(ch_next, fp);
+             return LABEL;
+         }
+         return EQUALS;
+     case '-':
+-        ch_next = getc(fp);
++        ch_next = netsnmp_getc(fp);
+         if (ch_next == '-') {
+             if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
+ 				       NETSNMP_DS_LIB_MIB_COMMENT_TERM)) {
+@@ -4747,7 +4757,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+                  * Treat the rest of this line as a comment. 
+                  */
+                 while ((ch_next != EOF) && (ch_next != '\n'))
+-                    ch_next = getc(fp);
++                    ch_next = netsnmp_getc(fp);
+             } else {
+                 /*
+                  * Treat the rest of the line or until another '--' as a comment 
+@@ -4756,11 +4766,11 @@ get_token(FILE * fp, char *token, int maxtlen)
+                  * (this is the "technically" correct way to parse comments) 
+                  */
+                 ch = ' ';
+-                ch_next = getc(fp);
++                ch_next = netsnmp_getc(fp);
+                 while (ch_next != EOF && ch_next != '\n' &&
+                        (ch != '-' || ch_next != '-')) {
+                     ch = ch_next;
+-                    ch_next = getc(fp);
++                    ch_next = netsnmp_getc(fp);
+                 }
+             }
+             if (ch_next == EOF)
+@@ -4770,6 +4780,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+             return get_token(fp, token, maxtlen);
+         }
+         ungetc(ch_next, fp);
++	/* fallthrough */
+     default:
+         /*
+          * Accumulate characters until end of token is found.  Then attempt to
+@@ -4780,7 +4791,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+             return LABEL;
+         hash += tolower(ch);
+       more:
+-        while (is_labelchar(ch_next = getc(fp))) {
++        while (is_labelchar(ch_next = netsnmp_getc(fp))) {
+             hash += tolower(ch_next);
+             if (cp - token < maxtlen - 1)
+                 *cp++ = ch_next;
+@@ -4799,7 +4810,7 @@ get_token(FILE * fp, char *token, int maxtlen)
+         if (tp) {
+             if (tp->token != CONTINUE)
+                 return (tp->token);
+-            while (isspace((ch_next = getc(fp))))
++            while (isspace((ch_next = netsnmp_getc(fp))))
+                 if (ch_next == '\n')
+                     mibLine++;
+             if (ch_next == EOF)
+@@ -4846,7 +4857,10 @@ add_mibfile(const char* tmpstr, const char* d_name, FILE *ip )
+                 tmpstr));
+     mibLine = 1;
+     File = tmpstr;
+-    get_token(fp, token, MAXTOKEN);
++    if (get_token(fp, token, MAXTOKEN) != LABEL) {
++	    fclose(fp);
++	    return 1;
++    }
+     /*
+      * simple test for this being a MIB 
+      */
+@@ -4984,7 +4998,11 @@ read_mib(const char *filename)
+     mibLine = 1;
+     File = filename;
+     DEBUGMSGTL(("parse-mibs", "Parsing file: %s...\n", filename));
+-    get_token(fp, token, MAXTOKEN);
++    if (get_token(fp, token, MAXTOKEN) != LABEL) {
++	    snmp_log(LOG_ERR, "Failed to parse MIB file %s\n", filename);
++	    fclose(fp);
++	    return NULL;
++    }
+     fclose(fp);
+     new_module(token, filename);
+     (void) netsnmp_read_module(token);
+@@ -5055,7 +5073,7 @@ parseQuoteString(FILE * fp, char *token, int maxtlen)
+     int             too_long = 0;
+     char           *token_start = token;
+ 
+-    for (ch = getc(fp); ch != EOF; ch = getc(fp)) {
++    for (ch = netsnmp_getc(fp); ch != EOF; ch = netsnmp_getc(fp)) {
+         if (ch == '\r')
+             continue;
+         if (ch == '\n') {
+diff --git a/snmplib/read_config.c b/snmplib/read_config.c
+index 5c5268b..2443230 100644
+--- a/snmplib/read_config.c
++++ b/snmplib/read_config.c
+@@ -180,8 +180,8 @@ internal_register_config_handler(const char *type_param,
+         struct config_line *ltmp2 = NULL;
+         char                buf[STRINGMAX];
+         char               *cptr = buf;
+-        strncpy(buf, type, STRINGMAX - 1);
+-        buf[STRINGMAX - 1] = '\0';
++
++        strlcpy(buf, type, STRINGMAX);
+         while (cptr) {
+             char* c = cptr;
+             cptr = strchr(cptr, ':');
+@@ -366,8 +366,8 @@ unregister_config_handler(const char *type_param, const char *token)
+     if (strchr(type, ':')) {
+         char                buf[STRINGMAX];
+         char               *cptr = buf;
+-        strncpy(buf, type, STRINGMAX - 1);
+-        buf[STRINGMAX - 1] = '\0';
++
++        strlcpy(buf, type, STRINGMAX);
+         while (cptr) {
+             char* c = cptr;
+             cptr = strchr(cptr, ':');
+@@ -582,10 +582,13 @@ snmp_config_when(char *line, int when)
+         return SNMPERR_GENERR;
+     }
+ 
+-    strncpy(buf, line, STRINGMAX);
+-    buf[STRINGMAX - 1] = '\0';
++    strlcpy(buf, line, STRINGMAX);
+     cptr = strtok_r(buf, SNMP_CONFIG_DELIMETERS, &st);
+-    if (cptr && cptr[0] == '[') {
++    if (!cptr) {
++        netsnmp_config_warn("Wrong format: %s", line);
++        return SNMPERR_GENERR;
++    }
++    if (cptr[0] == '[') {
+         if (cptr[strlen(cptr) - 1] != ']') {
+ 	    netsnmp_config_error("no matching ']' for type %s.", cptr + 1);
+             return SNMPERR_GENERR;
+@@ -887,15 +890,15 @@ read_config(const char *filename,
+                         continue;
+                     }
+                     if ( cptr[0] == '/' ) {
+-                        strncpy(fname, cptr, SNMP_MAXPATH);
+-                        fname[SNMP_MAXPATH-1]='\0';
++                        strlcpy(fname, cptr, SNMP_MAXPATH);
+                     } else {
+-                        strncpy(fname, filename, SNMP_MAXPATH);
+-                        fname[SNMP_MAXPATH-1]='\0';
++                        strlcpy(fname, filename, SNMP_MAXPATH);
+                         cp = strrchr(fname, '/');
+-                        *(++cp) = '\0';
+-                        strncat(fname, cptr, SNMP_MAXPATH-strlen(fname));
+-                        fname[SNMP_MAXPATH-1]='\0';
++                        if (!cp)
++                            fname[0] = '\0';
++                        else
++                            *(++cp) = '\0';
++                        strlcat(fname, cptr, SNMP_MAXPATH);
+                     }
+                     prev_filename  = curfilename;
+                     prev_linecount = linecount;
+@@ -2320,210 +2323,3 @@ read_config_store_data_prefix(char prefix, int type, char *storeto,
+ }
+ 
+ /** @} */
+-
+-#ifdef READ_CONFIG_UNIT_TEST
+-
+-#define NETSNMP_USE_ASSERT 1
+-#include <net-snmp/libary/snmp_assert.h>
+-
+-int
+-read64(U64 * i64, const char *str)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-snmp_get_do_debugging(void)
+-{
+-    return 0;
+-}
+-
+-int
+-debug_is_token_registered(const char *token)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-void
+-debugmsg(const char *token, const char *format, ...)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-void
+-debugmsgtoken(const char *token, const char *format, ...)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-snmp_log(int priority, const char *format, ...)
+-{
+-#if 0
+-    va_list         ap;
+-
+-    va_start(ap, format);
+-    vprintf(format, ap);
+-    va_end(ap);
+-#endif
+-    return 0;
+-}
+-
+-void
+-snmp_log_perror(const char *s)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-snmp_vlog(int priority, const char *format, va_list ap)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-netsnmp_ds_set_boolean(int storeid, int which, int value)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-netsnmp_ds_get_boolean(int storeid, int which)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-netsnmp_ds_set_string(int storeid, int which, const char *value)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-char           *
+-netsnmp_ds_get_string(int storeid, int which)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-char           *
+-netsnmp_getenv(const char *name)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-snmp_call_callbacks(int major, int minor, void *caller_arg)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-mkdirhier(const char *pathname, mode_t mode, int skiplast)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-int
+-read_objid(const char *input, oid * output, size_t * out_len)
+-{
+-    netsnmp_assert(0);
+-}
+-
+-struct read_config_testcase {
+-    /*
+-     * inputs 
+-     */
+-    const char     *(*pf) (const char * readfrom, u_char ** str,
+-                           size_t * len);
+-    const char     *readfrom;
+-    size_t          obuf_len;
+-
+-    /*
+-     * expected outputs 
+-     */
+-    size_t          expected_offset;
+-    const u_char   *expected_output;
+-    size_t          expected_len;
+-};
+-
+-static const u_char obuf1[] = { 1, 0, 2 };
+-static const u_char obuf2[] = { 'a', 'b', 'c', 0 };
+-static const u_char obuf3[] = { 1, 3, 2 };
+-
+-static const struct read_config_testcase test_input[] = {
+-    { &read_config_read_octet_string_const, "",           1, -1, NULL,  0 },
+-    { &read_config_read_octet_string_const, "0x0",        1, -1, NULL,  1 },
+-    { &read_config_read_octet_string_const, "0x0 0",      1, -1, NULL,  1 },
+-
+-    { &read_config_read_octet_string_const, "0x010002",   1, -1, NULL,  0 },
+-    { &read_config_read_octet_string_const, "0x010002",   2, -1, NULL,  0 },
+-    { &read_config_read_octet_string_const, "0x010002",   3, -1, obuf1, 0 },
+-    { &read_config_read_octet_string_const, "0x010002",   4, -1, obuf1, 3 },
+-    { &read_config_read_octet_string_const, "0x010002 0", 4,  9, obuf1, 3 },
+-    { &read_config_read_octet_string_const, "0x010002",   0, -1, obuf1, 3 },
+-
+-    { &read_config_read_octet_string_const, "abc",        1, -1, NULL,  0 },
+-    { &read_config_read_octet_string_const, "abc z",      1,  4, NULL,  0 },
+-    { &read_config_read_octet_string_const, "abc",        2, -1, NULL,  1 },
+-    { &read_config_read_octet_string_const, "abc",        3, -1, obuf2, 2 },
+-    { &read_config_read_octet_string_const, "abc",        4, -1, obuf2, 3 },
+-    { &read_config_read_octet_string_const, "abc z",      4,  4, obuf2, 3 },
+-    { &read_config_read_octet_string_const, "abc",        0, -1, obuf2, 3 },
+-};
+-
+-int
+-main(int argc, char **argv)
+-{
+-    int             failure_count = 0;
+-    unsigned int    i, j;
+-
+-    printf("Start of unit test.\n");
+-    for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) {
+-        const struct read_config_testcase *const p = &test_input[i];
+-        size_t          len = p->obuf_len;
+-        u_char         *str = len > 0 ? malloc(len) : NULL;
+-        const char     *result;
+-        size_t          offset;
+-
+-        printf("Test %d ...\n", i);
+-        fflush(stdout);
+-        result = (p->pf) (p->readfrom, &str, &len);
+-        offset = result ? result - p->readfrom : -1;
+-        if (offset != p->expected_offset) {
+-            failure_count++;
+-            printf("test %d: expected offset %zd, got offset %" NETSNMP_PRIz "d\n",
+-                   i, p->expected_offset, offset);
+-        } else if (len != p->expected_len) {
+-            failure_count++;
+-            printf("test %d: expected length %d, got length %d\n",
+-                   i, p->expected_len, len);
+-        } else if (len >= 0 && p->expected_output
+-                   && memcmp(str, p->expected_output, len) != 0
+-                   && p->expected_output[len] == 0) {
+-            failure_count++;
+-            printf("test %d: output buffer mismatch\n", i);
+-            printf("Expected: ");
+-            for (j = 0; j < p->expected_len; ++j)
+-                printf("%02x ", p->expected_output[j]);
+-            printf("\nActual:   ");
+-            for (j = 0; j < len; ++j)
+-                printf("%02x ", str[j]);
+-            printf("\n");
+-        }
+-
+-        if (str)
+-            free(str);
+-    }
+-    if (failure_count == 0)
+-        printf("All %d tests passed.\n", i);
+-    return 0;
+-}
+-#endif                          /* READ_CONFIG_UNIT_TEST */
+-
+-/*
+- * Local variables:
+- * c-basic-offset: 4
+- * indent-tabs-mode: nil
+- * compile-command: "gcc -Wall -Werror -DREAD_CONFIG_UNIT_TEST=1 -O1 -I../include -g -o read_config-unit-test read_config.c && ./read_config-unit-test && valgrind --leak-check=full ./read_config-unit-test"
+- * End:
+- */
+diff --git a/snmplib/scapi.c b/snmplib/scapi.c
+index a397344..fdd33ff 100644
+--- a/snmplib/scapi.c
++++ b/snmplib/scapi.c
+@@ -116,12 +116,12 @@ netsnmp_feature_child_of(usm_scapi, usm_support)
+ 
+ #ifdef NETSNMP_USE_INTERNAL_CRYPTO
+ static
+-int SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+-              u_char * secret, size_t secretlen);
++int SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
++              const u_char * secret, size_t secretlen);
+ 
+ static
+-int MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+-             u_char * secret, size_t secretlen);
++int MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
++             const u_char * secret, size_t secretlen);
+ #endif
+ 
+ /*
+@@ -454,7 +454,7 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf,
+ 
+ #ifdef NETSNMP_USE_OPENSSL
+     const EVP_MD   *hashfn;
+-    EVP_MD_CTX     ctx, *cptr;
++    EVP_MD_CTX     *cptr;
+ #endif
+ #ifdef NETSNMP_USE_INTERNAL_CRYPTO
+     MD5_CTX        cmd5;
+@@ -485,42 +485,32 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf,
+     }
+ 
+ /** initialize the pointer */
+-    memset(&ctx, 0, sizeof(ctx));
+-    cptr = &ctx;
++#ifdef HAVE_EVP_MD_CTX_CREATE
++    cptr = EVP_MD_CTX_create();
++#else
++    cptr = malloc(sizeof(*cptr));
+ #if defined(OLD_DES)
+-    EVP_DigestInit(cptr, hashfn);
+-#else /* !OLD_DES */
+-    /* this is needed if the runtime library is different than the compiled
+-       library since the openssl versions are very different. */
+-    if (SSLeay() < 0x907000) {
+-        /* the old version of the struct was bigger and thus more
+-           memory is needed. should be 152, but we use 256 for safety. */
+-        cptr = (EVP_MD_CTX *)malloc(256);
+-        EVP_DigestInit(cptr, hashfn);
+-    } else {
+-        EVP_MD_CTX_init(cptr);
+-        EVP_DigestInit(cptr, hashfn);
+-    }
++    memset(cptr, 0, sizeof(*cptr));
++#else
++    EVP_MD_CTX_init(cptr);
++#endif
+ #endif
++    EVP_DigestInit(cptr, hashfn);
+ 
+ /** pass the data */
+     EVP_DigestUpdate(cptr, buf, buf_len);
+ 
+ /** do the final pass */
+-#if defined(OLD_DES)
+     EVP_DigestFinal(cptr, MAC, &tmp_len);
+     *MAC_len = tmp_len;
+-#else /* !OLD_DES */
+-    if (SSLeay() < 0x907000) {
+-        EVP_DigestFinal(cptr, MAC, &tmp_len);
+-        *MAC_len = tmp_len;
+-        free(cptr);
+-    } else {
+-        EVP_DigestFinal_ex(cptr, MAC, &tmp_len);
+-        *MAC_len = tmp_len;
+-        EVP_MD_CTX_cleanup(cptr);
+-    }
+-#endif                          /* OLD_DES */
++#ifdef HAVE_EVP_MD_CTX_DESTROY
++    EVP_MD_CTX_destroy(cptr);
++#else
++#if !defined(OLD_DES)
++    EVP_MD_CTX_cleanup(cptr);
++#endif
++    free(cptr);
++#endif
+     return (rval);
+ 
+ #elif NETSNMP_USE_INTERNAL_CRYPTO
+@@ -1171,8 +1161,8 @@ sc_decrypt(const oid * privtype, size_t privtypelen,
+  * of data, and prepended with a secret in the standard fashion 
+  */
+ static int
+-MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+-         u_char * secret, size_t secretlen)
++MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
++         const u_char * secret, size_t secretlen)
+ {
+ #define MD5_HASHKEYLEN 64
+ #define MD5_SECRETKEYLEN 16
+@@ -1183,7 +1173,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+     u_char          extendedAuthKey[MD5_HASHKEYLEN];
+     u_char          buf[MD5_HASHKEYLEN];
+     size_t          i;
+-    u_char         *cp, *newdata = NULL;
++    const u_char   *cp;
++    u_char         *newdata = NULL;
+     int             rc = 0;
+ 
+     /*
+@@ -1268,8 +1259,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+ }
+ 
+ static int
+-SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+-         u_char * secret, size_t secretlen)
++SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
++          const u_char * secret, size_t secretlen)
+ {
+ #define SHA1_HASHKEYLEN   64
+ #define SHA1_SECRETKEYLEN 20
+@@ -1280,7 +1271,8 @@ SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
+     u_char          extendedAuthKey[SHA1_HASHKEYLEN];
+     u_char          buf[SHA1_HASHKEYLEN];
+     size_t          i;
+-    u_char         *cp, *newdata = NULL;
++    const u_char   *cp;
++    u_char         *newdata = NULL;
+     int             rc = 0;
+ 
+     /*
+diff --git a/snmplib/snmp-tc.c b/snmplib/snmp-tc.c
+index 3b73da2..891c3a0 100644
+--- a/snmplib/snmp-tc.c
++++ b/snmplib/snmp-tc.c
+@@ -163,7 +163,7 @@ date_n_time(const time_t * when, size_t * length)
+     string[7] = 0;
+     *length = 8;
+ 
+-#ifndef cygwin
++#if defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_TIMEZONE_VARIABLE)
+     /*
+      * Timezone offset
+      */
+diff --git a/snmplib/snmp_alarm.c b/snmplib/snmp_alarm.c
+index adfa93d..dc498cc 100644
+--- a/snmplib/snmp_alarm.c
++++ b/snmplib/snmp_alarm.c
+@@ -82,23 +82,22 @@ init_snmp_alarm(void)
+ void
+ sa_update_entry(struct snmp_alarm *a)
+ {
+-    if (a->t_last.tv_sec == 0 && a->t_last.tv_usec == 0) {
++    if (!timerisset(&a->t_last)) {
+         struct timeval  t_now;
+         /*
+          * Never been called yet, call time `t' from now.  
+          */
+         gettimeofday(&t_now, NULL);
+ 
+-        a->t_last.tv_sec = t_now.tv_sec;
+-        a->t_last.tv_usec = t_now.tv_usec;
++        a->t_last = t_now;
+ 
+         NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next);
+-    } else if (a->t_next.tv_sec == 0 && a->t_next.tv_usec == 0) {
++    } else if (!timerisset(&a->t_next)) {
+         /*
+          * We've been called but not reset for the next call.  
+          */
+         if (a->flags & SA_REPEAT) {
+-            if (a->t.tv_sec == 0 && a->t.tv_usec == 0) {
++            if (!timerisset(&a->t)) {
+                 DEBUGMSGTL(("snmp_alarm",
+                             "update_entry: illegal interval specified\n"));
+                 snmp_alarm_unregister(a->clientreg);
+@@ -144,7 +143,7 @@ snmp_alarm_unregister(unsigned int clientreg)
+         DEBUGMSGTL(("snmp_alarm", "unregistered alarm %d\n", 
+ 		    sa_ptr->clientreg));
+         /*
+-         * Note:  do not free the clientarg, its the clients responsibility 
++         * Note: do not free the clientarg, it's the client's responsibility 
+          */
+         free(sa_ptr);
+     } else {
+@@ -185,22 +184,13 @@ sa_find_next(void)
+     for (a = thealarms; a != NULL; a = a->next) {
+         if (!(a->flags & SA_FIRED)) {
+             /* check for time delta skew */
+-            if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec)
+-            {
++            if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec) {
+                 DEBUGMSGTL(("time_skew", "Time delta too big (%ld seconds), should be %ld seconds - fixing\n",
+ 		    (long)(a->t_next.tv_sec - t_now.tv_sec), (long)a->t.tv_sec));
+-                a->t_next.tv_sec = t_now.tv_sec + a->t.tv_sec;
+-                a->t_next.tv_usec = t_now.tv_usec + a->t.tv_usec;
+-           }
+-            if (lowest == NULL) {
+-               lowest = a;
+-            } else if (a->t_next.tv_sec == lowest->t_next.tv_sec) {
+-                if (a->t_next.tv_usec < lowest->t_next.tv_usec) {
+-                    lowest = a;
+-                }
+-            } else if (a->t_next.tv_sec < lowest->t_next.tv_sec) {
+-               lowest = a;
+-           }
++                NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next);
++            }
++            if (lowest == NULL || timercmp(&a->t_next, &lowest->t_next, <))
++                lowest = a;
+        }
+     }
+     return lowest;
+@@ -247,10 +237,8 @@ run_alarms(void)
+             DEBUGMSGTL(("snmp_alarm", "alarm %d completed\n", clientreg));
+ 
+             if ((a = sa_find_specific(clientreg)) != NULL) {
+-                a->t_last.tv_sec = t_now.tv_sec;
+-                a->t_last.tv_usec = t_now.tv_usec;
+-                a->t_next.tv_sec = 0;
+-                a->t_next.tv_usec = 0;
++                a->t_last = t_now;
++                timerclear(&a->t_next);
+                 a->flags &= ~SA_FIRED;
+                 sa_update_entry(a);
+             } else {
+@@ -274,39 +262,56 @@ alarm_handler(int a)
+ 
+ 
+ 
++/**
++ * Look up the time at which the next alarm will fire.
++ *
++ * @param[out] alarm_tm Time at which the next alarm will fire.
++ * @param[in] now Earliest time that should be written into *alarm_tm.
++ *
++ * @return Zero if no alarms are scheduled; non-zero 'clientreg' value
++ *   identifying the first alarm that will fire if one or more alarms are
++ *   scheduled.
++ */
+ int
+-get_next_alarm_delay_time(struct timeval *delta)
++netsnmp_get_next_alarm_time(struct timeval *alarm_tm, const struct timeval *now)
+ {
+     struct snmp_alarm *sa_ptr;
+-    struct timeval  t_now;
+ 
+     sa_ptr = sa_find_next();
+ 
+     if (sa_ptr) {
+-        gettimeofday(&t_now, NULL);
+-
+-        if (timercmp(&t_now, &sa_ptr->t_next, >)) {
+-            /*
+-             * Time has already passed.  Return the smallest possible amount of
+-             * time.  
+-             */
+-            delta->tv_sec = 0;
+-            delta->tv_usec = 1;
+-            return sa_ptr->clientreg;
+-        } else {
+-            /*
+-             * Time is still in the future.  
+-             */
+-            NETSNMP_TIMERSUB(&sa_ptr->t_next, &t_now, delta);
+-
+-            return sa_ptr->clientreg;
+-        }
++        netsnmp_assert(alarm_tm);
++        netsnmp_assert(timerisset(&sa_ptr->t_next));
++        if (timercmp(&sa_ptr->t_next, now, >))
++            *alarm_tm = sa_ptr->t_next;
++        else
++            *alarm_tm = *now;
++        return sa_ptr->clientreg;
++    } else {
++        return 0;
+     }
++}
+ 
+-    /*
+-     * Nothing Left.  
+-     */
+-    return 0;
++/**
++ * Get the time until the next alarm will fire.
++ *
++ * @param[out] delta Time until the next alarm.
++ *
++ * @return Zero if no alarms are scheduled; non-zero 'clientreg' value
++ *   identifying the first alarm that will fire if one or more alarms are
++ *   scheduled.
++ */
++int
++get_next_alarm_delay_time(struct timeval *delta)
++{
++    struct timeval t_now, alarm_tm;
++    int res;
++
++    gettimeofday(&t_now, NULL);
++    res = netsnmp_get_next_alarm_time(&alarm_tm, &t_now);
++    if (res)
++        NETSNMP_TIMERSUB(&alarm_tm, &t_now, delta);
++    return res;
+ }
+ 
+ 
+@@ -328,10 +333,8 @@ set_an_alarm(void)
+ # ifdef HAVE_SETITIMER
+         struct itimerval it;
+ 
+-        it.it_value.tv_sec = delta.tv_sec;
+-        it.it_value.tv_usec = delta.tv_usec;
+-        it.it_interval.tv_sec = 0;
+-        it.it_interval.tv_usec = 0;
++        it.it_value = delta;
++        timerclear(&it.it_interval);
+ 
+         signal(SIGALRM, alarm_handler);
+         setitimer(ITIMER_REAL, &it, NULL);
+@@ -452,8 +455,7 @@ snmp_alarm_register_hr(struct timeval t, unsigned int flags,
+         return 0;
+     }
+ 
+-    (*s)->t.tv_sec = t.tv_sec;
+-    (*s)->t.tv_usec = t.tv_usec;
++    (*s)->t = t;
+     (*s)->flags = flags;
+     (*s)->clientarg = cd;
+     (*s)->thecallback = cb;
+diff --git a/snmplib/snmp_api.c b/snmplib/snmp_api.c
+index df0dc1c..4fca5bf 100644
+--- a/snmplib/snmp_api.c
++++ b/snmplib/snmp_api.c
+@@ -506,8 +506,7 @@ void
+ snmp_set_detail(const char *detail_string)
+ {
+     if (detail_string != NULL) {
+-        strncpy((char *) snmp_detail, detail_string, sizeof(snmp_detail));
+-        snmp_detail[sizeof(snmp_detail) - 1] = '\0';
++        strlcpy((char *) snmp_detail, detail_string, sizeof(snmp_detail));
+         snmp_detail_f = 1;
+     }
+ }
+@@ -523,20 +522,22 @@ snmp_api_errstring(int snmp_errnumber)
+ {
+     const char     *msg = "";
+     static char     msg_buf[SPRINT_MAX_LEN];
++
+     if (snmp_errnumber >= SNMPERR_MAX && snmp_errnumber <= SNMPERR_GENERR) {
+         msg = api_errors[-snmp_errnumber];
+     } else if (snmp_errnumber != SNMPERR_SUCCESS) {
+         msg = NULL;
+     }
+-    if (!msg)
++    if (!msg) {
+ 	snprintf(msg_buf, sizeof(msg_buf), "Unknown error: %d", snmp_errnumber);
+-    else if (snmp_detail_f) {
++        msg_buf[sizeof(msg_buf)-1] = '\0';
++    } else if (snmp_detail_f) {
+         snprintf(msg_buf, sizeof(msg_buf), "%s (%s)", msg, snmp_detail);
++        msg_buf[sizeof(msg_buf)-1] = '\0';
+         snmp_detail_f = 0;
+     } else {
+-        strncpy(msg_buf, msg, sizeof(msg_buf));
++        strlcpy(msg_buf, msg, sizeof(msg_buf));
+     }
+-    msg_buf[sizeof(msg_buf)-1] = '\0';
+ 
+     return (msg_buf);
+ }
+@@ -566,15 +567,17 @@ snmp_error(netsnmp_session * psess,
+ 	if (snmp_detail_f) {
+             snprintf(buf, sizeof(buf), "%s (%s)", api_errors[-snmp_errnumber],
+ 		    snmp_detail);
++            buf[sizeof(buf)-1] = '\0';
+ 	    snmp_detail_f = 0;
+ 	}
+ 	else
+-	    strncpy(buf, api_errors[-snmp_errnumber], sizeof(buf));
++	    strlcpy(buf, api_errors[-snmp_errnumber], sizeof(buf));
+     } else {
+-        if (snmp_errnumber)
++        if (snmp_errnumber) {
+             snprintf(buf, sizeof(buf), "Unknown Error %d", snmp_errnumber);
++            buf[sizeof(buf)-1] = '\0';
++        }
+     }
+-    buf[sizeof(buf)-1] = '\0';
+ 
+     /*
+      * append a useful system errno interpretation. 
+@@ -704,6 +707,8 @@ _init_snmp(void)
+ 
+     netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, 
+                        NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH, 16);
++    netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RETRIES,
++                       DEFAULT_RETRIES);
+ 
+ #ifdef NETSNMP_USE_REVERSE_ASNENCODING
+     netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
+@@ -1280,6 +1285,7 @@ snmpv3_probe_contextEngineID_rfc5343(void *slp, netsnmp_session *session) {
+     if (memdup(&pdu->contextEngineID, probeEngineID, probeEngineID_len) !=
+         SNMPERR_SUCCESS) {
+         snmp_log(LOG_ERR, "failed to clone memory for rfc5343 probe\n");
++        snmp_free_pdu(pdu);
+         return SNMP_ERR_GENERR;
+     }
+     pdu->contextEngineIDLen = probeEngineID_len;
+@@ -1390,7 +1396,7 @@ snmpv3_engineID_probe(struct session_list *slp,
+     }
+ 
+     /* see if there was any hooks to call after the engineID probing */
+-    if (sptr->post_probe_engineid) {
++    if (sptr && sptr->post_probe_engineid) {
+         status = (*sptr->post_probe_engineid)(slp, in_session);
+         if (status != SNMPERR_SUCCESS)
+             return 0;
+@@ -5341,8 +5347,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp,
+ 	    if (sp->securityEngineID == NULL) {
+ 	      /*
+ 	       * TODO FIX: recover after message callback *?
+-	       * return -1;
+-	       */
++               */
++	      return -1;
+ 	    }
+ 	    memcpy(sp->securityEngineID, pdu->securityEngineID,
+ 		   pdu->securityEngineIDLen);
+@@ -5354,8 +5360,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp,
+ 	      if (sp->contextEngineID == NULL) {
+ 		/*
+ 		 * TODO FIX: recover after message callback *?
+-		 * return -1;
+ 		 */
++                return -1;
+ 	      }
+ 	      memcpy(sp->contextEngineID,
+ 		     pdu->securityEngineID,
+@@ -5868,7 +5874,7 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset)
+ }
+ 
+ 
+-/*
++/**
+  * Returns info about what snmp requires from a select statement.
+  * numfds is the number of fds in the list that are significant.
+  * All file descriptors opened for SNMP are OR'd into the fdset.
+@@ -5889,54 +5895,43 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset)
+  *
+  * snmp_select_info returns the number of open sockets.  (i.e. The number of
+  * sessions open)
++ *
++ * @see See also snmp_sess_select_info2_flags().
+  */
+-
+ int
+-snmp_select_info(int *numfds,
+-                 fd_set * fdset, struct timeval *timeout, int *block)
+-    /*
+-     * input:  set to 1 if input timeout value is undefined  
+-     * set to 0 if input timeout value is defined    
+-     * output: set to 1 if output timeout value is undefined 
+-     * set to 0 if output rimeout vlaue id defined   
+-     */
++snmp_select_info(int *numfds, fd_set *fdset, struct timeval *timeout,
++                 int *block)
+ {
+-    return snmp_sess_select_info((void *) 0, numfds, fdset, timeout,
+-                                 block);
++    return snmp_sess_select_info(NULL, numfds, fdset, timeout, block);
+ }
+ 
++/**
++ * @see See also snmp_sess_select_info2_flags().
++ */
+ int
+-snmp_select_info2(int *numfds,
+-                  netsnmp_large_fd_set * fdset,
++snmp_select_info2(int *numfds, netsnmp_large_fd_set *fdset,
+ 		  struct timeval *timeout, int *block)
+-    /*
+-     * input:  set to 1 if input timeout value is undefined  
+-     * set to 0 if input timeout value is defined    
+-     * output: set to 1 if output timeout value is undefined 
+-     * set to 0 if output rimeout vlaue id defined   
+-     */
+ {
+-    return snmp_sess_select_info2((void *) 0, numfds, fdset, timeout,
+-                                  block);
++    return snmp_sess_select_info2(NULL, numfds, fdset, timeout, block);
+ }
+ 
+-/*
+- * Same as snmp_select_info, but works just one session. 
++/**
++ * @see See also snmp_sess_select_info2_flags().
+  */
+ int
+-snmp_sess_select_info(void *sessp,
+-                      int *numfds,
+-                      fd_set * fdset, struct timeval *timeout, int *block)
++snmp_sess_select_info(void *sessp, int *numfds, fd_set *fdset,
++                      struct timeval *timeout, int *block)
+ {
+     return snmp_sess_select_info_flags(sessp, numfds, fdset, timeout, block,