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(¤t, NULL); - NETSNMP_TIMERSUB(¤t, 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, ¤t_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 *) ð_strings->data[i * ETH_GSTRING_LEN], - ETH_GSTRING_LEN); + strlcpy(s, (const char *) ð_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 #include +#include #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 #include #include +#ifdef HAVE_INTTYPES_H +#include +#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, ""); + strlcpy(string, "", 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 *) ð_strings->data[i * ETH_GSTRING_LEN], - ETH_GSTRING_LEN); + strlcpy(s, (const char *) ð_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 @@ -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 #include -#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN) - #include #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 + +#include +#if HAVE_STDDEF_H +#include +#endif +#include +#if HAVE_STRING_H +#include +#else +#include +#endif + +#include +#include +#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, ¬_argc, ¬_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 + #include +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 +#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 +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# 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 #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 ], - [BIO_dgram_get_peer(NULL, NULL);],, - AC_MSG_ERROR([DTLS support requires a newer version of OpenSSL])) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[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 + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include 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 + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include #include 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 + #include ]], [[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 +#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 +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +]], [[ + return timezone; +]])], [ +AC_MSG_RESULT([yes]) +AC_DEFINE([HAVE_TIMEZONE_VARIABLE], [1], [Define if a timezone variable is declared in ]) +], [ +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. + + + 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. + + @@ -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 @@ git commit -m "make depend for {VERSION}" `find . -name Makefile.depend` - + We need to extract the portions of the change logs committed to the repository. - - - git2cl | head -10000 > ChangeLog.add - perl dist/changelogfix < ChangeLog.add > ChangeLog.reallyadd + git log --no-merges {LASTVERSIONTAGNAME}..HEAD > ChangeLog.add 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 @@ - perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.reallyadd + perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.add 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 #endif -#if defined(HAVE_WINSOCK_H) && ! defined(_WINSOCKAPI_) && ! defined(_WINSOCK_H) +#if defined(HAVE_WINSOCK_H) && !defined(_WINSOCKAPI_) && !defined(_WINSOCK_H) #error or 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 * The Single UNIX Specification, Version 2, <sys/time.h>. */ -#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 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 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 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 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 */ +#undef HAVE_TIMEZONE_VARIABLE + /* Define to 1 if you have the 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 #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 formats accepted. for syncronous operation will be updated with value(s) and type(s) and will also return retrieved value(s). If supplied method -will operate asyncronously +will operate asynchronously =item $sess->fget(EvarsE [,EcallbackE]) @@ -1852,7 +1858,7 @@ and Note: simple string ,(e.g., 'sysDescr.0') form is not updated. If supplied method -will operate asyncronously +will operate asynchronously =item $sess->fgetnext(EvarsE [,EcallbackE]) @@ -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 description section), returns snmp_errno. If supplied method -will operate asyncronously +will operate asynchronously =item $sess->getbulk(Enon-repeatersE, Emax-repeatersE, EvarsE) @@ -1985,7 +1991,7 @@ collect all the columns defined in the MIB table. Specifies a GETBULK repeat I. 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 ) 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 +#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 #include #include @@ -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 -* -*/ +/** + * @file int64.c + * + * @brief Functions for 64-bit integer computations. + * + * 21-jan-1998: David Perkins + */ #include #include @@ -24,17 +25,13 @@ #include -#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 ...\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 -#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 - -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, NETSNMP_SELECT_NOFLAGS); } +/** + * @see See also snmp_sess_select_info2_flags(). + */ int -snmp_sess_select_info_flags(void *sessp, - int *numfds, - fd_set * fdset, struct timeval *timeout, int *block, - int flags) +snmp_sess_select_info_flags(void *sessp, int *numfds, fd_set *fdset, + struct timeval *timeout, int *block, int flags) { int rc; netsnmp_large_fd_set lfdset; @@ -5954,47 +5949,67 @@ snmp_sess_select_info_flags(void *sessp, return rc; } +/** + * @see See also snmp_sess_select_info2_flags(). + */ int -snmp_sess_select_info2(void *sessp, - int *numfds, - netsnmp_large_fd_set * fdset, +snmp_sess_select_info2(void *sessp, int *numfds, netsnmp_large_fd_set *fdset, struct timeval *timeout, int *block) { return snmp_sess_select_info2_flags(sessp, numfds, fdset, timeout, block, NETSNMP_SELECT_NOFLAGS); } +/** + * Compute/update the arguments to be passed to select(). + * + * @param[in] sessp Which sessions to process: either a pointer to a + * specific session or NULL which means to process all sessions. + * @param[in,out] numfds On POSIX systems one more than the the largest file + * descriptor that is present in *fdset. On systems that use Winsock (MinGW + * and MSVC), do not use the value written into *numfds. + * @param[in,out] fdset A large file descriptor set to which all file + * descriptors will be added that are associated with one of the examined + * sessions. + * @param[in,out] timeout On input, if *block = 1, the maximum time the caller + * will block while waiting for Net-SNMP activity. On output, if this function + * has set *block to 0, the maximum time the caller is allowed to wait before + * invoking the Net-SNMP processing functions (snmp_read(), snmp_timeout() + * and run_alarms()). If this function has set *block to 1, *timeout won't + * have been modified and no alarms are active. + * @param[in,out] block On input, whether the caller prefers to block forever + * when no alarms are active. On output, 0 means that no alarms are active + * nor that there is a timeout pending for any of the processed sessions. + * @param[in] flags Either 0 or NETSNMP_SELECT_NOALARMS. + * + * @return Number of sessions processed by this function. + * + * @see See also agent_check_and_process() for an example of how to use this + * function. + */ int -snmp_sess_select_info2_flags(void *sessp, - int *numfds, - netsnmp_large_fd_set * fdset, - struct timeval *timeout, int *block, int flags) +snmp_sess_select_info2_flags(void *sessp, int *numfds, + netsnmp_large_fd_set * fdset, + struct timeval *timeout, int *block, int flags) { - struct session_list *slptest = (struct session_list *) sessp; struct session_list *slp, *next = NULL; netsnmp_request_list *rp; - struct timeval now, earliest, delta; + struct timeval now, earliest, alarm_tm; int active = 0, requests = 0; int next_alarm = 0; timerclear(&earliest); /* - * For each request outstanding, add its socket to the fdset, + * For each session examined, add its socket to the fdset, * and if it is the earliest timeout to expire, mark it as lowest. * If a single session is specified, do just for that session. */ - if (sessp) { - slp = slptest; - } else { - slp = Sessions; - } - DEBUGMSGTL(("sess_select", "for %s session%s: ", sessp ? "single" : "all", sessp ? "" : "s")); - for (; slp; slp = next) { + for (slp = sessp ? sessp : Sessions; slp; slp = next) { next = slp->next; if (slp->transport == NULL) { @@ -6032,8 +6047,9 @@ snmp_sess_select_info2_flags(void *sessp, */ requests++; for (rp = slp->internal->requests; rp; rp = rp->next_request) { - if ((!timerisset(&earliest) - || (timercmp(&rp->expire, &earliest, <)))) { + if (!timerisset(&earliest) + || (timerisset(&rp->expire) + && timercmp(&rp->expire, &earliest, <))) { earliest = rp->expire; DEBUGMSG(("verbose:sess_select","(to in %d.%06d sec) ", (int)earliest.tv_sec, (int)earliest.tv_usec)); @@ -6051,12 +6067,15 @@ snmp_sess_select_info2_flags(void *sessp, } DEBUGMSG(("sess_select", "\n")); + gettimeofday(&now, NULL); + if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_ALARM_DONT_USE_SIG) && !(flags & NETSNMP_SELECT_NOALARMS)) { - next_alarm = get_next_alarm_delay_time(&delta); - DEBUGMSGT(("sess_select","next alarm %d.%06d sec\n", - (int)delta.tv_sec, (int)delta.tv_usec)); + next_alarm = netsnmp_get_next_alarm_time(&alarm_tm, &now); + if (next_alarm) + DEBUGMSGT(("sess_select","next alarm at %ld.%06ld sec\n", + (long)alarm_tm.tv_sec, (long)alarm_tm.tv_usec)); } if (next_alarm == 0 && requests == 0) { /* @@ -6067,51 +6086,18 @@ snmp_sess_select_info2_flags(void *sessp, return active; } - /* - * * Now find out how much time until the earliest timeout. This - * * transforms earliest from an absolute time into a delta time, the - * * time left until the select should timeout. - */ - gettimeofday(&now, (struct timezone *) 0); - /* - * Now = now; - */ + if (next_alarm && + (!timerisset(&earliest) || timercmp(&alarm_tm, &earliest, <))) + earliest = alarm_tm; - if (next_alarm) { - delta.tv_sec += now.tv_sec; - delta.tv_usec += now.tv_usec; - while (delta.tv_usec >= 1000000) { - delta.tv_usec -= 1000000; - delta.tv_sec += 1; - } - if (!timerisset(&earliest) || - ((earliest.tv_sec > delta.tv_sec) || - ((earliest.tv_sec == delta.tv_sec) && - (earliest.tv_usec > delta.tv_usec)))) { - earliest.tv_sec = delta.tv_sec; - earliest.tv_usec = delta.tv_usec; - } - } - - if (earliest.tv_sec < now.tv_sec) { - DEBUGMSGT(("verbose:sess_select","timer overdue\n")); - earliest.tv_sec = 0; - earliest.tv_usec = 0; - } else if (earliest.tv_sec == now.tv_sec) { - earliest.tv_sec = 0; - earliest.tv_usec = (earliest.tv_usec - now.tv_usec); - if (earliest.tv_usec < 0) { - earliest.tv_usec = 100; - } - DEBUGMSGT(("verbose:sess_select","timer due *real* soon. %d usec\n", - (int)earliest.tv_usec)); + NETSNMP_TIMERSUB(&earliest, &now, &earliest); + if (earliest.tv_sec < 0) { + time_t overdue_ms = -(earliest.tv_sec * 1000 + earliest.tv_usec / 1000); + if (overdue_ms >= 10) + DEBUGMSGT(("verbose:sess_select","timer overdue by %ld ms\n", + overdue_ms)); + timerclear(&earliest); } else { - earliest.tv_sec = (earliest.tv_sec - now.tv_sec); - earliest.tv_usec = (earliest.tv_usec - now.tv_usec); - if (earliest.tv_usec < 0) { - earliest.tv_sec--; - earliest.tv_usec = (1000000L + earliest.tv_usec); - } DEBUGMSGT(("verbose:sess_select","timer due in %d.%06d sec\n", (int)earliest.tv_sec, (int)earliest.tv_usec)); } diff --git a/snmplib/snmp_client.c b/snmplib/snmp_client.c index ae57613..c1aa9c4 100644 --- a/snmplib/snmp_client.c +++ b/snmplib/snmp_client.c @@ -804,6 +804,11 @@ snmp_set_var_value(netsnmp_variable_list * vars, vars->val.string = NULL; vars->val_len = 0; + if (value == NULL && len > 0) { + snmp_log(LOG_ERR, "bad size for NULL value\n"); + return 1; + } + /* * use built-in storage for smaller values */ @@ -823,84 +828,82 @@ snmp_set_var_value(netsnmp_variable_list * vars, case ASN_UNSIGNED: case ASN_TIMETICKS: case ASN_COUNTER: - if (value) { - if (vars->val_len == sizeof(int)) { - if (ASN_INTEGER == vars->type) { - const int *val_int - = (const int *) value; - *(vars->val.integer) = (long) *val_int; - } else { - const u_int *val_uint - = (const u_int *) value; - *(vars->val.integer) = (unsigned long) *val_uint; - } + case ASN_UINTEGER: + if (vars->val_len == sizeof(int)) { + if (ASN_INTEGER == vars->type) { + const int *val_int + = (const int *) value; + *(vars->val.integer) = (long) *val_int; + } else { + const u_int *val_uint + = (const u_int *) value; + *(vars->val.integer) = (unsigned long) *val_uint; } + } #if SIZEOF_LONG != SIZEOF_INT - else if (vars->val_len == sizeof(long)){ - const u_long *val_ulong - = (const u_long *) value; - *(vars->val.integer) = *val_ulong; - if (*(vars->val.integer) > 0xffffffff) { - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); - *(vars->val.integer) &= 0xffffffff; - } + else if (vars->val_len == sizeof(long)){ + const u_long *val_ulong + = (const u_long *) value; + *(vars->val.integer) = *val_ulong; + if (*(vars->val.integer) > 0xffffffff) { + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); + *(vars->val.integer) &= 0xffffffff; } + } #endif #if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG != SIZEOF_LONG_LONG) #if !defined(SIZEOF_INTMAX_T) || (SIZEOF_LONG_LONG != SIZEOF_INTMAX_T) - else if (vars->val_len == sizeof(long long)){ - const unsigned long long *val_ullong - = (const unsigned long long *) value; - *(vars->val.integer) = (long) *val_ullong; - if (*(vars->val.integer) > 0xffffffff) { - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); - *(vars->val.integer) &= 0xffffffff; - } + else if (vars->val_len == sizeof(long long)){ + const unsigned long long *val_ullong + = (const unsigned long long *) value; + *(vars->val.integer) = (long) *val_ullong; + if (*(vars->val.integer) > 0xffffffff) { + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); + *(vars->val.integer) &= 0xffffffff; } + } #endif #endif #if defined(SIZEOF_INTMAX_T) && (SIZEOF_LONG != SIZEOF_INTMAX_T) - else if (vars->val_len == sizeof(intmax_t)){ - const uintmax_t *val_uintmax_t - = (const uintmax_t *) value; - *(vars->val.integer) = (long) *val_uintmax_t; - if (*(vars->val.integer) > 0xffffffff) { - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); - *(vars->val.integer) &= 0xffffffff; - } + else if (vars->val_len == sizeof(intmax_t)){ + const uintmax_t *val_uintmax_t + = (const uintmax_t *) value; + *(vars->val.integer) = (long) *val_uintmax_t; + if (*(vars->val.integer) > 0xffffffff) { + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); + *(vars->val.integer) &= 0xffffffff; } + } #endif #if SIZEOF_SHORT != SIZEOF_INT - else if (vars->val_len == sizeof(short)) { - if (ASN_INTEGER == vars->type) { - const short *val_short - = (const short *) value; - *(vars->val.integer) = (long) *val_short; - } else { - const u_short *val_ushort - = (const u_short *) value; - *(vars->val.integer) = (unsigned long) *val_ushort; - } + else if (vars->val_len == sizeof(short)) { + if (ASN_INTEGER == vars->type) { + const short *val_short + = (const short *) value; + *(vars->val.integer) = (long) *val_short; + } else { + const u_short *val_ushort + = (const u_short *) value; + *(vars->val.integer) = (unsigned long) *val_ushort; } + } #endif - else if (vars->val_len == sizeof(char)) { - if (ASN_INTEGER == vars->type) { - const char *val_char - = (const char *) value; - *(vars->val.integer) = (long) *val_char; - } else { + else if (vars->val_len == sizeof(char)) { + if (ASN_INTEGER == vars->type) { + const char *val_char + = (const char *) value; + *(vars->val.integer) = (long) *val_char; + } else { const u_char *val_uchar - = (const u_char *) value; - *(vars->val.integer) = (unsigned long) *val_uchar; - } - } - else { - snmp_log(LOG_ERR,"bad size for integer-like type (%d)\n", - (int)vars->val_len); - return (1); + = (const u_char *) value; + *(vars->val.integer) = (unsigned long) *val_uchar; } - } else - *(vars->val.integer) = 0; + } + else { + snmp_log(LOG_ERR,"bad size for integer-like type (%d)\n", + (int)vars->val_len); + return (1); + } vars->val_len = sizeof(long); break; diff --git a/snmplib/snmp_enum.c b/snmplib/snmp_enum.c index cac0ed3..8a6bd38 100644 --- a/snmplib/snmp_enum.c +++ b/snmplib/snmp_enum.c @@ -156,12 +156,12 @@ se_read_conf(const char *word, char *cptr) void se_store_enum_list(struct snmp_enum_list *new_list, - const char *token, char *type) + const char *token, const char *type) { struct snmp_enum_list *listp = new_list; char line[2048]; char buf[512]; - int len = 0; + int len; snprintf(line, sizeof(line), "enum %s", token); while (listp) { @@ -175,26 +175,19 @@ se_store_enum_list(struct snmp_enum_list *new_list, if ((int)strlen(buf) > len) { read_config_store(type, line); snprintf(line, sizeof(line), "enum %s", token); - len = sizeof(line); + len = sizeof(line) - strlen(line); } strncat(line, buf, len); listp = listp->next; } - /* - * If there's anything left, then save that. - * But don't bother saving an empty 'overflow' line. - */ - if (len != sizeof(line)) - read_config_store(type, line); - - return; + read_config_store(type, line); } #ifndef NETSNMP_FEATURE_REMOVE_SNMP_ENUM_STORE_LIST void -se_store_list(unsigned int major, unsigned int minor, char *type) +se_store_list(unsigned int major, unsigned int minor, const char *type) { char token[32]; @@ -297,8 +290,10 @@ se_add_pair_to_list(struct snmp_enum_list **list, char *label, int value) (*list) = SNMP_MALLOC_STRUCT(snmp_enum_list); lastnode = (*list); } - if (!lastnode) + if (!lastnode) { + free(label); return (SE_NOMEM); + } lastnode->label = label; lastnode->value = value; lastnode->next = NULL; @@ -445,7 +440,7 @@ se_clear_list(struct snmp_enum_list **list) #ifndef NETSNMP_FEATURE_REMOVE_SNMP_ENUM_STORE_SLIST void -se_store_slist(const char *listname, char *type) +se_store_slist(const char *listname, const char *type) { struct snmp_enum_list *list = se_find_slist(listname); se_store_enum_list(list, listname, type); diff --git a/snmplib/snmp_logging.c b/snmplib/snmp_logging.c index 37d5948..a2cd55a 100644 --- a/snmplib/snmp_logging.c +++ b/snmplib/snmp_logging.c @@ -535,7 +535,7 @@ char * snmp_log_syslogname(const char *pstr) { if (pstr) - strncpy (syslogname, pstr, sizeof(syslogname)); + strlcpy (syslogname, pstr, sizeof(syslogname)); return syslogname; } diff --git a/snmplib/snmp_openssl.c b/snmplib/snmp_openssl.c index da5c114..3b0eaa8 100644 --- a/snmplib/snmp_openssl.c +++ b/snmplib/snmp_openssl.c @@ -737,7 +737,7 @@ _cert_get_san_type(X509 *ocert, int mapType) if (lower) for ( ; *lower; ++lower ) if (isascii(*lower)) - *lower = tolower(*lower); + *lower = tolower(0xFF & *lower); DEBUGMSGT(("openssl:cert:extension:san", "#%d type %d: %s\n", i, oname ? oname->type : -1, buf ? buf : "NULL")); diff --git a/snmplib/snmp_parse_args.c b/snmplib/snmp_parse_args.c index e47542e..c73b84c 100644 --- a/snmplib/snmp_parse_args.c +++ b/snmplib/snmp_parse_args.c @@ -209,8 +209,13 @@ netsnmp_parse_args(int argc, */ snmp_sess_init(session); strcpy(Opts, "Y:VhHm:M:O:I:P:D:dv:r:t:c:Z:e:E:n:u:l:x:X:a:A:p:T:-:3:s:S:L:"); - if (localOpts) + if (localOpts) { + if (strlen(localOpts) + strlen(Opts) >= sizeof(Opts)) { + snmp_log(LOG_ERR, "Too many localOpts in snmp_parse_args()\n"); + return -1; + } strcat(Opts, localOpts); + } /* * get the options @@ -364,10 +369,8 @@ netsnmp_parse_args(int argc, } /* set the config */ - strncpy(leftside, tmpopt, sizeof(leftside)); - leftside[sizeof(leftside)-1] = '0'; - strncpy(rightside, tmpcp, sizeof(rightside)); - rightside[sizeof(rightside)-1] = '0'; + strlcpy(leftside, tmpopt, sizeof(leftside)); + strlcpy(rightside, tmpcp, sizeof(rightside)); CONTAINER_INSERT(session->transport_configuration, netsnmp_transport_create_config(leftside, diff --git a/snmplib/snmp_service.c b/snmplib/snmp_service.c index 90af5e4..ce7e8be 100644 --- a/snmplib/snmp_service.c +++ b/snmplib/snmp_service.c @@ -227,6 +227,15 @@ struct netsnmp_lookup_target { static struct netsnmp_lookup_target* targets = NULL; +/** + * Add an (application, domain, target) triplet to the targets list if target + * != NULL. Remove an entry if target == NULL and the userTarget pointer for + * the entry found is also NULL. Keep at most one target per (application, + * domain) pair. + * + * @return 1 if an entry for (application, domain) was already present in the + * targets list or 0 if such an entry was not yet present in the targets list. + */ int netsnmp_register_default_target(const char* application, const char* domain, const char* target) @@ -271,6 +280,9 @@ netsnmp_register_default_target(const char* application, const char* domain, return res; } +/** + * Clear the targets list. + */ void netsnmp_clear_default_target(void) { diff --git a/snmplib/snmp_transport.c b/snmplib/snmp_transport.c index ae2b3ee..85a4f35 100644 --- a/snmplib/snmp_transport.c +++ b/snmplib/snmp_transport.c @@ -127,11 +127,10 @@ netsnmp_transport_copy(netsnmp_transport *t) return NULL; } - n = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + n = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (n == NULL) { return NULL; } - memset(n, 0, sizeof(netsnmp_transport)); if (t->domain != NULL) { n->domain = t->domain; @@ -551,7 +550,7 @@ netsnmp_tdomain_transport_full(const char *application, if (NULL != (newhost = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_HOSTNAME))) { - strncpy(buf, newhost, sizeof(buf)-1); + strlcpy(buf, newhost, sizeof(buf)); str = buf; } diff --git a/snmplib/snmptsm.c b/snmplib/snmptsm.c index 778001e..bf4b612 100644 --- a/snmplib/snmptsm.c +++ b/snmplib/snmptsm.c @@ -193,6 +193,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) size_t *wholeMsgLen = parms->wholeMsgLen; netsnmp_tsmSecurityReference *tsmSecRef; netsnmp_tmStateReference *tmStateRef; + int tmStateRefLocal = 0; DEBUGMSGTL(("tsm", "Starting TSM processing\n")); @@ -229,7 +230,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) tmStateReference cache. */ tmStateRef = SNMP_MALLOC_TYPEDEF(netsnmp_tmStateReference); netsnmp_assert_or_return(NULL != tmStateRef, SNMPERR_GENERR); - + tmStateRefLocal = 1; + /* XXX: we don't actually use this really in our implementation */ /* 4.2, step 2: Set tmTransportDomain to the value of transportDomain, tmTransportAddress to the value of @@ -263,6 +265,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) incremented, an error indication is returned to the calling module, and message processing stops. */ snmp_increment_statistic(STAT_TSM_SNMPTSMUNKNOWNPREFIXES); + SNMP_FREE(tmStateRef); return SNMPERR_GENERR; } @@ -281,6 +284,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) /* Note: since we're assiging the prefixes above the prefix lengths always meet the 1-4 criteria */ snmp_increment_statistic(STAT_TSM_SNMPTSMINVALIDPREFIXES); + SNMP_FREE(tmStateRef); return SNMPERR_GENERR; } @@ -315,6 +319,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) DEBUGINDENTLESS(); if (rc == 0) { DEBUGMSGTL(("tsm", "building msgSecurityParameters failed.\n")); + if (tmStateRefLocal) + SNMP_FREE(tmStateRef); return SNMPERR_TOO_LONG; } @@ -324,6 +330,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) while ((*wholeMsgLen - *offset) < parms->globalDataLen) { if (!asn_realloc(wholeMsg, wholeMsgLen)) { DEBUGMSGTL(("tsm", "building global data failed.\n")); + if (tmStateRefLocal) + SNMP_FREE(tmStateRef); return SNMPERR_TOO_LONG; } } @@ -347,6 +355,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) ASN_CONSTRUCTOR), *offset); if (rc == 0) { DEBUGMSGTL(("tsm", "building master packet sequence failed.\n")); + if (tmStateRefLocal) + SNMP_FREE(tmStateRef); return SNMPERR_TOO_LONG; } @@ -364,6 +374,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) } parms->pdu->transport_data_length = sizeof(*tmStateRef); + if (tmStateRefLocal) + SNMP_FREE(tmStateRef); DEBUGMSGTL(("tsm", "TSM processing completed.\n")); return SNMPERR_SUCCESS; } diff --git a/snmplib/snmpusm.c b/snmplib/snmpusm.c index 8a673dc..d8d8932 100644 --- a/snmplib/snmpusm.c +++ b/snmplib/snmpusm.c @@ -2727,6 +2727,7 @@ usm_handle_report(void *sessp, } session->s_snmp_errno = res; } + /* fallthrough */ case SNMPERR_USM_UNKNOWNENGINEID: case SNMPERR_USM_UNKNOWNSECURITYNAME: case SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL: @@ -3150,6 +3151,7 @@ int usm_discover_engineid(void *slpv, netsnmp_session *session) { break; case STAT_TIMEOUT: session->s_snmp_errno = SNMPERR_TIMEOUT; + break; default: DEBUGMSGTL(("snmp_sess_open", "unable to connect with remote engine: %s (%d)\n", @@ -4160,8 +4162,8 @@ usm_set_password(const char *token, char *line) { char *cp; char nameBuf[SNMP_MAXBUF]; - u_char *engineID; - size_t engineIDLen; + u_char *engineID = NULL; + size_t engineIDLen = 0; struct usmUser *user; cp = copy_nword(line, nameBuf, sizeof(nameBuf)); @@ -4185,15 +4187,18 @@ usm_set_password(const char *token, char *line) cp = read_config_read_octet_string(cp, &engineID, &engineIDLen); if (cp == NULL) { config_perror("invalid engineID specifier"); + SNMP_FREE(engineID); return; } user = usm_get_user(engineID, engineIDLen, nameBuf); if (user == NULL) { config_perror("not a valid user/engineID pair"); + SNMP_FREE(engineID); return; } usm_set_user_password(user, token, cp); + SNMP_FREE(engineID); } } diff --git a/snmplib/snmpv3.c b/snmplib/snmpv3.c index f8bd90b..3369fb6 100644 --- a/snmplib/snmpv3.c +++ b/snmplib/snmpv3.c @@ -1274,7 +1274,7 @@ getHwAddress(const char *networkDevice, /* e.g. "eth0", "eth1" */ /* * copy the name of the net device we want to find the HW address for */ - strncpy(request.ifr_name, networkDevice, IFNAMSIZ - 1); + strlcpy(request.ifr_name, networkDevice, IFNAMSIZ); /* * Get the HW address */ diff --git a/snmplib/strlcat.c b/snmplib/strlcat.c new file mode 100644 index 0000000..90713ca --- /dev/null +++ b/snmplib/strlcat.c @@ -0,0 +1,67 @@ +/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#ifndef HAVE_STRLCAT + +#if HAVE_STRING_H +#include +#else +#include +#endif +#include + +#include + +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +size_t +strlcat(char * __restrict dst, const char * __restrict src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} + +#endif diff --git a/snmplib/strtoull.c b/snmplib/strtoull.c index be94f29..6c98fc4 100644 --- a/snmplib/strtoull.c +++ b/snmplib/strtoull.c @@ -49,13 +49,8 @@ #define ULLONG_MAX UINT64_C(0xffffffffffffffff) #endif -#ifdef STRTOULL_UNIT_TEST -uint64_t -my_strtoull(const char *nptr, char **endptr, int base) -#else uint64_t strtoull(const char *nptr, char **endptr, int base) -#endif { uint64_t result = 0; const char *p; @@ -161,123 +156,3 @@ strtoull(const char *nptr, char **endptr, int base) *endptr = (char *) nptr; return 0; } - -#if defined(STRTOULL_UNIT_TEST) - -#include -#include - -#ifndef PRIu64 -#ifdef _MSC_VER -#define PRIu64 "I64u" -#else -#define PRIu64 "llu" -#endif -#endif - -struct strtoull_testcase { - /* - * inputs - */ - const char *nptr; - int base; - /* - * expected outputs - */ - int expected_errno; - int expected_end; - uint64_t expected_result; -}; - -static const struct strtoull_testcase test_input[] = { - {"0x0", 0, 0, 3, 0}, - {"1", 0, 0, 1, 1}, - {"0x1", 0, 0, 3, 1}, - {" -0666", 0, 0, 7, -0666}, - {" -0x666", 0, 0, 8, -0x666}, - {"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)}, - {"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)}, - {"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)}, - {"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)}, - {"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)}, - {"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)}, - {"ff", 16, 0, 2, 255}, - {"0xff", 16, 0, 4, 255}, - {" ", 0, 0, 0, 0}, - {"0x", 0, 0, 1, 0}, - {"0x", 8, 0, 1, 0}, - {"0x", 16, 0, 1, 0}, - {"zyyy", 0, 0, 0, 0}, - {"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX}, - {"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX} -}; - -int -main(void) -{ - int failure_count = 0; - unsigned int i; - - for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { - const struct strtoull_testcase *const p = &test_input[i]; - char *endptr; - uint64_t result; - - errno = 0; - result = my_strtoull(p->nptr, &endptr, p->base); - if (errno != p->expected_errno) { - failure_count++; - printf("test %d failed (input \"%s\"): expected errno %d" - ", got errno %d\n", - i, p->nptr, p->expected_errno, errno); - } - if (result != p->expected_result) { - failure_count++; - printf("test %d failed (input \"%s\"): expected result %" PRIu64 - ", got result %" PRIu64 "\n", - i, p->nptr, p->expected_result, result); - } - if (endptr - p->nptr != p->expected_end) { - failure_count++; - printf("test %d failed (input \"%s\"): expected end %d," - " got end %d\n", - i, p->nptr, p->expected_end, (int) (endptr - p->nptr)); - } - -#if HAVE_STRTOULL - errno = 0; - result = strtoull(p->nptr, &endptr, p->base); - if (errno != p->expected_errno) { - failure_count++; - printf("test %d (input \"%s\"): expected errno %d" - ", libc strtoull() returned errno %d\n", - i, p->nptr, p->expected_errno, errno); - } - if (result != p->expected_result) { - failure_count++; - printf("test %d (input \"%s\"): expected result %" PRIu64 - ", libc strtoull() returned result %" PRIu64 "\n", - i, p->nptr, p->expected_result, result); - } - if (endptr - p->nptr != p->expected_end) { - failure_count++; - printf("test %d (input \"%s\"): expected end %d," - " libc strtoull() returned end %d\n", - i, p->nptr, p->expected_end, (int) (endptr - p->nptr)); - } -#endif - } - if (failure_count == 0) - printf("All %d tests passed.\n", i); - return 0; -} - -#endif /* defined(STRTOULL_UNIT_TEST) */ - -/* - * Local variables: - * c-basic-offset: 4 - * indent-tabs-mode: nil - * compile-command: "gcc -Wall -Werror -DSTRTOULL_UNIT_TEST=1 -I../include -g -o strtoull-unit-test strtoull.c && ./strtoull-unit-test" - * End: - */ diff --git a/snmplib/system.c b/snmplib/system.c index cec6c34..1070bbf 100644 --- a/snmplib/system.c +++ b/snmplib/system.c @@ -184,6 +184,8 @@ SOFTWARE. #include #include /* for get_temp_file_pattern() */ +#include "inet_ntop.h" + /* NetSNMP and DNSSEC-Tools both define FREE. We'll not use either here. */ #undef FREE @@ -637,25 +639,19 @@ get_boottime(void) } #endif -/* - * Returns uptime in centiseconds(!). +/** + * Returns the system uptime in centiseconds. + * + * @note The value returned by this function is not identical to sysUpTime + * defined in RFC 1213. get_uptime() returns the system uptime while + * sysUpTime represents the time that has elapsed since the most recent + * restart of the network manager (snmpd). + * + * @see See also netsnmp_get_agent_uptime(). */ long get_uptime(void) { -#if !defined(solaris2) && !defined(linux) && !defined(cygwin) && !defined(aix4) && !defined(aix5) && !defined(aix6) && !defined(aix7) - struct timeval now; - long boottime_csecs, nowtime_csecs; - - boottime_csecs = get_boottime(); - if (boottime_csecs == 0) - return 0; - gettimeofday(&now, (struct timezone *) 0); - nowtime_csecs = (now.tv_sec * 100) + (now.tv_usec / 10000); - - return (nowtime_csecs - boottime_csecs); -#endif - #if defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) struct nlist nl; int kmem; @@ -668,9 +664,7 @@ get_uptime(void) read(kmem, &lbolt, sizeof(lbolt)); close(kmem); return(lbolt); -#endif - -#ifdef solaris2 +#elif defined(solaris2) kstat_ctl_t *ksc = kstat_open(); kstat_t *ks; kid_t kid; @@ -695,9 +689,7 @@ get_uptime(void) kstat_close(ksc); } return lbolt; -#endif /* solaris2 */ - -#ifdef linux +#elif defined(linux) || defined(cygwin) FILE *in = fopen("/proc/uptime", "r"); long uptim = 0, a, b; if (in) { @@ -706,10 +698,17 @@ get_uptime(void) fclose(in); } return uptim; -#endif /* linux */ +#else + struct timeval now; + long boottime_csecs, nowtime_csecs; -#ifdef cygwin - return (0); /* not implemented */ + boottime_csecs = get_boottime(); + if (boottime_csecs == 0) + return 0; + gettimeofday(&now, (struct timezone *) 0); + nowtime_csecs = (now.tv_sec * 100) + (now.tv_usec / 10000); + + return (nowtime_csecs - boottime_csecs); #endif } @@ -928,22 +927,33 @@ netsnmp_gethostbyname(const char *name) #endif /* HAVE_GETHOSTBYNAME */ } +/** + * Look up the host name via DNS. + * + * @param[in] addr Pointer to the address to resolve. This argument points e.g. + * to a struct in_addr for AF_INET or to a struct in6_addr for AF_INET6. + * @param[in] len Length in bytes of *addr. + * @param[in] type Address family, e.g. AF_INET or AF_INET6. + * + * @return Pointer to a hostent structure if address lookup succeeded or NULL + * if the lookup failed. + * + * @see See also the gethostbyaddr() man page. + */ struct hostent * netsnmp_gethostbyaddr(const void *addr, socklen_t len, int type) { #if HAVE_GETHOSTBYADDR struct hostent *hp = NULL; - struct sockaddr_in *saddr_in = - NETSNMP_REMOVE_CONST(struct sockaddr_in *,addr); + char buf[64]; - DEBUGMSGTL(("dns:gethostbyaddr", "resolving { AF_INET, %s:%hu }\n", - inet_ntoa(saddr_in->sin_addr), ntohs(saddr_in->sin_port))); + DEBUGMSGTL(("dns:gethostbyaddr", "resolving %s\n", + inet_ntop(type, addr, buf, sizeof(buf)))); #ifdef DNSSEC_LOCAL_VALIDATION val_status_t val_status; - hp = val_gethostbyaddr(netsnmp_validator_context(), - (const void*)&saddr_in->sin_addr, - sizeof(struct in_addr), AF_INET, &val_status); + hp = val_gethostbyaddr(netsnmp_validator_context(), addr, len, type, + &val_status); DEBUGMSGTL(("dns:sec:val", "val_status %d / %s; trusted: %d\n", val_status, p_val_status(val_status), val_istrusted(val_status))); @@ -959,8 +969,7 @@ netsnmp_gethostbyaddr(const void *addr, socklen_t len, int type) else if (val_does_not_exist(val_status) && hp) hp = NULL; #else - hp = gethostbyaddr((const void*) &saddr_in->sin_addr, - sizeof(struct in_addr), AF_INET); + hp = gethostbyaddr(addr, len, type); #endif if (hp == NULL) { DEBUGMSGTL(("dns:gethostbyaddr", "couldn't resolve addr\n")); @@ -1069,44 +1078,30 @@ setenv(const char *name, const char *value, int overwrite) } #endif /* HAVE_SETENV */ -/* returns centiseconds */ netsnmp_feature_child_of(calculate_time_diff, netsnmp_unused) #ifndef NETSNMP_FEATURE_REMOVE_CALCULATE_TIME_DIFF +/** + * Compute (*now - *then) in centiseconds. + */ int calculate_time_diff(const struct timeval *now, const struct timeval *then) { - struct timeval tmp, diff; - memcpy(&tmp, now, sizeof(struct timeval)); - tmp.tv_sec--; - tmp.tv_usec += 1000000L; - diff.tv_sec = tmp.tv_sec - then->tv_sec; - diff.tv_usec = tmp.tv_usec - then->tv_usec; - if (diff.tv_usec > 1000000L) { - diff.tv_usec -= 1000000L; - diff.tv_sec++; - } + struct timeval diff; + + NETSNMP_TIMERSUB(now, then, &diff); return (int)(diff.tv_sec * 100 + diff.tv_usec / 10000); } #endif /* NETSNMP_FEATURE_REMOVE_CALCULATE_TIME_DIFF */ #ifndef NETSNMP_FEATURE_REMOVE_CALCULATE_SECTIME_DIFF -/* returns diff in rounded seconds */ +/** Compute rounded (*now - *then) in seconds. */ u_int calculate_sectime_diff(const struct timeval *now, const struct timeval *then) { - struct timeval tmp, diff; - memcpy(&tmp, now, sizeof(struct timeval)); - tmp.tv_sec--; - tmp.tv_usec += 1000000L; - diff.tv_sec = tmp.tv_sec - then->tv_sec; - diff.tv_usec = tmp.tv_usec - then->tv_usec; - if (diff.tv_usec >= 1000000L) { - diff.tv_usec -= 1000000L; - diff.tv_sec++; - } - if (diff.tv_usec >= 500000L) - return (u_int)(diff.tv_sec + 1); - return (u_int)(diff.tv_sec); + struct timeval diff; + + NETSNMP_TIMERSUB(now, then, &diff); + return diff.tv_sec + (diff.tv_usec >= 500000L); } #endif /* NETSNMP_FEATURE_REMOVE_CALCULATE_SECTIME_DIFF */ @@ -1171,8 +1166,17 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) struct stat sbuf; char *ourcopy = strdup(pathname); char *entry; - char buf[SNMP_MAXPATH]; + char *buf = NULL; char *st = NULL; + int res; + + res = SNMPERR_GENERR; + if (!ourcopy) + goto out; + + buf = malloc(strlen(pathname) + 2); + if (!buf) + goto out; #if defined (WIN32) || defined (cygwin) /* convert backslash to forward slash */ @@ -1215,12 +1219,9 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) #else if (mkdir(buf, mode) == -1) #endif - { - free(ourcopy); - return SNMPERR_GENERR; - } else { + goto out; + else snmp_log(LOG_INFO, "Created directory: %s\n", buf); - } } else { /* * exists, is it a file? @@ -1229,13 +1230,15 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) /* * ack! can't make a directory on top of a file */ - free(ourcopy); - return SNMPERR_GENERR; + goto out; } } } + res = SNMPERR_SUCCESS; +out: + free(buf); free(ourcopy); - return SNMPERR_SUCCESS; + return res; } /** @@ -1254,9 +1257,14 @@ netsnmp_mktemp(void) #endif int fd = -1; - strcpy(name, get_temp_file_pattern()); + strlcpy(name, get_temp_file_pattern(), sizeof(name)); #ifdef HAVE_MKSTEMP - fd = mkstemp(name); + { + mode_t oldmask = umask(~(S_IRUSR | S_IWUSR)); + netsnmp_assert(oldmask != -1); + fd = mkstemp(name); + umask(oldmask); + } #else if (mktemp(name)) { # ifndef WIN32 @@ -1353,6 +1361,15 @@ netsnmp_os_kernel_width(void) netsnmp_feature_child_of(str_to_uid, user_information) #ifndef NETSNMP_FEATURE_REMOVE_STR_TO_UID +/** + * Convert a user name or number into numeric form. + * + * @param[in] useroruid Either a Unix user name or the ASCII representation + * of a user number. + * + * @return Either a user number > 0 or 0 if useroruid is not a valid user + * name, not a valid user number or the name of the root user. + */ int netsnmp_str_to_uid(const char *useroruid) { int uid; #if HAVE_GETPWNAM && HAVE_PWD_H @@ -1361,13 +1378,13 @@ int netsnmp_str_to_uid(const char *useroruid) { uid = atoi(useroruid); - if ( uid == 0 ) { + if (uid == 0) { #if HAVE_GETPWNAM && HAVE_PWD_H - pwd = getpwnam( useroruid ); - if (pwd) - uid = pwd->pw_uid; - else + pwd = getpwnam(useroruid); + uid = pwd ? pwd->pw_uid : 0; + endpwent(); #endif + if (uid == 0) snmp_log(LOG_WARNING, "Can't identify user (%s).\n", useroruid); } return uid; @@ -1377,23 +1394,31 @@ int netsnmp_str_to_uid(const char *useroruid) { netsnmp_feature_child_of(str_to_gid, user_information) #ifndef NETSNMP_FEATURE_REMOVE_STR_TO_GID -int netsnmp_str_to_gid(const char *grouporgid) { +/** + * Convert a group name or number into numeric form. + * + * @param[in] grouporgid Either a Unix group name or the ASCII representation + * of a group number. + * + * @return Either a group number > 0 or 0 if grouporgid is not a valid group + * name, not a valid group number or the root group. + */ +int netsnmp_str_to_gid(const char *grouporgid) +{ int gid; -#if HAVE_GETGRNAM && HAVE_GRP_H - struct group *grp; -#endif gid = atoi(grouporgid); - if ( gid == 0 ) { + if (gid == 0) { #if HAVE_GETGRNAM && HAVE_GRP_H - grp = getgrnam( grouporgid ); - if (grp) - gid = grp->gr_gid; - else + struct group *grp; + + grp = getgrnam(grouporgid); + gid = grp ? grp->gr_gid : 0; + endgrent(); #endif - snmp_log(LOG_WARNING, "Can't identify group (%s).\n", - grouporgid); + if (gid == 0) + snmp_log(LOG_WARNING, "Can't identify group (%s).\n", grouporgid); } return gid; diff --git a/snmplib/test_binary_array.c b/snmplib/test_binary_array.c deleted file mode 100644 index 44b1f0e..0000000 --- a/snmplib/test_binary_array.c +++ /dev/null @@ -1,171 +0,0 @@ -#include - -#if HAVE_IO_H -#include -#endif -#include -#if HAVE_STDLIB_H -#include -#endif -#if HAVE_MALLOC_H -#include -#endif -#include -#if HAVE_STRING_H -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#define TEST_SIZE 7 - -void -print_int(netsnmp_index *i, void *v) -{ - printf("item %p = %ld\n", i, i->oids[0]); -} - -int -test_int(void) -{ - oid o1 = 1; - oid o2 = 2; - oid o3 = 6; - oid o4 = 8; - oid o5 = 9; - oid ox = 7; - oid oy = 10; - netsnmp_index i1,i2,i3,i4,i5,ix,iy, *ip; - netsnmp_index *a[TEST_SIZE] = { &i1, &i2, &i3, &ix, &i4, &i5, &iy }; - netsnmp_container *c = netsnmp_container_get_binary_array(); - int i; - - c->compare = netsnmp_compare_netsnmp_index; - - i1.oids = &o1; - i2.oids = &o2; - i3.oids = &o3; - i4.oids = &o4; - i5.oids = &o5; - ix.oids = &ox; - iy.oids = &oy; - i1.len = i2.len = i3.len = i4.len = i5.len = ix.len = iy.len = 1; - - printf("Creating container...\n"); - - printf("Inserting data...\n"); - CONTAINER_INSERT(c,&i4); - CONTAINER_INSERT(c,&i2); - CONTAINER_INSERT(c,&i3); - CONTAINER_INSERT(c,&i1); - CONTAINER_INSERT(c,&i5); - - printf("For each...\n"); - CONTAINER_FOR_EACH(c, print_int, NULL); - printf("Done.\n"); - - printf("\n"); - ip = CONTAINER_FIRST(c); - printf("Find first = %p %ld\n",ip, ip->oids[0]); - while( ip ) { - ip = CONTAINER_NEXT(c,ip); - if(ip) - printf("Find next = %p %ld\n",ip, ip->oids[0]); - else - printf("Find next = %s\n",ip); - } - - for( i=0; i < TEST_SIZE; ++i) { - printf("\n"); - ip = CONTAINER_FIND(c,a[i]); - printf("Find %ld = %p %ld\n", a[i]->oids[0], ip, ip ? ip->oids[0] : 0); - ip = CONTAINER_NEXT(c,a[i]); - printf("Next %ld = %p %ld\n", a[i]->oids[0], ip, ip ? ip->oids[0] : 0); - } - - printf("Done.\n"); - - return 0; -} - -void -print_string(char *i, void *v) -{ - printf("item %s\n", i); -} - -int -my_strcmp(char *lhs, char *rhs) -{ - int rc = strcmp(lhs,rhs); -/* printf("%s %d %s\n",lhs, rc, rhs); */ - return rc; -} - -int -test_string() -{ - const char *o1 = "zebra"; - const char *o2 = "b-two"; - const char *o3 = "b"; - const char *o4 = "cedar"; - const char *o5 = "alpha"; - const char *ox = "dev"; - const char *oy = "aa"; - const char * ip; - - const char *a[TEST_SIZE] = { o1, o2, o3, ox, o4, o5, oy }; - netsnmp_container *c = netsnmp_container_get_binary_array(); - int i; - - c->compare = my_strcmp; - - printf("Creating container...\n"); - - printf("Inserting data...\n"); - CONTAINER_INSERT(c,o4); - CONTAINER_INSERT(c,o2); - CONTAINER_INSERT(c,o3); - CONTAINER_INSERT(c,o1); - CONTAINER_INSERT(c,o5); - printf("\n"); - printf("For each...\n"); - CONTAINER_FOR_EACH(c, print_string, NULL); - printf("Done.\n"); - - printf("\n"); - ip = CONTAINER_FIRST(c); - printf("Find first = %s\n",ip); - while( ip ) { - ip = CONTAINER_NEXT(c,ip); - printf("Find next = %s\n",ip); - } - - for( i=0; i < TEST_SIZE; ++i) { - printf("\n"); - ip = CONTAINER_FIND(c,a[i]); - printf("Find %s = %s\n", a[i], ip); - ip = CONTAINER_NEXT(c,a[i]); - printf("Next %s = %s\n", a[i], ip); - } - - printf("Done.\n"); - - return 0; -} - -int -main(int argc, char** argv) -{ - - test_int(); - test_string(); -} diff --git a/snmplib/tools.c b/snmplib/tools.c index 676f36c..b2be790 100644 --- a/snmplib/tools.c +++ b/snmplib/tools.c @@ -613,7 +613,7 @@ void dump_chunk(const char *debugtoken, const char *title, const u_char * buf, int size) { - u_int printunit = 64; /* XXX Make global. */ + int printunit = 64; /* XXX Make global. */ char chunk[SNMP_MAXBUF], *s, *sp; if (title && (*title != '\0')) { @@ -626,8 +626,8 @@ dump_chunk(const char *debugtoken, const char *title, const u_char * buf, sp = s; while (size > 0) { - if (size > (int) printunit) { - strncpy(chunk, sp, printunit); + if (size > printunit) { + memcpy(chunk, sp, printunit); chunk[printunit] = '\0'; DEBUGMSGTL((debugtoken, "\t%s\n", chunk)); } else { @@ -803,15 +803,10 @@ dump_snmpEngineID(const u_char * estring, size_t * estring_len) case 4: /* Text. */ - /* - * Doesn't exist on all (many) architectures - */ - /* - * s += snprintf(s, remaining_len+3, "\"%s\"", esp); - */ - s += sprintf(s, "\"%.*s\"", sizeof(buf)-strlen(buf)-3, esp); + s += sprintf(s, "\"%.*s\"", (int) (sizeof(buf)-strlen(buf)-3), esp); goto dump_snmpEngineID_quit; break; + /*NOTREACHED*/ case 5: /* Octets. */ snprint_hexstring(s, (SNMP_MAXBUF - (s-buf)), @@ -820,6 +815,7 @@ dump_snmpEngineID(const u_char * estring, size_t * estring_len) s -= 1; goto dump_snmpEngineID_quit; break; + /*NOTREACHED*/ dump_snmpEngineID_violation: case 0: /* Violation of RESERVED, * * -OR- of expected length. @@ -941,11 +937,11 @@ uatime_hdiff(const_marker_t first, const_marker_t second) } /** - * Test: Has (marked time plus delta) exceeded current time (in msec) ? + * Test: Has (marked time plus delta) exceeded current time ? * Returns 0 if test fails or cannot be tested (no marker). */ int -atime_ready(const_marker_t pm, int deltaT) +atime_ready(const_marker_t pm, int delta_ms) { marker_t now; long diff; @@ -956,19 +952,19 @@ atime_ready(const_marker_t pm, int deltaT) diff = atime_diff(pm, now); free(now); - if (diff < deltaT) + if (diff < delta_ms) return 0; return 1; } +#ifndef NETSNMP_FEATURE_REMOVE_UATIME_READY /** - * Test: Has (marked time plus delta) exceeded current time (in msec) ? + * Test: Has (marked time plus delta) exceeded current time ? * Returns 0 if test fails or cannot be tested (no marker). */ -#ifndef NETSNMP_FEATURE_REMOVE_UATIME_READY int -uatime_ready(const_marker_t pm, unsigned int deltaT) +uatime_ready(const_marker_t pm, unsigned int delta_ms) { marker_t now; u_long diff; @@ -979,7 +975,7 @@ uatime_ready(const_marker_t pm, unsigned int deltaT) diff = uatime_diff(pm, now); free(now); - if (diff < deltaT) + if (diff < delta_ms) return 0; return 1; diff --git a/snmplib/transports/snmpAAL5PVCDomain.c b/snmplib/transports/snmpAAL5PVCDomain.c index f6684f0..5ac69a1 100644 --- a/snmplib/transports/snmpAAL5PVCDomain.c +++ b/snmplib/transports/snmpAAL5PVCDomain.c @@ -32,6 +32,7 @@ #include #include +#include oid netsnmp_AAL5PVCDomain[10] = { NETSNMP_ENTERPRISE_MIB, 3, 3, 3 }; @@ -87,11 +88,13 @@ netsnmp_aal5pvc_recv(netsnmp_transport *t, void *buf, int size, } if (rc >= 0) { - char *str = netsnmp_aal5pvc_fmtaddr(t, NULL, 0); - DEBUGMSGTL(("netsnmp_aal5pvc", - "recv on fd %d got %d bytes (from %s)\n", t->sock, - rc, str)); - free(str); + DEBUGIF("netsnmp_aal5pvc") { + char *str = netsnmp_aal5pvc_fmtaddr(t, NULL, 0); + DEBUGMSGTL(("netsnmp_aal5pvc", + "recv on fd %d got %d bytes (from %s)\n", t->sock, + rc, str)); + free(str); + } } else { DEBUGMSGTL(("netsnmp_aal5pvc", "recv on fd %d err %d (\"%s\")\n", t->sock, errno, strerror(errno))); @@ -120,11 +123,14 @@ netsnmp_aal5pvc_send(netsnmp_transport *t, void *buf, int size, } if (to != NULL && t != NULL && t->sock >= 0) { - char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *)to, - sizeof(struct sockaddr_atmpvc)); - DEBUGMSGTL(("netsnmp_aal5pvc","send %d bytes from %p to %s on fd %d\n", - size, buf, str, t->sock)); - free(str); + DEBUGIF("netsnmp_aal5pvc") { + char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *)to, + sizeof(struct sockaddr_atmpvc)); + DEBUGMSGTL(("netsnmp_aal5pvc", + "send %d bytes from %p to %s on fd %d\n", + size, buf, str, t->sock)); + free(str); + } while (rc < 0) { rc = sendto(t->sock, buf, size, 0, NULL, 0); if (rc < 0 && errno != EINTR) { @@ -165,8 +171,6 @@ netsnmp_aal5pvc_close(netsnmp_transport *t) netsnmp_transport * netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) { - char *str = NULL; - struct atm_qos qos; netsnmp_transport *t = NULL; #ifdef NETSNMP_NO_LISTEN_SUPPORT @@ -178,18 +182,18 @@ netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - str = netsnmp_aal5pvc_fmtaddr(NULL, (void *) addr, - sizeof(struct sockaddr_atmpvc)); - DEBUGMSGTL(("netsnmp_aal5pvc", "open %s %s\n", local ? "local" : "remote", - str)); - free(str); - - memset(t, 0, sizeof(netsnmp_transport)); + DEBUGIF("netsnmp_aal5pvc") { + char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *) addr, + sizeof(struct sockaddr_atmpvc)); + DEBUGMSGTL(("netsnmp_aal5pvc", "open %s %s\n", + local ? "local" : "remote", str)); + free(str); + } t->domain = netsnmp_AAL5PVCDomain; t->domain_length = @@ -203,22 +207,24 @@ netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) } DEBUGMSGTL(("netsnmp_aal5pvc", "fd %d opened\n", t->sock)); - /* - * Set up the QOS parameters. - */ + { + /* + * Set up the QOS parameters. + */ - memset(&qos, 0, sizeof(struct atm_qos)); - qos.aal = ATM_AAL5; - qos.rxtp.traffic_class = ATM_UBR; - qos.rxtp.max_sdu = SNMP_MAX_LEN; /* Hmm -- this is a bit small? */ - qos.txtp = qos.rxtp; + struct atm_qos qos = { 0 }; + qos.aal = ATM_AAL5; + qos.rxtp.traffic_class = ATM_UBR; + qos.rxtp.max_sdu = SNMP_MAX_LEN; /* Hmm -- this is a bit small? */ + qos.txtp = qos.rxtp; - if (setsockopt(t->sock, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0) { - DEBUGMSGTL(("netsnmp_aal5pvc", "setsockopt failed (%s)\n", - strerror(errno))); - netsnmp_aal5pvc_close(t); - netsnmp_transport_free(t); - return NULL; + if (setsockopt(t->sock, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0) { + DEBUGMSGTL(("netsnmp_aal5pvc", "setsockopt failed (%s)\n", + strerror(errno))); + netsnmp_aal5pvc_close(t); + netsnmp_transport_free(t); + return NULL; + } } if (local) { diff --git a/snmplib/transports/snmpCallbackDomain.c b/snmplib/transports/snmpCallbackDomain.c index e487f28..95018b8 100644 --- a/snmplib/transports/snmpCallbackDomain.c +++ b/snmplib/transports/snmpCallbackDomain.c @@ -353,7 +353,7 @@ netsnmp_callback_accept(netsnmp_transport *t) { DEBUGMSGTL(("transport_callback", "hook_accept enter\n")); DEBUGMSGTL(("transport_callback", "hook_accept exit\n")); - return 0; + return -1; } @@ -385,8 +385,10 @@ netsnmp_callback_transport(int to) * our stuff */ mydata = SNMP_MALLOC_TYPEDEF(netsnmp_callback_info); - if (!mydata) + if (!mydata) { + SNMP_FREE(t); return NULL; + } mydata->linkedto = to; mydata->callback_num = ++callback_count; mydata->data = NULL; diff --git a/snmplib/transports/snmpDTLSUDPDomain.c b/snmplib/transports/snmpDTLSUDPDomain.c index fcbc5a2..9c56d19 100644 --- a/snmplib/transports/snmpDTLSUDPDomain.c +++ b/snmplib/transports/snmpDTLSUDPDomain.c @@ -231,8 +231,10 @@ start_new_cached_connection(netsnmp_transport *t, return NULL; /* allocate our TLS specific data */ - if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, !we_are_client))) + if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, !we_are_client))) { + SNMP_FREE(cachep); return NULL; + } cachep->tlsdata = tlsdata; /* RFC5953: section 5.3.1, step 1: @@ -427,7 +429,7 @@ _extract_addr_pair(netsnmp_transport *t, void *opaque, int olen) if (opaque && olen == sizeof(netsnmp_tmStateReference)) { netsnmp_tmStateReference *tmStateRef = - tmStateRef = (netsnmp_tmStateReference *) opaque; + (netsnmp_tmStateReference *) opaque; if (tmStateRef->have_addresses) addr_pair = &(tmStateRef->addresses); @@ -817,6 +819,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, DEBUGMSGTL(("dtlsudp", "peer disconnected\n")); cachep->flags |= NETSNMP_BIO_DISCONNECTED; remove_and_free_bio_cache(cachep); + SNMP_FREE(tmStateRef); return rc; } cachep->flags |= NETSNMP_BIO_CONNECTED; @@ -913,6 +916,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, /* XXX: probably need to check for whether we should send stuff from our end to continue the transaction */ + SNMP_FREE(tmStateRef); return -1; } else { /* XXX: free needed memory */ @@ -922,6 +926,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, /* Step 5 says these are always incremented */ snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONINVALIDSERVERCERTIFICATES); snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONOPENERRORS); + SNMP_FREE(tmStateRef); return -1; } } @@ -939,12 +944,14 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, /* XXX: probably need to check for whether we should send stuff from our end to continue the transaction */ + SNMP_FREE(tmStateRef); return -1; } else { /* XXX: free needed memory */ snmp_log(LOG_ERR, "DTLSUDP: failed to verify ssl certificate (of the client)\n"); snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONINVALIDCLIENTCERTIFICATES); + SNMP_FREE(tmStateRef); return -1; } } @@ -1061,7 +1068,7 @@ netsnmp_dtlsudp_send(netsnmp_transport *t, void *buf, int size, specs) then we create one automatically here. */ if (opaque != NULL && *opaque != NULL && - *olength == sizeof(netsnmp_tmStateReference)) + olength != NULL && *olength == sizeof(netsnmp_tmStateReference)) tmStateRef = (netsnmp_tmStateReference *) *opaque; @@ -1506,13 +1513,11 @@ netsnmp_dtlsudp_create_tstring(const char *str, int isserver, tlsdata = (_netsnmpTLSBaseData *) t->data; /* search for a : */ if (NULL != (cp = strrchr(str, ':'))) { - strncpy(buf, str, SNMP_MIN(cp-str, sizeof(buf)-1)); - buf[SNMP_MIN(cp-str, sizeof(buf)-1)] = '\0'; + sprintf(buf, "%.*s", (int) SNMP_MIN(cp - str, sizeof(buf) - 1), + str); } else { /* else the entire spec is a host name only */ - strncpy(buf, str, - SNMP_MIN(strlen(str), sizeof(buf)-1)); - buf[SNMP_MIN(strlen(str), sizeof(buf)-1)] = '\0'; + strlcpy(buf, str, sizeof(buf)); } tlsdata->their_hostname = strdup(buf); } diff --git a/snmplib/transports/snmpIPXDomain.c b/snmplib/transports/snmpIPXDomain.c index 75994d4..24c13a4 100644 --- a/snmplib/transports/snmpIPXDomain.c +++ b/snmplib/transports/snmpIPXDomain.c @@ -34,6 +34,7 @@ #include #include +#include #define SNMP_IPX_DEFAULT_PORT 36879 /* Specified in RFC 1420. */ static netsnmp_tdomain ipxDomain; @@ -99,10 +100,13 @@ netsnmp_ipx_recv(netsnmp_transport *t, void *buf, int size, } if (rc >= 0) { - char *str = netsnmp_ipx_fmtaddr(NULL, from, fromlen); - DEBUGMSGTL(("netsnmp_ipx","recvfrom fd %d got %d bytes(from %s)\n", - t->sock, rc, str)); - free(str); + DEBUGIF("netsnmp_ipx") { + char *str = netsnmp_ipx_fmtaddr(NULL, from, fromlen); + DEBUGMSGTL(("netsnmp_ipx", + "recvfrom fd %d got %d bytes(from %s)\n", + t->sock, rc, str)); + free(str); + } } else { DEBUGMSGTL(("netsnmp_ipx", "recvfrom fd %d err %d (\"%s\")\n", t->sock, errno, strerror(errno))); @@ -131,11 +135,13 @@ netsnmp_ipx_send(netsnmp_transport *t, void *buf, int size, } if (to != NULL && t != NULL && t->sock >= 0) { - char *str = netsnmp_ipx_fmtaddr(NULL, (void *)to, - sizeof(struct sockaddr_ipx)); - DEBUGMSGTL(("netsnmp_ipx", "send %d bytes from %p to %s on fd %d\n", - size, buf, str, t->sock)); - free(str); + DEBUGIF("netsnmp_ipx") { + char *str = netsnmp_ipx_fmtaddr(NULL, (void *)to, + sizeof(struct sockaddr_ipx)); + DEBUGMSGTL(("netsnmp_ipx", "send %d bytes from %p to %s on fd %d\n", + size, buf, str, t->sock)); + free(str); + } while (rc < 0) { rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr)); if (rc < 0 && errno != EINTR) { @@ -176,7 +182,6 @@ netsnmp_ipx_transport(struct sockaddr_ipx *addr, int local) { netsnmp_transport *t = NULL; int rc = 0; - char *str = NULL; #ifdef NETSNMP_NO_LISTEN_SUPPORT if (local) @@ -187,18 +192,18 @@ netsnmp_ipx_transport(struct sockaddr_ipx *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - str = netsnmp_ipx_fmtaddr(NULL, (void *)addr, - sizeof(struct sockaddr_ipx)); - DEBUGMSGTL(("netsnmp_ipx", "open %s %s\n", local ? "local" : "remote", - str)); - free(str); - - memset(t, 0, sizeof(netsnmp_transport)); + DEBUGIF("netsnmp_ipx") { + char *str = netsnmp_ipx_fmtaddr(NULL, (void *)addr, + sizeof(struct sockaddr_ipx)); + DEBUGMSGTL(("netsnmp_ipx", "open %s %s\n", local ? "local" : "remote", + str)); + free(str); + } t->domain = netsnmpIPXDomain; t->domain_length = netsnmpIPXDomain_len; @@ -358,9 +363,7 @@ netsnmp_sockaddr_ipx2(struct sockaddr_ipx *addr, const char *peername, node = "000000000000"; if (port == NULL || *port == '\0') -#define val(x) __STRING(x) - port = val(SNMP_IPX_DEFAULT_PORT); -#undef val + port = __STRING(SNMP_IPX_DEFAULT_PORT); DEBUGMSGTL(("netsnmp_sockaddr_ipx", "Address: %s:%s/%s\n", network ? network : "[NIL]", node ? node : "[NIL]", diff --git a/snmplib/transports/snmpIPv6BaseDomain.c b/snmplib/transports/snmpIPv6BaseDomain.c index a7daf1c..9bad950 100644 --- a/snmplib/transports/snmpIPv6BaseDomain.c +++ b/snmplib/transports/snmpIPv6BaseDomain.c @@ -127,7 +127,6 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr, char debug_addr[INET6_ADDRSTRLEN]; #if HAVE_GETADDRINFO struct addrinfo *addrs = NULL; - struct addrinfo hint; int err; #elif HAVE_GETIPNODEBYNAME struct hostent *hp = NULL; @@ -333,13 +332,15 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr, } #if HAVE_GETADDRINFO - memset(&hint, 0, sizeof hint); - hint.ai_flags = 0; - hint.ai_family = PF_INET6; - hint.ai_socktype = SOCK_DGRAM; - hint.ai_protocol = 0; - - err = netsnmp_getaddrinfo(peername, NULL, &hint, &addrs); + { + struct addrinfo hint = { 0 }; + hint.ai_flags = 0; + hint.ai_family = PF_INET6; + hint.ai_socktype = SOCK_DGRAM; + hint.ai_protocol = 0; + + err = netsnmp_getaddrinfo(peername, NULL, &hint, &addrs); + } if (err != 0) { #if HAVE_GAI_STRERROR snmp_log(LOG_ERR, "getaddrinfo(\"%s\", NULL, ...): %s\n", peername, diff --git a/snmplib/transports/snmpSSHDomain.c b/snmplib/transports/snmpSSHDomain.c index 72cc59e..a9ed81f 100644 --- a/snmplib/transports/snmpSSHDomain.c +++ b/snmplib/transports/snmpSSHDomain.c @@ -236,9 +236,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, user_pw->pw_name); return -1; } - strncpy(addr_pair->username, user_pw->pw_name, + strlcpy(addr_pair->username, user_pw->pw_name, sizeof(addr_pair->username)); - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; } DEBUGMSGTL(("ssh", "Setting user name to %s\n", addr_pair->username)); @@ -309,9 +308,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, user_pw->pw_name); return -1; } - strncpy(addr_pair->username, user_pw->pw_name, + strlcpy(addr_pair->username, user_pw->pw_name, sizeof(addr_pair->username)); - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; } */ @@ -330,12 +328,12 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, if (iamclient && 0) { /* XXX: we're on the client; we should have named the connection ourselves... pull this from session somehow? */ - strncpy(tmStateRef->securityName, addr_pair->username, - sizeof(tmStateRef->securityName)-1); + strlcpy(tmStateRef->securityName, addr_pair->username, + sizeof(tmStateRef->securityName)); } else { #ifdef SNMPSSHDOMAIN_USE_EXTERNAL_PIPE - strncpy(tmStateRef->securityName, addr_pair->username, - sizeof(tmStateRef->securityName)-1); + strlcpy(tmStateRef->securityName, addr_pair->username, + sizeof(tmStateRef->securityName)); #else /* we're called directly by sshd and use stdin/out */ /* we're on the server... */ /* XXX: this doesn't copy properly and can get pointer @@ -349,8 +347,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, /* XXX: detect and throw out overflow secname sizes rather than truncating. */ - strncpy(tmStateRef->securityName, getenv("USER"), - sizeof(tmStateRef->securityName)-1); + strlcpy(tmStateRef->securityName, getenv("USER"), + sizeof(tmStateRef->securityName)); #endif /* ! SNMPSSHDOMAIN_USE_EXTERNAL_PIPE */ } tmStateRef->securityName[sizeof(tmStateRef->securityName)-1] = '\0'; @@ -389,9 +387,8 @@ netsnmp_ssh_send(netsnmp_transport *t, void *buf, int size, if (NULL != t && NULL != addr_pair && NULL != addr_pair->channel) { if (addr_pair->username[0] == '\0') { - strncpy(addr_pair->username, tmStateRef->securityName, - sizeof(addr_pair->username)-1); - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; + strlcpy(addr_pair->username, tmStateRef->securityName, + sizeof(addr_pair->username)); } else if (strcmp(addr_pair->username, tmStateRef->securityName) != 0 || strlen(addr_pair->username) != tmStateRef->securityNameLen) { /* error! they must always match */ @@ -599,7 +596,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) if (t == NULL) { return NULL; } - memset(t, 0, sizeof(netsnmp_transport)); t->domain = netsnmp_snmpSSHDomain; t->domain_length = netsnmp_snmpSSHDomain_len; @@ -728,7 +724,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) #endif /* NETSNMP_NO_LISTEN_SUPPORT */ } else { char *username; - size_t username_len; char *keyfilepub; char *keyfilepriv; @@ -740,7 +735,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) snmp_log(LOG_ERR, "You must specify a ssh username to use. See the snmp.conf manual page\n"); return NULL; } - username_len = strlen(username); /* use the requested public key file */ keyfilepub = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, diff --git a/snmplib/transports/snmpSTDDomain.c b/snmplib/transports/snmpSTDDomain.c index 21e0d79..0a1c3f9 100644 --- a/snmplib/transports/snmpSTDDomain.c +++ b/snmplib/transports/snmpSTDDomain.c @@ -154,11 +154,10 @@ netsnmp_std_transport(const char *instring, size_t instring_len, { netsnmp_transport *t; - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - memset(t, 0, sizeof(netsnmp_transport)); t->domain = netsnmp_snmpSTDDomain; t->domain_length = diff --git a/snmplib/transports/snmpTCPDomain.c b/snmplib/transports/snmpTCPDomain.c index 426ae08..b8bdba4 100644 --- a/snmplib/transports/snmpTCPDomain.c +++ b/snmplib/transports/snmpTCPDomain.c @@ -41,6 +41,7 @@ #include #include #include +#include /* * needs to be in sync with the definitions in snmplib/snmpUDPDomain.c @@ -77,7 +78,6 @@ netsnmp_tcp_accept(netsnmp_transport *t) netsnmp_udp_addr_pair *addr_pair = NULL; int newsock = -1; socklen_t farendlen = sizeof(netsnmp_udp_addr_pair); - char *str = NULL; addr_pair = (netsnmp_udp_addr_pair *)malloc(farendlen); if (addr_pair == NULL) { @@ -106,9 +106,11 @@ netsnmp_tcp_accept(netsnmp_transport *t) t->data = addr_pair; t->data_length = sizeof(netsnmp_udp_addr_pair); - str = netsnmp_tcp_fmtaddr(NULL, farend, farendlen); - DEBUGMSGTL(("netsnmp_tcp", "accept succeeded (from %s)\n", str)); - free(str); + DEBUGIF("netsnmp_tcp") { + char *str = netsnmp_tcp_fmtaddr(NULL, farend, farendlen); + DEBUGMSGTL(("netsnmp_tcp", "accept succeeded (from %s)\n", str)); + free(str); + } /* * Try to make the new socket blocking. @@ -157,11 +159,10 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - memset(t, 0, sizeof(netsnmp_transport)); addr_pair = (netsnmp_udp_addr_pair *)malloc(sizeof(netsnmp_udp_addr_pair)); if (addr_pair == NULL) { diff --git a/snmplib/transports/snmpTCPIPv6Domain.c b/snmplib/transports/snmpTCPIPv6Domain.c index 5e866eb..3c96856 100644 --- a/snmplib/transports/snmpTCPIPv6Domain.c +++ b/snmplib/transports/snmpTCPIPv6Domain.c @@ -47,6 +47,7 @@ #include #include #include +#include #include "inet_ntop.h" @@ -70,7 +71,6 @@ netsnmp_tcp6_accept(netsnmp_transport *t) struct sockaddr_in6 *farend = NULL; int newsock = -1; socklen_t farendlen = sizeof(struct sockaddr_in6); - char *str = NULL; farend = (struct sockaddr_in6 *) malloc(sizeof(struct sockaddr_in6)); @@ -98,9 +98,11 @@ netsnmp_tcp6_accept(netsnmp_transport *t) t->data = farend; t->data_length = farendlen; - str = netsnmp_tcp6_fmtaddr(NULL, farend, farendlen); - DEBUGMSGTL(("netsnmp_tcp6", "accept succeeded (from %s)\n", str)); - free(str); + DEBUGIF("netsnmp_tcp6") { + char *str = netsnmp_tcp6_fmtaddr(NULL, farend, farendlen); + DEBUGMSGTL(("netsnmp_tcp6", "accept succeeded (from %s)\n", str)); + free(str); + } /* * Try to make the new socket blocking. @@ -138,7 +140,6 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) { netsnmp_transport *t = NULL; int rc = 0; - char *str = NULL; #ifdef NETSNMP_NO_LISTEN_SUPPORT if (local) @@ -149,19 +150,18 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - memset(t, 0, sizeof(netsnmp_transport)); - - str = netsnmp_tcp6_fmtaddr(NULL, (void *)addr, - sizeof(struct sockaddr_in6)); - DEBUGMSGTL(("netsnmp_tcp6", "open %s %s\n", local ? "local" : "remote", - str)); - free(str); - memset(t, 0, sizeof(netsnmp_transport)); + DEBUGIF("netsnmp_tcp6") { + char *str = netsnmp_tcp6_fmtaddr(NULL, (void *)addr, + sizeof(struct sockaddr_in6)); + DEBUGMSGTL(("netsnmp_tcp6", "open %s %s\n", local ? "local" : "remote", + str)); + free(str); + } t->data = malloc(sizeof(netsnmp_indexed_addr_pair)); if (t->data == NULL) { @@ -169,7 +169,7 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) return NULL; } t->data_length = sizeof(netsnmp_indexed_addr_pair); - memcpy(t->data, addr, sizeof(netsnmp_indexed_addr_pair)); + memcpy(t->data, addr, sizeof(struct sockaddr_in6)); t->domain = netsnmp_TCPIPv6Domain; t->domain_length = sizeof(netsnmp_TCPIPv6Domain) / sizeof(oid); diff --git a/snmplib/transports/snmpTLSBaseDomain.c b/snmplib/transports/snmpTLSBaseDomain.c index 12a69c6..c54d6ad 100644 --- a/snmplib/transports/snmpTLSBaseDomain.c +++ b/snmplib/transports/snmpTLSBaseDomain.c @@ -51,6 +51,7 @@ netsnmp_feature_require(cert_util) #include #include #include +#include #define LOGANDDIE(msg) do { snmp_log(LOG_ERR, "%s\n", msg); return 0; } while(0) @@ -105,12 +106,13 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { DEBUGMSGTL(("tls_x509:verify", "verify_callback called with: ok=%d ctx=%p depth=%d err=%i:%s\n", ok, ctx, depth, err, X509_verify_cert_error_string(err))); DEBUGMSGTL(("tls_x509:verify", " accepting matching fp of self-signed certificate found in: %s\n", cert->info.filename)); + SNMP_FREE(fingerprint); return 1; } else { DEBUGMSGTL(("tls_x509:verify", " no matching fp found\n")); /* log where we are and why called */ snmp_log(LOG_ERR, "tls verification failure: ok=%d ctx=%p depth=%d err=%i:%s\n", ok, ctx, depth, err, X509_verify_cert_error_string(err)); - + SNMP_FREE(fingerprint); return 0; } @@ -118,6 +120,7 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { (verify_info->flags & VRFY_PARENT_WAS_OK)) { DEBUGMSGTL(("tls_x509:verify", "verify_callback called with: ok=%d ctx=%p depth=%d err=%i:%s\n", ok, ctx, depth, err, X509_verify_cert_error_string(err))); DEBUGMSGTL(("tls_x509:verify", " a parent was ok, so returning ok for this child certificate\n")); + SNMP_FREE(fingerprint); return 1; /* we'll check the hostname later at this level */ } } @@ -128,6 +131,7 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { DEBUGMSGTL(("tls_x509:verify", "verify_callback called with: ok=%d ctx=%p depth=%d err=%i:%s\n", ok, ctx, depth, err, X509_verify_cert_error_string(err))); DEBUGMSGTL(("tls_x509:verify", " returning the passed in value of %d\n", ok)); + SNMP_FREE(fingerprint); return(ok); } @@ -186,6 +190,7 @@ _netsnmp_tlsbase_verify_remote_fingerprint(X509 *remote_cert, } } else { DEBUGMSGTL(("tls_x509:verify", "No fingerprint for the remote entity available to verify\n")); + free(fingerprint); return NO_FINGERPRINT_AVAILABLE; } @@ -262,7 +267,7 @@ netsnmp_tlsbase_verify_server_cert(SSL *ssl, _netsnmpTLSBaseData *tlsdata) { *check_name && j < sizeof(buf)-1; ++check_name, ++j ) { if (isascii(*check_name)) - buf[j] = tolower(*check_name); + buf[j] = tolower(0xFF & *check_name); } if (j < sizeof(buf)) buf[j] = '\0'; @@ -914,9 +919,8 @@ int netsnmp_tlsbase_wrapup_recv(netsnmp_tmStateReference *tmStateRef, /* RFC5953 Section 5.1.2 step 2: tmSecurityName */ /* XXX: detect and throw out overflow secname sizes rather than truncating. */ - strncpy(tmStateRef->securityName, tlsdata->securityName, - sizeof(tmStateRef->securityName)-1); - tmStateRef->securityName[sizeof(tmStateRef->securityName)-1] = '\0'; + strlcpy(tmStateRef->securityName, tlsdata->securityName, + sizeof(tmStateRef->securityName)); tmStateRef->securityNameLen = strlen(tmStateRef->securityName); /* RFC5953 Section 5.1.2 step 2: tmSessionID */ @@ -1080,6 +1084,7 @@ const char * _x509_get_error(int x509failvalue, const char *location) { #endif case X509_V_ERR_APPLICATION_VERIFICATION: reason = "X509_V_ERR_APPLICATION_VERIFICATION"; + break; default: reason = "unknown failure code"; } diff --git a/snmplib/transports/snmpTLSTCPDomain.c b/snmplib/transports/snmpTLSTCPDomain.c index c1423f6..a92091e 100644 --- a/snmplib/transports/snmpTLSTCPDomain.c +++ b/snmplib/transports/snmpTLSTCPDomain.c @@ -152,7 +152,7 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, snmp_log(LOG_ERR, "tlstcp received an invalid invocation with missing data\n"); DEBUGMSGTL(("tlstcp", "recvfrom fd %d err %d (\"%s\")\n", - t->sock, errno, strerror(errno))); + (t ? t->sock : -1), errno, strerror(errno))); DEBUGMSGTL(("tlstcp", " tdata = %p\n", t->data)); return -1; } @@ -248,8 +248,8 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, */ /* read the packet from openssl */ - rc = SSL_read(tlsdata->ssl, buf, size); - while (rc <= 0) { + do { + rc = SSL_read(tlsdata->ssl, buf, size); if (rc == 0) { /* XXX closed connection */ DEBUGMSGTL(("tlstcp", "remote side closed connection\n")); @@ -257,24 +257,22 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, SNMP_FREE(tmStateRef); return -1; } - rc = SSL_read(tlsdata->ssl, buf, size); - } + if (rc == -1) { + int err = SSL_get_error(tlsdata->ssl, rc); + if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { + /* error detected */ + _openssl_log_error(rc, tlsdata->ssl, "SSL_read"); + SNMP_FREE(tmStateRef); + return rc; + } + } + /* retry read for SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE */ + } while (rc <= 0); DEBUGMSGTL(("tlstcp", "received %d decoded bytes from tls\n", rc)); - /* Check for errors */ - if (rc == -1) { - if (SSL_get_error(tlsdata->ssl, rc) == SSL_ERROR_WANT_READ) - return -1; /* XXX: it's ok, but what's the right return? */ - - _openssl_log_error(rc, tlsdata->ssl, "SSL_read"); - SNMP_FREE(tmStateRef); - - return rc; - } - /* log the packet */ - { + DEBUGIF("tlstcp") { char *str = netsnmp_tlstcp_fmtaddr(t, NULL, 0); DEBUGMSGTL(("tlstcp", "recvfrom fd %d got %d bytes (from %s)\n", @@ -416,7 +414,7 @@ netsnmp_tlstcp_send(netsnmp_transport *t, void *buf, int size, /* If the first packet and we have no secname, then copy the important securityName data into the longer-lived session reference information. */ - if ((tlsdata->flags | NETSNMP_TLSBASE_IS_CLIENT) && + if ((tlsdata->flags & NETSNMP_TLSBASE_IS_CLIENT) && !tlsdata->securityName && tmStateRef && tmStateRef->securityNameLen > 0) tlsdata->securityName = strdup(tmStateRef->securityName); @@ -921,7 +919,6 @@ netsnmp_tlstcp_transport(const char *addr_string, int isserver) if (NULL == t) { return NULL; } - memset(t, 0, sizeof(netsnmp_transport)); /* allocate our TLS specific data */ if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, isserver))) @@ -936,12 +933,13 @@ netsnmp_tlstcp_transport(const char *addr_string, int isserver) if (!isserver && tlsdata && addr_string) { /* search for a : */ if (NULL != (cp = strrchr(addr_string, ':'))) { - strncpy(buf, addr_string, sizeof(buf)-1); + sprintf(buf, "%.*s", + (int) SNMP_MIN(cp - addr_string, sizeof(buf) - 1), + addr_string); } else { /* else the entire spec is a host name only */ - strncpy(buf, addr_string, sizeof(buf)-1); + strlcpy(buf, addr_string, sizeof(buf)); } - buf[sizeof(buf)-1] = '\0'; tlsdata->their_hostname = strdup(buf); } @@ -989,7 +987,7 @@ netsnmp_tlstcp_create_tstring(const char *str, int local, for(cp = str; *cp != '\0'; cp++) { /* if ALL numbers, it must be just a port */ /* if it contains anything else, assume a host or ip address */ - if (!isdigit(*cp)) { + if (!isdigit(0xFF & *cp)) { isport = 0; break; } diff --git a/snmplib/transports/snmpUDPBaseDomain.c b/snmplib/transports/snmpUDPBaseDomain.c index eb5f1a1..fc5c1cc 100644 --- a/snmplib/transports/snmpUDPBaseDomain.c +++ b/snmplib/transports/snmpUDPBaseDomain.c @@ -89,6 +89,160 @@ _netsnmp_udp_sockopt_set(int fd, int local) netsnmp_sock_buffer_set(fd, SO_RCVBUF, local, 0); } +#if (defined(linux) && defined(IP_PKTINFO)) \ + || defined(IP_RECVDSTADDR) && HAVE_STRUCT_MSGHDR_MSG_CONTROL \ + && HAVE_STRUCT_MSGHDR_MSG_FLAGS +#if defined(linux) && defined(IP_PKTINFO) +#elif defined(IP_RECVDSTADDR) +# ifndef IP_SENDSRCADDR +# define IP_SENDSRCADDR IP_RECVDSTADDR /* DragonFly BSD */ +# endif +#endif + +#define netsnmp_udpbase_recvfrom_sendto_defined + +enum { +#if defined(linux) && defined(IP_PKTINFO) + cmsg_data_size = sizeof(struct in_pktinfo) +#elif defined(IP_RECVDSTADDR) + cmsg_data_size = sizeof(struct in_addr) +#endif +}; + +int +netsnmp_udpbase_recvfrom(int s, void *buf, int len, struct sockaddr *from, + socklen_t *fromlen, struct sockaddr *dstip, + socklen_t *dstlen, int *if_index) +{ + int r; + struct iovec iov; + char cmsg[CMSG_SPACE(cmsg_data_size)]; + struct cmsghdr *cm; + struct msghdr msg; + + iov.iov_base = buf; + iov.iov_len = len; + + memset(&msg, 0, sizeof msg); + msg.msg_name = from; + msg.msg_namelen = *fromlen; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = &cmsg; + msg.msg_controllen = sizeof(cmsg); + + r = recvmsg(s, &msg, NETSNMP_DONTWAIT); + + if (r == -1) { + return -1; + } + + DEBUGMSGTL(("udpbase:recv", "got source addr: %s\n", + inet_ntoa(((struct sockaddr_in *)from)->sin_addr))); + + { + /* Get the local port number for use in diagnostic messages */ + int r2 = getsockname(s, dstip, dstlen); + netsnmp_assert(r2 == 0); + } + + for (cm = CMSG_FIRSTHDR(&msg); cm != NULL; cm = CMSG_NXTHDR(&msg, cm)) { +#if defined(linux) && defined(IP_PKTINFO) + if (cm->cmsg_level == SOL_IP && cm->cmsg_type == IP_PKTINFO) { + struct in_pktinfo* src = (struct in_pktinfo *)CMSG_DATA(cm); + netsnmp_assert(dstip->sa_family == AF_INET); + ((struct sockaddr_in*)dstip)->sin_addr = src->ipi_addr; + *if_index = src->ipi_ifindex; + DEBUGMSGTL(("udpbase:recv", + "got destination (local) addr %s, iface %d\n", + inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr), + *if_index)); + } +#elif defined(IP_RECVDSTADDR) + if (cm->cmsg_level == IPPROTO_IP && cm->cmsg_type == IP_RECVDSTADDR) { + struct in_addr* src = (struct in_addr *)CMSG_DATA(cm); + ((struct sockaddr_in*)dstip)->sin_addr = *src; + DEBUGMSGTL(("netsnmp_udp", "got destination (local) addr %s\n", + inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr))); + } +#endif + } + return r; +} + +int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, + struct sockaddr *remote, void *data, int len) +{ + struct iovec iov; + struct msghdr m = { 0 }; + char cmsg[CMSG_SPACE(cmsg_data_size)]; + + iov.iov_base = data; + iov.iov_len = len; + + m.msg_name = remote; + m.msg_namelen = sizeof(struct sockaddr_in); + m.msg_iov = &iov; + m.msg_iovlen = 1; + m.msg_flags = 0; + + if (srcip && srcip->s_addr != INADDR_ANY) { + struct cmsghdr *cm; + + DEBUGMSGTL(("udpbase:sendto", "sending from %s\n", inet_ntoa(*srcip))); + + memset(cmsg, 0, sizeof(cmsg)); + + m.msg_control = &cmsg; + m.msg_controllen = sizeof(cmsg); + + cm = CMSG_FIRSTHDR(&m); + cm->cmsg_len = CMSG_LEN(cmsg_data_size); + +#if defined(linux) && defined(IP_PKTINFO) + cm->cmsg_level = SOL_IP; + cm->cmsg_type = IP_PKTINFO; + + { + struct in_pktinfo ipi = { 0 }; + ipi.ipi_ifindex = 0; + ipi.ipi_spec_dst.s_addr = srcip->s_addr; + memcpy(CMSG_DATA(cm), &ipi, sizeof(ipi)); + } + + { + errno = 0; + const int rc = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); + + if (rc >= 0 || errno != EINVAL) + return rc; + } + + /* + * The error might be caused by broadcast srcip (i.e. we're responding + * to a broadcast request) - sendmsg does not like it. Try to resend it + * using the interface on which it was received + */ + + DEBUGMSGTL(("udpbase:sendto", "re-sending on iface %d\n", if_index)); + + { + struct in_pktinfo ipi = { 0 }; + ipi.ipi_ifindex = if_index; + ipi.ipi_spec_dst.s_addr = INADDR_ANY; + memcpy(CMSG_DATA(cm), &ipi, sizeof(ipi)); + } +#elif defined(IP_SENDSRCADDR) + cm->cmsg_level = IPPROTO_IP; + cm->cmsg_type = IP_SENDSRCADDR; + memcpy((struct in_addr *)CMSG_DATA(cm), srcip, sizeof(struct in_addr)); +#endif + } + + return sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); +} +#endif /* (linux && IP_PKTINFO) || IP_RECVDSTADDR */ + /* * You can write something into opaque that will subsequently get passed back * to your send function if you like. For instance, you might want to @@ -116,25 +270,28 @@ netsnmp_udpbase_recv(netsnmp_transport *t, void *buf, int size, } while (rc < 0) { -#if defined(linux) && defined(IP_PKTINFO) +#ifdef netsnmp_udpbase_recvfrom_sendto_defined socklen_t local_addr_len = sizeof(addr_pair->local_addr); rc = netsnmp_udp_recvfrom(t->sock, buf, size, from, &fromlen, (struct sockaddr*)&(addr_pair->local_addr), &local_addr_len, &(addr_pair->if_index)); #else rc = recvfrom(t->sock, buf, size, NETSNMP_DONTWAIT, from, &fromlen); -#endif /* linux && IP_PKTINFO */ +#endif /* netsnmp_udpbase_recvfrom_sendto_defined */ if (rc < 0 && errno != EINTR) { break; } } if (rc >= 0) { - char *str = netsnmp_udp_fmtaddr(NULL, addr_pair, sizeof(netsnmp_indexed_addr_pair)); - DEBUGMSGTL(("netsnmp_udp", - "recvfrom fd %d got %d bytes (from %s)\n", - t->sock, rc, str)); - free(str); + DEBUGIF("netsnmp_udp") { + char *str = netsnmp_udp_fmtaddr( + NULL, addr_pair, sizeof(netsnmp_indexed_addr_pair)); + DEBUGMSGTL(("netsnmp_udp", + "recvfrom fd %d got %d bytes (from %s)\n", + t->sock, rc, str)); + free(str); + } } else { DEBUGMSGTL(("netsnmp_udp", "recvfrom fd %d err %d (\"%s\")\n", t->sock, errno, strerror(errno))); @@ -167,19 +324,21 @@ netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size, to = &addr_pair->remote_addr.sa; if (to != NULL && t != NULL && t->sock >= 0) { - char *str = netsnmp_udp_fmtaddr(NULL, (void *) addr_pair, - sizeof(netsnmp_indexed_addr_pair)); - DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p to %s on fd %d\n", - size, buf, str, t->sock)); - free(str); + DEBUGIF("netsnmp_udp") { + char *str = netsnmp_udp_fmtaddr(NULL, (void *) addr_pair, + sizeof(netsnmp_indexed_addr_pair)); + DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p to %s on fd %d\n", + size, buf, str, t->sock)); + free(str); + } while (rc < 0) { -#if defined(linux) && defined(IP_PKTINFO) +#ifdef netsnmp_udpbase_recvfrom_sendto_defined rc = netsnmp_udp_sendto(t->sock, addr_pair ? &(addr_pair->local_addr.sin.sin_addr) : NULL, addr_pair ? addr_pair->if_index : 0, to, buf, size); #else rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr)); -#endif /* linux && IP_PKTINFO */ +#endif /* netsnmp_udpbase_recvfrom_sendto_defined */ if (rc < 0 && errno != EINTR) { DEBUGMSGTL(("netsnmp_udp", "sendto error, rc %d (errno %d)\n", rc, errno)); @@ -189,153 +348,3 @@ netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size, } return rc; } - -#if (defined(linux) && defined(IP_PKTINFO)) \ - || defined(IP_RECVDSTADDR) && HAVE_STRUCT_MSGHDR_MSG_CONTROL \ - && HAVE_STRUCT_MSGHDR_MSG_FLAGS -#if defined(linux) && defined(IP_PKTINFO) -# define netsnmp_dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr)) -#elif defined(IP_RECVDSTADDR) -# define netsnmp_dstaddr(x) (&(struct cmsghr *)(CMSG_DATA(x))) -# ifndef IP_SENDSRCADDR -# define IP_SENDSRCADDR IP_RECVDSTADDR /* DragonFly BSD */ -# endif -#endif - -int -netsnmp_udpbase_recvfrom(int s, void *buf, int len, struct sockaddr *from, - socklen_t *fromlen, struct sockaddr *dstip, - socklen_t *dstlen, int *if_index) -{ - int r, r2; - struct iovec iov[1]; -#if defined(linux) && defined(IP_PKTINFO) - char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; -#elif defined(IP_RECVDSTADDR) - char cmsg[CMSG_SPACE(sizeof(struct in_addr))]; -#endif - struct cmsghdr *cmsgptr; - struct msghdr msg; - - iov[0].iov_base = buf; - iov[0].iov_len = len; - - memset(&msg, 0, sizeof msg); - msg.msg_name = from; - msg.msg_namelen = *fromlen; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - msg.msg_control = &cmsg; - msg.msg_controllen = sizeof(cmsg); - - r = recvmsg(s, &msg, NETSNMP_DONTWAIT); - - if (r == -1) { - return -1; - } - - r2 = getsockname(s, dstip, dstlen); - netsnmp_assert(r2 == 0); - - DEBUGMSGTL(("udpbase:recv", "got source addr: %s\n", - inet_ntoa(((struct sockaddr_in *)from)->sin_addr))); -#if defined(linux) && defined(IP_PKTINFO) - for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) { - if (cmsgptr->cmsg_level != SOL_IP || cmsgptr->cmsg_type != IP_PKTINFO) - continue; - - netsnmp_assert(dstip->sa_family == AF_INET); - ((struct sockaddr_in*)dstip)->sin_addr = *netsnmp_dstaddr(cmsgptr); - *if_index = (((struct in_pktinfo *)(CMSG_DATA(cmsgptr)))->ipi_ifindex); - DEBUGMSGTL(("udpbase:recv", - "got destination (local) addr %s, iface %d\n", - inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr), - *if_index)); - } -#elif defined(IP_RECVDSTADDR) - for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) { - if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVDSTADDR) { - memcpy((void *) dstip, CMSG_DATA(cmsgptr), sizeof(struct in_addr)); - DEBUGMSGTL(("netsnmp_udp", "got destination (local) addr %s\n", - inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr))); - } - } -#endif - return r; -} - -#if defined(linux) && defined(IP_PKTINFO) -int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, - struct sockaddr *remote, void *data, int len) -{ - struct iovec iov; - struct { - struct cmsghdr cm; - struct in_pktinfo ipi; - } cmsg; - struct msghdr m; - int ret; - - iov.iov_base = data; - iov.iov_len = len; - memset(&cmsg, 0, sizeof(cmsg)); - cmsg.cm.cmsg_len = sizeof(struct cmsghdr) + sizeof(struct in_pktinfo); - cmsg.cm.cmsg_level = SOL_IP; - cmsg.cm.cmsg_type = IP_PKTINFO; - cmsg.ipi.ipi_ifindex = 0; - cmsg.ipi.ipi_spec_dst.s_addr = (srcip ? srcip->s_addr : INADDR_ANY); - - m.msg_name = remote; - m.msg_namelen = sizeof(struct sockaddr_in); - m.msg_iov = &iov; - m.msg_iovlen = 1; - m.msg_control = &cmsg; - m.msg_controllen = sizeof(cmsg); - m.msg_flags = 0; - - DEBUGMSGTL(("udpbase:sendto", "sending from %s iface %d\n", - (srcip ? inet_ntoa(*srcip) : "NULL"), if_index)); - errno = 0; - ret = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); - if (ret < 0 && errno == EINVAL && srcip) { - /* The error might be caused by broadcast srcip (i.e. we're responding - * to broadcast request) - sendmsg does not like it. Try to resend it - * with global address and using the interface on whicg it was - * received */ - cmsg.ipi.ipi_ifindex = if_index; - cmsg.ipi.ipi_spec_dst.s_addr = INADDR_ANY; - DEBUGMSGTL(("udpbase:sendto", "re-sending the message\n")); - ret = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); - } - return ret; -} -#elif defined(IP_SENDSRCADDR) -int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, - struct sockaddr *remote, void *data, int len) -{ - struct iovec iov = { data, len }; - struct cmsghdr *cm; - struct msghdr m; - char cmbuf[CMSG_SPACE(sizeof(struct in_addr))]; - - memset(&m, 0, sizeof(struct msghdr)); - m.msg_name = remote; - m.msg_namelen = sizeof(struct sockaddr_in); - m.msg_iov = &iov; - m.msg_iovlen = 1; - m.msg_control = cmbuf; - m.msg_controllen = sizeof(cmbuf); - m.msg_flags = 0; - - cm = CMSG_FIRSTHDR(&m); - cm->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); - cm->cmsg_level = IPPROTO_IP; - cm->cmsg_type = IP_SENDSRCADDR; - - memcpy((struct in_addr *)CMSG_DATA(cm), srcip, sizeof(struct in_addr)); - - return sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); -} -#endif -#endif /* (linux && IP_PKTINFO) || IP_RECVDSTADDR */ - diff --git a/snmplib/transports/snmpUDPIPv4BaseDomain.c b/snmplib/transports/snmpUDPIPv4BaseDomain.c index 5a4f5b0..5f2f2da 100644 --- a/snmplib/transports/snmpUDPIPv4BaseDomain.c +++ b/snmplib/transports/snmpUDPIPv4BaseDomain.c @@ -64,7 +64,6 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) { netsnmp_transport *t = NULL; int rc = 0, rc2; - char *str = NULL; char *client_socket = NULL; netsnmp_indexed_addr_pair addr_pair; socklen_t local_addr_len; @@ -84,11 +83,13 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); netsnmp_assert_or_return(t != NULL, NULL); - str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, - sizeof(netsnmp_indexed_addr_pair)); - DEBUGMSGTL(("netsnmp_udpbase", "open %s %s\n", local ? "local" : "remote", - str)); - free(str); + DEBUGIF("netsnmp_udpbase") { + char *str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, + sizeof(netsnmp_indexed_addr_pair)); + DEBUGMSGTL(("netsnmp_udpbase", "open %s %s\n", + local ? "local" : "remote", str)); + free(str); + } t->sock = socket(PF_INET, SOCK_DGRAM, 0); DEBUGMSGTL(("UDPBase", "openned socket %d as local=%d\n", t->sock, local)); @@ -128,6 +129,17 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) } DEBUGMSGTL(("netsnmp_udpbase", "set IP_PKTINFO\n")); } +#elif defined(IP_RECVDSTADDR) + { + int sockopt = 1; + if (setsockopt(t->sock, IPPROTO_IP, IP_RECVDSTADDR, &sockopt, sizeof sockopt) == -1) { + DEBUGMSGTL(("netsnmp_udp", "couldn't set IP_RECVDSTADDR: %s\n", + strerror(errno))); + netsnmp_transport_free(t); + return NULL; + } + DEBUGMSGTL(("netsnmp_udp", "set IP_RECVDSTADDR\n")); + } #endif rc = bind(t->sock, (struct sockaddr *) addr, sizeof(struct sockaddr)); @@ -169,10 +181,12 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) netsnmp_assert(rc2 == 0); } - str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, - sizeof(netsnmp_indexed_addr_pair)); - DEBUGMSGTL(("netsnmp_udpbase", "client open %s\n", str)); - free(str); + DEBUGIF("netsnmp_udpbase") { + char *str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, + sizeof(netsnmp_indexed_addr_pair)); + DEBUGMSGTL(("netsnmp_udpbase", "client open %s\n", str)); + free(str); + } /* * Save the (remote) address in the diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c index 90607b5..b3eaae4 100644 --- a/snmplib/transports/snmpUDPIPv6Domain.c +++ b/snmplib/transports/snmpUDPIPv6Domain.c @@ -65,6 +65,7 @@ static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; #include #include +#include #include "inet_ntop.h" #include "inet_pton.h" @@ -123,11 +124,13 @@ netsnmp_udp6_recv(netsnmp_transport *t, void *buf, int size, } if (rc >= 0) { - char *str = netsnmp_udp6_fmtaddr(NULL, from, fromlen); - DEBUGMSGTL(("netsnmp_udp6", - "recvfrom fd %d got %d bytes (from %s)\n", t->sock, - rc, str)); - free(str); + DEBUGIF("netsnmp_udp6") { + char *str = netsnmp_udp6_fmtaddr(NULL, from, fromlen); + DEBUGMSGTL(("netsnmp_udp6", + "recvfrom fd %d got %d bytes (from %s)\n", t->sock, + rc, str)); + free(str); + } } else { DEBUGMSGTL(("netsnmp_udp6", "recvfrom fd %d err %d (\"%s\")\n", t->sock, errno, strerror(errno))); @@ -157,11 +160,14 @@ netsnmp_udp6_send(netsnmp_transport *t, void *buf, int size, } if (to != NULL && t != NULL && t->sock >= 0) { - char *str = netsnmp_udp6_fmtaddr(NULL, (void *)to, - sizeof(struct sockaddr_in6)); - DEBUGMSGTL(("netsnmp_udp6", "send %d bytes from %p to %s on fd %d\n", - size, buf, str, t->sock)); - free(str); + DEBUGIF("netsnmp_udp6") { + char *str = netsnmp_udp6_fmtaddr(NULL, (void *)to, + sizeof(struct sockaddr_in6)); + DEBUGMSGTL(("netsnmp_udp6", + "send %d bytes from %p to %s on fd %d\n", + size, buf, str, t->sock)); + free(str); + } while (rc < 0) { rc = sendto(t->sock, buf, size, 0, to,sizeof(struct sockaddr_in6)); if (rc < 0 && errno != EINTR) { @@ -184,7 +190,6 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local) { netsnmp_transport *t = NULL; int rc = 0; - char *str = NULL; #ifdef NETSNMP_NO_LISTEN_SUPPORT if (local) @@ -195,18 +200,18 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - str = netsnmp_udp6_fmtaddr(NULL, (void *) addr, - sizeof(struct sockaddr_in6)); - DEBUGMSGTL(("netsnmp_udp6", "open %s %s\n", local ? "local" : "remote", - str)); - free(str); - - memset(t, 0, sizeof(netsnmp_transport)); + DEBUGIF("netsnmp_udp6") { + char *str = netsnmp_udp6_fmtaddr(NULL, (void *) addr, + sizeof(struct sockaddr_in6)); + DEBUGMSGTL(("netsnmp_udp6", "open %s %s\n", local ? "local" : "remote", + str)); + free(str); + } t->domain = netsnmp_UDPIPv6Domain; t->domain_length = diff --git a/snmplib/transports/snmpUnixDomain.c b/snmplib/transports/snmpUnixDomain.c index fbdeb03..674dc2b 100644 --- a/snmplib/transports/snmpUnixDomain.c +++ b/snmplib/transports/snmpUnixDomain.c @@ -35,6 +35,7 @@ #include #include #include /* mkdirhier */ +#include netsnmp_feature_child_of(transport_unix_socket_all, transport_all) netsnmp_feature_child_of(unix_socket_paths, transport_unix_socket_all) @@ -294,7 +295,6 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local) netsnmp_transport *t = NULL; sockaddr_un_pair *sup = NULL; int rc = 0; - char *string = NULL; #ifdef NETSNMP_NO_LISTEN_SUPPORT /* SPECIAL CIRCUMSTANCE: We still want AgentX to be able to operate, @@ -307,18 +307,18 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local) return NULL; } - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); if (t == NULL) { return NULL; } - string = netsnmp_unix_fmtaddr(NULL, (void *)addr, - sizeof(struct sockaddr_un)); - DEBUGMSGTL(("netsnmp_unix", "open %s %s\n", local ? "local" : "remote", - string)); - free(string); - - memset(t, 0, sizeof(netsnmp_transport)); + DEBUGIF("netsnmp_unix") { + char *str = netsnmp_unix_fmtaddr(NULL, (void *)addr, + sizeof(struct sockaddr_un)); + DEBUGMSGTL(("netsnmp_unix", "open %s %s\n", local ? "local" : "remote", + str)); + free(str); + } t->domain = netsnmp_UnixDomain; t->domain_length = @@ -463,7 +463,7 @@ netsnmp_unix_create_tstring(const char *string, int local, (strlen(string) < sizeof(addr.sun_path))) { addr.sun_family = AF_UNIX; memset(addr.sun_path, 0, sizeof(addr.sun_path)); - strncpy(addr.sun_path, string, sizeof(addr.sun_path) - 1); + strlcpy(addr.sun_path, string, sizeof(addr.sun_path)); return netsnmp_unix_transport(&addr, local); } else { if (string != NULL && *string != '\0') { @@ -483,7 +483,7 @@ netsnmp_unix_create_ostring(const u_char * o, size_t o_len, int local) if (o_len > 0 && o_len < (sizeof(addr.sun_path) - 1)) { addr.sun_family = AF_UNIX; memset(addr.sun_path, 0, sizeof(addr.sun_path)); - strncpy(addr.sun_path, (const char *)o, o_len); + strlcpy(addr.sun_path, (const char *)o, sizeof(addr.sun_path)); return netsnmp_unix_transport(&addr, local); } else { if (o_len > 0) { diff --git a/testing/RUNTESTS b/testing/RUNTESTS index 8976c31..0b093da 100755 --- a/testing/RUNTESTS +++ b/testing/RUNTESTS @@ -10,13 +10,13 @@ if [ "x$MIBDIRS" = "x" ]; then export MIBDIRS fi -# Make sure MinGW / MSYS users have the kill.exe program to stop the agent and +# Make sure MinGW / MSYS users have the pskill.exe program to stop the agent and # snmptrapd -if [ "x$OSTYPE" = "xmsys" -a "x`type -p kill.exe`" = "x" ]; then - echo Could not find kill.exe. Aborting tests. - echo kill.exe can be installed as follows: - echo - Download pskill.exe from http://technet.microsoft.com/en-us/sysinternals/default.aspx. - echo - Copy pskill.exe to C:\Windows\kill.exe. +if [ "x$OSTYPE" = "xmsys" -a "x`type -p pskill.exe`" = "x" ]; then + echo "Could not find pskill.exe. Aborting tests." + echo "pskill.exe can be installed as follows:" + echo "- Download pskill.exe from http://technet.microsoft.com/en-us/sysinternals/default.aspx." + echo "- Copy pskill.exe to C:\\MinGW\\msys\\1.0\\bin." exit 1 fi diff --git a/testing/fulltests/default/T035snmpv3trapdusermgmt_simple b/testing/fulltests/default/T035snmpv3trapdusermgmt_simple index e42690f..e1b06c1 100644 --- a/testing/fulltests/default/T035snmpv3trapdusermgmt_simple +++ b/testing/fulltests/default/T035snmpv3trapdusermgmt_simple @@ -7,7 +7,8 @@ HEADER SNMPv3 snmptrapd USM user management with snmpusm SKIPIFNOT USING_AGENTX_MASTER_MODULE SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE SKIPIFNOT USING_SNMPV3_USMUSER_MODULE -SKIPIF NETSNMP_SNMPTRAPD_DISABLE_AGENTX +SKIPIF NETSNMP_SNMPTRAPD_DISABLE_AGENTX +SKIPIF NETSNMP_DISABLE_SET_SUPPORT SKIPIFNOT NETSNMP_CAN_DO_CRYPTO SKIPIFNOT NETSNMP_ENABLE_SCAPI_AUTHPRIV diff --git a/testing/fulltests/default/T065agentextend_simple b/testing/fulltests/default/T065agentextend_simple index c7cf6aa..07dcae3 100644 --- a/testing/fulltests/default/T065agentextend_simple +++ b/testing/fulltests/default/T065agentextend_simple @@ -4,6 +4,7 @@ HEADER "extending agent functionality with extend" +[ "x$OSTYPE" = xmsys -a "x$MSYS_SH" = x ] && SKIP "\$MSYS_SH has not been set" SKIPIF NETSNMP_DISABLE_SNMPV2C SKIPIFNOT USING_AGENT_EXTEND_MODULE SKIPIFNOT USING_UTILITIES_EXECUTE_MODULE diff --git a/testing/fulltests/default/T066pass_simple b/testing/fulltests/default/T066pass_simple new file mode 100644 index 0000000..6396ed1 --- /dev/null +++ b/testing/fulltests/default/T066pass_simple @@ -0,0 +1,53 @@ +#!/bin/sh + +. ../support/simple_eval_tools.sh + +HEADER "extending agent functionality with pass" + +SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIFNOT USING_UCD_SNMP_PASS_MODULE +SKIPIFNOT USING_UTILITIES_EXECUTE_MODULE + +# Don't run this test on MinGW - local/passtest is a shell script and +# hence passing it to the MSVCRT popen() doesn't work. +[ "x$OSTYPE" = "xmsys" ] && SKIP "MinGW" + +# make sure snmpget and snmpwalk can be executed +SNMPGET="${builddir}/apps/snmpget" +[ -x "$SNMPGET" ] || SKIP +SNMPWALK="${builddir}/apps/snmpwalk" +[ -x "$SNMPWALK" ] || SKIP + +snmp_version=v2c +TESTCOMMUNITY=testcommunity +. ./Sv2cconfig + +# +# Begin test +# +oid=.1.3.6.1.4.1.8072.2.255 # NET-SNMP-PASS-MIB::netSnmpPassExamples +CONFIGAGENT pass $oid ${srcdir}/local/passtest + +ORIG_AGENT_FLAGS="$AGENT_FLAGS" +AGENT_FLAGS="$ORIG_AGENT_FLAGS -Ducd-snmp/pass" +STARTAGENT + +#COMMENT Check a full walk of the sample data +CAPTURE "$SNMPWALK $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $oid" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassString.0 = STRING: Life, the Universe, and Everything" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassInteger.1 = INTEGER: 42" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassOID.1 = OID: NET-SNMP-PASS-MIB::netSnmpPassOIDValue" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassTimeTicks.0 = Timeticks: (363136200) 42 days, 0:42:42.00 " +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassIpAddress.0 = IpAddress: 127.0.0.1" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassCounter.0 = Counter32: 42" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassGauge.0 = Gauge32: 42" + +#COMMENT A couple of spot checks of GET requests. +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassInteger.1" +CHECKORDIE "INTEGER: 42" + +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" +CHECKORDIE "Counter32: 42" + +STOPAGENT +FINISHED diff --git a/testing/fulltests/default/T067passpersist_simple b/testing/fulltests/default/T067passpersist_simple new file mode 100644 index 0000000..f91651a --- /dev/null +++ b/testing/fulltests/default/T067passpersist_simple @@ -0,0 +1,61 @@ +#!/bin/sh + +. ../support/simple_eval_tools.sh + +HEADER "extending agent functionality with pass_persist" + +SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIFNOT USING_UCD_SNMP_PASS_PERSIST_MODULE + +# Don't run this test on MinGW - local/pass_persisttest is a shell script and +# hence passing it to the MSVCRT popen() doesn't work. +[ "x$OSTYPE" = "xmsys" ] && SKIP "MinGW" + +# make sure snmpget and snmpwalk can be executed +SNMPGET="${builddir}/apps/snmpget" +[ -x "$SNMPGET" ] || SKIP +SNMPWALK="${builddir}/apps/snmpwalk" +[ -x "$SNMPWALK" ] || SKIP + +snmp_version=v2c +TESTCOMMUNITY=testcommunity +. ./Sv2cconfig + +# +# Begin test +# +oid=.1.3.6.1.4.1.8072.2.255 # NET-SNMP-PASS-MIB::netSnmpPassExamples +CONFIGAGENT pass_persist $oid ${srcdir}/local/pass_persisttest + +ORIG_AGENT_FLAGS="$AGENT_FLAGS" +AGENT_FLAGS="$ORIG_AGENT_FLAGS -Ducd-snmp/pass_persist" +PASS_PERSIST_PIDFILE="$SNMP_TMPDIR/pass_persist.pid.$$" +export PASS_PERSIST_PIDFILE +STARTAGENT + +#COMMENT Check a full walk of the sample data +CAPTURE "$SNMPWALK $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $oid" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassString.0 = STRING: Life, the Universe, and Everything" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassInteger.1 = INTEGER: 42" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassOID.1 = OID: NET-SNMP-PASS-MIB::netSnmpPassOIDValue" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassTimeTicks.0 = Timeticks: (363136200) 42 days, 0:42:42.00 " +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassIpAddress.0 = IpAddress: 127.0.0.1" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassCounter.0 = Counter32: 1" +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassGauge.0 = Gauge32: 42" + +#COMMENT A couple of spot checks of GET requests. +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassInteger.1" +CHECKORDIE "INTEGER: 42" + +#COMMENT netSnmpPassCounter should increment, since this is pass_persist +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" +CHECKORDIE "Counter32: 2" + +#COMMENT now kill the pass_persist script, and check that it recovers. +STOPPROG $PASS_PERSIST_PIDFILE +#COMMENT netSnmpPassCounter should have reverted to 1, as this is a new instance. +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" +CHECKORDIE "Counter32: 1" + +STOPAGENT +FINISHED diff --git a/testing/fulltests/default/T111agentxset_simple b/testing/fulltests/default/T111agentxset_simple index 2423be5..c767064 100644 --- a/testing/fulltests/default/T111agentxset_simple +++ b/testing/fulltests/default/T111agentxset_simple @@ -7,6 +7,7 @@ HEADER AgentX SET support SKIPIFNOT USING_AGENTX_MASTER_MODULE SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE +SKIPIF NETSNMP_DISABLE_SET_SUPPORT # # Begin test diff --git a/testing/fulltests/default/T112agentxsetfail_simple b/testing/fulltests/default/T112agentxsetfail_simple index 9976144..4f1f0cb 100644 --- a/testing/fulltests/default/T112agentxsetfail_simple +++ b/testing/fulltests/default/T112agentxsetfail_simple @@ -7,6 +7,7 @@ HEADER AgentX illegal SET handling support SKIPIFNOT USING_AGENTX_MASTER_MODULE SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE +SKIPIF NETSNMP_DISABLE_SET_SUPPORT # # Begin test diff --git a/testing/fulltests/default/T114agentxagentxtrap_simple b/testing/fulltests/default/T114agentxagentxtrap_simple index ae72d5c..58475d0 100644 --- a/testing/fulltests/default/T114agentxagentxtrap_simple +++ b/testing/fulltests/default/T114agentxagentxtrap_simple @@ -38,7 +38,7 @@ STOPAGENT STOPTRAPD # Check that the trap was received -CHECKTRAPD "mostly_harmless" +CHECKTRAPD "= STRING: \"*mostly_harmless\"*" # all done (whew) FINISHED diff --git a/testing/fulltests/default/T121proxyset_simple b/testing/fulltests/default/T121proxyset_simple index 335a2da..d3d77d9 100644 --- a/testing/fulltests/default/T121proxyset_simple +++ b/testing/fulltests/default/T121proxyset_simple @@ -6,7 +6,8 @@ HEADER Proxy SET support SKIPIFNOT USING_UCD_SNMP_PROXY_MODULE SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE -SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIF NETSNMP_DISABLE_SET_SUPPORT # XXX: ucd-snmp/proxy doesn't properly support TCP -- remove this once it does [ "x$SNMP_TRANSPORT_SPEC" = "xtcp" -o "x$SNMP_TRANSPORT_SPEC" = "xtcp6" ] && SKIP diff --git a/testing/fulltests/default/T122proxysetfail_simple b/testing/fulltests/default/T122proxysetfail_simple index a49b3ef..d149f56 100644 --- a/testing/fulltests/default/T122proxysetfail_simple +++ b/testing/fulltests/default/T122proxysetfail_simple @@ -6,7 +6,8 @@ HEADER Proxy illegal SET handling support SKIPIFNOT USING_UCD_SNMP_PROXY_MODULE SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE -SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIF NETSNMP_DISABLE_SET_SUPPORT # XXX: ucd-snmp/proxy doesn't properly support TCP -- remove this once it does [ "x$SNMP_TRANSPORT_SPEC" = "xtcp" ] && SKIP diff --git a/testing/fulltests/default/T130snmpv1vacmget_simple b/testing/fulltests/default/T130snmpv1vacmget_simple index 1974b7f..80623f4 100644 --- a/testing/fulltests/default/T130snmpv1vacmget_simple +++ b/testing/fulltests/default/T130snmpv1vacmget_simple @@ -16,6 +16,7 @@ SKIPIF NETSNMP_DISABLE_SNMPV1 snmp_version=v1 . ./Svacmconfig +AGENT_FLAGS="$AGENT_FLAGS -I-winExtDLL" STARTAGENT CAPTURE "snmpget -On $SNMP_FLAGS -c testcommunity1 -v 1 $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT .1.3.6.1.2.1.1.1.0" diff --git a/testing/fulltests/default/T141snmpv2cvacmgetfail_simple b/testing/fulltests/default/T141snmpv2cvacmgetfail_simple index b97cf5d..69c2925 100644 --- a/testing/fulltests/default/T141snmpv2cvacmgetfail_simple +++ b/testing/fulltests/default/T141snmpv2cvacmgetfail_simple @@ -5,6 +5,7 @@ HEADER SNMPv2 vacm denial support SKIPIF NETSNMP_DISABLE_SNMPV2C +SKIPIF NETSNMP_DISABLE_SET_SUPPORT SKIPIFNOT USING_MIBII_VACM_CONF_MODULE # diff --git a/testing/fulltests/snmpv3/T040keymanagetest_capp.c b/testing/fulltests/snmpv3/T040keymanagetest_capp.c index f3f8dcc..d68f663 100644 --- a/testing/fulltests/snmpv3/T040keymanagetest_capp.c +++ b/testing/fulltests/snmpv3/T040keymanagetest_capp.c @@ -360,7 +360,6 @@ test_genkul(void) char *s = NULL; const char *testname = "Using HMACMD5 to create master key."; const char *hashname_Ku = "usmHMACMD5AuthProtocol"; - const char *hashname_kul = NULL; u_char Ku[LOCAL_MAXBUF], kul[LOCAL_MAXBUF]; @@ -413,7 +412,6 @@ test_genkul(void) test_genkul_again_master: memset(Ku, 0, LOCAL_MAXBUF); kulen = LOCAL_MAXBUF; - hashname_kul = "usmHMACMD5AuthProtocol"; hashtype_kul = usmHMACMD5AuthProtocol; properlength = BYTESIZE(SNMP_TRANS_AUTHLEN_HMACMD5); @@ -461,7 +459,6 @@ test_genkul(void) */ if (hashtype_kul == usmHMACMD5AuthProtocol) { hashtype_kul = usmHMACSHA1AuthProtocol; - hashname_kul = "usmHMACSHA1AuthProtocol"; properlength = BYTESIZE(SNMP_TRANS_AUTHLEN_HMACSHA1); goto test_genkul_again_local; } diff --git a/testing/fulltests/support/clib_build b/testing/fulltests/support/clib_build index 7a72285..0c7eb6d 100755 --- a/testing/fulltests/support/clib_build +++ b/testing/fulltests/support/clib_build @@ -13,6 +13,7 @@ cat >>"$2.c" < /* standard headers */ +#include #include #include #ifdef HAVE_STDLIB_H @@ -23,6 +24,9 @@ cat >>"$2.c" < #endif +#ifdef HAVE_NETDB_H +#include +#endif #ifdef HAVE_ARPA_INET_H #include #endif diff --git a/testing/fulltests/support/simple_TESTCONF.sh b/testing/fulltests/support/simple_TESTCONF.sh index f8f229a..83c38c2 100644 --- a/testing/fulltests/support/simple_TESTCONF.sh +++ b/testing/fulltests/support/simple_TESTCONF.sh @@ -7,6 +7,28 @@ # *SNMP_PERSISTENT_FILE: where to store the agent's persistent information # (XXX: this should be specific to just the agent) +# MinGW/MSYS only: translate an MSYS path back into a DOS path such that snmpd +# and the Net-SNMP applications can understand it. One of the features of MSYS +# is that if a POSIX-style path is passed as a command-line argument to an +# executable that MSYS translates that path to a DOS-style path before +# starting the executable. This is a key feature of MSYS that makes it +# possible to run shell scripts unmodified and at the same time to use +# executables that accept DOS-style paths. There is no support however for +# automatical translation of environment variables that contain paths. Hence +# this function that translates paths explicitly. +translate_path() { + if [ "$OSTYPE" = msys ]; then + local t=`set \ + | sed -n -e "s/^$1='\(.*\)'$/${SNMP_ENV_SEPARATOR}\1/p" \ + -e "s/^$1=\(.*\)$/${SNMP_ENV_SEPARATOR}\1/p" \ + | sed -e "s|${SNMP_ENV_SEPARATOR}/c/|${SNMP_ENV_SEPARATOR}c:/|g" \ + -e "s|${SNMP_ENV_SEPARATOR}/tmp/|${SNMP_ENV_SEPARATOR}c:/windows/temp/|g" \ + | sed -e "s/^${SNMP_ENV_SEPARATOR}//" \ + ` + eval "$1='$t'" + fi +} + # # Only allow ourselves to be eval'ed once # @@ -48,6 +70,8 @@ if [ "x$SNMP_VERBOSE" = "x" ]; then export SNMP_VERBOSE fi +SNMP_ENV_SEPARATOR="`${builddir}/net-snmp-config --env-separator`" + if [ "x$MIBDIRS" = "x" ]; then if [ "x$SNMP_PREFER_NEAR_MIBS" = "x1" ]; then MIBDIRS=${srcdir}/mibs @@ -103,6 +127,7 @@ if [ "x$SNMP_HEADERONLY" != "xyes" ]; then testnum=0 fi SNMP_TMPDIR="/tmp/snmp-test-$testnum-$$" + translate_path SNMP_TMPDIR export SNMP_TMPDIR if [ -d $SNMP_TMPDIR ]; then echo "$0: ERROR: $SNMP_TMPDIR already existed." @@ -110,7 +135,7 @@ if [ "x$SNMP_HEADERONLY" != "xyes" ]; then fi fi if [ ! -d $SNMP_TMPDIR ]; then - mkdir $SNMP_TMPDIR + mkdir -p $SNMP_TMPDIR chmod 0700 $SNMP_TMPDIR fi if [ "x$SNMP_TMP_PERSISTENTDIR" = "x" ]; then @@ -130,7 +155,6 @@ fi SNMP_IGNORE_WINDOWS_REGISTRY="true" export SNMP_IGNORE_WINDOWS_REGISTRY -SNMP_ENV_SEPARATOR="`${builddir}/net-snmp-config --env-separator`" SNMP_PERLPROG="`${builddir}/net-snmp-config --perlprog`" SNMP_TESTDIR="$SNMP_BASEDIR/tests" SNMP_CONFIG_FILE="$SNMP_TMPDIR/snmpd.conf" @@ -144,8 +168,10 @@ SNMP_SNMPD_LOG_FILE="$SNMP_TMPDIR/snmpd.log" SNMP_AGENTX_PID_FILE="$SNMP_TMPDIR/agentx.pid" SNMP_AGENTX_LOG_FILE="$SNMP_TMPDIR/agentx.log" SNMPCONFPATH="${SNMP_TMPDIR}${SNMP_ENV_SEPARATOR}${SNMP_TMP_PERSISTENTDIR}" +translate_path SNMPCONFPATH export SNMPCONFPATH SNMP_PERSISTENT_DIR=$SNMP_TMP_PERSISTENTDIR +translate_path SNMP_PERSISTENT_DIR export SNMP_PERSISTENT_DIR #SNMP_PERSISTENT_FILE="$SNMP_TMP_PERSISTENTDIR/persistent-store.conf" #export SNMP_PERSISTENT_FILE @@ -175,8 +201,12 @@ else fi if [ "x$OSTYPE" = "xmsys" ]; then - # To do: make configure find out the path of MSYS' sh.exe. - MSYS_SH="c:/msys/1.0/bin/sh.exe" + # Obtain the MSYS installation path from the !C: environment variable, + # remove surrounding single quotes and convert backslashes into forward + # slashes. + MSYS_PATH="$(set \ + | sed -n 's|^\!C:='"'"'\(.*\)'"'"'$|\1|p' | sed 's|\\|/|g')" + MSYS_SH="$MSYS_PATH/sh.exe" fi PROBE_FOR_PORT() { diff --git a/testing/fulltests/support/simple_eval_tools.sh b/testing/fulltests/support/simple_eval_tools.sh index f16d9a6..d1dfbc8 100644 --- a/testing/fulltests/support/simple_eval_tools.sh +++ b/testing/fulltests/support/simple_eval_tools.sh @@ -114,7 +114,7 @@ SKIP() { } ISDEFINED() { - grep "^#define $1" ${builddir}/include/net-snmp/net-snmp-config.h ${builddir}/include/net-snmp/agent/mib_module_config.h ${builddir}/include/net-snmp/agent/agent_module_config.h > /dev/null + grep -wq "^#define $1" ${builddir}/include/net-snmp/net-snmp-config.h ${builddir}/include/net-snmp/agent/mib_module_config.h ${builddir}/include/net-snmp/agent/agent_module_config.h } SKIPIFNOT() { @@ -131,7 +131,7 @@ VERIFY() { # local missingfiles= for f in $*; do - [ -e "$f" ] && continue + [ -f "$f" ] && continue echo "FAILED: Cannot find file \"$f\"." missingfiles=true done @@ -148,7 +148,7 @@ NEWOUTPUTFILE() { # STARTTEST() { NEWOUTPUTFILE - [ ! -e "$junkoutputfile" ] && { + [ ! -f "$junkoutputfile" ] && { touch $junkoutputfile return } @@ -365,7 +365,7 @@ ISRUNNING() { # Echo a command that asks the process with pid $1 to stop. ECHOSENDSIGTERM() { if [ "x$OSTYPE" = "xmsys" ]; then - echo kill.exe $1 + echo pskill.exe $1 else echo kill -TERM $1 fi @@ -374,7 +374,7 @@ ECHOSENDSIGTERM() { # Echo a command that stops the process with pid $1 forcibly. ECHOSENDSIGKILL() { if [ "x$OSTYPE" = "xmsys" ]; then - echo kill.exe $1 + echo pskill.exe $1 else echo kill -KILL $1 fi @@ -489,7 +489,6 @@ CONFIGAPP() { # # common to STARTAGENT and STARTTRAPD # log command to "invoked" file -# delay after command to allow for settle # STARTPROG() { if [ "x$DYNAMIC_ANALYZER" != "x" ]; then @@ -537,6 +536,7 @@ STARTAGENT() { PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" fi STARTPROG + WAITFORCOND test -f $SNMP_SNMPD_PID_FILE WAITFORAGENT "NET-SNMP version" } @@ -551,6 +551,7 @@ STARTTRAPD() { PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" fi STARTPROG + WAITFORCOND test -f $SNMP_SNMPTRAPD_PID_FILE WAITFORTRAPD "NET-SNMP version" } @@ -559,7 +560,7 @@ STARTTRAPD() { HUPPROG() { if [ -f $1 ]; then if [ "x$OSTYPE" = "xmsys" ]; then - COMMAND='echo "Skipping SIGHUP (not supported by kill.exe on MinGW)"' + COMMAND='echo "Skipping SIGHUP (not possible with MinGW)"' else COMMAND="kill -HUP `cat $1`" fi @@ -595,7 +596,10 @@ STOPPROG() { echo "$COMMAND ($1)" >> $SNMP_TMPDIR/invoked VERBOSE_OUT 0 "$COMMAND ($1)" $COMMAND >/dev/null 2>&1 - if [ "x$OSTYPE" != "xmsys" ]; then + if [ "x$OSTYPE" = "xmsys" ]; then + # Wait until $pid and its parent have stopped. + sleep 1 + else WAITFORNOTCOND "ISRUNNING $pid" fi fi diff --git a/testing/fulltests/unit-tests/T004snmp_enum_clib.c b/testing/fulltests/unit-tests/T004snmp_enum_clib.c index e78ffca..d28b19b 100644 --- a/testing/fulltests/unit-tests/T004snmp_enum_clib.c +++ b/testing/fulltests/unit-tests/T004snmp_enum_clib.c @@ -1,15 +1,69 @@ /* HEADER Testing snmp_enum */ +#define CONFIG_TYPE "snmp-enum-unit-test" #define STRING1 "life, and everything" #define STRING2 "restaurant at the end of the universe" #define STRING3 "label3" +#define LONG_STRING "a-string-of-255-characters-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" +#define STORE_AND_COMPARE(maj, min, s) \ + { \ + FILE *fp; \ + int read = 0; \ + char *p, contents[4096]; \ + \ + se_store_list(maj, min, CONFIG_TYPE); \ + fp = fopen(tmp_persist_file, "r"); \ + if (fp) { \ + read = fread(contents, 1, sizeof(contents) - 1, fp); \ + fclose(fp); \ + } \ + contents[read > 0 ? read : 0] = '\0'; \ + for (p = contents; *p; ++p) \ + if (*p == '\n') \ + *p = '|'; \ + OKF(strcmp(contents, (s)) == 0, \ + ("stored list %s <> %s", (s), contents)); \ + remove(tmp_persist_file); \ + } + +char tmp_persist_file[256]; char *se_find_result; +sprintf(tmp_persist_file, "/tmp/snmp-enum-unit-test-%d", getpid()); +netsnmp_setenv("SNMP_PERSISTENT_FILE", tmp_persist_file, 1); + init_snmp_enum("snmp"); + +STORE_AND_COMPARE(1, 1, "enum 1:1|"); + se_add_pair(1, 1, strdup("hi"), 1); + +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi|"); + se_add_pair(1, 1, strdup("there"), 2); +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there|"); + +se_add_pair(1, 1, strdup(LONG_STRING), 3); +se_add_pair(1, 1, strdup(LONG_STRING), 4); +se_add_pair(1, 1, strdup(LONG_STRING), 5); +se_add_pair(1, 1, strdup(LONG_STRING), 6); +se_add_pair(1, 1, strdup(LONG_STRING), 7); +se_add_pair(1, 1, strdup(LONG_STRING), 8); +se_add_pair(1, 1, strdup(LONG_STRING), 9); + +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING + " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING + " 8:" LONG_STRING " 9:" LONG_STRING "|"); + +se_add_pair(1, 1, strdup(LONG_STRING), 10); + +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING + " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING + " 8:" LONG_STRING " 9:" LONG_STRING "|" + "enum 1:1 10:" LONG_STRING "|"); + OK(se_find_value(1, 1, "hi") == 1, "lookup by number #1 should be the proper string"); OK(strcmp(se_find_label(1, 1, 2), "there") == 0, @@ -33,10 +87,10 @@ se_read_conf("enum", OK(se_find_list(2, 3), "list (2, 3) should be present"); if (se_find_list(2, 3)) { OK(se_find_value(2, 3, "kiwifruit") == 3, - "lookup by string should return the proper value") + "lookup by string should return the proper value"); se_find_result = se_find_label(2, 3, 2); OK(se_find_result && strcmp(se_find_result, "pear") == 0, - "lookup by label should return the proper string") + "lookup by label should return the proper string"); } se_read_conf("enum", diff --git a/testing/fulltests/unit-tests/T008asn1_clib.c b/testing/fulltests/unit-tests/T008asn1_clib.c index 222ec7a..73a2f73 100644 --- a/testing/fulltests/unit-tests/T008asn1_clib.c +++ b/testing/fulltests/unit-tests/T008asn1_clib.c @@ -78,6 +78,8 @@ debug_register_tokens("dumpv_recv,dumpv_send,asn"); } } +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES + #define TOINT64(c) ((long long)(long)(c).high << 32 | (c).low) { @@ -128,6 +130,8 @@ debug_register_tokens("dumpv_recv,dumpv_send,asn"); } } +#endif + #define TOUINT64(c) ((unsigned long long)(c).high << 32 | (c).low) { diff --git a/testing/fulltests/unit-tests/T009large_fd_set_clib.c b/testing/fulltests/unit-tests/T009large_fd_set_clib.c index 0951dc2..eee4d41 100644 --- a/testing/fulltests/unit-tests/T009large_fd_set_clib.c +++ b/testing/fulltests/unit-tests/T009large_fd_set_clib.c @@ -2,7 +2,8 @@ netsnmp_large_fd_set fds; netsnmp_large_fd_set_init(&fds, 2000); -netsnmp_large_fd_set_resize(&fds, 2000); +OKF(fds.lfs_setsize == 2000, ("initialization")); +OKF(netsnmp_large_fd_set_resize(&fds, 2000) == 1, ("resizing to 2000")); NETSNMP_LARGE_FD_ZERO(&fds); { @@ -16,7 +17,7 @@ NETSNMP_LARGE_FD_ZERO(&fds); } } -netsnmp_large_fd_set_resize(&fds, 3000); +OKF(netsnmp_large_fd_set_resize(&fds, 3000) == 1, ("resizing to 3000")); { int i; @@ -29,7 +30,7 @@ netsnmp_large_fd_set_resize(&fds, 3000); } } -netsnmp_large_fd_set_resize(&fds, 1000); +OKF(netsnmp_large_fd_set_resize(&fds, 1000) == 1, ("resizing to 1000")); { int i; diff --git a/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c b/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c new file mode 100644 index 0000000..6f1d449 --- /dev/null +++ b/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c @@ -0,0 +1,46 @@ +/* HEADER Testing SNMP handler registration via the old API */ + +static oid Oid[] = { 1, 3, 6, 1, 3, 327 }; /* experimental.327 */ +struct variable var_array[] = { + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 1 } }, + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 2 } }, + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 3 } }, +}; +netsnmp_session *sess; +int res; + +init_snmp("snmp"); + +sess = calloc(1, sizeof(*sess)); +snmp_sess_init(sess); + +res = +netsnmp_register_old_api("exp.327.a", + var_array, + sizeof(var_array[0]), + sizeof(var_array)/sizeof(var_array[0]), + Oid, + sizeof(Oid)/sizeof(Oid[0]), + 2, /* priority */ + 0, /* range_subid */ + 0, /* range_ubound */ + sess, + "context", 5/*timeout*/, 0/*flags - ignored*/); +OK(res == SNMPERR_SUCCESS, "Handler registration (1)."); + +/* Verify that duplicate registration does not cause any havoc. */ +res = +netsnmp_register_old_api("exp.327.b", + var_array, + sizeof(var_array[0]), + sizeof(var_array)/sizeof(var_array[0]), + Oid, + sizeof(Oid)/sizeof(Oid[0]), + 2, /* priority */ + 0, /* range_subid */ + 0, /* range_ubound */ + sess, + "context", 5/*timeout*/, 0/*flags - ignored*/); +OK(res == SNMPERR_SUCCESS, "Handler registration (2)."); + +snmp_shutdown("snmp"); diff --git a/testing/fulltests/unit-tests/T012binary_array_oid_clib.c b/testing/fulltests/unit-tests/T012binary_array_oid_clib.c new file mode 100644 index 0000000..aeeb502 --- /dev/null +++ b/testing/fulltests/unit-tests/T012binary_array_oid_clib.c @@ -0,0 +1,72 @@ +/* HEADER Testing binary OID array */ + +static const char test_name[] = "binary-array-of-OIDs-test"; +oid o1 = 1; +oid o2 = 2; +oid o3 = 6; +oid o4 = 8; +oid o5 = 9; +oid ox = 7; +oid oy = 10; +netsnmp_index i1, i2, i3, i4, i5, ix, iy, *ip; +const netsnmp_index *const i_last = &i5; +netsnmp_index *a[] = { &ix, &iy }; +netsnmp_index *b[] = { &i4, &i2, &i3, &i1, &i5 }; +netsnmp_container *c; +int i; + +init_snmp(test_name); + +c = netsnmp_container_get_binary_array(); +c->compare = netsnmp_compare_netsnmp_index; + +i1.oids = &o1; +i2.oids = &o2; +i3.oids = &o3; +i4.oids = &o4; +i5.oids = &o5; +ix.oids = &ox; +iy.oids = &oy; +i1.len = i2.len = i3.len = i4.len = i5.len = ix.len = iy.len = 1; + +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) + CONTAINER_INSERT(c, b[i]); + +for (ip = CONTAINER_FIRST(c); ip; ip = CONTAINER_NEXT(c, ip)) { + for (i = sizeof(b)/sizeof(b[0]) - 1; i >= 0; --i) + if (c->compare(ip, b[i]) == 0) + break; + OKF(i >= 0, ("OID b[%d] = %" NETSNMP_PRIo "d present", i, b[i]->oids[0])); +} + +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) { + ip = CONTAINER_FIND(c, b[i]); + OKF(ip, ("Value b[%d] = %" NETSNMP_PRIo "d present", i, b[i]->oids[0])); + ip = CONTAINER_NEXT(c, b[i]); + if (c->compare(b[i], i_last) < 0) + OKF(ip && c->compare(b[i], ip) < 0, + ("Successor of b[%d] = %" NETSNMP_PRIo "d is %" NETSNMP_PRIo "d", + i, b[i]->oids[0], ip->oids[0])); + else + OKF(!ip, ("No successor found for b[%d] = %" NETSNMP_PRIo "d", i, + b[i]->oids[0])); +} + +for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { + ip = CONTAINER_FIND(c, a[i]); + OKF(!ip, ("a[%d] = %" NETSNMP_PRIo "d absent", i, a[i]->oids[0])); + ip = CONTAINER_NEXT(c, a[i]); + if (c->compare(a[i], i_last) < 0) + OKF(ip && c->compare(ip, a[i]) > 0, + ("Successor of a[%d] = %" NETSNMP_PRIo "d is %" NETSNMP_PRIo "d", + i, a[i]->oids[0], ip->oids[0])); + else + OKF(!ip, ("No successor found for a[%d] = %" NETSNMP_PRIo "d", i, + a[i]->oids[0])); +} + +while ((ip = CONTAINER_FIRST(c))) + CONTAINER_REMOVE(c, ip); +CONTAINER_FREE(c); + +snmp_shutdown(test_name); diff --git a/testing/fulltests/unit-tests/T013binary_array_string_clib.c b/testing/fulltests/unit-tests/T013binary_array_string_clib.c new file mode 100644 index 0000000..cc4361b --- /dev/null +++ b/testing/fulltests/unit-tests/T013binary_array_string_clib.c @@ -0,0 +1,59 @@ +/* HEADER Testing binary string array */ + +static const char test_name[] = "binary-array-of-strings-test"; +const char o1[] = "zebra"; +const char o2[] = "b-two"; +const char o3[] = "b"; +const char o4[] = "cedar"; +const char o5[] = "alpha"; +const char ox[] = "dev"; +const char oy[] = "aa"; +const char* const o_last = o1; +const char *ip; +const char *const a[] = { ox, oy }; +const char *const b[] = { o4, o2, o3, o1, o5 }; +netsnmp_container *c; +int i; + +init_snmp(test_name); + +c = netsnmp_container_get_binary_array(); +c->compare = (netsnmp_container_compare*)strcmp; + +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) + CONTAINER_INSERT(c, b[i]); + +for (ip = CONTAINER_FIRST(c); ip; ip = CONTAINER_NEXT(c, ip)) { + for (i = sizeof(b)/sizeof(b[0]) - 1; i >= 0; --i) + if (c->compare(ip, b[i]) == 0) + break; + OKF(i >= 0, ("string b[%d] = \"%s\" present", i, b[i])); +} + +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) { + ip = CONTAINER_FIND(c, b[i]); + OKF(ip, ("b[%d] = \"%s\" present", i, b[i])); + ip = CONTAINER_NEXT(c, b[i]); + if (c->compare(b[i], o_last) < 0) + OKF(ip && c->compare(b[i], ip) < 0, + ("Successor of b[%d] = \"%s\" is \"%s\"", i, b[i], ip)); + else + OKF(!ip, ("No successor found for b[%d] = \"%s\"", i, b[i])); +} + +for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { + ip = CONTAINER_FIND(c, a[i]); + OKF(!ip, ("a[%d] = \"%s\" absent", i, a[i])); + ip = CONTAINER_NEXT(c, a[i]); + if (c->compare(a[i], o_last) < 0) + OKF(ip && c->compare(ip, a[i]) > 0, + ("Successor of a[%d] = \"%s\" is \"%s\"", i, a[i], ip)); + else + OKF(!ip, ("No successor found for a[%d] = \"%s\"", i, a[i])); +} + +while ((ip = CONTAINER_FIRST(c))) + CONTAINER_REMOVE(c, ip); +CONTAINER_FREE(c); + +snmp_shutdown(test_name); diff --git a/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c new file mode 100644 index 0000000..4c633ed --- /dev/null +++ b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c @@ -0,0 +1,55 @@ +/* HEADER Testing netsnmp_gethostbyaddr() */ + +SOCK_STARTUP; + +{ + int ran_test = 0; +#ifdef HAVE_GETHOSTBYADDR + struct hostent *h; + struct in_addr v4loop; + struct sockaddr_in sin_addr; + int s; + + v4loop.s_addr = htonl(INADDR_LOOPBACK); + memset(&sin_addr, 0, sizeof(sin_addr)); + sin_addr.sin_family = AF_INET; + sin_addr.sin_addr = v4loop; + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s >= 0) { + if (bind(s, (struct sockaddr *)&sin_addr, sizeof(sin_addr)) >= 0) { + h = netsnmp_gethostbyaddr(&v4loop, sizeof(v4loop), AF_INET); + OKF(h && strcmp(h->h_name, "localhost") == 0, + ("127.0.0.1 lookup (%s)", h ? h->h_name : "(failed)")); + ran_test = 1; + } + close(s); + } +#endif + if (!ran_test) + OKF(1, ("Skipped IPv4 test")); +} + +{ + struct hostent *h; + static const struct in6_addr v6loop = IN6ADDR_LOOPBACK_INIT; + struct sockaddr_in6 sin6_addr; + int s, ran_test = 0; + + memset(&sin6_addr, 0, sizeof(sin6_addr)); + sin6_addr.sin6_family = AF_INET6; + sin6_addr.sin6_addr = v6loop; + s = socket(AF_INET6, SOCK_DGRAM, 0); + if (s >= 0) { + if (bind(s, (struct sockaddr*)&sin6_addr, sizeof(sin6_addr)) >= 0) { + h = netsnmp_gethostbyaddr(&v6loop, sizeof(v6loop), AF_INET6); + OKF(h && strcmp(h->h_name, "localhost") == 0, + ("::1 lookup (%s)", h ? h->h_name : "(failed)")); + ran_test = 1; + } + close(s); + } + if (!ran_test) + OKF(1, ("Skipped IPv6 test")); +} + +SOCK_CLEANUP; diff --git a/testing/fulltests/unit-tests/T015int64_clib.c b/testing/fulltests/unit-tests/T015int64_clib.c new file mode 100644 index 0000000..5f5f4b6 --- /dev/null +++ b/testing/fulltests/unit-tests/T015int64_clib.c @@ -0,0 +1,82 @@ +/* HEADER Testing 64-bit integer operations (U64). */ + +int i, j; +char buf[22]; +static const int64_t intval[] = { + 0, + -1, + 1, + 37, + 0x7fffffffUL, + 0x80000000UL, + 0x99999999UL, + 0x7fffffffffffffffULL, + 0x8000000000000000ULL, +}; + +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { + U64 a, b; + a.low = (uint32_t)intval[i]; + a.high = (uint32_t)(intval[i] >> 32); + printI64(buf, &a); + read64(&b, buf); + OKF(memcmp(&a, &b, sizeof(a)) == 0, + ("[%d]: %" PRId64 " <> %s <> %" PRId64, i, intval[i], buf, + ((uint64_t)b.high) << 32 | b.low)); +} + +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { + for (j = i; j < sizeof(intval)/sizeof(intval[0]); ++j) { + U64 a, b; + uint64_t d; + a.low = (uint32_t)intval[i]; + a.high = (uint32_t)(intval[i] >> 32); + b.low = (uint32_t)intval[j]; + b.high = (uint32_t)(intval[j] >> 32); + u64Incr(&a, &b); + d = (uint64_t)a.high << 32 | a.low; + OKF(intval[i] + intval[j] == d, + ("%" PRId64 " + %" PRId64 " = %" PRId64 " <> %" PRId64, intval[i], + intval[j], intval[i] + intval[j], d)); + } +} + +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { + for (j = i; j < sizeof(intval)/sizeof(intval[0]); ++j) { + U64 a, b, c; + uint64_t d; + a.low = (uint32_t)intval[i]; + a.high = (uint32_t)(intval[i] >> 32); + b.low = (uint32_t)intval[j]; + b.high = (uint32_t)(intval[j] >> 32); + u64Subtract(&a, &b, &c); + d = (uint64_t)c.high << 32 | c.low; + OKF(intval[i] - intval[j] == d, + ("%" PRId64 " - %" PRId64 " = %" PRId64 " <> %" PRId64, intval[i], + intval[j], intval[i] - intval[j], d)); + } +} + +{ + U64 old_val, new_val; + old_val.low = 7; + old_val.high = 0; + new_val = old_val; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap1"); + new_val.low = 8; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap2"); + new_val.low = 6; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 32, "cwrap3"); + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 1) == 32 + && new_val.low == 6 && new_val.high == 1, "cwrap4"); + old_val.low = 7; + old_val.high = 0xffffffffU; + new_val.low = 7; + new_val.high = old_val.high; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap5"); + new_val.low = 8; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap6"); + new_val.low = 6; + new_val.high = 0; + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 64, "cwrap7"); +} diff --git a/testing/fulltests/unit-tests/T016read_config_clib.c b/testing/fulltests/unit-tests/T016read_config_clib.c new file mode 100644 index 0000000..c11a591 --- /dev/null +++ b/testing/fulltests/unit-tests/T016read_config_clib.c @@ -0,0 +1,82 @@ +/* HEADER Testing read_config_read_octet_string_const(). */ + +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 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 }, +}; + +unsigned int i, j, ok; + +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; + + fflush(stdout); + result = (p->pf) (p->readfrom, &str, &len); + offset = result ? result - p->readfrom : -1; + OKF(offset == p->expected_offset, + ("test %d: expected offset %zd, got offset %" NETSNMP_PRIz "d", + i, p->expected_offset, offset)); + if (offset == p->expected_offset) { + OKF(len == p->expected_len, + ("test %d: expected length %" NETSNMP_PRIz "d, got length %" + NETSNMP_PRIz "d", i, p->expected_len, len)); + if (len == p->expected_len) { + ok = len < 0 || !p->expected_output + || memcmp(str, p->expected_output, len) == 0 + || p->expected_output[len] != 0; + OKF(ok, ("test %d: output buffer mismatch", i)); + if (!ok) { + 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); +} diff --git a/testing/fulltests/unit-tests/T017strtoull_clib.c b/testing/fulltests/unit-tests/T017strtoull_clib.c new file mode 100644 index 0000000..4ab9cad --- /dev/null +++ b/testing/fulltests/unit-tests/T017strtoull_clib.c @@ -0,0 +1,94 @@ +/* HEADER Testing strtoull(). */ + +#ifdef HAVE_STRTOULL + +OK(1, "Skipping strtoull() test because using strtoull() from C library.\n");; + +#else + +/* + * UINT64_C: C99 macro for the suffix for uint64_t constants. + */ +#ifndef UINT64_C +#ifdef _MSC_VER +#define UINT64_C(c) c##ui64 +#else +#define UINT64_C(c) c##ULL +#endif +#endif + +/* + * According to the C99 standard, the constant ULLONG_MAX must be defined in + * . Define it here for pre-C99 compilers. + */ +#ifndef ULLONG_MAX +#define ULLONG_MAX UINT64_C(0xffffffffffffffff) +#endif + +#ifndef PRIu64 +#ifdef _MSC_VER +#define PRIu64 "I64u" +#else +#define PRIu64 "llu" +#endif +#endif + +struct strtoull_testcase { + /* + * inputs + */ + const char *nptr; + int base; + /* + * expected outputs + */ + int expected_errno; + int expected_end; + uint64_t expected_result; +}; + +static const struct strtoull_testcase test_input[] = { + {"0x0", 0, 0, 3, 0}, + {"1", 0, 0, 1, 1}, + {"0x1", 0, 0, 3, 1}, + {" -0666", 0, 0, 7, -0666}, + {" -0x666", 0, 0, 8, -0x666}, + {"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)}, + {"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)}, + {"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)}, + {"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)}, + {"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)}, + {"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)}, + {"ff", 16, 0, 2, 255}, + {"0xff", 16, 0, 4, 255}, + {" ", 0, 0, 0, 0}, + {"0x", 0, 0, 1, 0}, + {"0x", 8, 0, 1, 0}, + {"0x", 16, 0, 1, 0}, + {"zyyy", 0, 0, 0, 0}, + {"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX}, + {"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX} +}; + +unsigned int i; + +for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { + const struct strtoull_testcase *const p = &test_input[i]; + char *endptr; + uint64_t result; + + errno = 0; + result = strtoull(p->nptr, &endptr, p->base); + OKF(errno == p->expected_errno, + ("test %d (input \"%s\"): expected errno %d, got errno %d", + i, p->nptr, p->expected_errno, errno)); + OKF(result == p->expected_result, + ("test %d (input \"%s\"): expected result %" PRIu64 + ", got result %" PRIu64, + i, p->nptr, p->expected_result, result)); + OKF(endptr - p->nptr == p->expected_end, + ("test %d (input \"%s\"): expected end %d, got end %d", + i, p->nptr, p->expected_end, (int) (endptr - p->nptr))); +} + +#endif diff --git a/testing/fulltests/unit-tests/T102pdu_build_clib.c b/testing/fulltests/unit-tests/T102pdu_build_clib.c index 088a282..1fba69e 100644 --- a/testing/fulltests/unit-tests/T102pdu_build_clib.c +++ b/testing/fulltests/unit-tests/T102pdu_build_clib.c @@ -1,4 +1,7 @@ /* HEADER PDU building */ + +SOCK_STARTUP; + netsnmp_pdu *pdu; u_char *packet; size_t packet_len, offset = 0; @@ -60,3 +63,5 @@ rc = snmp_build(&packet, &packet_len, &offset, ss, pdu); OKF((rc == SNMPERR_SUCCESS), ("Building an INFORM PDU/packet should have succeed: %d", rc)); + +SOCK_CLEANUP; diff --git a/win32/encode_keychange/encode_keychange.dsp b/win32/encode_keychange/encode_keychange.dsp index 5e19366..5a252f5 100644 --- a/win32/encode_keychange/encode_keychange.dsp +++ b/win32/encode_keychange/encode_keychange.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/encode_keychange.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/encode_keychange.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "encode_keychange - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/encode_keychange.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/encode_keychange.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/libsnmp/Makefile.in b/win32/libsnmp/Makefile.in index 382b329..98d83c8 100644 --- a/win32/libsnmp/Makefile.in +++ b/win32/libsnmp/Makefile.in @@ -66,6 +66,7 @@ LIB32_OBJS= \ "$(INTDIR)\snmp_version.obj" \ "$(INTDIR)\snmpusm.obj" \ "$(INTDIR)\snmpv3.obj" \ + "$(INTDIR)\strlcat.obj" \ "$(INTDIR)\strlcpy.obj" \ "$(INTDIR)\strtok_r.obj" \ "$(INTDIR)\strtoull.obj" \ @@ -468,6 +469,12 @@ SOURCE=..\..\snmplib\snmpv3.c $(CPP) $(CPP_PROJ) $(SOURCE) +SOURCE=..\..\snmplib\strlcat.c + +"$(INTDIR)\strlcat.obj" : $(SOURCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + SOURCE=..\..\snmplib\strlcpy.c "$(INTDIR)\strlcpy.obj" : $(SOURCE) "$(INTDIR)" diff --git a/win32/libsnmp/libsnmp.dsp b/win32/libsnmp/libsnmp.dsp index 7a34939..2386331 100644 --- a/win32/libsnmp/libsnmp.dsp +++ b/win32/libsnmp/libsnmp.dsp @@ -313,6 +313,10 @@ SOURCE=..\..\snmplib\snmpv3.c # End Source File # Begin Source File +SOURCE=..\..\snmplib\strlcat.c +# End Source File +# Begin Source File + SOURCE=..\..\snmplib\strlcpy.c # End Source File # Begin Source File diff --git a/win32/libsnmp_dll/Makefile.in b/win32/libsnmp_dll/Makefile.in index 31279f3..42235d2 100644 --- a/win32/libsnmp_dll/Makefile.in +++ b/win32/libsnmp_dll/Makefile.in @@ -67,6 +67,7 @@ LINK32_OBJS= \ "$(INTDIR)\snmp_version.obj" \ "$(INTDIR)\snmpusm.obj" \ "$(INTDIR)\snmpv3.obj" \ + "$(INTDIR)\strlcat.obj" \ "$(INTDIR)\strlcpy.obj" \ "$(INTDIR)\strtok_r.obj" \ "$(INTDIR)\strtoull.obj" \ @@ -484,6 +485,12 @@ SOURCE=..\..\snmplib\snmpv3.c $(CPP) $(CPP_PROJ) $(SOURCE) +SOURCE=..\..\snmplib\strlcat.c + +"$(INTDIR)\strlcat.obj" : $(SOURCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + SOURCE=..\..\snmplib\strlcpy.c "$(INTDIR)\strlcpy.obj" : $(SOURCE) "$(INTDIR)" diff --git a/win32/libsnmp_dll/libsnmp_dll.dsp b/win32/libsnmp_dll/libsnmp_dll.dsp index 098c3b9..12c0414 100644 --- a/win32/libsnmp_dll/libsnmp_dll.dsp +++ b/win32/libsnmp_dll/libsnmp_dll.dsp @@ -320,6 +320,10 @@ SOURCE=..\..\snmplib\snmpv3.c # End Source File # Begin Source File +SOURCE=..\..\snmplib\strlcat.c +# End Source File +# Begin Source File + SOURCE=..\..\snmplib\strlcpy.c # End Source File # Begin Source File diff --git a/win32/mib_module_includes.h b/win32/mib_module_includes.h index 18a9281..014ade0 100644 --- a/win32/mib_module_includes.h +++ b/win32/mib_module_includes.h @@ -73,7 +73,6 @@ #include "mibgroup/agent/extend.h" #include "mibgroup/ucd-snmp/errormib.h" #include "mibgroup/ucd-snmp/file.h" -#include "mibgroup/ucd-snmp/dlmod.h" #include "mibgroup/ucd-snmp/proxy.h" #endif diff --git a/win32/mib_module_inits.h b/win32/mib_module_inits.h index 875fcb9..a4b39bc 100644 --- a/win32/mib_module_inits.h +++ b/win32/mib_module_inits.h @@ -34,7 +34,6 @@ if (should_init("extend")) init_extend(); if (should_init("errormib")) init_errormib(); if (should_init("file")) init_file(); - if (should_init("dlmod")) init_dlmod(); if (should_init("proxy")) init_proxy(); #endif if (should_init("snmpEngine")) init_snmpEngine(); diff --git a/win32/net-snmp/net-snmp-config.h b/win32/net-snmp/net-snmp-config.h index da3c031..f63a83f 100644 --- a/win32/net-snmp/net-snmp-config.h +++ b/win32/net-snmp/net-snmp-config.h @@ -22,7 +22,9 @@ * When compiling with the MSVC workspace, this must be set manually. * See the PACKAGE_VERSION variable in Unix /configure script */ +#ifndef PACKAGE_VERSION #define PACKAGE_VERSION "unknown" +#endif /* Define HAVE_WIN32_PLATFORM_SDK if you have: * Microsoft Visual Studio MSVC 6.0 and the Platform SDK (PSDK) @@ -60,7 +62,7 @@ /* default list of mibs to load */ -#define NETSNMP_DEFAULT_MIBS "IP-MIB;IF-MIB;TCP-MIB;UDP-MIB;HOST-RESOURCES-MIB;SNMPv2-MIB;RFC1213-MIB;NOTIFICATION-LOG-MIB;UCD-SNMP-MIB;UCD-DEMO-MIB;SNMP-TARGET-MIB;NET-SNMP-AGENT-MIB;DISMAN-EVENT-MIB;SNMP-VIEW-BASED-ACM-MIB;SNMP-COMMUNITY-MIB;UCD-DLMOD-MIB;SNMP-FRAMEWORK-MIB;SNMP-MPD-MIB;SNMP-USER-BASED-SM-MIB;SNMP-NOTIFICATION-MIB;SNMPv2-TM" +#define NETSNMP_DEFAULT_MIBS "IP-MIB;IF-MIB;TCP-MIB;UDP-MIB;HOST-RESOURCES-MIB;SNMPv2-MIB;RFC1213-MIB;NOTIFICATION-LOG-MIB;UCD-SNMP-MIB;UCD-DEMO-MIB;SNMP-TARGET-MIB;NET-SNMP-AGENT-MIB;DISMAN-EVENT-MIB;SNMP-VIEW-BASED-ACM-MIB;SNMP-COMMUNITY-MIB;SNMP-FRAMEWORK-MIB;SNMP-MPD-MIB;SNMP-USER-BASED-SM-MIB;SNMP-NOTIFICATION-MIB;SNMPv2-TM" /* default location to look for mibs to load using the above tokens and/or those in the MIBS envrionment variable*/ @@ -944,13 +946,17 @@ /* #undef PACKAGE_BUGREPORT */ /* Define to the full name of this package. */ +#ifndef PACKAGE_NAME #define PACKAGE_NAME "Net-SNMP" +#endif /* Define to the full name and version of this package. */ /* #undef PACKAGE_STRING */ /* Define to the one symbol short name of this package. */ +#ifndef PACKAGE_TARNAME #define PACKAGE_TARNAME "net-snmp" +#endif /* Define to the version of this package. */ /* #undef PACKAGE_VERSION */ @@ -1358,6 +1364,12 @@ /* Define to 1 if you have the header file. */ #define HAVE_OPENSSL_AES_H 1 +/* Define to 1 if you have the `EVP_MD_CTX_create' function. */ +#define HAVE_EVP_MD_CTX_CREATE 1 + +/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */ +#define HAVE_EVP_MD_CTX_DESTROY 1 + /* Define to 1 if you have the `AES_cfb128_encrypt' function. */ #define HAVE_AES_CFB128_ENCRYPT 1 @@ -1570,15 +1582,14 @@ typedef unsigned short mode_t; #ifndef HAVE_STDINT_H typedef unsigned char uint8_t; typedef char int8_t; -typedef unsigned short uint16_t; -typedef short int16_t; +typedef unsigned __int16 uint16_t; +typedef __int16 int16_t; typedef unsigned __int32 uint32_t; -typedef long int32_t; +typedef __int32 int32_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int64 uintmax_t; typedef __int64 intmax_t; -typedef unsigned short uint16_t; #else /* HAVE_STDINT_H */ #include #endif /* HAVE_STDINT_H */ @@ -1663,9 +1674,9 @@ enum { #endif /* NETSNMP_USE_DLL */ /* MSVC OpenSSL linker settings. */ -#if defined(WIN32) && !defined(mingw32) +#if defined(_MSC_VER) # if defined(NETSNMP_USE_OPENSSL) -# ifdef NETSNMP_USE_DLL +# ifdef _DLL # ifdef _DEBUG # pragma comment(lib, "libeay32MDd.lib") # else @@ -1679,6 +1690,7 @@ enum { # endif # endif # pragma comment(lib, "gdi32.lib") +# pragma comment(lib, "user32.lib") # endif #endif diff --git a/win32/net-snmp/net-snmp-config.h.in b/win32/net-snmp/net-snmp-config.h.in index 7101702..005e4f9 100644 --- a/win32/net-snmp/net-snmp-config.h.in +++ b/win32/net-snmp/net-snmp-config.h.in @@ -22,7 +22,9 @@ * When compiling with the MSVC workspace, this must be set manually. * See the PACKAGE_VERSION variable in Unix /configure script */ +#ifndef PACKAGE_VERSION #define PACKAGE_VERSION "unknown" +#endif /* Define HAVE_WIN32_PLATFORM_SDK if you have: * Microsoft Visual Studio MSVC 6.0 and the Platform SDK (PSDK) @@ -60,7 +62,7 @@ /* default list of mibs to load */ -#define NETSNMP_DEFAULT_MIBS "IP-MIB;IF-MIB;TCP-MIB;UDP-MIB;HOST-RESOURCES-MIB;SNMPv2-MIB;RFC1213-MIB;NOTIFICATION-LOG-MIB;UCD-SNMP-MIB;UCD-DEMO-MIB;SNMP-TARGET-MIB;NET-SNMP-AGENT-MIB;DISMAN-EVENT-MIB;SNMP-VIEW-BASED-ACM-MIB;SNMP-COMMUNITY-MIB;UCD-DLMOD-MIB;SNMP-FRAMEWORK-MIB;SNMP-MPD-MIB;SNMP-USER-BASED-SM-MIB;SNMP-NOTIFICATION-MIB;SNMPv2-TM" +#define NETSNMP_DEFAULT_MIBS "IP-MIB;IF-MIB;TCP-MIB;UDP-MIB;HOST-RESOURCES-MIB;SNMPv2-MIB;RFC1213-MIB;NOTIFICATION-LOG-MIB;UCD-SNMP-MIB;UCD-DEMO-MIB;SNMP-TARGET-MIB;NET-SNMP-AGENT-MIB;DISMAN-EVENT-MIB;SNMP-VIEW-BASED-ACM-MIB;SNMP-COMMUNITY-MIB;SNMP-FRAMEWORK-MIB;SNMP-MPD-MIB;SNMP-USER-BASED-SM-MIB;SNMP-NOTIFICATION-MIB;SNMPv2-TM" /* default location to look for mibs to load using the above tokens and/or those in the MIBS envrionment variable*/ @@ -944,13 +946,17 @@ /* #undef PACKAGE_BUGREPORT */ /* Define to the full name of this package. */ +#ifndef PACKAGE_NAME #define PACKAGE_NAME "Net-SNMP" +#endif /* Define to the full name and version of this package. */ /* #undef PACKAGE_STRING */ /* Define to the one symbol short name of this package. */ +#ifndef PACKAGE_TARNAME #define PACKAGE_TARNAME "net-snmp" +#endif /* Define to the version of this package. */ /* #undef PACKAGE_VERSION */ @@ -1358,6 +1364,12 @@ /* Define to 1 if you have the header file. */ #define HAVE_OPENSSL_AES_H 1 +/* Define to 1 if you have the `EVP_MD_CTX_create' function. */ +#define HAVE_EVP_MD_CTX_CREATE 1 + +/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */ +#define HAVE_EVP_MD_CTX_DESTROY 1 + /* Define to 1 if you have the `AES_cfb128_encrypt' function. */ #define HAVE_AES_CFB128_ENCRYPT 1 @@ -1570,15 +1582,14 @@ typedef unsigned short mode_t; #ifndef HAVE_STDINT_H typedef unsigned char uint8_t; typedef char int8_t; -typedef unsigned short uint16_t; -typedef short int16_t; +typedef unsigned __int16 uint16_t; +typedef __int16 int16_t; typedef unsigned __int32 uint32_t; -typedef long int32_t; +typedef __int32 int32_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int64 uintmax_t; typedef __int64 intmax_t; -typedef unsigned short uint16_t; #else /* HAVE_STDINT_H */ #include #endif /* HAVE_STDINT_H */ @@ -1663,9 +1674,9 @@ enum { #endif /* NETSNMP_USE_DLL */ /* MSVC OpenSSL linker settings. */ -#if defined(WIN32) && !defined(mingw32) +#if defined(_MSC_VER) # if defined(NETSNMP_USE_OPENSSL) -# ifdef NETSNMP_USE_DLL +# ifdef _DLL # ifdef _DEBUG # pragma comment(lib, "libeay32MDd.lib") # else @@ -1679,6 +1690,7 @@ enum { # endif # endif # pragma comment(lib, "gdi32.lib") +# pragma comment(lib, "user32.lib") # endif #endif diff --git a/win32/netsnmpmibs/Makefile.in b/win32/netsnmpmibs/Makefile.in index ed44162..44d0203 100644 --- a/win32/netsnmpmibs/Makefile.in +++ b/win32/netsnmpmibs/Makefile.in @@ -85,13 +85,13 @@ LIB32_OBJS1= \ "$(INTDIR)\mteTriggerThresholdTable.obj" \ "$(INTDIR)\example.obj" \ "$(INTDIR)\ucdDemoPublic.obj" \ - "$(INTDIR)\dlmod.obj" \ "$(INTDIR)\errormib.obj" \ "$(INTDIR)\extensible.obj" \ "$(INTDIR)\file.obj" LIB32_OBJS2= \ "$(INTDIR)\loadave.obj" \ "$(INTDIR)\pass.obj" \ + "$(INTDIR)\pass_common.obj" \ "$(INTDIR)\pass_persist.obj" \ "$(INTDIR)\proc.obj" \ "$(INTDIR)\proxy.obj" \ @@ -314,12 +314,6 @@ SOURCE=..\..\agent\mibgroup\examples\ucdDemoPublic.c $(CPP) $(CPP_PROJ) $(SOURCE) -SOURCE="..\..\agent\mibgroup\ucd-snmp\dlmod.c" - -"$(INTDIR)\dlmod.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - SOURCE="..\..\agent\mibgroup\ucd-snmp\errormib.c" "$(INTDIR)\errormib.obj" : $(SOURCE) "$(INTDIR)" @@ -350,6 +344,12 @@ SOURCE="..\..\agent\mibgroup\ucd-snmp\pass.c" $(CPP) $(CPP_PROJ) $(SOURCE) +SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_common.c" + +"$(INTDIR)\pass_common.obj" : $(SOURCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_persist.c" "$(INTDIR)\pass_persist.obj" : $(SOURCE) "$(INTDIR)" diff --git a/win32/netsnmpmibs/netsnmpmibs.dsp b/win32/netsnmpmibs/netsnmpmibs.dsp index 5c88b97..9034eed 100644 --- a/win32/netsnmpmibs/netsnmpmibs.dsp +++ b/win32/netsnmpmibs/netsnmpmibs.dsp @@ -245,10 +245,6 @@ SOURCE=..\..\agent\mibgroup\examples\ucdDemoPublic.c # PROP Default_Filter "" # Begin Source File -SOURCE="..\..\agent\mibgroup\ucd-snmp\dlmod.c" -# End Source File -# Begin Source File - SOURCE="..\..\agent\mibgroup\ucd-snmp\errormib.c" # End Source File # Begin Source File @@ -269,6 +265,10 @@ SOURCE="..\..\agent\mibgroup\ucd-snmp\pass.c" # End Source File # Begin Source File +SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_common.c" +# End Source File +# Begin Source File + SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_persist.c" # End Source File # Begin Source File diff --git a/win32/snmpbulkget/snmpbulkget.dsp b/win32/snmpbulkget/snmpbulkget.dsp index fe5e5ae..39599db 100644 --- a/win32/snmpbulkget/snmpbulkget.dsp +++ b/win32/snmpbulkget/snmpbulkget.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpbulkget.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpbulkget.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpbulkget - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpbulkget.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpbulkget.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpbulkwalk/snmpbulkwalk.dsp b/win32/snmpbulkwalk/snmpbulkwalk.dsp index ea8bb0c..91e94d3 100644 --- a/win32/snmpbulkwalk/snmpbulkwalk.dsp +++ b/win32/snmpbulkwalk/snmpbulkwalk.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpbulkwalk.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpbulkwalk.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpbulkwalk - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpbulkwalk.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpbulkwalk.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpd/snmpd.dsp b/win32/snmpd/snmpd.dsp index 5534306..45e2cad 100644 --- a/win32/snmpd/snmpd.dsp +++ b/win32/snmpd/snmpd.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib netsnmpagent.lib netsnmpmibs.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpd.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpd.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpd - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib netsnmpagent.lib netsnmpmibs.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpd.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpd.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpdelta/snmpdelta.dsp b/win32/snmpdelta/snmpdelta.dsp index b17b822..7f5a5d3 100644 --- a/win32/snmpdelta/snmpdelta.dsp +++ b/win32/snmpdelta/snmpdelta.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpdelta.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpdelta.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpdelta - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpdelta.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpdelta.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpdf/snmpdf.dsp b/win32/snmpdf/snmpdf.dsp index 88c3f6d..e2e4b94 100644 --- a/win32/snmpdf/snmpdf.dsp +++ b/win32/snmpdf/snmpdf.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpdf.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpdf.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpdf - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpdf.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpdf.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpget/snmpget.dsp b/win32/snmpget/snmpget.dsp index 64980ed..0603232 100644 --- a/win32/snmpget/snmpget.dsp +++ b/win32/snmpget/snmpget.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpget.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpget.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpget - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpget.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpget.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpgetnext/snmpgetnext.dsp b/win32/snmpgetnext/snmpgetnext.dsp index 233199d..cb63c84 100644 --- a/win32/snmpgetnext/snmpgetnext.dsp +++ b/win32/snmpgetnext/snmpgetnext.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpgetnext.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpgetnext.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpgetnext - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpgetnext.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpgetnext.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpnetstat/snmpnetstat.dsp b/win32/snmpnetstat/snmpnetstat.dsp index 25ec031..35dd7e8 100644 --- a/win32/snmpnetstat/snmpnetstat.dsp +++ b/win32/snmpnetstat/snmpnetstat.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpnetstat.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpnetstat.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpnetstat - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpnetstat.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpnetstat.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpset/snmpset.dsp b/win32/snmpset/snmpset.dsp index fdeca30..ad0f509 100644 --- a/win32/snmpset/snmpset.dsp +++ b/win32/snmpset/snmpset.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpset.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpset.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpset - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpset.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpset.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpstatus/snmpstatus.dsp b/win32/snmpstatus/snmpstatus.dsp index 1b68373..e6a4100 100644 --- a/win32/snmpstatus/snmpstatus.dsp +++ b/win32/snmpstatus/snmpstatus.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpstatus.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpstatus.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpstatus - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpstatus.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpstatus.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmptable/snmptable.dsp b/win32/snmptable/snmptable.dsp index 75f964f..1dfc138 100644 --- a/win32/snmptable/snmptable.dsp +++ b/win32/snmptable/snmptable.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptable.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptable.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmptable - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptable.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptable.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmptest/snmptest.dsp b/win32/snmptest/snmptest.dsp index dfb0cf1..89c08e9 100644 --- a/win32/snmptest/snmptest.dsp +++ b/win32/snmptest/snmptest.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptest.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptest.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmptest - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptest.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptest.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmptranslate/snmptranslate.dsp b/win32/snmptranslate/snmptranslate.dsp index a3ebde5..c3eca02 100644 --- a/win32/snmptranslate/snmptranslate.dsp +++ b/win32/snmptranslate/snmptranslate.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptranslate.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptranslate.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmptranslate - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptranslate.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptranslate.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmptrap/snmptrap.dsp b/win32/snmptrap/snmptrap.dsp index 8d27ee1..c34ffd8 100644 --- a/win32/snmptrap/snmptrap.dsp +++ b/win32/snmptrap/snmptrap.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptrap.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptrap.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmptrap - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptrap.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptrap.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmptrapd/snmptrapd.dsp b/win32/snmptrapd/snmptrapd.dsp index 503918a..9f49389 100644 --- a/win32/snmptrapd/snmptrapd.dsp +++ b/win32/snmptrapd/snmptrapd.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib netsnmpagent.lib netsnmpmibs.lib netsnmptrapd.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptrapd.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmptrapd.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmptrapd - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib netsnmpagent.lib netsnmpmibs.lib netsnmptrapd.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptrapd.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmptrapd.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpusm/snmpusm.dsp b/win32/snmpusm/snmpusm.dsp index db43f2e..a1c0124 100644 --- a/win32/snmpusm/snmpusm.dsp +++ b/win32/snmpusm/snmpusm.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpusm.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpusm.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpusm - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpusm.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpusm.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpvacm/snmpvacm.dsp b/win32/snmpvacm/snmpvacm.dsp index 0856832..2fd53fd 100644 --- a/win32/snmpvacm/snmpvacm.dsp +++ b/win32/snmpvacm/snmpvacm.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpvacm.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpvacm.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpvacm - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpvacm.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpvacm.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF diff --git a/win32/snmpwalk/snmpwalk.dsp b/win32/snmpwalk/snmpwalk.dsp index 5d81957..67598f1 100644 --- a/win32/snmpwalk/snmpwalk.dsp +++ b/win32/snmpwalk/snmpwalk.dsp @@ -50,7 +50,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpwalk.exe" /libpath:"../lib/release" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../bin/release/snmpwalk.exe" /libpath:"../lib/release" !ELSEIF "$(CFG)" == "snmpwalk - Win32 Debug" @@ -74,7 +74,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 netsnmp.lib advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpwalk.exe" /pdbtype:sept /libpath:"../lib/debug" +# ADD LINK32 advapi32.lib ws2_32.lib kernel32.lib user32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../bin/debug/snmpwalk.exe" /pdbtype:sept /libpath:"../lib/debug" !ENDIF