diff options
| -rw-r--r-- | meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch | 19998 | ||||
| -rw-r--r-- | meta-oe/recipes-extended/net-snmp/net-snmp_5.7.1.bb | 3 |
2 files changed, 20000 insertions, 1 deletions
diff --git a/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch b/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch new file mode 100644 index 0000000000..442e8d0cd1 --- /dev/null +++ b/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch | |||
| @@ -0,0 +1,19998 @@ | |||
| 1 | Sync with 5.7 branch | ||
| 2 | |||
| 3 | This syncs v5.7.1 to 2012-02-08 5.7 GIT branch status | ||
| 4 | |||
| 5 | Upstream-Status: Backport | ||
| 6 | |||
| 7 | diff --git a/.gitignore b/.gitignore | ||
| 8 | index 9d6a15f..9cfb7a3 100644 | ||
| 9 | --- a/.gitignore | ||
| 10 | +++ b/.gitignore | ||
| 11 | @@ -1,9 +1,9 @@ | ||
| 12 | *.bak | ||
| 13 | *.bs | ||
| 14 | -*.la | ||
| 15 | -*.lo | ||
| 16 | *.ft | ||
| 17 | *.ft.1 | ||
| 18 | +*.la | ||
| 19 | +*.lo | ||
| 20 | *.made | ||
| 21 | *.o | ||
| 22 | *.obj | ||
| 23 | @@ -78,7 +78,10 @@ net-snmp-config | ||
| 24 | net-snmp-config-x | ||
| 25 | net-snmp-create-v3-user | ||
| 26 | NEWS.new* | ||
| 27 | +perl/*.yml | ||
| 28 | perl/*/*.def | ||
| 29 | +perl/*/*.yml | ||
| 30 | +perl/*/*/*.yml | ||
| 31 | perl/agent/agent.c | ||
| 32 | perl/agent/default_store/default_store.c | ||
| 33 | perl/agent/default_store/default_store.def | ||
| 34 | @@ -96,6 +99,7 @@ perl/TrapReceiver/const-c.inc | ||
| 35 | perl/TrapReceiver/const-xs.inc | ||
| 36 | perl/TrapReceiver/TrapReceiver.c | ||
| 37 | pm_to_blib | ||
| 38 | +python/build | ||
| 39 | sedscript | ||
| 40 | snmplib/snmpsm_init.h | ||
| 41 | snmplib/snmpsm_shutdown.h | ||
| 42 | diff --git a/COPYING b/COPYING | ||
| 43 | index afe6e6d..d368331 100644 | ||
| 44 | --- a/COPYING | ||
| 45 | +++ b/COPYING | ||
| 46 | @@ -135,7 +135,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 47 | |||
| 48 | ---- Part 5: Sparta, Inc copyright notice (BSD) ----- | ||
| 49 | |||
| 50 | -Copyright (c) 2003-2011, Sparta, Inc | ||
| 51 | +Copyright (c) 2003-2012, Sparta, Inc | ||
| 52 | All rights reserved. | ||
| 53 | |||
| 54 | Redistribution and use in source and binary forms, with or without | ||
| 55 | diff --git a/Makefile.in b/Makefile.in | ||
| 56 | index f3dd7b7..9664676 100644 | ||
| 57 | --- a/Makefile.in | ||
| 58 | +++ b/Makefile.in | ||
| 59 | @@ -85,22 +85,23 @@ libtool: $(LIBTOOL_DEPS) | ||
| 60 | $(SHELL) ./config.status --recheck | ||
| 61 | |||
| 62 | |||
| 63 | -snmplib: | ||
| 64 | +snmplib: @FEATURETARGS@ | ||
| 65 | @(cd snmplib; $(MAKE) ) | ||
| 66 | |||
| 67 | -agent: | ||
| 68 | +agent: @FEATURETARGS@ | ||
| 69 | @(cd snmplib; $(MAKE) ) | ||
| 70 | @(cd agent; $(MAKE) ) | ||
| 71 | |||
| 72 | -apps: | ||
| 73 | +apps: @FEATURETARGS@ | ||
| 74 | @(cd snmplib; $(MAKE) ) | ||
| 75 | + @(cd agent; $(MAKE) libs) | ||
| 76 | @(cd apps; $(MAKE) ) | ||
| 77 | |||
| 78 | -snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls: | ||
| 79 | +snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls: @FEATURETARGS@ | ||
| 80 | @(cd snmplib; $(MAKE) ) | ||
| 81 | @(cd apps; $(MAKE) $@ ) | ||
| 82 | |||
| 83 | -snmptrapd: | ||
| 84 | +agentxtrap snmptrapd: @FEATURETARGS@ | ||
| 85 | @(cd snmplib; $(MAKE) ) | ||
| 86 | @(cd agent; $(MAKE) libs) | ||
| 87 | @(cd apps; $(MAKE) $@ ) | ||
| 88 | diff --git a/agent/Makefile.in b/agent/Makefile.in | ||
| 89 | index 84a5e4c..59cf4ef 100644 | ||
| 90 | --- a/agent/Makefile.in | ||
| 91 | +++ b/agent/Makefile.in | ||
| 92 | @@ -114,7 +114,6 @@ USELIBS = ../snmplib/libnetsnmp.$(LIB_EXTENSION)$(LIB_VERSION) | ||
| 93 | AGENTLIB = libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION) | ||
| 94 | MIBLIB = libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION) | ||
| 95 | |||
| 96 | -LOCAL_LIBS = -L../snmplib/.libs -L../snmplib -L./.libs | ||
| 97 | LAGENTLIBS = @LAGENTLIBS@ | ||
| 98 | LMIBLIBS = @LMIBLIBS@ | ||
| 99 | VAL_LIBS = @VAL_LIBS@ | ||
| 100 | @@ -282,34 +281,33 @@ all: agentlib subdirs miblib $(INSTALLBINPROGS) $(INSTALLSBINPROGS) | ||
| 101 | # build stuff targets | ||
| 102 | # | ||
| 103 | getkstat: getkstat.o | ||
| 104 | - $(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS) | ||
| 105 | + $(CC) $(CFLAGS) -o $@ $? $(LIBS) | ||
| 106 | |||
| 107 | getkstat.o: mibgroup/kernel_sunos5.c | ||
| 108 | $(CC) $(CFLAGS) -o $@ -D_GETKSTAT_TEST -DDODEBUG -c $? | ||
| 109 | |||
| 110 | getmibstat: getmibstat.o | ||
| 111 | - $(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS) | ||
| 112 | + $(CC) $(CFLAGS) -o $@ $? $(LIBS) | ||
| 113 | |||
| 114 | getmibstat.o: mibgroup/kernel_sunos5.c | ||
| 115 | $(CC) $(CFLAGS) -o $@ -D_GETMIBSTAT_TEST -DDODEBUG -c $? | ||
| 116 | |||
| 117 | -snmpd$(EXEEXT): ${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(MIBLIB) $(LIBTARG) | ||
| 118 | - $(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} $(LOCAL_LIBS) ${LDFLAGS} ${OUR_AGENT_LIBS} | ||
| 119 | - | ||
| 120 | +snmpd$(EXEEXT): ${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(HELPERLIB) $(MIBLIB) $(LIBTARG) | ||
| 121 | + $(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} ${LDFLAGS} ${OUR_AGENT_LIBS} | ||
| 122 | |||
| 123 | libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION): ${LLIBAGENTOBJS} $(USELIBS) | ||
| 124 | $(LIB_LD_CMD) $(AGENTLIB) ${LLIBAGENTOBJS} $(USELIBS) ${LAGENTLIBS} @LD_NO_UNDEFINED@ $(LDFLAGS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@ | ||
| 125 | $(RANLIB) $(AGENTLIB) | ||
| 126 | |||
| 127 | libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION): ${LMIBOBJS} $(AGENTLIB) $(USELIBS) | ||
| 128 | - $(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(LIB_LD_LIBS) @AGENTLIBS@ | ||
| 129 | + $(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@ | ||
| 130 | $(RANLIB) $(MIBLIB) | ||
| 131 | |||
| 132 | agentlib: $(AGENTLIB) | ||
| 133 | |||
| 134 | miblib: $(MIBLIB) | ||
| 135 | |||
| 136 | -libs: $(INSTALLLIBS) | ||
| 137 | +libs: $(AGENTLIB) $(MIBLIB) | ||
| 138 | |||
| 139 | embedperlinstall: | ||
| 140 | @$(SHELL) $(srcdir)/../mkinstalldirs $(INSTALL_PREFIX)$(snmplibdir) | ||
| 141 | diff --git a/agent/agent_handler.c b/agent/agent_handler.c | ||
| 142 | index da64761..59e9613 100644 | ||
| 143 | --- a/agent/agent_handler.c | ||
| 144 | +++ b/agent/agent_handler.c | ||
| 145 | @@ -774,7 +774,7 @@ netsnmp_handler_registration_free(netsnmp_handler_registration *reginfo) | ||
| 146 | /** Duplicates handler registration object and all subsequent handlers. | ||
| 147 | * Creates a copy of the handler registration object and all its data. | ||
| 148 | * | ||
| 149 | - * @param handler is the handler registration object to be duplicated | ||
| 150 | + * @param reginfo is the handler registration object to be duplicated | ||
| 151 | * | ||
| 152 | * @return Returns a pointer to the complete copy, | ||
| 153 | * or NULL if any problem occured. | ||
| 154 | @@ -922,7 +922,8 @@ netsnmp_free_delegated_cache(netsnmp_delegated_cache *dcache) | ||
| 155 | * Sweeps through given chain of requests and sets 'delegated' | ||
| 156 | * flag accordingly to the isdelegaded parameter. | ||
| 157 | * | ||
| 158 | - * @param isdelegaded New value of the 'delegated' flag. | ||
| 159 | + * @param requests Request list. | ||
| 160 | + * @param isdelegated New value of the 'delegated' flag. | ||
| 161 | */ | ||
| 162 | void | ||
| 163 | netsnmp_handler_mark_requests_as_delegated(netsnmp_request_info *requests, | ||
| 164 | diff --git a/agent/agent_read_config.c b/agent/agent_read_config.c | ||
| 165 | index 3514f0f..f9ef1af 100644 | ||
| 166 | --- a/agent/agent_read_config.c | ||
| 167 | +++ b/agent/agent_read_config.c | ||
| 168 | @@ -115,13 +115,10 @@ netsnmp_feature_child_of(snmpd_unregister_config_handler, agent_read_config_all) | ||
| 169 | void | ||
| 170 | snmpd_set_agent_user(const char *token, char *cptr) | ||
| 171 | { | ||
| 172 | -#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H) | ||
| 173 | - struct passwd *info; | ||
| 174 | -#endif | ||
| 175 | - | ||
| 176 | if (cptr[0] == '#') { | ||
| 177 | char *ecp; | ||
| 178 | int uid; | ||
| 179 | + | ||
| 180 | uid = strtoul(cptr + 1, &ecp, 10); | ||
| 181 | if (*ecp != 0) { | ||
| 182 | config_perror("Bad number"); | ||
| 183 | @@ -129,44 +126,47 @@ snmpd_set_agent_user(const char *token, char *cptr) | ||
| 184 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 185 | NETSNMP_DS_AGENT_USERID, uid); | ||
| 186 | } | ||
| 187 | - } | ||
| 188 | #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H) | ||
| 189 | - else if ((info = getpwnam(cptr)) != NULL) { | ||
| 190 | - netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 191 | - NETSNMP_DS_AGENT_USERID, info->pw_uid); | ||
| 192 | } else { | ||
| 193 | - config_perror("User not found in passwd database"); | ||
| 194 | - } | ||
| 195 | - endpwent(); | ||
| 196 | + struct passwd *info; | ||
| 197 | + | ||
| 198 | + info = getpwnam(cptr); | ||
| 199 | + if (info) | ||
| 200 | + netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 201 | + NETSNMP_DS_AGENT_USERID, info->pw_uid); | ||
| 202 | + else | ||
| 203 | + config_perror("User not found in passwd database"); | ||
| 204 | + endpwent(); | ||
| 205 | #endif | ||
| 206 | + } | ||
| 207 | } | ||
| 208 | |||
| 209 | void | ||
| 210 | snmpd_set_agent_group(const char *token, char *cptr) | ||
| 211 | { | ||
| 212 | -#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H) | ||
| 213 | - struct group *info; | ||
| 214 | -#endif | ||
| 215 | - | ||
| 216 | if (cptr[0] == '#') { | ||
| 217 | char *ecp; | ||
| 218 | int gid = strtoul(cptr + 1, &ecp, 10); | ||
| 219 | + | ||
| 220 | if (*ecp != 0) { | ||
| 221 | config_perror("Bad number"); | ||
| 222 | } else { | ||
| 223 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 224 | NETSNMP_DS_AGENT_GROUPID, gid); | ||
| 225 | } | ||
| 226 | - } | ||
| 227 | #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H) | ||
| 228 | - else if ((info = getgrnam(cptr)) != NULL) { | ||
| 229 | - netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 230 | - NETSNMP_DS_AGENT_GROUPID, info->gr_gid); | ||
| 231 | } else { | ||
| 232 | - config_perror("Group not found in group database"); | ||
| 233 | - } | ||
| 234 | - endpwent(); | ||
| 235 | + struct group *info; | ||
| 236 | + | ||
| 237 | + info = getgrnam(cptr); | ||
| 238 | + if (info) | ||
| 239 | + netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 240 | + NETSNMP_DS_AGENT_GROUPID, info->gr_gid); | ||
| 241 | + else | ||
| 242 | + config_perror("Group not found in group database"); | ||
| 243 | + endgrent(); | ||
| 244 | #endif | ||
| 245 | + } | ||
| 246 | } | ||
| 247 | #endif | ||
| 248 | |||
| 249 | @@ -187,9 +187,10 @@ snmpd_set_agent_address(const char *token, char *cptr) | ||
| 250 | /* | ||
| 251 | * append to the older specification string | ||
| 252 | */ | ||
| 253 | - snprintf(buf, SPRINT_MAX_LEN, "%s,%s", ptr, cptr); | ||
| 254 | + snprintf(buf, sizeof(buf), "%s,%s", ptr, cptr); | ||
| 255 | + buf[sizeof(buf) - 1] = '\0'; | ||
| 256 | } else { | ||
| 257 | - strncpy(buf, cptr, SPRINT_MAX_LEN); | ||
| 258 | + strlcpy(buf, cptr, sizeof(buf)); | ||
| 259 | } | ||
| 260 | |||
| 261 | DEBUGMSGTL(("snmpd_ports", "port spec: %s\n", buf)); | ||
| 262 | diff --git a/agent/agent_registry.c b/agent/agent_registry.c | ||
| 263 | index 5efaeb5..1e2482a 100644 | ||
| 264 | --- a/agent/agent_registry.c | ||
| 265 | +++ b/agent/agent_registry.c | ||
| 266 | @@ -555,6 +555,8 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev) | ||
| 267 | &ptr->oid_off); | ||
| 268 | } | ||
| 269 | |||
| 270 | +netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused) | ||
| 271 | +#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE | ||
| 272 | /** Compares OIDs of given subtrees. | ||
| 273 | * | ||
| 274 | * @param ap,bp Pointers to the subtrees to be compared. | ||
| 275 | @@ -563,8 +565,6 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev) | ||
| 276 | * | ||
| 277 | * @see snmp_oid_compare() | ||
| 278 | */ | ||
| 279 | -netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused) | ||
| 280 | -#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE | ||
| 281 | int | ||
| 282 | netsnmp_subtree_compare(const netsnmp_subtree *ap, const netsnmp_subtree *bp) | ||
| 283 | { | ||
| 284 | @@ -742,7 +742,7 @@ netsnmp_subtree_split(netsnmp_subtree *current, oid name[], int name_len) | ||
| 285 | |||
| 286 | /** Loads the subtree under given context name. | ||
| 287 | * | ||
| 288 | - * @param root The subtree to be loaded into current subtree. | ||
| 289 | + * @param new_sub The subtree to be loaded into current subtree. | ||
| 290 | * | ||
| 291 | * @param context_name Text name of the context we're searching for. | ||
| 292 | * | ||
| 293 | @@ -1085,8 +1085,22 @@ netsnmp_subtree_find(const oid *name, size_t len, netsnmp_subtree *subtree, | ||
| 294 | |||
| 295 | /** Registers a MIB handler. | ||
| 296 | * | ||
| 297 | + * @param moduleName | ||
| 298 | + * @param var | ||
| 299 | + * @param varsize | ||
| 300 | + * @param numvars | ||
| 301 | + * @param mibloc | ||
| 302 | + * @param mibloclen | ||
| 303 | + * @param priority | ||
| 304 | + * @param range_subid | ||
| 305 | + * @param range_ubound | ||
| 306 | + * @param ss | ||
| 307 | + * @param context | ||
| 308 | + * @param timeout | ||
| 309 | + * @param flags | ||
| 310 | * @param reginfo Registration handler structure. | ||
| 311 | * In a case of failure, it will be freed. | ||
| 312 | + * @param perform_callback | ||
| 313 | * | ||
| 314 | * @return gives MIB_REGISTERED_OK or MIB_* error code. | ||
| 315 | * | ||
| 316 | @@ -1389,6 +1403,7 @@ register_mib_detach(void) | ||
| 317 | * If range_subid is zero, then this parameter is ignored. | ||
| 318 | * | ||
| 319 | * @param ss | ||
| 320 | + * @param context | ||
| 321 | * @param timeout | ||
| 322 | * @param flags | ||
| 323 | * | ||
| 324 | @@ -1584,6 +1599,7 @@ netsnmp_subtree_unload(netsnmp_subtree *sub, netsnmp_subtree *prev, const char * | ||
| 325 | DEBUGMSGOID(("register_mib", sub->start_a, sub->start_len)); | ||
| 326 | } else { | ||
| 327 | DEBUGMSG(("register_mib", "[NIL]")); | ||
| 328 | + return; | ||
| 329 | } | ||
| 330 | DEBUGMSG(("register_mib", ", ")); | ||
| 331 | if (prev != NULL) { | ||
| 332 | @@ -1664,7 +1680,7 @@ unregister_mib_context(oid * name, size_t len, int priority, | ||
| 333 | int range_subid, oid range_ubound, | ||
| 334 | const char *context) | ||
| 335 | { | ||
| 336 | - netsnmp_subtree *list, *myptr; | ||
| 337 | + netsnmp_subtree *list, *myptr = NULL; | ||
| 338 | netsnmp_subtree *prev, *child, *next; /* loop through children */ | ||
| 339 | struct register_parameters reg_parms; | ||
| 340 | int old_lookup_cache_val = netsnmp_get_lookup_cache_size(); | ||
| 341 | diff --git a/agent/agent_trap.c b/agent/agent_trap.c | ||
| 342 | index cc90620..dfa9dcf 100644 | ||
| 343 | --- a/agent/agent_trap.c | ||
| 344 | +++ b/agent/agent_trap.c | ||
| 345 | @@ -801,6 +801,7 @@ netsnmp_send_traps(int trap, int specific, | ||
| 346 | |||
| 347 | } | ||
| 348 | |||
| 349 | + if (template_v2pdu) { | ||
| 350 | /* A context name was provided, so copy it and its length to the v2 pdu | ||
| 351 | * template. */ | ||
| 352 | if (context != NULL) | ||
| 353 | @@ -808,6 +809,7 @@ netsnmp_send_traps(int trap, int specific, | ||
| 354 | template_v2pdu->contextName = strdup(context); | ||
| 355 | template_v2pdu->contextNameLen = strlen(context); | ||
| 356 | } | ||
| 357 | + } | ||
| 358 | |||
| 359 | /* | ||
| 360 | * Now loop through the list of trap sinks | ||
| 361 | diff --git a/agent/auto_nlist.c b/agent/auto_nlist.c | ||
| 362 | index cb92a5b..bcbdb05 100644 | ||
| 363 | --- a/agent/auto_nlist.c | ||
| 364 | +++ b/agent/auto_nlist.c | ||
| 365 | @@ -52,6 +52,9 @@ auto_nlist_value(const char *string) | ||
| 366 | } | ||
| 367 | } | ||
| 368 | if (*ptr == 0) { | ||
| 369 | +#if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)) | ||
| 370 | + static char *n_name = NULL; | ||
| 371 | +#endif | ||
| 372 | *ptr = (struct autonlist *) malloc(sizeof(struct autonlist)); | ||
| 373 | it = *ptr; | ||
| 374 | it->left = 0; | ||
| 375 | @@ -66,15 +69,35 @@ auto_nlist_value(const char *string) | ||
| 376 | strcpy(it->nl[0].n_name, string); | ||
| 377 | it->nl[0].n_name[strlen(string)+1] = '\0'; | ||
| 378 | #else | ||
| 379 | - sprintf(it->nl[0].n_name, "_%s", string); | ||
| 380 | + | ||
| 381 | + if (n_name != NULL) | ||
| 382 | + free(n_name); | ||
| 383 | + | ||
| 384 | + n_name = malloc(strlen(string) + 2); | ||
| 385 | + if (n_name == NULL) { | ||
| 386 | + snmp_log(LOG_ERR, "nlist err: failed to allocate memory"); | ||
| 387 | + return (-1); | ||
| 388 | + } | ||
| 389 | + snprintf(n_name, strlen(string) + 2, "_%s", string); | ||
| 390 | + it->nl[0].n_name = (const char*)n_name; | ||
| 391 | #endif | ||
| 392 | it->nl[1].n_name = 0; | ||
| 393 | init_nlist(it->nl); | ||
| 394 | #if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) || \ | ||
| 395 | - defined(netbsd1) || defined(dragonfly)) | ||
| 396 | + defined(netbsd1) || defined(dragonfly)) | ||
| 397 | if (it->nl[0].n_type == 0) { | ||
| 398 | - strcpy(it->nl[0].n_name, string); | ||
| 399 | - it->nl[0].n_name[strlen(string)+1] = '\0'; | ||
| 400 | + static char *n_name2 = NULL; | ||
| 401 | + | ||
| 402 | + if (n_name2 != NULL) | ||
| 403 | + free(n_name2); | ||
| 404 | + | ||
| 405 | + n_name2 = malloc(strlen(string) + 1); | ||
| 406 | + if (n_name2 == NULL) { | ||
| 407 | + snmp_log(LOG_ERR, "nlist err: failed to allocate memory"); | ||
| 408 | + return (-1); | ||
| 409 | + } | ||
| 410 | + strcpy(n_name2, string); | ||
| 411 | + it->nl[0].n_name = (const char*)n_name2; | ||
| 412 | init_nlist(it->nl); | ||
| 413 | } | ||
| 414 | #endif | ||
| 415 | @@ -86,7 +109,8 @@ auto_nlist_value(const char *string) | ||
| 416 | } | ||
| 417 | return (-1); | ||
| 418 | } else { | ||
| 419 | - DEBUGMSGTL(("auto_nlist:auto_nlist_value", "found symbol %s at %x.\n", | ||
| 420 | + DEBUGMSGTL(("auto_nlist:auto_nlist_value", | ||
| 421 | + "found symbol %s at %lx.\n", | ||
| 422 | it->symbol, it->nl[0].n_value)); | ||
| 423 | return (it->nl[0].n_value); | ||
| 424 | } | ||
| 425 | @@ -95,7 +119,7 @@ auto_nlist_value(const char *string) | ||
| 426 | } | ||
| 427 | |||
| 428 | int | ||
| 429 | -auto_nlist(const char *string, char *var, int size) | ||
| 430 | +auto_nlist(const char *string, char *var, size_t size) | ||
| 431 | { | ||
| 432 | long result; | ||
| 433 | int ret; | ||
| 434 | @@ -192,7 +216,7 @@ init_nlist(struct nlist nl[]) | ||
| 435 | } | ||
| 436 | |||
| 437 | int | ||
| 438 | -KNLookup(struct nlist nl[], int nl_which, char *buf, int s) | ||
| 439 | +KNLookup(struct nlist nl[], int nl_which, char *buf, size_t s) | ||
| 440 | { | ||
| 441 | struct nlist *nlp = &nl[nl_which]; | ||
| 442 | |||
| 443 | diff --git a/agent/helpers/all_helpers.c b/agent/helpers/all_helpers.c | ||
| 444 | index 0f2b6a1..e1e1b78 100644 | ||
| 445 | --- a/agent/helpers/all_helpers.c | ||
| 446 | +++ b/agent/helpers/all_helpers.c | ||
| 447 | @@ -26,7 +26,7 @@ netsnmp_init_helpers(void) | ||
| 448 | netsnmp_init_bulk_to_next_helper(); | ||
| 449 | #ifndef NETSNMP_FEATURE_REMOVE_TABLE_DATASET | ||
| 450 | netsnmp_init_table_dataset(); | ||
| 451 | -#endif | ||
| 452 | +#endif /* NETSNMP_FEATURE_REMOVE_TABLE_DATASET */ | ||
| 453 | |||
| 454 | #ifndef NETSNMP_FEATURE_REMOVE_ROW_MERGE | ||
| 455 | netsnmp_init_row_merge(); | ||
| 456 | diff --git a/agent/helpers/instance.c b/agent/helpers/instance.c | ||
| 457 | index 2142909..a187d58 100644 | ||
| 458 | --- a/agent/helpers/instance.c | ||
| 459 | +++ b/agent/helpers/instance.c | ||
| 460 | @@ -536,6 +536,8 @@ netsnmp_register_num_file_instance(const char *name, | ||
| 461 | } | ||
| 462 | #endif /* NETSNMP_FEATURE_REMOVE_REGISTER_NUM_FILE_INSTANCE */ | ||
| 463 | |||
| 464 | +netsnmp_feature_child_of(register_int_instance,instance) | ||
| 465 | +#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE | ||
| 466 | /** | ||
| 467 | * This function registers an int helper handler to a specified OID. | ||
| 468 | * | ||
| 469 | @@ -554,8 +556,6 @@ netsnmp_register_num_file_instance(const char *name, | ||
| 470 | * MIB_REGISTERED_OK is returned if the registration was a success. | ||
| 471 | * Failures are MIB_REGISTRATION_FAILED and MIB_DUPLICATE_REGISTRATION. | ||
| 472 | */ | ||
| 473 | -netsnmp_feature_child_of(register_int_instance,instance) | ||
| 474 | -#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE | ||
| 475 | int | ||
| 476 | netsnmp_register_int_instance(const char *name, | ||
| 477 | const oid * reg_oid, size_t reg_oid_len, | ||
| 478 | diff --git a/agent/helpers/old_api.c b/agent/helpers/old_api.c | ||
| 479 | index b1630e6..4888cbc 100644 | ||
| 480 | --- a/agent/helpers/old_api.c | ||
| 481 | +++ b/agent/helpers/old_api.c | ||
| 482 | @@ -103,8 +103,12 @@ netsnmp_register_old_api(const char *moduleName, | ||
| 483 | reginfo->rootoid_len = (mibloclen + vp->namelen); | ||
| 484 | reginfo->rootoid = | ||
| 485 | (oid *) malloc(reginfo->rootoid_len * sizeof(oid)); | ||
| 486 | - if (reginfo->rootoid == NULL) | ||
| 487 | + if (reginfo->rootoid == NULL) { | ||
| 488 | + SNMP_FREE(vp); | ||
| 489 | + SNMP_FREE(reginfo->handlerName); | ||
| 490 | + SNMP_FREE(reginfo); | ||
| 491 | return SNMP_ERR_GENERR; | ||
| 492 | + } | ||
| 493 | |||
| 494 | memcpy(reginfo->rootoid, mibloc, mibloclen * sizeof(oid)); | ||
| 495 | memcpy(reginfo->rootoid + mibloclen, vp->name, vp->namelen | ||
| 496 | @@ -127,7 +131,7 @@ netsnmp_register_old_api(const char *moduleName, | ||
| 497 | */ | ||
| 498 | if (netsnmp_register_handler(reginfo) != MIB_REGISTERED_OK) { | ||
| 499 | /** netsnmp_handler_registration_free(reginfo); already freed */ | ||
| 500 | - SNMP_FREE(vp); | ||
| 501 | + /* SNMP_FREE(vp); already freed */ | ||
| 502 | } | ||
| 503 | } | ||
| 504 | return SNMPERR_SUCCESS; | ||
| 505 | diff --git a/agent/helpers/snmp_get_statistic.c b/agent/helpers/snmp_get_statistic.c | ||
| 506 | index 2e4fed8..efac2ac 100644 | ||
| 507 | --- a/agent/helpers/snmp_get_statistic.c | ||
| 508 | +++ b/agent/helpers/snmp_get_statistic.c | ||
| 509 | @@ -58,4 +58,4 @@ netsnmp_register_statistic_handler(netsnmp_handler_registration *reginfo, | ||
| 510 | } | ||
| 511 | #else /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */ | ||
| 512 | netsnmp_feature_unused(helper_statistics); | ||
| 513 | -#endif | ||
| 514 | +#endif /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */ | ||
| 515 | diff --git a/agent/helpers/table_array.c b/agent/helpers/table_array.c | ||
| 516 | index 49e0b24..7c98aae 100644 | ||
| 517 | --- a/agent/helpers/table_array.c | ||
| 518 | +++ b/agent/helpers/table_array.c | ||
| 519 | @@ -576,8 +576,11 @@ group_requests(netsnmp_agent_request_info *agtreq_info, | ||
| 520 | DEBUGMSG(("table_array:group", "\n")); | ||
| 521 | g = SNMP_MALLOC_TYPEDEF(netsnmp_request_group); | ||
| 522 | i = SNMP_MALLOC_TYPEDEF(netsnmp_request_group_item); | ||
| 523 | - if (i == NULL || g == NULL) | ||
| 524 | + if (i == NULL || g == NULL) { | ||
| 525 | + SNMP_FREE(i); | ||
| 526 | + SNMP_FREE(g); | ||
| 527 | return; | ||
| 528 | + } | ||
| 529 | g->list = i; | ||
| 530 | g->table = tad->table; | ||
| 531 | i->ri = current; | ||
| 532 | diff --git a/agent/helpers/table_dataset.c b/agent/helpers/table_dataset.c | ||
| 533 | index 5160748..0949a8a 100644 | ||
| 534 | --- a/agent/helpers/table_dataset.c | ||
| 535 | +++ b/agent/helpers/table_dataset.c | ||
| 536 | @@ -467,7 +467,7 @@ netsnmp_register_table_data_set(netsnmp_handler_registration *reginfo, | ||
| 537 | netsnmp_get_table_data_set_handler(data_set)); | ||
| 538 | ret = netsnmp_register_table_data(reginfo, data_set->table, | ||
| 539 | table_info); | ||
| 540 | - if (reginfo->handler) | ||
| 541 | + if (ret == SNMPERR_SUCCESS && reginfo->handler) | ||
| 542 | netsnmp_handler_owns_table_info(reginfo->handler->next); | ||
| 543 | return ret; | ||
| 544 | } | ||
| 545 | @@ -1105,9 +1105,11 @@ netsnmp_config_parse_table_set(const char *token, char *line) | ||
| 546 | switch (tp->access) { | ||
| 547 | case MIB_ACCESS_CREATE: | ||
| 548 | table_set->allow_creation = 1; | ||
| 549 | + /* fallthrough */ | ||
| 550 | case MIB_ACCESS_READWRITE: | ||
| 551 | case MIB_ACCESS_WRITEONLY: | ||
| 552 | canwrite = 1; | ||
| 553 | + /* fallthrough */ | ||
| 554 | case MIB_ACCESS_READONLY: | ||
| 555 | DEBUGMSGTL(("table_set_add_table", | ||
| 556 | "adding column %ld of type %d\n", tp->subid, type)); | ||
| 557 | diff --git a/agent/helpers/table_iterator.c b/agent/helpers/table_iterator.c | ||
| 558 | index 64ef2cb..8ed5cd0 100644 | ||
| 559 | --- a/agent/helpers/table_iterator.c | ||
| 560 | +++ b/agent/helpers/table_iterator.c | ||
| 561 | @@ -648,6 +648,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler, | ||
| 562 | */ | ||
| 563 | if (free_this_index_search) | ||
| 564 | snmp_free_varbind(free_this_index_search); | ||
| 565 | + netsnmp_free_request_data_sets(reqtmp); | ||
| 566 | + SNMP_FREE(reqtmp); | ||
| 567 | return SNMP_ERR_GENERR; | ||
| 568 | } | ||
| 569 | coloid[reginfo->rootoid_len + 1] = table_info->colnum; | ||
| 570 | @@ -681,6 +683,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler, | ||
| 571 | if (free_this_index_search) | ||
| 572 | snmp_free_varbind | ||
| 573 | (free_this_index_search); | ||
| 574 | + netsnmp_free_request_data_sets(reqtmp); | ||
| 575 | + SNMP_FREE(reqtmp); | ||
| 576 | return SNMP_ERR_GENERR; | ||
| 577 | } | ||
| 578 | request_count--; /* One less to look for */ | ||
| 579 | diff --git a/agent/helpers/watcher.c b/agent/helpers/watcher.c | ||
| 580 | index ee80736..9b3933b 100644 | ||
| 581 | --- a/agent/helpers/watcher.c | ||
| 582 | +++ b/agent/helpers/watcher.c | ||
| 583 | @@ -245,14 +245,11 @@ netsnmp_watcher_helper_handler(netsnmp_mib_handler *handler, | ||
| 584 | netsnmp_watcher_cache *old_data; | ||
| 585 | |||
| 586 | DEBUGMSGTL(("helper:watcher", "Got request: %d\n", reqinfo->mode)); | ||
| 587 | - | ||
| 588 | DEBUGMSGTL(( "helper:watcher", " oid:")); | ||
| 589 | DEBUGMSGOID(("helper:watcher", requests->requestvb->name, | ||
| 590 | requests->requestvb->name_length)); | ||
| 591 | DEBUGMSG(( "helper:watcher", "\n")); | ||
| 592 | |||
| 593 | - | ||
| 594 | - | ||
| 595 | switch (reqinfo->mode) { | ||
| 596 | /* | ||
| 597 | * data requests | ||
| 598 | @@ -392,14 +389,11 @@ netsnmp_watched_timestamp_handler(netsnmp_mib_handler *handler, | ||
| 599 | |||
| 600 | DEBUGMSGTL(("helper:watcher:timestamp", | ||
| 601 | "Got request: %d\n", reqinfo->mode)); | ||
| 602 | - | ||
| 603 | DEBUGMSGTL(( "helper:watcher:timestamp", " oid:")); | ||
| 604 | DEBUGMSGOID(("helper:watcher:timestamp", requests->requestvb->name, | ||
| 605 | requests->requestvb->name_length)); | ||
| 606 | DEBUGMSG(( "helper:watcher:timestamp", "\n")); | ||
| 607 | |||
| 608 | - | ||
| 609 | - | ||
| 610 | switch (reqinfo->mode) { | ||
| 611 | /* | ||
| 612 | * data requests | ||
| 613 | @@ -481,14 +475,11 @@ netsnmp_watched_spinlock_handler(netsnmp_mib_handler *handler, | ||
| 614 | |||
| 615 | DEBUGMSGTL(("helper:watcher:spinlock", | ||
| 616 | "Got request: %d\n", reqinfo->mode)); | ||
| 617 | - | ||
| 618 | DEBUGMSGTL(( "helper:watcher:spinlock", " oid:")); | ||
| 619 | DEBUGMSGOID(("helper:watcher:spinlock", requests->requestvb->name, | ||
| 620 | requests->requestvb->name_length)); | ||
| 621 | DEBUGMSG(( "helper:watcher:spinlock", "\n")); | ||
| 622 | |||
| 623 | - | ||
| 624 | - | ||
| 625 | switch (reqinfo->mode) { | ||
| 626 | /* | ||
| 627 | * Ensure the assigned value matches the current one | ||
| 628 | diff --git a/agent/mibgroup/Rmon/agutil.c b/agent/mibgroup/Rmon/agutil.c | ||
| 629 | index d28bb67..12c6342 100644 | ||
| 630 | --- a/agent/mibgroup/Rmon/agutil.c | ||
| 631 | +++ b/agent/mibgroup/Rmon/agutil.c | ||
| 632 | @@ -200,12 +200,7 @@ AGUTIL_get_oid_value(u_char * var_val, u_char var_val_type, | ||
| 633 | u_long | ||
| 634 | AGUTIL_sys_up_time(void) | ||
| 635 | { | ||
| 636 | - struct timeval current, delta; | ||
| 637 | - const struct timeval* const starttime_ptr = netsnmp_get_agent_starttime(); | ||
| 638 | - | ||
| 639 | - gettimeofday(¤t, NULL); | ||
| 640 | - NETSNMP_TIMERSUB(¤t, starttime_ptr, &delta); | ||
| 641 | - return delta.tv_sec * 100 + delta.tv_usec / 10000; | ||
| 642 | + return netsnmp_get_agent_runtime(); | ||
| 643 | } | ||
| 644 | |||
| 645 | /* | ||
| 646 | diff --git a/agent/mibgroup/Rmon/event.c b/agent/mibgroup/Rmon/event.c | ||
| 647 | index 008ebaa..04a8555 100644 | ||
| 648 | --- a/agent/mibgroup/Rmon/event.c | ||
| 649 | +++ b/agent/mibgroup/Rmon/event.c | ||
| 650 | @@ -128,6 +128,7 @@ typedef struct { | ||
| 651 | |||
| 652 | static TABLE_DEFINTION_T EventCtrlTable; | ||
| 653 | static TABLE_DEFINTION_T *table_ptr = &EventCtrlTable; | ||
| 654 | +static unsigned char zero_octet_string[1]; | ||
| 655 | |||
| 656 | /* | ||
| 657 | * Control Table RowApi Callbacks | ||
| 658 | @@ -262,7 +263,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type, | ||
| 659 | static int prev_action = COMMIT; | ||
| 660 | RMON_ENTRY_T *hdr; | ||
| 661 | CRTL_ENTRY_T *cloned_body; | ||
| 662 | - CRTL_ENTRY_T *body; | ||
| 663 | |||
| 664 | switch (action) { | ||
| 665 | case RESERVE1: | ||
| 666 | @@ -283,7 +283,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type, | ||
| 667 | leaf_id = (int) name[eventEntryFirstIndexBegin - 1]; | ||
| 668 | hdr = ROWAPI_find(table_ptr, long_temp); /* it MUST be OK */ | ||
| 669 | cloned_body = (CRTL_ENTRY_T *) hdr->tmp; | ||
| 670 | - body = (CRTL_ENTRY_T *) hdr->body; | ||
| 671 | switch (leaf_id) { | ||
| 672 | case Leaf_event_description: | ||
| 673 | char_temp = AGMALLOC(1 + MAX_event_description); | ||
| 674 | @@ -406,7 +405,7 @@ var_eventTable(struct variable *vp, | ||
| 675 | return (unsigned char *) theEntry.event_description; | ||
| 676 | } else { | ||
| 677 | *var_len = 0; | ||
| 678 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 679 | + return zero_octet_string; | ||
| 680 | } | ||
| 681 | case EVENTTYPE: | ||
| 682 | long_ret = theEntry.event_type; | ||
| 683 | @@ -417,7 +416,7 @@ var_eventTable(struct variable *vp, | ||
| 684 | return (unsigned char *) theEntry.event_community; | ||
| 685 | } else { | ||
| 686 | *var_len = 0; | ||
| 687 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 688 | + return zero_octet_string; | ||
| 689 | } | ||
| 690 | case EVENTLASTTIMESENT: | ||
| 691 | long_ret = theEntry.event_last_time_sent; | ||
| 692 | @@ -428,7 +427,7 @@ var_eventTable(struct variable *vp, | ||
| 693 | return (unsigned char *) hdr->owner; | ||
| 694 | } else { | ||
| 695 | *var_len = 0; | ||
| 696 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 697 | + return zero_octet_string; | ||
| 698 | } | ||
| 699 | case EVENTSTATUS: | ||
| 700 | long_ret = hdr->status; | ||
| 701 | @@ -457,7 +456,6 @@ var_logTable(struct variable *vp, | ||
| 702 | static long long_ret; | ||
| 703 | static DATA_ENTRY_T theEntry; | ||
| 704 | RMON_ENTRY_T *hdr; | ||
| 705 | - CRTL_ENTRY_T *ctrl; | ||
| 706 | |||
| 707 | *write_method = NULL; | ||
| 708 | hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len, | ||
| 709 | @@ -467,8 +465,6 @@ var_logTable(struct variable *vp, | ||
| 710 | if (!hdr) | ||
| 711 | return NULL; | ||
| 712 | |||
| 713 | - ctrl = (CRTL_ENTRY_T *) hdr->body; | ||
| 714 | - | ||
| 715 | *var_len = sizeof(long); /* default */ | ||
| 716 | |||
| 717 | switch (vp->magic) { | ||
| 718 | @@ -487,7 +483,7 @@ var_logTable(struct variable *vp, | ||
| 719 | return (unsigned char *) theEntry.log_description; | ||
| 720 | } else { | ||
| 721 | *var_len = 0; | ||
| 722 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 723 | + return zero_octet_string; | ||
| 724 | } | ||
| 725 | default: | ||
| 726 | ERROR_MSG(""); | ||
| 727 | diff --git a/agent/mibgroup/Rmon/history.c b/agent/mibgroup/Rmon/history.c | ||
| 728 | index b962567..c8e9c25 100644 | ||
| 729 | --- a/agent/mibgroup/Rmon/history.c | ||
| 730 | +++ b/agent/mibgroup/Rmon/history.c | ||
| 731 | @@ -181,7 +181,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type, | ||
| 732 | var_val_len, | ||
| 733 | MIN_historyControlBucketsRequested, | ||
| 734 | MAX_historyControlBucketsRequested, | ||
| 735 | - &cloned_body->scrlr. | ||
| 736 | + (long *) &cloned_body->scrlr. | ||
| 737 | data_requested); | ||
| 738 | if (SNMP_ERR_NOERROR != snmp_status) { | ||
| 739 | return snmp_status; | ||
| 740 | @@ -198,7 +198,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type, | ||
| 741 | var_val_len, | ||
| 742 | MIN_historyControlInterval, | ||
| 743 | MAX_historyControlInterval, | ||
| 744 | - &cloned_body->interval); | ||
| 745 | + (long *) &cloned_body->interval); | ||
| 746 | if (SNMP_ERR_NOERROR != snmp_status) { | ||
| 747 | return snmp_status; | ||
| 748 | } | ||
| 749 | @@ -257,6 +257,7 @@ var_historyControlTable(struct variable *vp, | ||
| 750 | int exact, | ||
| 751 | size_t * var_len, WriteMethod ** write_method) | ||
| 752 | { | ||
| 753 | + static unsigned char zero_octet_string[1]; | ||
| 754 | static long long_ret; | ||
| 755 | static CRTL_ENTRY_T theEntry; | ||
| 756 | RMON_ENTRY_T *hdr; | ||
| 757 | @@ -298,7 +299,7 @@ var_historyControlTable(struct variable *vp, | ||
| 758 | return (unsigned char *) hdr->owner; | ||
| 759 | } else { | ||
| 760 | *var_len = 0; | ||
| 761 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 762 | + return zero_octet_string; | ||
| 763 | } | ||
| 764 | |||
| 765 | case CTRL_STATUS: | ||
| 766 | @@ -530,7 +531,6 @@ var_etherHistoryTable(struct variable *vp, | ||
| 767 | static long long_ret; | ||
| 768 | static DATA_ENTRY_T theBucket; | ||
| 769 | RMON_ENTRY_T *hdr; | ||
| 770 | - CRTL_ENTRY_T *ctrl; | ||
| 771 | |||
| 772 | *write_method = NULL; | ||
| 773 | hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len, | ||
| 774 | @@ -542,8 +542,6 @@ var_etherHistoryTable(struct variable *vp, | ||
| 775 | |||
| 776 | *var_len = sizeof(long); /* default */ | ||
| 777 | |||
| 778 | - ctrl = (CRTL_ENTRY_T *) hdr->body; | ||
| 779 | - | ||
| 780 | switch (vp->magic) { | ||
| 781 | case DATA_INDEX: | ||
| 782 | long_ret = hdr->ctrl_index; | ||
| 783 | diff --git a/agent/mibgroup/Rmon/row_api.h b/agent/mibgroup/Rmon/row_api.h | ||
| 784 | index 2fb5a88..9f576be 100644 | ||
| 785 | --- a/agent/mibgroup/Rmon/row_api.h | ||
| 786 | +++ b/agent/mibgroup/Rmon/row_api.h | ||
| 787 | @@ -62,7 +62,7 @@ typedef struct tagEntry { | ||
| 788 | typedef int (ENTRY_CALLBACK_T) (RMON_ENTRY_T *); | ||
| 789 | |||
| 790 | typedef struct { | ||
| 791 | - char *name; | ||
| 792 | + const char *name; | ||
| 793 | RMON_ENTRY_T *first; | ||
| 794 | u_long max_number_of_entries; /* '<0' means without limit */ | ||
| 795 | u_long current_number_of_entries; | ||
| 796 | diff --git a/agent/mibgroup/Rmon/statistics.c b/agent/mibgroup/Rmon/statistics.c | ||
| 797 | index 51f25ee..3ed4acb 100644 | ||
| 798 | --- a/agent/mibgroup/Rmon/statistics.c | ||
| 799 | +++ b/agent/mibgroup/Rmon/statistics.c | ||
| 800 | @@ -317,6 +317,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length, | ||
| 801 | int exact, size_t * var_len, | ||
| 802 | WriteMethod ** write_method) | ||
| 803 | { | ||
| 804 | + static unsigned char zero_octet_string[1]; | ||
| 805 | static long long_return; | ||
| 806 | static CRTL_ENTRY_T theEntry; | ||
| 807 | RMON_ENTRY_T *hdr; | ||
| 808 | @@ -397,7 +398,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length, | ||
| 809 | return (unsigned char *) hdr->owner; | ||
| 810 | } else { | ||
| 811 | *var_len = 0; | ||
| 812 | - return NETSNMP_REMOVE_CONST(unsigned char *, ""); | ||
| 813 | + return zero_octet_string; | ||
| 814 | } | ||
| 815 | case IDetherStatsStatus: | ||
| 816 | long_return = hdr->status; | ||
| 817 | diff --git a/agent/mibgroup/agent/extend.c b/agent/mibgroup/agent/extend.c | ||
| 818 | index ddef4fb..8268559 100644 | ||
| 819 | --- a/agent/mibgroup/agent/extend.c | ||
| 820 | +++ b/agent/mibgroup/agent/extend.c | ||
| 821 | @@ -120,7 +120,8 @@ _register_extend( oid *base, size_t len ) | ||
| 822 | netsnmp_table_data *dinfo; | ||
| 823 | netsnmp_table_registration_info *tinfo; | ||
| 824 | netsnmp_watcher_info *winfo; | ||
| 825 | - netsnmp_handler_registration *reg; | ||
| 826 | + netsnmp_handler_registration *reg = NULL; | ||
| 827 | + int rc; | ||
| 828 | |||
| 829 | for ( eptr=ereg_head; eptr; eptr=eptr->next ) { | ||
| 830 | if (!snmp_oid_compare( base, len, eptr->root_oid, eptr->oid_len)) | ||
| 831 | @@ -128,6 +129,8 @@ _register_extend( oid *base, size_t len ) | ||
| 832 | } | ||
| 833 | if (!eptr) { | ||
| 834 | eptr = SNMP_MALLOC_TYPEDEF( extend_registration_block ); | ||
| 835 | + if (!eptr) | ||
| 836 | + return NULL; | ||
| 837 | eptr->root_oid = snmp_duplicate_objid( base, len ); | ||
| 838 | eptr->oid_len = len; | ||
| 839 | eptr->num_entries = 0; | ||
| 840 | @@ -157,7 +160,10 @@ _register_extend( oid *base, size_t len ) | ||
| 841 | "nsExtendConfigTable", handle_nsExtendConfigTable, | ||
| 842 | oid_buf, len+1, HANDLER_CAN_RONLY); | ||
| 843 | #endif /* !NETSNMP_NO_WRITE_SUPPORT */ | ||
| 844 | - netsnmp_register_table_data( reg, dinfo, tinfo ); | ||
| 845 | + rc = netsnmp_register_table_data( reg, dinfo, tinfo ); | ||
| 846 | + if (rc != SNMPERR_SUCCESS) { | ||
| 847 | + goto bail; | ||
| 848 | + } | ||
| 849 | netsnmp_handler_owns_table_info(reg->handler->next); | ||
| 850 | eptr->reg[0] = reg; | ||
| 851 | |||
| 852 | @@ -175,7 +181,9 @@ _register_extend( oid *base, size_t len ) | ||
| 853 | reg = netsnmp_create_handler_registration( | ||
| 854 | "nsExtendOut1Table", handle_nsExtendOutput1Table, | ||
| 855 | oid_buf, len+1, HANDLER_CAN_RONLY); | ||
| 856 | - netsnmp_register_table_data( reg, dinfo, tinfo ); | ||
| 857 | + rc = netsnmp_register_table_data( reg, dinfo, tinfo ); | ||
| 858 | + if (rc != SNMPERR_SUCCESS) | ||
| 859 | + goto bail; | ||
| 860 | netsnmp_handler_owns_table_info(reg->handler->next); | ||
| 861 | eptr->reg[1] = reg; | ||
| 862 | |||
| 863 | @@ -195,7 +203,9 @@ _register_extend( oid *base, size_t len ) | ||
| 864 | reg = netsnmp_create_handler_registration( | ||
| 865 | "nsExtendOut2Table", handle_nsExtendOutput2Table, | ||
| 866 | oid_buf, len+1, HANDLER_CAN_RONLY); | ||
| 867 | - netsnmp_register_table( reg, tinfo ); | ||
| 868 | + rc = netsnmp_register_table( reg, tinfo ); | ||
| 869 | + if (rc != SNMPERR_SUCCESS) | ||
| 870 | + goto bail; | ||
| 871 | netsnmp_handler_owns_table_info(reg->handler->next); | ||
| 872 | eptr->reg[2] = reg; | ||
| 873 | |||
| 874 | @@ -209,9 +219,20 @@ _register_extend( oid *base, size_t len ) | ||
| 875 | winfo = netsnmp_create_watcher_info( | ||
| 876 | &(eptr->num_entries), sizeof(eptr->num_entries), | ||
| 877 | ASN_INTEGER, WATCHER_FIXED_SIZE); | ||
| 878 | - netsnmp_register_watched_scalar2( reg, winfo ); | ||
| 879 | + rc = netsnmp_register_watched_scalar2( reg, winfo ); | ||
| 880 | + if (rc != SNMPERR_SUCCESS) | ||
| 881 | + goto bail; | ||
| 882 | |||
| 883 | return eptr; | ||
| 884 | + | ||
| 885 | +bail: | ||
| 886 | + if (eptr->reg[2]) | ||
| 887 | + netsnmp_unregister_handler(eptr->reg[2]); | ||
| 888 | + if (eptr->reg[1]) | ||
| 889 | + netsnmp_unregister_handler(eptr->reg[1]); | ||
| 890 | + if (eptr->reg[0]) | ||
| 891 | + netsnmp_unregister_handler(eptr->reg[0]); | ||
| 892 | + return NULL; | ||
| 893 | } | ||
| 894 | |||
| 895 | static void | ||
| 896 | @@ -406,9 +427,9 @@ _free_extension( netsnmp_extend *extension, extend_registration_block *ereg ) | ||
| 897 | eprev->next = eptr->next; | ||
| 898 | else | ||
| 899 | ereg->ehead = eptr->next; | ||
| 900 | + netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row); | ||
| 901 | } | ||
| 902 | |||
| 903 | - netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row); | ||
| 904 | SNMP_FREE( extension->token ); | ||
| 905 | SNMP_FREE( extension->cache ); | ||
| 906 | SNMP_FREE( extension->command ); | ||
| 907 | diff --git a/agent/mibgroup/agent/nsDebug.c b/agent/mibgroup/agent/nsDebug.c | ||
| 908 | index 0a629cc..89a90b0 100644 | ||
| 909 | --- a/agent/mibgroup/agent/nsDebug.c | ||
| 910 | +++ b/agent/mibgroup/agent/nsDebug.c | ||
| 911 | @@ -423,8 +423,9 @@ handle_nsDebugTable(netsnmp_mib_handler *handler, | ||
| 912 | */ | ||
| 913 | debug_entry = (netsnmp_token_descr*) | ||
| 914 | netsnmp_extract_iterator_context(request); | ||
| 915 | - debug_entry->enabled = | ||
| 916 | - (*request->requestvb->val.integer == RS_ACTIVE); | ||
| 917 | + if (debug_entry) | ||
| 918 | + debug_entry->enabled = | ||
| 919 | + (*request->requestvb->val.integer == RS_ACTIVE); | ||
| 920 | break; | ||
| 921 | |||
| 922 | case RS_CREATEANDWAIT: | ||
| 923 | diff --git a/agent/mibgroup/agent/nsLogging.c b/agent/mibgroup/agent/nsLogging.c | ||
| 924 | index c06a18a..7f20bdb 100644 | ||
| 925 | --- a/agent/mibgroup/agent/nsLogging.c | ||
| 926 | +++ b/agent/mibgroup/agent/nsLogging.c | ||
| 927 | @@ -363,7 +363,7 @@ handle_nsLoggingTable(netsnmp_mib_handler *handler, | ||
| 928 | switch ( *request->requestvb->val.integer ) { | ||
| 929 | case RS_ACTIVE: | ||
| 930 | case RS_CREATEANDGO: | ||
| 931 | - if ( !logh->type ) { | ||
| 932 | + if ( !logh || !logh->type ) { | ||
| 933 | netsnmp_set_request_error(reqinfo, request, | ||
| 934 | SNMP_ERR_INCONSISTENTVALUE); | ||
| 935 | return SNMP_ERR_INCONSISTENTVALUE; | ||
| 936 | diff --git a/agent/mibgroup/agent/nsVacmAccessTable.c b/agent/mibgroup/agent/nsVacmAccessTable.c | ||
| 937 | index 22d2154..79fa97d 100644 | ||
| 938 | --- a/agent/mibgroup/agent/nsVacmAccessTable.c | ||
| 939 | +++ b/agent/mibgroup/agent/nsVacmAccessTable.c | ||
| 940 | @@ -174,11 +174,11 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler, | ||
| 941 | /* Extract the authType token from the list of indexes */ | ||
| 942 | idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; | ||
| 943 | memset(atype, 0, sizeof(atype)); | ||
| 944 | - strncpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 945 | + memcpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 946 | viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); | ||
| 947 | DEBUGMSGTL(("nsVacm", "GET %s (%d)\n", idx->val.string, viewIdx)); | ||
| 948 | |||
| 949 | - if (!entry) | ||
| 950 | + if (!entry || viewIdx < 0) | ||
| 951 | continue; | ||
| 952 | |||
| 953 | switch (table_info->colnum) { | ||
| 954 | @@ -248,7 +248,7 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler, | ||
| 955 | */ | ||
| 956 | idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; | ||
| 957 | memset(atype, 0, sizeof(atype)); | ||
| 958 | - strncpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 959 | + memcpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 960 | viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); | ||
| 961 | if ( viewIdx < 0 ) { | ||
| 962 | ret = SNMP_ERR_NOCREATION; | ||
| 963 | @@ -322,8 +322,10 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler, | ||
| 964 | /* Extract the authType token from the list of indexes */ | ||
| 965 | idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable; | ||
| 966 | memset(atype, 0, sizeof(atype)); | ||
| 967 | - strncpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 968 | + memcpy(atype, (char *)idx->val.string, idx->val_len); | ||
| 969 | viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype); | ||
| 970 | + if (viewIdx < 0) | ||
| 971 | + continue; | ||
| 972 | |||
| 973 | switch (table_info->colnum) { | ||
| 974 | case COLUMN_NSVACMCONTEXTMATCH: | ||
| 975 | diff --git a/agent/mibgroup/agentx/agentx_config.c b/agent/mibgroup/agentx/agentx_config.c | ||
| 976 | index b590c7a..ea453c2 100644 | ||
| 977 | --- a/agent/mibgroup/agentx/agentx_config.c | ||
| 978 | +++ b/agent/mibgroup/agentx/agentx_config.c | ||
| 979 | @@ -180,10 +180,8 @@ agentx_config_init(void) | ||
| 980 | */ | ||
| 981 | netsnmp_register_default_domain("agentx", "unix tcp"); | ||
| 982 | netsnmp_register_default_target("agentx", "unix", NETSNMP_AGENTX_SOCKET); | ||
| 983 | -#define val(x) __STRING(x) | ||
| 984 | netsnmp_register_default_target("agentx", "tcp", | ||
| 985 | - "localhost:" val(AGENTX_PORT)); | ||
| 986 | -#undef val | ||
| 987 | + "localhost:" __STRING(AGENTX_PORT)); | ||
| 988 | agentx_register_config_handler("agentxsocket", | ||
| 989 | agentx_parse_agentx_socket, NULL, | ||
| 990 | "AgentX bind address"); | ||
| 991 | diff --git a/agent/mibgroup/agentx/master_admin.c b/agent/mibgroup/agentx/master_admin.c | ||
| 992 | index 3f4b33d..f16f392 100644 | ||
| 993 | --- a/agent/mibgroup/agentx/master_admin.c | ||
| 994 | +++ b/agent/mibgroup/agentx/master_admin.c | ||
| 995 | @@ -64,7 +64,6 @@ int | ||
| 996 | open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu) | ||
| 997 | { | ||
| 998 | netsnmp_session *sp; | ||
| 999 | - struct timeval now; | ||
| 1000 | |||
| 1001 | DEBUGMSGTL(("agentx/master", "open %8p\n", session)); | ||
| 1002 | sp = (netsnmp_session *) malloc(sizeof(netsnmp_session)); | ||
| 1003 | @@ -104,8 +103,7 @@ open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu) | ||
| 1004 | name_length); | ||
| 1005 | sp->securityAuthProtoLen = pdu->variables->name_length; | ||
| 1006 | sp->securityName = strdup((char *) pdu->variables->val.string); | ||
| 1007 | - gettimeofday(&now, NULL); | ||
| 1008 | - sp->engineTime = calculate_sectime_diff(&now, netsnmp_get_agent_starttime()); | ||
| 1009 | + sp->engineTime = (netsnmp_get_agent_runtime() + 50) / 100; | ||
| 1010 | |||
| 1011 | sp->subsession = session; /* link back to head */ | ||
| 1012 | sp->flags |= SNMP_FLAGS_SUBSESSION; | ||
| 1013 | diff --git a/agent/mibgroup/agentx/protocol.c b/agent/mibgroup/agentx/protocol.c | ||
| 1014 | index 09c149f..6e3daf3 100644 | ||
| 1015 | --- a/agent/mibgroup/agentx/protocol.c | ||
| 1016 | +++ b/agent/mibgroup/agentx/protocol.c | ||
| 1017 | @@ -453,6 +453,7 @@ agentx_realloc_build_varbind(u_char ** buf, size_t * buf_len, | ||
| 1018 | case ASN_COUNTER: | ||
| 1019 | case ASN_GAUGE: | ||
| 1020 | case ASN_TIMETICKS: | ||
| 1021 | + case ASN_UINTEGER: | ||
| 1022 | if (!agentx_realloc_build_int(buf, buf_len, out_len, allow_realloc, | ||
| 1023 | *(vp->val.integer), network_order)) { | ||
| 1024 | DEBUGINDENTLESS(); | ||
| 1025 | @@ -1372,6 +1373,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type, | ||
| 1026 | case ASN_COUNTER: | ||
| 1027 | case ASN_GAUGE: | ||
| 1028 | case ASN_TIMETICKS: | ||
| 1029 | + case ASN_UINTEGER: | ||
| 1030 | int_val = agentx_parse_int(bufp, network_byte_order); | ||
| 1031 | memmove(data_buf, &int_val, 4); | ||
| 1032 | *data_len = 4; | ||
| 1033 | @@ -1429,6 +1431,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type, | ||
| 1034 | break; | ||
| 1035 | |||
| 1036 | default: | ||
| 1037 | + DEBUGMSG(("recv", "Can not parse type %x", *type)); | ||
| 1038 | DEBUGINDENTLESS(); | ||
| 1039 | return NULL; | ||
| 1040 | } | ||
| 1041 | diff --git a/agent/mibgroup/agentx/subagent.c b/agent/mibgroup/agentx/subagent.c | ||
| 1042 | index 5d51834..76b1acf 100644 | ||
| 1043 | --- a/agent/mibgroup/agentx/subagent.c | ||
| 1044 | +++ b/agent/mibgroup/agentx/subagent.c | ||
| 1045 | @@ -243,6 +243,24 @@ free_set_vars(netsnmp_session * ss, netsnmp_pdu *pdu) | ||
| 1046 | } | ||
| 1047 | #endif /* !NETSNMP_NO_WRITE_SUPPORT */ | ||
| 1048 | |||
| 1049 | +static void | ||
| 1050 | +send_agentx_error(netsnmp_session *session, netsnmp_pdu *pdu, int errstat, int errindex) | ||
| 1051 | +{ | ||
| 1052 | + pdu = snmp_clone_pdu(pdu); | ||
| 1053 | + pdu->command = AGENTX_MSG_RESPONSE; | ||
| 1054 | + pdu->version = session->version; | ||
| 1055 | + pdu->errstat = errstat; | ||
| 1056 | + pdu->errindex = errindex; | ||
| 1057 | + snmp_free_varbind(pdu->variables); | ||
| 1058 | + pdu->variables = NULL; | ||
| 1059 | + | ||
| 1060 | + DEBUGMSGTL(("agentx/subagent", "Sending AgentX response error stat %d idx %d\n", | ||
| 1061 | + errstat, errindex)); | ||
| 1062 | + if (!snmp_send(session, pdu)) { | ||
| 1063 | + snmp_free_pdu(pdu); | ||
| 1064 | + } | ||
| 1065 | +} | ||
| 1066 | + | ||
| 1067 | int | ||
| 1068 | handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1069 | netsnmp_pdu *pdu, void *magic) | ||
| 1070 | @@ -298,8 +316,10 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1071 | * agentx_reopen_session unregisters itself if it succeeds in talking | ||
| 1072 | * to the master agent. | ||
| 1073 | */ | ||
| 1074 | - snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session, | ||
| 1075 | - NULL); | ||
| 1076 | + snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session, NULL); | ||
| 1077 | + snmp_log(LOG_INFO, "AgentX master disconnected us, reconnecting in %d\n", period); | ||
| 1078 | + } else { | ||
| 1079 | + snmp_log(LOG_INFO, "AgentX master disconnected us, not reconnecting\n"); | ||
| 1080 | } | ||
| 1081 | return 0; | ||
| 1082 | } else if (operation != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) { | ||
| 1083 | @@ -325,6 +345,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1084 | (ns_subagent_magic *) calloc(1, sizeof(ns_subagent_magic)); | ||
| 1085 | if (smagic == NULL) { | ||
| 1086 | DEBUGMSGTL(("agentx/subagent", "couldn't malloc() smagic\n")); | ||
| 1087 | + /* would like to send_agentx_error(), but it needs memory too */ | ||
| 1088 | return 1; | ||
| 1089 | } | ||
| 1090 | smagic->original_command = pdu->command; | ||
| 1091 | @@ -389,6 +410,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1092 | if (asi == NULL) { | ||
| 1093 | SNMP_FREE(smagic); | ||
| 1094 | snmp_log(LOG_WARNING, "save_set_vars() failed\n"); | ||
| 1095 | + send_agentx_error(session, pdu, AGENTX_ERR_PARSE_FAILED, 0); | ||
| 1096 | return 1; | ||
| 1097 | } | ||
| 1098 | asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_RESERVE1; | ||
| 1099 | @@ -402,6 +424,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1100 | if (asi == NULL) { | ||
| 1101 | SNMP_FREE(smagic); | ||
| 1102 | snmp_log(LOG_WARNING, "restore_set_vars() failed\n"); | ||
| 1103 | + send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0); | ||
| 1104 | return 1; | ||
| 1105 | } | ||
| 1106 | if (asi->mode != SNMP_MSG_INTERNAL_SET_RESERVE2) { | ||
| 1107 | @@ -409,6 +432,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1108 | snmp_log(LOG_WARNING, | ||
| 1109 | "dropping bad AgentX request (wrong mode %d)\n", | ||
| 1110 | asi->mode); | ||
| 1111 | + send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0); | ||
| 1112 | return 1; | ||
| 1113 | } | ||
| 1114 | asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_ACTION; | ||
| 1115 | @@ -422,6 +446,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1116 | if (asi == NULL) { | ||
| 1117 | SNMP_FREE(smagic); | ||
| 1118 | snmp_log(LOG_WARNING, "restore_set_vars() failed\n"); | ||
| 1119 | + send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0); | ||
| 1120 | return 1; | ||
| 1121 | } | ||
| 1122 | if (asi->mode == SNMP_MSG_INTERNAL_SET_RESERVE1 || | ||
| 1123 | @@ -446,6 +471,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1124 | if (asi == NULL) { | ||
| 1125 | SNMP_FREE(smagic); | ||
| 1126 | snmp_log(LOG_WARNING, "restore_set_vars() failed\n"); | ||
| 1127 | + send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0); | ||
| 1128 | return 1; | ||
| 1129 | } | ||
| 1130 | asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_UNDO; | ||
| 1131 | @@ -484,6 +510,26 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid, | ||
| 1132 | return 1; | ||
| 1133 | } | ||
| 1134 | |||
| 1135 | +static int | ||
| 1136 | +_invalid_op_and_magic(int op, ns_subagent_magic *smagic) | ||
| 1137 | +{ | ||
| 1138 | + int invalid = 0; | ||
| 1139 | + | ||
| 1140 | + if (smagic && (snmp_sess_pointer(smagic->session) == NULL || | ||
| 1141 | + op == NETSNMP_CALLBACK_OP_TIMED_OUT)) { | ||
| 1142 | + if (smagic->ovars != NULL) { | ||
| 1143 | + snmp_free_varbind(smagic->ovars); | ||
| 1144 | + } | ||
| 1145 | + free(smagic); | ||
| 1146 | + invalid = 1; | ||
| 1147 | + } | ||
| 1148 | + | ||
| 1149 | + if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || smagic == NULL) | ||
| 1150 | + invalid = 1; | ||
| 1151 | + | ||
| 1152 | + return invalid; | ||
| 1153 | +} | ||
| 1154 | + | ||
| 1155 | int | ||
| 1156 | handle_subagent_response(int op, netsnmp_session * session, int reqid, | ||
| 1157 | netsnmp_pdu *pdu, void *magic) | ||
| 1158 | @@ -492,13 +538,7 @@ handle_subagent_response(int op, netsnmp_session * session, int reqid, | ||
| 1159 | netsnmp_variable_list *u = NULL, *v = NULL; | ||
| 1160 | int rc = 0; | ||
| 1161 | |||
| 1162 | - if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || magic == NULL) { | ||
| 1163 | - if (op == NETSNMP_CALLBACK_OP_TIMED_OUT && magic != NULL) { | ||
| 1164 | - if (smagic->ovars != NULL) { | ||
| 1165 | - snmp_free_varbind(smagic->ovars); | ||
| 1166 | - } | ||
| 1167 | - free(smagic); | ||
| 1168 | - } | ||
| 1169 | + if (_invalid_op_and_magic(op, magic)) { | ||
| 1170 | return 1; | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | @@ -778,6 +818,7 @@ subagent_open_master_session(void) | ||
| 1174 | { | ||
| 1175 | netsnmp_transport *t; | ||
| 1176 | netsnmp_session sess; | ||
| 1177 | + const char *agentx_socket; | ||
| 1178 | |||
| 1179 | DEBUGMSGTL(("agentx/subagent", "opening session...\n")); | ||
| 1180 | |||
| 1181 | @@ -795,9 +836,9 @@ subagent_open_master_session(void) | ||
| 1182 | sess.callback = handle_agentx_packet; | ||
| 1183 | sess.authenticator = NULL; | ||
| 1184 | |||
| 1185 | - t = netsnmp_transport_open_client( | ||
| 1186 | - "agentx", netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, | ||
| 1187 | - NETSNMP_DS_AGENT_X_SOCKET)); | ||
| 1188 | + agentx_socket = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, | ||
| 1189 | + NETSNMP_DS_AGENT_X_SOCKET); | ||
| 1190 | + t = netsnmp_transport_open_client("agentx", agentx_socket); | ||
| 1191 | if (t == NULL) { | ||
| 1192 | /* | ||
| 1193 | * Diagnose snmp_open errors with the input | ||
| 1194 | @@ -806,12 +847,9 @@ subagent_open_master_session(void) | ||
| 1195 | if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, | ||
| 1196 | NETSNMP_DS_AGENT_NO_CONNECTION_WARNINGS)) { | ||
| 1197 | char buf[1024]; | ||
| 1198 | - const char *socket = | ||
| 1199 | - netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, | ||
| 1200 | - NETSNMP_DS_AGENT_X_SOCKET); | ||
| 1201 | snprintf(buf, sizeof(buf), "Warning: " | ||
| 1202 | "Failed to connect to the agentx master agent (%s)", | ||
| 1203 | - socket ? socket : "[NIL]"); | ||
| 1204 | + agentx_socket ? agentx_socket : "[NIL]"); | ||
| 1205 | if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, | ||
| 1206 | NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) { | ||
| 1207 | netsnmp_sess_log_error(LOG_WARNING, buf, &sess); | ||
| 1208 | @@ -832,8 +870,7 @@ subagent_open_master_session(void) | ||
| 1209 | char buf[1024]; | ||
| 1210 | snprintf(buf, sizeof(buf), "Error: " | ||
| 1211 | "Failed to create the agentx master agent session (%s)", | ||
| 1212 | - netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, | ||
| 1213 | - NETSNMP_DS_AGENT_X_SOCKET)); | ||
| 1214 | + agentx_socket); | ||
| 1215 | snmp_sess_perror(buf, &sess); | ||
| 1216 | } | ||
| 1217 | netsnmp_transport_free(t); | ||
| 1218 | diff --git a/agent/mibgroup/disman/event/mteEventConf.c b/agent/mibgroup/disman/event/mteEventConf.c | ||
| 1219 | index 949d6e5..24192a6 100644 | ||
| 1220 | --- a/agent/mibgroup/disman/event/mteEventConf.c | ||
| 1221 | +++ b/agent/mibgroup/disman/event/mteEventConf.c | ||
| 1222 | @@ -296,6 +296,11 @@ parse_setEvent( const char *token, char *line ) | ||
| 1223 | if (cp && *cp == '=') { | ||
| 1224 | cp = skip_token( cp ); /* skip the '=' assignment character */ | ||
| 1225 | } | ||
| 1226 | + if (!cp) { | ||
| 1227 | + config_perror("syntax error: missing set value"); | ||
| 1228 | + return; | ||
| 1229 | + } | ||
| 1230 | + | ||
| 1231 | value = strtol( cp, NULL, 0); | ||
| 1232 | |||
| 1233 | /* | ||
| 1234 | diff --git a/agent/mibgroup/disman/event/mteEventNotificationTable.c b/agent/mibgroup/disman/event/mteEventNotificationTable.c | ||
| 1235 | index 9095f0e..7d2c94a 100644 | ||
| 1236 | --- a/agent/mibgroup/disman/event/mteEventNotificationTable.c | ||
| 1237 | +++ b/agent/mibgroup/disman/event/mteEventNotificationTable.c | ||
| 1238 | @@ -98,6 +98,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler, | ||
| 1239 | */ | ||
| 1240 | case MODE_GET: | ||
| 1241 | for (request = requests; request; request = request->next) { | ||
| 1242 | + if (request->processed) | ||
| 1243 | + continue; | ||
| 1244 | + | ||
| 1245 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1246 | tinfo = netsnmp_extract_table_info(request); | ||
| 1247 | |||
| 1248 | @@ -136,6 +139,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler, | ||
| 1249 | */ | ||
| 1250 | case MODE_SET_RESERVE1: | ||
| 1251 | for (request = requests; request; request = request->next) { | ||
| 1252 | + if (request->processed) | ||
| 1253 | + continue; | ||
| 1254 | + | ||
| 1255 | tinfo = netsnmp_extract_table_info(request); | ||
| 1256 | |||
| 1257 | /* | ||
| 1258 | @@ -204,6 +210,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler, | ||
| 1259 | |||
| 1260 | case MODE_SET_ACTION: | ||
| 1261 | for (request = requests; request; request = request->next) { | ||
| 1262 | + if (request->processed) | ||
| 1263 | + continue; | ||
| 1264 | + | ||
| 1265 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1266 | if (!entry) { | ||
| 1267 | /* | ||
| 1268 | @@ -225,6 +234,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler, | ||
| 1269 | * (reasonably) safe to apply them in the Commit phase | ||
| 1270 | */ | ||
| 1271 | for (request = requests; request; request = request->next) { | ||
| 1272 | + if (request->processed) | ||
| 1273 | + continue; | ||
| 1274 | + | ||
| 1275 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1276 | tinfo = netsnmp_extract_table_info(request); | ||
| 1277 | |||
| 1278 | diff --git a/agent/mibgroup/disman/event/mteEventSetTable.c b/agent/mibgroup/disman/event/mteEventSetTable.c | ||
| 1279 | index 67a8170..ee696f1 100644 | ||
| 1280 | --- a/agent/mibgroup/disman/event/mteEventSetTable.c | ||
| 1281 | +++ b/agent/mibgroup/disman/event/mteEventSetTable.c | ||
| 1282 | @@ -100,6 +100,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler, | ||
| 1283 | */ | ||
| 1284 | case MODE_GET: | ||
| 1285 | for (request = requests; request; request = request->next) { | ||
| 1286 | + if (request->processed) | ||
| 1287 | + continue; | ||
| 1288 | + | ||
| 1289 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1290 | tinfo = netsnmp_extract_table_info(request); | ||
| 1291 | |||
| 1292 | @@ -151,6 +154,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler, | ||
| 1293 | */ | ||
| 1294 | case MODE_SET_RESERVE1: | ||
| 1295 | for (request = requests; request; request = request->next) { | ||
| 1296 | + if (request->processed) | ||
| 1297 | + continue; | ||
| 1298 | + | ||
| 1299 | tinfo = netsnmp_extract_table_info(request); | ||
| 1300 | |||
| 1301 | /* | ||
| 1302 | @@ -233,6 +239,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler, | ||
| 1303 | |||
| 1304 | case MODE_SET_ACTION: | ||
| 1305 | for (request = requests; request; request = request->next) { | ||
| 1306 | + if (request->processed) | ||
| 1307 | + continue; | ||
| 1308 | + | ||
| 1309 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1310 | if (!entry) { | ||
| 1311 | /* | ||
| 1312 | @@ -254,6 +263,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler, | ||
| 1313 | * (reasonably) safe to apply them in the Commit phase | ||
| 1314 | */ | ||
| 1315 | for (request = requests; request; request = request->next) { | ||
| 1316 | + if (request->processed) | ||
| 1317 | + continue; | ||
| 1318 | + | ||
| 1319 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1320 | tinfo = netsnmp_extract_table_info(request); | ||
| 1321 | |||
| 1322 | diff --git a/agent/mibgroup/disman/event/mteEventTable.c b/agent/mibgroup/disman/event/mteEventTable.c | ||
| 1323 | index 5603715..c5b534e 100644 | ||
| 1324 | --- a/agent/mibgroup/disman/event/mteEventTable.c | ||
| 1325 | +++ b/agent/mibgroup/disman/event/mteEventTable.c | ||
| 1326 | @@ -106,6 +106,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1327 | */ | ||
| 1328 | case MODE_GET: | ||
| 1329 | for (request = requests; request; request = request->next) { | ||
| 1330 | + if (request->processed) | ||
| 1331 | + continue; | ||
| 1332 | + | ||
| 1333 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1334 | tinfo = netsnmp_extract_table_info(request); | ||
| 1335 | if (!entry || !(entry->flags & MTE_EVENT_FLAG_VALID)) | ||
| 1336 | @@ -142,6 +145,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1337 | */ | ||
| 1338 | case MODE_SET_RESERVE1: | ||
| 1339 | for (request = requests; request; request = request->next) { | ||
| 1340 | + if (request->processed) | ||
| 1341 | + continue; | ||
| 1342 | + | ||
| 1343 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1344 | tinfo = netsnmp_extract_table_info(request); | ||
| 1345 | |||
| 1346 | @@ -223,6 +229,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1347 | |||
| 1348 | case MODE_SET_RESERVE2: | ||
| 1349 | for (request = requests; request; request = request->next) { | ||
| 1350 | + if (request->processed) | ||
| 1351 | + continue; | ||
| 1352 | + | ||
| 1353 | tinfo = netsnmp_extract_table_info(request); | ||
| 1354 | |||
| 1355 | switch (tinfo->colnum) { | ||
| 1356 | @@ -255,6 +264,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1357 | |||
| 1358 | case MODE_SET_FREE: | ||
| 1359 | for (request = requests; request; request = request->next) { | ||
| 1360 | + if (request->processed) | ||
| 1361 | + continue; | ||
| 1362 | + | ||
| 1363 | tinfo = netsnmp_extract_table_info(request); | ||
| 1364 | |||
| 1365 | switch (tinfo->colnum) { | ||
| 1366 | @@ -280,6 +292,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1367 | |||
| 1368 | case MODE_SET_ACTION: | ||
| 1369 | for (request = requests; request; request = request->next) { | ||
| 1370 | + if (request->processed) | ||
| 1371 | + continue; | ||
| 1372 | + | ||
| 1373 | tinfo = netsnmp_extract_table_info(request); | ||
| 1374 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1375 | if (!entry) { | ||
| 1376 | @@ -304,6 +319,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler, | ||
| 1377 | * (reasonably) safe to apply them in the Commit phase | ||
| 1378 | */ | ||
| 1379 | for (request = requests; request; request = request->next) { | ||
| 1380 | + if (request->processed) | ||
| 1381 | + continue; | ||
| 1382 | + | ||
| 1383 | entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request); | ||
| 1384 | tinfo = netsnmp_extract_table_info(request); | ||
| 1385 | |||
| 1386 | diff --git a/agent/mibgroup/disman/event/mteObjectsTable.c b/agent/mibgroup/disman/event/mteObjectsTable.c | ||
| 1387 | index 443c5cc..f7f6e02 100644 | ||
| 1388 | --- a/agent/mibgroup/disman/event/mteObjectsTable.c | ||
| 1389 | +++ b/agent/mibgroup/disman/event/mteObjectsTable.c | ||
| 1390 | @@ -101,6 +101,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1391 | */ | ||
| 1392 | case MODE_GET: | ||
| 1393 | for (request = requests; request; request = request->next) { | ||
| 1394 | + if (request->processed) | ||
| 1395 | + continue; | ||
| 1396 | + | ||
| 1397 | entry = (struct mteObject *) netsnmp_tdata_extract_entry(request); | ||
| 1398 | tinfo = netsnmp_extract_table_info(request); | ||
| 1399 | |||
| 1400 | @@ -135,6 +138,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1401 | case MODE_SET_RESERVE1: | ||
| 1402 | |||
| 1403 | for (request = requests; request; request = request->next) { | ||
| 1404 | + if (request->processed) | ||
| 1405 | + continue; | ||
| 1406 | + | ||
| 1407 | entry = (struct mteObject *) netsnmp_tdata_extract_entry(request); | ||
| 1408 | tinfo = netsnmp_extract_table_info(request); | ||
| 1409 | |||
| 1410 | @@ -198,8 +204,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1411 | break; | ||
| 1412 | |||
| 1413 | case MODE_SET_RESERVE2: | ||
| 1414 | - | ||
| 1415 | for (request = requests; request; request = request->next) { | ||
| 1416 | + if (request->processed) | ||
| 1417 | + continue; | ||
| 1418 | + | ||
| 1419 | tinfo = netsnmp_extract_table_info(request); | ||
| 1420 | |||
| 1421 | switch (tinfo->colnum) { | ||
| 1422 | @@ -232,8 +240,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1423 | break; | ||
| 1424 | |||
| 1425 | case MODE_SET_FREE: | ||
| 1426 | - | ||
| 1427 | for (request = requests; request; request = request->next) { | ||
| 1428 | + if (request->processed) | ||
| 1429 | + continue; | ||
| 1430 | + | ||
| 1431 | tinfo = netsnmp_extract_table_info(request); | ||
| 1432 | |||
| 1433 | switch (tinfo->colnum) { | ||
| 1434 | @@ -259,6 +269,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1435 | |||
| 1436 | case MODE_SET_ACTION: | ||
| 1437 | for (request = requests; request; request = request->next) { | ||
| 1438 | + if (request->processed) | ||
| 1439 | + continue; | ||
| 1440 | + | ||
| 1441 | entry = (struct mteObject *) netsnmp_tdata_extract_entry(request); | ||
| 1442 | if (!entry) { | ||
| 1443 | /* | ||
| 1444 | @@ -282,6 +295,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler, | ||
| 1445 | * (reasonably) safe to apply them in the Commit phase | ||
| 1446 | */ | ||
| 1447 | for (request = requests; request; request = request->next) { | ||
| 1448 | + if (request->processed) | ||
| 1449 | + continue; | ||
| 1450 | + | ||
| 1451 | entry = (struct mteObject *) netsnmp_tdata_extract_entry(request); | ||
| 1452 | tinfo = netsnmp_extract_table_info(request); | ||
| 1453 | |||
| 1454 | diff --git a/agent/mibgroup/disman/event/mteTrigger.c b/agent/mibgroup/disman/event/mteTrigger.c | ||
| 1455 | index 002b543..7fca1b0 100644 | ||
| 1456 | --- a/agent/mibgroup/disman/event/mteTrigger.c | ||
| 1457 | +++ b/agent/mibgroup/disman/event/mteTrigger.c | ||
| 1458 | @@ -255,6 +255,7 @@ mteTrigger_run( unsigned int reg, void *clientarg) | ||
| 1459 | DEBUGMSGTL(( "disman:event:trigger:monitor", "Trigger query (%s) failed: %d\n", | ||
| 1460 | (( entry->flags & MTE_TRIGGER_FLAG_VWILD ) ? "walk" : "get"), n)); | ||
| 1461 | _mteTrigger_failure( "failed to run mteTrigger query" ); | ||
| 1462 | + snmp_free_varbind(var); | ||
| 1463 | return; | ||
| 1464 | } | ||
| 1465 | |||
| 1466 | @@ -299,6 +300,7 @@ mteTrigger_run( unsigned int reg, void *clientarg) | ||
| 1467 | if (!vtmp) { | ||
| 1468 | _mteTrigger_failure( | ||
| 1469 | "failed to create mteTrigger temp varbind"); | ||
| 1470 | + snmp_free_varbind(var); | ||
| 1471 | return; | ||
| 1472 | } | ||
| 1473 | vtmp->type = ASN_NULL; | ||
| 1474 | @@ -336,6 +338,7 @@ mteTrigger_run( unsigned int reg, void *clientarg) | ||
| 1475 | if (!vtmp) { | ||
| 1476 | _mteTrigger_failure( | ||
| 1477 | "failed to create mteTrigger temp varbind"); | ||
| 1478 | + snmp_free_varbind(var); | ||
| 1479 | return; | ||
| 1480 | } | ||
| 1481 | vtmp->type = ASN_NULL; | ||
| 1482 | @@ -377,6 +380,7 @@ mteTrigger_run( unsigned int reg, void *clientarg) | ||
| 1483 | if (!vtmp) { | ||
| 1484 | _mteTrigger_failure( | ||
| 1485 | "failed to create mteTrigger temp varbind"); | ||
| 1486 | + snmp_free_varbind(var); | ||
| 1487 | return; | ||
| 1488 | } | ||
| 1489 | vtmp->type = ASN_NULL; | ||
| 1490 | @@ -712,6 +716,7 @@ mteTrigger_run( unsigned int reg, void *clientarg) | ||
| 1491 | if (!vtmp) { | ||
| 1492 | _mteTrigger_failure( | ||
| 1493 | "failed to create mteTrigger discontinuity varbind"); | ||
| 1494 | + snmp_free_varbind(dvar); | ||
| 1495 | return; | ||
| 1496 | } | ||
| 1497 | snmp_set_var_objid(vtmp, entry->mteDeltaDiscontID, | ||
| 1498 | diff --git a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c | ||
| 1499 | index a34ad30..ed1ec30 100644 | ||
| 1500 | --- a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c | ||
| 1501 | +++ b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c | ||
| 1502 | @@ -97,6 +97,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler, | ||
| 1503 | */ | ||
| 1504 | case MODE_GET: | ||
| 1505 | for (request = requests; request; request = request->next) { | ||
| 1506 | + if (request->processed) | ||
| 1507 | + continue; | ||
| 1508 | + | ||
| 1509 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1510 | tinfo = netsnmp_extract_table_info(request); | ||
| 1511 | |||
| 1512 | @@ -105,8 +108,10 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler, | ||
| 1513 | * rows where the mteTriggerTest 'boolean(1)' bit is set. | ||
| 1514 | * So skip entries where this isn't the case. | ||
| 1515 | */ | ||
| 1516 | - if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN )) | ||
| 1517 | + if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN )) { | ||
| 1518 | + netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE); | ||
| 1519 | continue; | ||
| 1520 | + } | ||
| 1521 | |||
| 1522 | switch (tinfo->colnum) { | ||
| 1523 | case COLUMN_MTETRIGGERBOOLEANCOMPARISON: | ||
| 1524 | @@ -152,6 +157,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler, | ||
| 1525 | */ | ||
| 1526 | case MODE_SET_RESERVE1: | ||
| 1527 | for (request = requests; request; request = request->next) { | ||
| 1528 | + if (request->processed) | ||
| 1529 | + continue; | ||
| 1530 | + | ||
| 1531 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1532 | tinfo = netsnmp_extract_table_info(request); | ||
| 1533 | |||
| 1534 | @@ -236,6 +244,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler, | ||
| 1535 | |||
| 1536 | case MODE_SET_ACTION: | ||
| 1537 | for (request = requests; request; request = request->next) { | ||
| 1538 | + if (request->processed) | ||
| 1539 | + continue; | ||
| 1540 | + | ||
| 1541 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1542 | if (!entry) { | ||
| 1543 | /* | ||
| 1544 | @@ -256,6 +267,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler, | ||
| 1545 | * (reasonably) safe to apply them in the Commit phase | ||
| 1546 | */ | ||
| 1547 | for (request = requests; request; request = request->next) { | ||
| 1548 | + if (request->processed) | ||
| 1549 | + continue; | ||
| 1550 | + | ||
| 1551 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1552 | tinfo = netsnmp_extract_table_info(request); | ||
| 1553 | |||
| 1554 | diff --git a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c | ||
| 1555 | index 47f112c..c2c2e8e 100644 | ||
| 1556 | --- a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c | ||
| 1557 | +++ b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c | ||
| 1558 | @@ -27,6 +27,7 @@ init_mteTriggerDeltaTable(void) | ||
| 1559 | size_t mteTDeltaTable_oid_len = OID_LENGTH(mteTDeltaTable_oid); | ||
| 1560 | netsnmp_handler_registration *reg; | ||
| 1561 | netsnmp_table_registration_info *table_info; | ||
| 1562 | + int rc; | ||
| 1563 | |||
| 1564 | /* | ||
| 1565 | * Ensure the (combined) table container is available... | ||
| 1566 | @@ -61,7 +62,9 @@ init_mteTriggerDeltaTable(void) | ||
| 1567 | table_info->max_column = COLUMN_MTETRIGGERDELTADISCONTINUITYIDTYPE; | ||
| 1568 | |||
| 1569 | /* Register this using the (common) trigger_table_data container */ | ||
| 1570 | - netsnmp_tdata_register(reg, trigger_table_data, table_info); | ||
| 1571 | + rc = netsnmp_tdata_register(reg, trigger_table_data, table_info); | ||
| 1572 | + if (rc != SNMPERR_SUCCESS) | ||
| 1573 | + return; | ||
| 1574 | netsnmp_handler_owns_table_info(reg->handler->next); | ||
| 1575 | DEBUGMSGTL(("disman:event:init", "Trigger Delta Table\n")); | ||
| 1576 | } | ||
| 1577 | @@ -89,6 +92,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler, | ||
| 1578 | */ | ||
| 1579 | case MODE_GET: | ||
| 1580 | for (request = requests; request; request = request->next) { | ||
| 1581 | + if (request->processed) | ||
| 1582 | + continue; | ||
| 1583 | + | ||
| 1584 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1585 | tinfo = netsnmp_extract_table_info(request); | ||
| 1586 | |||
| 1587 | @@ -97,8 +103,10 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler, | ||
| 1588 | * rows where the mteTriggerSampleType is 'deltaValue(2)' | ||
| 1589 | * So skip entries where this isn't the case. | ||
| 1590 | */ | ||
| 1591 | - if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA )) | ||
| 1592 | + if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA )) { | ||
| 1593 | + netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE); | ||
| 1594 | continue; | ||
| 1595 | + } | ||
| 1596 | |||
| 1597 | switch (tinfo->colnum) { | ||
| 1598 | case COLUMN_MTETRIGGERDELTADISCONTINUITYID: | ||
| 1599 | @@ -125,6 +133,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler, | ||
| 1600 | */ | ||
| 1601 | case MODE_SET_RESERVE1: | ||
| 1602 | for (request = requests; request; request = request->next) { | ||
| 1603 | + if (request->processed) | ||
| 1604 | + continue; | ||
| 1605 | + | ||
| 1606 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1607 | tinfo = netsnmp_extract_table_info(request); | ||
| 1608 | |||
| 1609 | @@ -199,6 +210,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler, | ||
| 1610 | |||
| 1611 | case MODE_SET_ACTION: | ||
| 1612 | for (request = requests; request; request = request->next) { | ||
| 1613 | + if (request->processed) | ||
| 1614 | + continue; | ||
| 1615 | + | ||
| 1616 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1617 | if (!entry) { | ||
| 1618 | /* | ||
| 1619 | @@ -219,6 +233,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler, | ||
| 1620 | * (reasonably) safe to apply them in the Commit phase | ||
| 1621 | */ | ||
| 1622 | for (request = requests; request; request = request->next) { | ||
| 1623 | + if (request->processed) | ||
| 1624 | + continue; | ||
| 1625 | + | ||
| 1626 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1627 | tinfo = netsnmp_extract_table_info(request); | ||
| 1628 | |||
| 1629 | diff --git a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c | ||
| 1630 | index ce1299f..22b683e 100644 | ||
| 1631 | --- a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c | ||
| 1632 | +++ b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c | ||
| 1633 | @@ -27,6 +27,7 @@ init_mteTriggerExistenceTable(void) | ||
| 1634 | static oid mteTExistTable_oid[] = { 1, 3, 6, 1, 2, 1, 88, 1, 2, 4 }; | ||
| 1635 | size_t mteTExistTable_oid_len = OID_LENGTH(mteTExistTable_oid); | ||
| 1636 | netsnmp_handler_registration *reg; | ||
| 1637 | + int rc; | ||
| 1638 | |||
| 1639 | /* | ||
| 1640 | * Ensure the (combined) table container is available... | ||
| 1641 | @@ -61,7 +62,10 @@ init_mteTriggerExistenceTable(void) | ||
| 1642 | table_info->max_column = COLUMN_MTETRIGGEREXISTENCEEVENT; | ||
| 1643 | |||
| 1644 | /* Register this using the (common) trigger_table_data container */ | ||
| 1645 | - netsnmp_tdata_register(reg, trigger_table_data, table_info); | ||
| 1646 | + rc = netsnmp_tdata_register(reg, trigger_table_data, table_info); | ||
| 1647 | + if (rc != SNMPERR_SUCCESS) | ||
| 1648 | + return; | ||
| 1649 | + | ||
| 1650 | netsnmp_handler_owns_table_info(reg->handler->next); | ||
| 1651 | DEBUGMSGTL(("disman:event:init", "Trigger Exist Table\n")); | ||
| 1652 | } | ||
| 1653 | @@ -89,6 +93,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler, | ||
| 1654 | */ | ||
| 1655 | case MODE_GET: | ||
| 1656 | for (request = requests; request; request = request->next) { | ||
| 1657 | + if (request->processed) | ||
| 1658 | + continue; | ||
| 1659 | + | ||
| 1660 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1661 | tinfo = netsnmp_extract_table_info(request); | ||
| 1662 | |||
| 1663 | @@ -97,8 +104,10 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler, | ||
| 1664 | * rows where the mteTriggerTest 'existence(0)' bit is set. | ||
| 1665 | * So skip entries where this isn't the case. | ||
| 1666 | */ | ||
| 1667 | - if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE )) | ||
| 1668 | + if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE )) { | ||
| 1669 | + netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE); | ||
| 1670 | continue; | ||
| 1671 | + } | ||
| 1672 | |||
| 1673 | switch (tinfo->colnum) { | ||
| 1674 | case COLUMN_MTETRIGGEREXISTENCETEST: | ||
| 1675 | @@ -139,6 +148,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler, | ||
| 1676 | */ | ||
| 1677 | case MODE_SET_RESERVE1: | ||
| 1678 | for (request = requests; request; request = request->next) { | ||
| 1679 | + if (request->processed) | ||
| 1680 | + continue; | ||
| 1681 | + | ||
| 1682 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1683 | tinfo = netsnmp_extract_table_info(request); | ||
| 1684 | |||
| 1685 | @@ -212,6 +224,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler, | ||
| 1686 | |||
| 1687 | case MODE_SET_ACTION: | ||
| 1688 | for (request = requests; request; request = request->next) { | ||
| 1689 | + if (request->processed) | ||
| 1690 | + continue; | ||
| 1691 | + | ||
| 1692 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1693 | if (!entry) { | ||
| 1694 | /* | ||
| 1695 | @@ -233,6 +248,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler, | ||
| 1696 | * (reasonably) safe to apply them in the Commit phase | ||
| 1697 | */ | ||
| 1698 | for (request = requests; request; request = request->next) { | ||
| 1699 | + if (request->processed) | ||
| 1700 | + continue; | ||
| 1701 | + | ||
| 1702 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1703 | tinfo = netsnmp_extract_table_info(request); | ||
| 1704 | |||
| 1705 | diff --git a/agent/mibgroup/disman/event/mteTriggerTable.c b/agent/mibgroup/disman/event/mteTriggerTable.c | ||
| 1706 | index d738ab5..88c2f8b 100644 | ||
| 1707 | --- a/agent/mibgroup/disman/event/mteTriggerTable.c | ||
| 1708 | +++ b/agent/mibgroup/disman/event/mteTriggerTable.c | ||
| 1709 | @@ -109,6 +109,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1710 | */ | ||
| 1711 | case MODE_GET: | ||
| 1712 | for (request = requests; request; request = request->next) { | ||
| 1713 | + if (request->processed) | ||
| 1714 | + continue; | ||
| 1715 | + | ||
| 1716 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1717 | tinfo = netsnmp_extract_table_info(request); | ||
| 1718 | |||
| 1719 | @@ -186,6 +189,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1720 | */ | ||
| 1721 | case MODE_SET_RESERVE1: | ||
| 1722 | for (request = requests; request; request = request->next) { | ||
| 1723 | + if (request->processed) | ||
| 1724 | + continue; | ||
| 1725 | + | ||
| 1726 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1727 | tinfo = netsnmp_extract_table_info(request); | ||
| 1728 | |||
| 1729 | @@ -292,6 +298,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1730 | |||
| 1731 | case MODE_SET_RESERVE2: | ||
| 1732 | for (request = requests; request; request = request->next) { | ||
| 1733 | + if (request->processed) | ||
| 1734 | + continue; | ||
| 1735 | + | ||
| 1736 | tinfo = netsnmp_extract_table_info(request); | ||
| 1737 | |||
| 1738 | switch (tinfo->colnum) { | ||
| 1739 | @@ -324,6 +333,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1740 | |||
| 1741 | case MODE_SET_FREE: | ||
| 1742 | for (request = requests; request; request = request->next) { | ||
| 1743 | + if (request->processed) | ||
| 1744 | + continue; | ||
| 1745 | + | ||
| 1746 | tinfo = netsnmp_extract_table_info(request); | ||
| 1747 | |||
| 1748 | switch (tinfo->colnum) { | ||
| 1749 | @@ -349,6 +361,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1750 | |||
| 1751 | case MODE_SET_ACTION: | ||
| 1752 | for (request = requests; request; request = request->next) { | ||
| 1753 | + if (request->processed) | ||
| 1754 | + continue; | ||
| 1755 | + | ||
| 1756 | tinfo = netsnmp_extract_table_info(request); | ||
| 1757 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1758 | if (!entry) { | ||
| 1759 | @@ -373,6 +388,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler, | ||
| 1760 | * (reasonably) safe to apply them in the Commit phase | ||
| 1761 | */ | ||
| 1762 | for (request = requests; request; request = request->next) { | ||
| 1763 | + if (request->processed) | ||
| 1764 | + continue; | ||
| 1765 | + | ||
| 1766 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1767 | tinfo = netsnmp_extract_table_info(request); | ||
| 1768 | |||
| 1769 | diff --git a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c | ||
| 1770 | index 37d35e0..5aed0c8 100644 | ||
| 1771 | --- a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c | ||
| 1772 | +++ b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c | ||
| 1773 | @@ -97,6 +97,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler, | ||
| 1774 | */ | ||
| 1775 | case MODE_GET: | ||
| 1776 | for (request = requests; request; request = request->next) { | ||
| 1777 | + if (request->processed) | ||
| 1778 | + continue; | ||
| 1779 | + | ||
| 1780 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1781 | tinfo = netsnmp_extract_table_info(request); | ||
| 1782 | |||
| 1783 | @@ -105,8 +108,10 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler, | ||
| 1784 | * rows where the mteTriggerTest 'threshold(2)' bit is set. | ||
| 1785 | * So skip entries where this isn't the case. | ||
| 1786 | */ | ||
| 1787 | - if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD )) | ||
| 1788 | + if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD )) { | ||
| 1789 | + netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE); | ||
| 1790 | continue; | ||
| 1791 | + } | ||
| 1792 | |||
| 1793 | switch (tinfo->colnum) { | ||
| 1794 | case COLUMN_MTETRIGGERTHRESHOLDSTARTUP: | ||
| 1795 | @@ -189,6 +194,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler, | ||
| 1796 | */ | ||
| 1797 | case MODE_SET_RESERVE1: | ||
| 1798 | for (request = requests; request; request = request->next) { | ||
| 1799 | + if (request->processed) | ||
| 1800 | + continue; | ||
| 1801 | + | ||
| 1802 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1803 | tinfo = netsnmp_extract_table_info(request); | ||
| 1804 | |||
| 1805 | @@ -276,6 +284,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler, | ||
| 1806 | |||
| 1807 | case MODE_SET_ACTION: | ||
| 1808 | for (request = requests; request; request = request->next) { | ||
| 1809 | + if (request->processed) | ||
| 1810 | + continue; | ||
| 1811 | + | ||
| 1812 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1813 | if (!entry) { | ||
| 1814 | /* | ||
| 1815 | @@ -296,6 +307,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler, | ||
| 1816 | * (reasonably) safe to apply them in the Commit phase | ||
| 1817 | */ | ||
| 1818 | for (request = requests; request; request = request->next) { | ||
| 1819 | + if (request->processed) | ||
| 1820 | + continue; | ||
| 1821 | + | ||
| 1822 | entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request); | ||
| 1823 | tinfo = netsnmp_extract_table_info(request); | ||
| 1824 | |||
| 1825 | diff --git a/agent/mibgroup/disman/expr/expErrorTable.c b/agent/mibgroup/disman/expr/expErrorTable.c | ||
| 1826 | index 6640a41..a759e2d 100644 | ||
| 1827 | --- a/agent/mibgroup/disman/expr/expErrorTable.c | ||
| 1828 | +++ b/agent/mibgroup/disman/expr/expErrorTable.c | ||
| 1829 | @@ -77,6 +77,9 @@ expErrorTable_handler(netsnmp_mib_handler *handler, | ||
| 1830 | */ | ||
| 1831 | case MODE_GET: | ||
| 1832 | for (request = requests; request; request = request->next) { | ||
| 1833 | + if (request->processed) | ||
| 1834 | + continue; | ||
| 1835 | + | ||
| 1836 | entry = (struct expExpression *) | ||
| 1837 | netsnmp_tdata_extract_entry(request); | ||
| 1838 | tinfo = netsnmp_extract_table_info(request); | ||
| 1839 | diff --git a/agent/mibgroup/disman/expr/expExpressionTable.c b/agent/mibgroup/disman/expr/expExpressionTable.c | ||
| 1840 | index ced9e0c..79aa715 100644 | ||
| 1841 | --- a/agent/mibgroup/disman/expr/expExpressionTable.c | ||
| 1842 | +++ b/agent/mibgroup/disman/expr/expExpressionTable.c | ||
| 1843 | @@ -88,6 +88,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1844 | */ | ||
| 1845 | case MODE_GET: | ||
| 1846 | for (request = requests; request; request = request->next) { | ||
| 1847 | + if (request->processed) | ||
| 1848 | + continue; | ||
| 1849 | + | ||
| 1850 | entry = (struct expExpression *) | ||
| 1851 | netsnmp_tdata_extract_entry(request); | ||
| 1852 | tinfo = netsnmp_extract_table_info(request); | ||
| 1853 | @@ -150,6 +153,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1854 | */ | ||
| 1855 | case MODE_SET_RESERVE1: | ||
| 1856 | for (request = requests; request; request = request->next) { | ||
| 1857 | + if (request->processed) | ||
| 1858 | + continue; | ||
| 1859 | + | ||
| 1860 | entry = (struct expExpression *) | ||
| 1861 | netsnmp_tdata_extract_entry(request); | ||
| 1862 | tinfo = netsnmp_extract_table_info(request); | ||
| 1863 | @@ -204,6 +210,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1864 | |||
| 1865 | case MODE_SET_RESERVE2: | ||
| 1866 | for (request = requests; request; request = request->next) { | ||
| 1867 | + if (request->processed) | ||
| 1868 | + continue; | ||
| 1869 | + | ||
| 1870 | tinfo = netsnmp_extract_table_info(request); | ||
| 1871 | |||
| 1872 | switch (tinfo->colnum) { | ||
| 1873 | @@ -236,6 +245,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1874 | |||
| 1875 | case MODE_SET_FREE: | ||
| 1876 | for (request = requests; request; request = request->next) { | ||
| 1877 | + if (request->processed) | ||
| 1878 | + continue; | ||
| 1879 | + | ||
| 1880 | tinfo = netsnmp_extract_table_info(request); | ||
| 1881 | |||
| 1882 | switch (tinfo->colnum) { | ||
| 1883 | @@ -261,6 +273,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1884 | |||
| 1885 | case MODE_SET_ACTION: | ||
| 1886 | for (request = requests; request; request = request->next) { | ||
| 1887 | + if (request->processed) | ||
| 1888 | + continue; | ||
| 1889 | + | ||
| 1890 | tinfo = netsnmp_extract_table_info(request); | ||
| 1891 | entry = (struct expExpression *) | ||
| 1892 | netsnmp_tdata_extract_entry(request); | ||
| 1893 | @@ -286,6 +301,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler, | ||
| 1894 | * (reasonably) safe to apply them in the Commit phase | ||
| 1895 | */ | ||
| 1896 | for (request = requests; request; request = request->next) { | ||
| 1897 | + if (request->processed) | ||
| 1898 | + continue; | ||
| 1899 | + | ||
| 1900 | entry = (struct expExpression *) | ||
| 1901 | netsnmp_tdata_extract_entry(request); | ||
| 1902 | tinfo = netsnmp_extract_table_info(request); | ||
| 1903 | diff --git a/agent/mibgroup/disman/expr/expObject.c b/agent/mibgroup/disman/expr/expObject.c | ||
| 1904 | index 28fbac6..c27437b 100644 | ||
| 1905 | --- a/agent/mibgroup/disman/expr/expObject.c | ||
| 1906 | +++ b/agent/mibgroup/disman/expr/expObject.c | ||
| 1907 | @@ -240,7 +240,6 @@ void | ||
| 1908 | expObject_getData( struct expExpression *expr, struct expObject *obj ) | ||
| 1909 | { | ||
| 1910 | netsnmp_variable_list *var; | ||
| 1911 | - int res; | ||
| 1912 | |||
| 1913 | /* | ||
| 1914 | * Retrieve and store the basic object value(s) | ||
| 1915 | @@ -279,7 +278,7 @@ expObject_getData( struct expExpression *expr, struct expObject *obj ) | ||
| 1916 | expr->expPrefix_len, | ||
| 1917 | expr->pvars ); | ||
| 1918 | } | ||
| 1919 | - res = netsnmp_query_get( var, expr->session ); | ||
| 1920 | + netsnmp_query_get( var, expr->session ); | ||
| 1921 | } | ||
| 1922 | |||
| 1923 | if ( obj->expObjectSampleType != EXPSAMPLETYPE_ABSOLUTE ) { | ||
| 1924 | @@ -312,7 +311,7 @@ expObject_getData( struct expExpression *expr, struct expObject *obj ) | ||
| 1925 | else | ||
| 1926 | var = _expObject_buildList( obj->expObjDeltaD, | ||
| 1927 | obj->expObjDeltaD_len, 0, NULL ); | ||
| 1928 | - res = netsnmp_query_get( var, expr->session ); | ||
| 1929 | + netsnmp_query_get( var, expr->session ); | ||
| 1930 | if ( obj->old_dvars ) | ||
| 1931 | snmp_free_varbind( obj->old_dvars ); | ||
| 1932 | obj->old_dvars = obj->dvars; | ||
| 1933 | @@ -338,7 +337,7 @@ expObject_getData( struct expExpression *expr, struct expObject *obj ) | ||
| 1934 | * | ||
| 1935 | * (The MIB description seems bogus?) | ||
| 1936 | */ | ||
| 1937 | - res = netsnmp_query_get( var, expr->session ); | ||
| 1938 | + netsnmp_query_get( var, expr->session ); | ||
| 1939 | if ( obj->cvars ) | ||
| 1940 | snmp_free_varbind( obj->cvars ); | ||
| 1941 | obj->cvars = var; | ||
| 1942 | diff --git a/agent/mibgroup/disman/expr/expObjectTable.c b/agent/mibgroup/disman/expr/expObjectTable.c | ||
| 1943 | index 4182b3e..adda438 100644 | ||
| 1944 | --- a/agent/mibgroup/disman/expr/expObjectTable.c | ||
| 1945 | +++ b/agent/mibgroup/disman/expr/expObjectTable.c | ||
| 1946 | @@ -90,6 +90,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1947 | */ | ||
| 1948 | case MODE_GET: | ||
| 1949 | for (request = requests; request; request = request->next) { | ||
| 1950 | + if (request->processed) | ||
| 1951 | + continue; | ||
| 1952 | + | ||
| 1953 | entry = (struct expObject *)netsnmp_tdata_extract_entry(request); | ||
| 1954 | tinfo = netsnmp_extract_table_info(request); | ||
| 1955 | if (!entry || !(entry->flags & EXP_OBJ_FLAG_VALID)) | ||
| 1956 | @@ -159,6 +162,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1957 | */ | ||
| 1958 | case MODE_SET_RESERVE1: | ||
| 1959 | for (request = requests; request; request = request->next) { | ||
| 1960 | + if (request->processed) | ||
| 1961 | + continue; | ||
| 1962 | + | ||
| 1963 | entry = (struct expObject *) | ||
| 1964 | netsnmp_tdata_extract_entry(request); | ||
| 1965 | tinfo = netsnmp_extract_table_info(request); | ||
| 1966 | @@ -211,6 +217,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1967 | |||
| 1968 | case MODE_SET_RESERVE2: | ||
| 1969 | for (request = requests; request; request = request->next) { | ||
| 1970 | + if (request->processed) | ||
| 1971 | + continue; | ||
| 1972 | + | ||
| 1973 | tinfo = netsnmp_extract_table_info(request); | ||
| 1974 | |||
| 1975 | switch (tinfo->colnum) { | ||
| 1976 | @@ -245,6 +254,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1977 | |||
| 1978 | case MODE_SET_FREE: | ||
| 1979 | for (request = requests; request; request = request->next) { | ||
| 1980 | + if (request->processed) | ||
| 1981 | + continue; | ||
| 1982 | + | ||
| 1983 | tinfo = netsnmp_extract_table_info(request); | ||
| 1984 | |||
| 1985 | switch (tinfo->colnum) { | ||
| 1986 | @@ -270,6 +282,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1987 | |||
| 1988 | case MODE_SET_ACTION: | ||
| 1989 | for (request = requests; request; request = request->next) { | ||
| 1990 | + if (request->processed) | ||
| 1991 | + continue; | ||
| 1992 | + | ||
| 1993 | tinfo = netsnmp_extract_table_info(request); | ||
| 1994 | entry = (struct expObject *) | ||
| 1995 | netsnmp_tdata_extract_entry(request); | ||
| 1996 | @@ -296,6 +311,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler, | ||
| 1997 | */ | ||
| 1998 | ret = 0; /* Flag to re-check expExpressionPrefix settings */ | ||
| 1999 | for (request = requests; request; request = request->next) { | ||
| 2000 | + if (request->processed) | ||
| 2001 | + continue; | ||
| 2002 | + | ||
| 2003 | entry = (struct expObject *) netsnmp_tdata_extract_entry(request); | ||
| 2004 | tinfo = netsnmp_extract_table_info(request); | ||
| 2005 | |||
| 2006 | diff --git a/agent/mibgroup/disman/expr/expValueTable.c b/agent/mibgroup/disman/expr/expValueTable.c | ||
| 2007 | index eac5faa..d74dbd1 100644 | ||
| 2008 | --- a/agent/mibgroup/disman/expr/expValueTable.c | ||
| 2009 | +++ b/agent/mibgroup/disman/expr/expValueTable.c | ||
| 2010 | @@ -124,7 +124,7 @@ NEXT_EXP: | ||
| 2011 | } | ||
| 2012 | if ( vp->val.objid[0] != 0 ) { | ||
| 2013 | DEBUGMSGTL(( "disman:expr:val", | ||
| 2014 | - "non-zero instance (%d)\n", vp->val.objid[0])); | ||
| 2015 | + "non-zero instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0])); | ||
| 2016 | return NULL; /* Invalid instance */ | ||
| 2017 | } | ||
| 2018 | |||
| 2019 | @@ -158,7 +158,7 @@ NEXT_EXP: | ||
| 2020 | */ | ||
| 2021 | if ( vp->val_len > 0 && vp->val.objid[0] != 0 ) { | ||
| 2022 | DEBUGMSGTL(( "disman:expr:val", | ||
| 2023 | - "non-zero next instance (%d)\n", vp->val.objid[0])); | ||
| 2024 | + "non-zero next instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0])); | ||
| 2025 | return NULL; /* All valid instances start with .0 */ | ||
| 2026 | } | ||
| 2027 | plen = exp->expPrefix_len; | ||
| 2028 | @@ -231,6 +231,8 @@ NEXT_EXP: | ||
| 2029 | len = vp2->name_length - exp->expPrefix_len; | ||
| 2030 | snmp_set_var_typed_value( vp, ASN_PRIV_IMPLIED_OBJECT_ID, | ||
| 2031 | (u_char*)(vp2->name+exp->expPrefix_len), len); | ||
| 2032 | + } else { | ||
| 2033 | + len = 1; | ||
| 2034 | } | ||
| 2035 | res = expValue_evaluateExpression( exp, vp->val.objid+1, len-1); | ||
| 2036 | DEBUGMSGTL(( "disman:expr:val", "w/card next returned (%p)\n", res)); | ||
| 2037 | diff --git a/agent/mibgroup/disman/expression/expValueTable.c b/agent/mibgroup/disman/expression/expValueTable.c | ||
| 2038 | index feace8c..6b315c6 100644 | ||
| 2039 | --- a/agent/mibgroup/disman/expression/expValueTable.c | ||
| 2040 | +++ b/agent/mibgroup/disman/expression/expValueTable.c | ||
| 2041 | @@ -133,7 +133,7 @@ init_expValueTable(void) | ||
| 2042 | * Initialize a "session" that defines who we're going to talk to | ||
| 2043 | */ | ||
| 2044 | snmp_sess_init(&session); /* set up defaults */ | ||
| 2045 | - session.peername = "localhost"; | ||
| 2046 | + session.peername = strdup("localhost"); | ||
| 2047 | |||
| 2048 | DEBUGMSGTL(("expValueTable", "done.\n")); | ||
| 2049 | } | ||
| 2050 | @@ -272,8 +272,7 @@ Evaluate_Expression(struct expValueTable_data *vtable_data) | ||
| 2051 | break; | ||
| 2052 | } | ||
| 2053 | } | ||
| 2054 | - strncpy(temp, expression + 1, j - 1); | ||
| 2055 | - *(temp + j - 1) = '\0'; | ||
| 2056 | + sprintf(temp, "%.*s", j - 1, expression + 1); | ||
| 2057 | l = atoi(temp); | ||
| 2058 | expression = expression + j; | ||
| 2059 | /* | ||
| 2060 | @@ -434,24 +433,12 @@ expValueTable_clean(void *data) | ||
| 2061 | void | ||
| 2062 | build_valuetable(void) | ||
| 2063 | { | ||
| 2064 | - struct expExpressionTable_data *expstorage, *expfound; | ||
| 2065 | + struct expExpressionTable_data *expstorage; | ||
| 2066 | struct expObjectTable_data *objstorage, *objfound = NULL; | ||
| 2067 | struct header_complex_index *hcindex, *object_hcindex; | ||
| 2068 | char *expression; | ||
| 2069 | - size_t expression_len; | ||
| 2070 | oid *index; | ||
| 2071 | - | ||
| 2072 | - | ||
| 2073 | - char *result, *resultbak; | ||
| 2074 | - char *temp, *tempbak; | ||
| 2075 | int i = 0, j, l; | ||
| 2076 | - temp = malloc(100); | ||
| 2077 | - result = malloc(100); | ||
| 2078 | - tempbak = temp; | ||
| 2079 | - memset(result, 0, 100); | ||
| 2080 | - *result = '\0'; | ||
| 2081 | - resultbak = result; | ||
| 2082 | - | ||
| 2083 | |||
| 2084 | DEBUGMSGTL(("expValueTable", "building valuetable... \n")); | ||
| 2085 | |||
| 2086 | @@ -460,7 +447,6 @@ build_valuetable(void) | ||
| 2087 | expstorage = (struct expExpressionTable_data *) hcindex->data; | ||
| 2088 | if (expstorage->expExpressionEntryStatus == RS_ACTIVE) { | ||
| 2089 | expression = expstorage->expExpression; | ||
| 2090 | - expression_len = expstorage->expExpressionLen; | ||
| 2091 | while (*expression != '\0') { | ||
| 2092 | if (*expression == '$') { | ||
| 2093 | i++; | ||
| 2094 | @@ -475,9 +461,12 @@ build_valuetable(void) | ||
| 2095 | break; | ||
| 2096 | } | ||
| 2097 | } | ||
| 2098 | - strncpy(temp, expression + 1, j - 1); | ||
| 2099 | - *(temp + j - 1) = '\0'; | ||
| 2100 | - l = atoi(temp); | ||
| 2101 | + { | ||
| 2102 | + char temp[100]; | ||
| 2103 | + | ||
| 2104 | + sprintf(temp, "%.*s", j - 1, expression + 1); | ||
| 2105 | + l = atoi(temp); | ||
| 2106 | + } | ||
| 2107 | for (object_hcindex = expObjectTableStorage; | ||
| 2108 | object_hcindex != NULL; | ||
| 2109 | object_hcindex = object_hcindex->next) { | ||
| 2110 | @@ -495,7 +484,6 @@ build_valuetable(void) | ||
| 2111 | expstorage->expExpressionNameLen) | ||
| 2112 | && (l == objstorage->expObjectIndex)) { | ||
| 2113 | if (objfound == NULL) { | ||
| 2114 | - expfound = expstorage; | ||
| 2115 | objfound = objstorage; | ||
| 2116 | } | ||
| 2117 | if (objstorage->expObjectIDWildcard == | ||
| 2118 | diff --git a/agent/mibgroup/disman/ping/pingCtlTable.c b/agent/mibgroup/disman/ping/pingCtlTable.c | ||
| 2119 | index a4fd3a8..a5036e2 100644 | ||
| 2120 | --- a/agent/mibgroup/disman/ping/pingCtlTable.c | ||
| 2121 | +++ b/agent/mibgroup/disman/ping/pingCtlTable.c | ||
| 2122 | @@ -340,12 +340,11 @@ pingProbeHistoryTable_addall(struct pingCtlTable_data *thedata) | ||
| 2123 | void | ||
| 2124 | pingCtlTable_cleaner(struct header_complex_index *thestuff) | ||
| 2125 | { | ||
| 2126 | - struct header_complex_index *hciptr = NULL; | ||
| 2127 | - struct pingCtlTable_data *StorageDel = NULL; | ||
| 2128 | + struct header_complex_index *hciptr; | ||
| 2129 | + | ||
| 2130 | DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout ")); | ||
| 2131 | for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) { | ||
| 2132 | - StorageDel = | ||
| 2133 | - header_complex_extract_entry(&pingCtlTableStorage, hciptr); | ||
| 2134 | + header_complex_extract_entry(&pingCtlTableStorage, hciptr); | ||
| 2135 | DEBUGMSGTL(("pingProbeHistoryTable", "cleaner ")); | ||
| 2136 | } | ||
| 2137 | } | ||
| 2138 | @@ -864,7 +863,6 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata) | ||
| 2139 | { | ||
| 2140 | struct header_complex_index *hciptr2 = NULL; | ||
| 2141 | struct header_complex_index *hcilast = NULL; | ||
| 2142 | - struct pingProbeHistoryTable_data *StorageDel = NULL; | ||
| 2143 | struct pingProbeHistoryTable_data *StorageTmp = NULL; | ||
| 2144 | netsnmp_variable_list *vars = NULL; | ||
| 2145 | oid newoid[MAX_OID_LEN]; | ||
| 2146 | @@ -895,9 +893,7 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata) | ||
| 2147 | |||
| 2148 | } | ||
| 2149 | } | ||
| 2150 | - StorageDel = | ||
| 2151 | - header_complex_extract_entry(&pingProbeHistoryTableStorage, | ||
| 2152 | - hcilast); | ||
| 2153 | + header_complex_extract_entry(&pingProbeHistoryTableStorage, hcilast); | ||
| 2154 | DEBUGMSGTL(("pingProbeHistoryTable", | ||
| 2155 | "delete the last one success!\n")); | ||
| 2156 | } | ||
| 2157 | @@ -1231,7 +1227,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen, | ||
| 2158 | unsigned long *minrtt, unsigned long *maxrtt, | ||
| 2159 | unsigned long *averagertt, pid_t pid) | ||
| 2160 | { | ||
| 2161 | - int size; | ||
| 2162 | char recvbuf[BUFSIZE]; | ||
| 2163 | char sendbuf[BUFSIZE]; | ||
| 2164 | int nsent = 1; | ||
| 2165 | @@ -1257,8 +1252,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen, | ||
| 2166 | } | ||
| 2167 | setuid(getuid()); /* don't need special permissions any more */ | ||
| 2168 | |||
| 2169 | - size = 60 * 1024; /* OK if setsockopt fails */ | ||
| 2170 | - | ||
| 2171 | tv.tv_sec = 5; | ||
| 2172 | tv.tv_usec = 0; | ||
| 2173 | setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); | ||
| 2174 | @@ -1266,11 +1259,13 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen, | ||
| 2175 | for (current_probe_temp = 1; | ||
| 2176 | current_probe_temp <= item->pingCtlProbeCount; | ||
| 2177 | current_probe_temp++) { | ||
| 2178 | + time_t timep; | ||
| 2179 | (*pr->fsend) (datalen, pid, nsent, sockfd, sendbuf); | ||
| 2180 | nsent++; | ||
| 2181 | len = pr->salen; | ||
| 2182 | if (readable_timeo(sockfd, item->pingCtlTimeOut) == 0) { | ||
| 2183 | /* printf("socket timeout!\n"); */ | ||
| 2184 | + n = -1; | ||
| 2185 | fail_probe = fail_probe + 1; | ||
| 2186 | flag = 1; | ||
| 2187 | } else { | ||
| 2188 | @@ -1282,18 +1277,17 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen, | ||
| 2189 | |||
| 2190 | gettimeofday(&tval, NULL); | ||
| 2191 | |||
| 2192 | - time_t timep; | ||
| 2193 | time(&timep); | ||
| 2194 | |||
| 2195 | (*pr->fproc) (recvbuf, n, &tval, timep, item, ai, datalen, minrtt, | ||
| 2196 | maxrtt, sumrtt, averagertt, current_probe_temp, | ||
| 2197 | success_probe, fail_probe, flag, ¤t_var, pid); | ||
| 2198 | - printf("receiver success!\n"); | ||
| 2199 | if (current_probe_temp >= item->pingCtlProbeCount) { | ||
| 2200 | SNMP_FREE(sumrtt); | ||
| 2201 | return; | ||
| 2202 | } | ||
| 2203 | } | ||
| 2204 | + close(sockfd); | ||
| 2205 | } | ||
| 2206 | |||
| 2207 | unsigned long | ||
| 2208 | @@ -1599,7 +1593,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf) | ||
| 2209 | { | ||
| 2210 | int len; | ||
| 2211 | struct icmp *icmp = NULL; | ||
| 2212 | - struct timeval *temp = NULL; | ||
| 2213 | |||
| 2214 | icmp = (struct icmp *) sendbuf; | ||
| 2215 | icmp->icmp_type = ICMP_ECHO; | ||
| 2216 | @@ -1607,7 +1600,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf) | ||
| 2217 | icmp->icmp_id = pid; | ||
| 2218 | icmp->icmp_seq = nsent; | ||
| 2219 | gettimeofday((struct timeval *) icmp->icmp_data, NULL); | ||
| 2220 | - temp = (struct timeval *) icmp->icmp_data; | ||
| 2221 | |||
| 2222 | len = 8 + datalen; /* checksum ICMP header and data */ | ||
| 2223 | icmp->icmp_cksum = 0; | ||
| 2224 | @@ -1773,7 +1765,7 @@ run_ping(unsigned int clientreg, void *clientarg) | ||
| 2225 | if (device) { | ||
| 2226 | struct ifreq ifr; | ||
| 2227 | memset(&ifr, 0, sizeof(ifr)); | ||
| 2228 | - strncpy(ifr.ifr_name, device, IFNAMSIZ - 1); | ||
| 2229 | + strlcpy(ifr.ifr_name, device, IFNAMSIZ); | ||
| 2230 | if (setsockopt | ||
| 2231 | (probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, | ||
| 2232 | strlen(device) + 1) == -1) { | ||
| 2233 | @@ -1936,6 +1928,7 @@ run_ping(unsigned int clientreg, void *clientarg) | ||
| 2234 | (char *) outpack, &ident, &start_time, &screen_width, | ||
| 2235 | &deadline); | ||
| 2236 | |||
| 2237 | + close(icmp_sock); | ||
| 2238 | } | ||
| 2239 | return; | ||
| 2240 | } | ||
| 2241 | @@ -2705,8 +2698,7 @@ write_pingCtlAdminStatus(int action, | ||
| 2242 | snmp_alarm_register(StorageTmp->pingCtlFrequency, | ||
| 2243 | SA_REPEAT, run_ping, StorageTmp); | ||
| 2244 | else | ||
| 2245 | - StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL, | ||
| 2246 | - run_ping, | ||
| 2247 | + StorageTmp->timer_id = snmp_alarm_register(1, 0, run_ping, | ||
| 2248 | StorageTmp); | ||
| 2249 | |||
| 2250 | } else if (StorageTmp->pingCtlAdminStatus == 2 | ||
| 2251 | @@ -4367,8 +4359,7 @@ write_pingCtlRowStatus(int action, | ||
| 2252 | StorageTmp); | ||
| 2253 | else | ||
| 2254 | StorageTmp->timer_id = | ||
| 2255 | - snmp_alarm_register(1, (int) NULL, run_ping, | ||
| 2256 | - StorageTmp); | ||
| 2257 | + snmp_alarm_register(1, 0, run_ping, StorageTmp); | ||
| 2258 | |||
| 2259 | } | ||
| 2260 | |||
| 2261 | @@ -4451,7 +4442,9 @@ int | ||
| 2262 | __schedule_exit(int next, long *nreceived, long *tmax) | ||
| 2263 | { | ||
| 2264 | unsigned long waittime; | ||
| 2265 | +#if 0 | ||
| 2266 | struct itimerval it; | ||
| 2267 | +#endif | ||
| 2268 | |||
| 2269 | if (*nreceived) { | ||
| 2270 | waittime = 2 * (*tmax); | ||
| 2271 | @@ -4463,11 +4456,13 @@ __schedule_exit(int next, long *nreceived, long *tmax) | ||
| 2272 | if (next < 0 || next < waittime / 1000) | ||
| 2273 | next = waittime / 1000; | ||
| 2274 | |||
| 2275 | +#if 0 | ||
| 2276 | it.it_interval.tv_sec = 0; | ||
| 2277 | it.it_interval.tv_usec = 0; | ||
| 2278 | it.it_value.tv_sec = waittime / 1000000; | ||
| 2279 | it.it_value.tv_usec = waittime % 1000000; | ||
| 2280 | - /* setitimer(ITIMER_REAL, &it, NULL); */ | ||
| 2281 | + setitimer(ITIMER_REAL, &it, NULL); | ||
| 2282 | +#endif | ||
| 2283 | return next; | ||
| 2284 | } | ||
| 2285 | |||
| 2286 | @@ -4741,6 +4736,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload, | ||
| 2287 | |||
| 2288 | gettimeofday(start_time, NULL); | ||
| 2289 | |||
| 2290 | +#if 0 | ||
| 2291 | if (*deadline) { | ||
| 2292 | struct itimerval it; | ||
| 2293 | |||
| 2294 | @@ -4749,6 +4745,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload, | ||
| 2295 | it.it_value.tv_sec = (*deadline); | ||
| 2296 | it.it_value.tv_usec = 0; | ||
| 2297 | } | ||
| 2298 | +#endif | ||
| 2299 | |||
| 2300 | if (isatty(STDOUT_FILENO)) { | ||
| 2301 | struct winsize w; | ||
| 2302 | diff --git a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c | ||
| 2303 | index de398a8..78c75be 100644 | ||
| 2304 | --- a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c | ||
| 2305 | +++ b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c | ||
| 2306 | @@ -74,12 +74,10 @@ void | ||
| 2307 | pingProbeHistoryTable_cleaner(struct header_complex_index *thestuff) | ||
| 2308 | { | ||
| 2309 | struct header_complex_index *hciptr = NULL; | ||
| 2310 | - struct pingProbeHistoryTable_data *StorageDel = NULL; | ||
| 2311 | + | ||
| 2312 | DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout ")); | ||
| 2313 | for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) { | ||
| 2314 | - StorageDel = | ||
| 2315 | - header_complex_extract_entry(&pingProbeHistoryTableStorage, | ||
| 2316 | - hciptr); | ||
| 2317 | + header_complex_extract_entry(&pingProbeHistoryTableStorage, hciptr); | ||
| 2318 | DEBUGMSGTL(("pingProbeHistoryTable", "cleaner ")); | ||
| 2319 | } | ||
| 2320 | |||
| 2321 | diff --git a/agent/mibgroup/disman/ping/pingResultsTable.c b/agent/mibgroup/disman/ping/pingResultsTable.c | ||
| 2322 | index bc4a9f4..1445d86 100644 | ||
| 2323 | --- a/agent/mibgroup/disman/ping/pingResultsTable.c | ||
| 2324 | +++ b/agent/mibgroup/disman/ping/pingResultsTable.c | ||
| 2325 | @@ -86,12 +86,11 @@ pingResultsTable_inadd(struct pingResultsTable_data *thedata); | ||
| 2326 | void | ||
| 2327 | pingResultsTable_cleaner(struct header_complex_index *thestuff) | ||
| 2328 | { | ||
| 2329 | - struct header_complex_index *hciptr = NULL; | ||
| 2330 | - struct pingResultsTable_data *StorageDel = NULL; | ||
| 2331 | + struct header_complex_index *hciptr; | ||
| 2332 | + | ||
| 2333 | DEBUGMSGTL(("pingResultsTable", "cleanerout ")); | ||
| 2334 | for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) { | ||
| 2335 | - StorageDel = | ||
| 2336 | - header_complex_extract_entry(&pingResultsTableStorage, hciptr); | ||
| 2337 | + header_complex_extract_entry(&pingResultsTableStorage, hciptr); | ||
| 2338 | DEBUGMSGTL(("pingResultsTable", "cleaner ")); | ||
| 2339 | } | ||
| 2340 | |||
| 2341 | diff --git a/agent/mibgroup/disman/schedule/schedCore.h b/agent/mibgroup/disman/schedule/schedCore.h | ||
| 2342 | index 4436711..35866d7 100644 | ||
| 2343 | --- a/agent/mibgroup/disman/schedule/schedCore.h | ||
| 2344 | +++ b/agent/mibgroup/disman/schedule/schedCore.h | ||
| 2345 | @@ -44,7 +44,7 @@ struct schedTable_entry { | ||
| 2346 | char schedDay[4+4]; | ||
| 2347 | char schedHour[3]; | ||
| 2348 | char schedMinute[8]; | ||
| 2349 | - char schedContextName[SCHED_STR1_LEN]; | ||
| 2350 | + char schedContextName[SCHED_STR1_LEN+1]; | ||
| 2351 | oid schedVariable[ MAX_OID_LEN ]; | ||
| 2352 | size_t schedVariable_len; | ||
| 2353 | long schedValue; | ||
| 2354 | diff --git a/agent/mibgroup/disman/schedule/schedTable.c b/agent/mibgroup/disman/schedule/schedTable.c | ||
| 2355 | index 943e545..bba48fd 100644 | ||
| 2356 | --- a/agent/mibgroup/disman/schedule/schedTable.c | ||
| 2357 | +++ b/agent/mibgroup/disman/schedule/schedTable.c | ||
| 2358 | @@ -98,6 +98,9 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2359 | */ | ||
| 2360 | case MODE_GET: | ||
| 2361 | for (request = requests; request; request = request->next) { | ||
| 2362 | + if (request->processed) | ||
| 2363 | + continue; | ||
| 2364 | + | ||
| 2365 | entry = (struct schedTable_entry *) | ||
| 2366 | netsnmp_tdata_extract_entry(request); | ||
| 2367 | tinfo = netsnmp_extract_table_info( request); | ||
| 2368 | @@ -210,6 +213,9 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2369 | */ | ||
| 2370 | case MODE_SET_RESERVE1: | ||
| 2371 | for (request = requests; request; request = request->next) { | ||
| 2372 | + if (request->processed) | ||
| 2373 | + continue; | ||
| 2374 | + | ||
| 2375 | entry = (struct schedTable_entry *) | ||
| 2376 | netsnmp_tdata_extract_entry(request); | ||
| 2377 | tinfo = netsnmp_extract_table_info( request); | ||
| 2378 | @@ -340,6 +346,9 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2379 | |||
| 2380 | case MODE_SET_RESERVE2: | ||
| 2381 | for (request = requests; request; request = request->next) { | ||
| 2382 | + if (request->processed) | ||
| 2383 | + continue; | ||
| 2384 | + | ||
| 2385 | tinfo = netsnmp_extract_table_info(request); | ||
| 2386 | |||
| 2387 | switch (tinfo->colnum) { | ||
| 2388 | @@ -370,6 +379,9 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2389 | |||
| 2390 | case MODE_SET_FREE: | ||
| 2391 | for (request = requests; request; request = request->next) { | ||
| 2392 | + if (request->processed) | ||
| 2393 | + continue; | ||
| 2394 | + | ||
| 2395 | tinfo = netsnmp_extract_table_info(request); | ||
| 2396 | |||
| 2397 | switch (tinfo->colnum) { | ||
| 2398 | @@ -417,7 +429,11 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2399 | * All these assignments are "unfailable", so it's | ||
| 2400 | * (reasonably) safe to apply them in the Commit phase | ||
| 2401 | */ | ||
| 2402 | + entry = NULL; | ||
| 2403 | for (request = requests; request; request = request->next) { | ||
| 2404 | + if (request->processed) | ||
| 2405 | + continue; | ||
| 2406 | + | ||
| 2407 | entry = (struct schedTable_entry *) | ||
| 2408 | netsnmp_tdata_extract_entry(request); | ||
| 2409 | tinfo = netsnmp_extract_table_info( request); | ||
| 2410 | @@ -460,7 +476,7 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2411 | recalculate = 1; | ||
| 2412 | break; | ||
| 2413 | case COLUMN_SCHEDCONTEXTNAME: | ||
| 2414 | - memset(entry->schedContextName, 0, SCHED_STR1_LEN+1); | ||
| 2415 | + memset(entry->schedContextName, 0, sizeof(entry->schedContextName)); | ||
| 2416 | memcpy(entry->schedContextName, | ||
| 2417 | request->requestvb->val.string, | ||
| 2418 | request->requestvb->val_len); | ||
| 2419 | @@ -514,8 +530,10 @@ schedTable_handler(netsnmp_mib_handler *handler, | ||
| 2420 | break; | ||
| 2421 | } | ||
| 2422 | } | ||
| 2423 | - if (recalculate) | ||
| 2424 | + if (recalculate) { | ||
| 2425 | + netsnmp_assert(entry); | ||
| 2426 | sched_nextTime(entry); | ||
| 2427 | + } | ||
| 2428 | break; | ||
| 2429 | } | ||
| 2430 | return SNMP_ERR_NOERROR; | ||
| 2431 | diff --git a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c | ||
| 2432 | index 23ac029..04143eb 100644 | ||
| 2433 | --- a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c | ||
| 2434 | +++ b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c | ||
| 2435 | @@ -713,7 +713,6 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data | ||
| 2436 | { | ||
| 2437 | struct header_complex_index *hciptr2 = NULL; | ||
| 2438 | struct header_complex_index *hcilast = NULL; | ||
| 2439 | - struct traceRouteProbeHistoryTable_data *StorageDel = NULL; | ||
| 2440 | struct traceRouteProbeHistoryTable_data *StorageTmp = NULL; | ||
| 2441 | netsnmp_variable_list *vars = NULL; | ||
| 2442 | oid newoid[MAX_OID_LEN]; | ||
| 2443 | @@ -745,9 +744,7 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data | ||
| 2444 | |||
| 2445 | } | ||
| 2446 | } | ||
| 2447 | - StorageDel = | ||
| 2448 | - header_complex_extract_entry(&traceRouteProbeHistoryTableStorage, | ||
| 2449 | - hcilast); | ||
| 2450 | + header_complex_extract_entry(&traceRouteProbeHistoryTableStorage, hcilast); | ||
| 2451 | DEBUGMSGTL(("traceRouteProbeHistoryTable", | ||
| 2452 | "delete the last one success!\n")); | ||
| 2453 | vars = NULL; | ||
| 2454 | @@ -1353,7 +1350,6 @@ int | ||
| 2455 | traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2456 | { | ||
| 2457 | struct header_complex_index *hciptr2 = NULL; | ||
| 2458 | - struct traceRouteResultsTable_data *StorageDel = NULL; | ||
| 2459 | netsnmp_variable_list *vars = NULL; | ||
| 2460 | oid newoid[MAX_OID_LEN]; | ||
| 2461 | size_t newoid_len = 0; | ||
| 2462 | @@ -1368,9 +1364,8 @@ traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2463 | hciptr2 = hciptr2->next) { | ||
| 2464 | if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len) | ||
| 2465 | == 0) { | ||
| 2466 | - StorageDel = | ||
| 2467 | - header_complex_extract_entry | ||
| 2468 | - (&traceRouteResultsTableStorage, hciptr2); | ||
| 2469 | + header_complex_extract_entry(&traceRouteResultsTableStorage, | ||
| 2470 | + hciptr2); | ||
| 2471 | DEBUGMSGTL(("traceRouteResultsTable", "delete success!\n")); | ||
| 2472 | |||
| 2473 | } | ||
| 2474 | @@ -1386,7 +1381,6 @@ int | ||
| 2475 | traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2476 | { | ||
| 2477 | struct header_complex_index *hciptr2 = NULL; | ||
| 2478 | - struct traceRouteProbeHistoryTable_data *StorageDel = NULL; | ||
| 2479 | netsnmp_variable_list *vars = NULL; | ||
| 2480 | oid newoid[MAX_OID_LEN]; | ||
| 2481 | size_t newoid_len = 0; | ||
| 2482 | @@ -1402,9 +1396,8 @@ traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2483 | hciptr2 = hciptr2->next) { | ||
| 2484 | if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len) | ||
| 2485 | == 0) { | ||
| 2486 | - StorageDel = | ||
| 2487 | - header_complex_extract_entry | ||
| 2488 | - (&traceRouteProbeHistoryTableStorage, hciptr2); | ||
| 2489 | + header_complex_extract_entry(&traceRouteProbeHistoryTableStorage, | ||
| 2490 | + hciptr2); | ||
| 2491 | DEBUGMSGTL(("traceRouteProbeHistoryTable", | ||
| 2492 | "delete success!\n")); | ||
| 2493 | |||
| 2494 | @@ -1419,7 +1412,6 @@ int | ||
| 2495 | traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2496 | { | ||
| 2497 | struct header_complex_index *hciptr2 = NULL; | ||
| 2498 | - struct traceRouteHopsTable_data *StorageDel = NULL; | ||
| 2499 | netsnmp_variable_list *vars = NULL; | ||
| 2500 | oid newoid[MAX_OID_LEN]; | ||
| 2501 | size_t newoid_len = 0; | ||
| 2502 | @@ -1435,9 +1427,7 @@ traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata) | ||
| 2503 | hciptr2 = hciptr2->next) { | ||
| 2504 | if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len) | ||
| 2505 | == 0) { | ||
| 2506 | - StorageDel = | ||
| 2507 | - header_complex_extract_entry(&traceRouteHopsTableStorage, | ||
| 2508 | - hciptr2); | ||
| 2509 | + header_complex_extract_entry(&traceRouteHopsTableStorage, hciptr2); | ||
| 2510 | DEBUGMSGTL(("traceRouteHopsTable", "delete success!\n")); | ||
| 2511 | |||
| 2512 | } | ||
| 2513 | @@ -3210,8 +3200,7 @@ write_traceRouteCtlAdminStatus(int action, | ||
| 2514 | SA_REPEAT, run_traceRoute, | ||
| 2515 | StorageTmp); | ||
| 2516 | else | ||
| 2517 | - StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL, | ||
| 2518 | - run_traceRoute, | ||
| 2519 | + StorageTmp->timer_id = snmp_alarm_register(1, 0, run_traceRoute, | ||
| 2520 | StorageTmp); | ||
| 2521 | |||
| 2522 | } else if (StorageTmp->traceRouteCtlAdminStatus == 2 | ||
| 2523 | @@ -4041,8 +4030,7 @@ write_traceRouteCtlRowStatus(int action, | ||
| 2524 | StorageTmp); | ||
| 2525 | else | ||
| 2526 | StorageTmp->timer_id = | ||
| 2527 | - snmp_alarm_register(1, (int) NULL, run_traceRoute, | ||
| 2528 | - StorageTmp); | ||
| 2529 | + snmp_alarm_register(1, 0, run_traceRoute, StorageTmp); | ||
| 2530 | |||
| 2531 | } | ||
| 2532 | |||
| 2533 | @@ -4924,6 +4912,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg) | ||
| 2534 | |||
| 2535 | } | ||
| 2536 | |||
| 2537 | + close(sndsock); | ||
| 2538 | + | ||
| 2539 | if (flag == 1) { | ||
| 2540 | DEBUGMSGTL(("traceRouteProbeHistoryTable", "path changed!\n")); | ||
| 2541 | send_traceRoute_trap(item, traceRoutePathChange, | ||
| 2542 | @@ -5556,6 +5546,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg) | ||
| 2543 | |||
| 2544 | } | ||
| 2545 | |||
| 2546 | + close(sndsock); | ||
| 2547 | + | ||
| 2548 | if (flag == 1) { | ||
| 2549 | printf("path changed!\n"); | ||
| 2550 | send_traceRoute_trap(item, traceRoutePathChange, | ||
| 2551 | @@ -6105,7 +6097,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) | ||
| 2552 | #ifdef HAVE_SOCKADDR_SA_LEN | ||
| 2553 | register int n; | ||
| 2554 | #endif | ||
| 2555 | - register struct ifreq *ifrp, *ifend, *ifnext, *mp; | ||
| 2556 | + register struct ifreq *ifrp, *ifend, *ifnext; | ||
| 2557 | register struct sockaddr_in *sin; | ||
| 2558 | register struct ifaddrlist *al; | ||
| 2559 | struct ifconf ifc; | ||
| 2560 | @@ -6137,7 +6129,6 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) | ||
| 2561 | ifend = (struct ifreq *) ((char *) ibuf + ifc.ifc_len); | ||
| 2562 | |||
| 2563 | al = ifaddrlist; | ||
| 2564 | - mp = NULL; | ||
| 2565 | nipaddr = 0; | ||
| 2566 | for (; ifrp < ifend; ifrp = ifnext) { | ||
| 2567 | #ifdef HAVE_SOCKADDR_SA_LEN | ||
| 2568 | @@ -6157,7 +6148,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) | ||
| 2569 | * SIOCGIFFLAGS stomps over it because the requests | ||
| 2570 | * are returned in a union.) | ||
| 2571 | */ | ||
| 2572 | - strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); | ||
| 2573 | + strlcpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); | ||
| 2574 | if (ioctl(fd, SIOCGIFFLAGS, (char *) &ifr) < 0) { | ||
| 2575 | if (errno == ENXIO) | ||
| 2576 | continue; | ||
| 2577 | @@ -6174,9 +6165,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf) | ||
| 2578 | if ((ifr.ifr_flags & IFF_UP) == 0) | ||
| 2579 | continue; | ||
| 2580 | |||
| 2581 | - | ||
| 2582 | - (void) strncpy(device, ifr.ifr_name, sizeof(ifr.ifr_name)); | ||
| 2583 | - device[sizeof(device) - 1] = '\0'; | ||
| 2584 | + sprintf(device, "%.*s", (int) sizeof(ifr.ifr_name), ifr.ifr_name); | ||
| 2585 | #ifdef sun | ||
| 2586 | /* | ||
| 2587 | * Ignore sun virtual interfaces | ||
| 2588 | diff --git a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c | ||
| 2589 | index efb1b54..00f4bc3 100644 | ||
| 2590 | --- a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c | ||
| 2591 | +++ b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c | ||
| 2592 | @@ -47,8 +47,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval) | ||
| 2593 | *retval = -2; | ||
| 2594 | return NULL; | ||
| 2595 | } | ||
| 2596 | - memset (list_head, 0, sizeof (struct ifname)); | ||
| 2597 | - strncpy (list_head->name, p->ifa_name, IF_NAMESIZE); | ||
| 2598 | + memset(list_head, 0, sizeof (struct ifname)); | ||
| 2599 | + strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE); | ||
| 2600 | continue; | ||
| 2601 | } | ||
| 2602 | |||
| 2603 | @@ -69,8 +69,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval) | ||
| 2604 | return NULL; | ||
| 2605 | } | ||
| 2606 | nameptr2 = nameptr2->ifn_next; | ||
| 2607 | - memset (nameptr2, 0, sizeof (struct ifname)); | ||
| 2608 | - strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE); | ||
| 2609 | + memset(nameptr2, 0, sizeof (struct ifname)); | ||
| 2610 | + strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE); | ||
| 2611 | continue; | ||
| 2612 | |||
| 2613 | } | ||
| 2614 | @@ -655,7 +655,7 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co | ||
| 2615 | "called\n")); | ||
| 2616 | |||
| 2617 | memset(&ifr, 0, sizeof(ifr)); | ||
| 2618 | - strcpy(ifr.ifr_name, name); | ||
| 2619 | + strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); | ||
| 2620 | |||
| 2621 | memset(&driver_info, 0, sizeof (driver_info)); | ||
| 2622 | driver_info.cmd = ETHTOOL_GDRVINFO; | ||
| 2623 | @@ -730,8 +730,8 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co | ||
| 2624 | for (i = 0; i < nstats; i++) { | ||
| 2625 | char s[ETH_GSTRING_LEN]; | ||
| 2626 | |||
| 2627 | - strncpy(s, (const char *) ð_strings->data[i * ETH_GSTRING_LEN], | ||
| 2628 | - ETH_GSTRING_LEN); | ||
| 2629 | + strlcpy(s, (const char *) ð_strings->data[i * ETH_GSTRING_LEN], | ||
| 2630 | + sizeof(s)); | ||
| 2631 | |||
| 2632 | if (DOT3STATSALIGNMENTERRORS(s)) { | ||
| 2633 | data->dot3StatsAlignmentErrors = (u_long)eth_stats->data[i]; | ||
| 2634 | @@ -911,8 +911,7 @@ _dot3Stats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name) | ||
| 2635 | } | ||
| 2636 | } | ||
| 2637 | |||
| 2638 | - strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 2639 | - ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0; | ||
| 2640 | + strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 2641 | rc = ioctl(fd, which, ifrq); | ||
| 2642 | if (rc < 0) { | ||
| 2643 | DEBUGMSGTL(("access:dot3StatsTable:ioctl", | ||
| 2644 | diff --git a/agent/mibgroup/examples/example.c b/agent/mibgroup/examples/example.c | ||
| 2645 | index 8f27ead..50b7e7d 100644 | ||
| 2646 | --- a/agent/mibgroup/examples/example.c | ||
| 2647 | +++ b/agent/mibgroup/examples/example.c | ||
| 2648 | @@ -163,7 +163,7 @@ init_example(void) | ||
| 2649 | * Also set a default value for the string object. Note that the | ||
| 2650 | * example integer variable was initialised above. | ||
| 2651 | */ | ||
| 2652 | - strncpy(example_str, EXAMPLE_STR_DEFAULT, EXAMPLE_STR_LEN); | ||
| 2653 | + strlcpy(example_str, EXAMPLE_STR_DEFAULT, sizeof(example_str)); | ||
| 2654 | |||
| 2655 | snmpd_register_config_handler("exampleint", | ||
| 2656 | example_parse_config_exampleint, | ||
| 2657 | @@ -209,7 +209,7 @@ example_parse_config_examplestr(const char *token, char *cptr) | ||
| 2658 | /* | ||
| 2659 | * Make sure the string fits in the space allocated for it. | ||
| 2660 | */ | ||
| 2661 | - if (strlen(cptr) < EXAMPLE_STR_LEN) | ||
| 2662 | + if (strlen(cptr) < sizeof(example_str)) | ||
| 2663 | strcpy(example_str, cptr); | ||
| 2664 | else { | ||
| 2665 | /* | ||
| 2666 | @@ -217,10 +217,8 @@ example_parse_config_examplestr(const char *token, char *cptr) | ||
| 2667 | * An alternative approach would be to log an error, | ||
| 2668 | * and discard this value altogether. | ||
| 2669 | */ | ||
| 2670 | - strncpy(example_str, cptr, EXAMPLE_STR_LEN - 4); | ||
| 2671 | - example_str[EXAMPLE_STR_LEN - 4] = 0; | ||
| 2672 | - strcat(example_str, "..."); | ||
| 2673 | - example_str[EXAMPLE_STR_LEN - 1] = 0; | ||
| 2674 | + sprintf(example_str, "%.*s...", (int) (sizeof(example_str) - 4), cptr); | ||
| 2675 | + netsnmp_assert(strlen(example_str) < sizeof(example_str)); | ||
| 2676 | } | ||
| 2677 | } | ||
| 2678 | |||
| 2679 | diff --git a/agent/mibgroup/examples/netSnmpHostsTable_access.c b/agent/mibgroup/examples/netSnmpHostsTable_access.c | ||
| 2680 | index f6f933a..3d2e5fb 100644 | ||
| 2681 | --- a/agent/mibgroup/examples/netSnmpHostsTable_access.c | ||
| 2682 | +++ b/agent/mibgroup/examples/netSnmpHostsTable_access.c | ||
| 2683 | @@ -177,10 +177,11 @@ void * | ||
| 2684 | netSnmpHostsTable_create_data_context(netsnmp_variable_list * index_data) | ||
| 2685 | { | ||
| 2686 | my_data_info *datactx = SNMP_MALLOC_TYPEDEF(my_data_info); | ||
| 2687 | + | ||
| 2688 | if (!datactx) | ||
| 2689 | return NULL; | ||
| 2690 | - strncpy(datactx->hostname, index_data->val.string, | ||
| 2691 | - strlen(index_data->val.string)); | ||
| 2692 | + strlcpy(datactx->hostname, (const char *) index_data->val.string, | ||
| 2693 | + sizeof(datactx->hostname)); | ||
| 2694 | return datactx; | ||
| 2695 | } | ||
| 2696 | |||
| 2697 | diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c | ||
| 2698 | index df47ca4..25a7330 100644 | ||
| 2699 | --- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c | ||
| 2700 | +++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c | ||
| 2701 | @@ -34,9 +34,6 @@ int | ||
| 2702 | check_netSnmpHostAddressType(int type, long *val, size_t val_len, | ||
| 2703 | long *old_val, size_t old_val_len) | ||
| 2704 | { | ||
| 2705 | - | ||
| 2706 | - int ret; | ||
| 2707 | - | ||
| 2708 | /** Check to see that we were called legally */ | ||
| 2709 | if (!val) | ||
| 2710 | return SNMP_ERR_GENERR; | ||
| 2711 | @@ -59,8 +56,6 @@ check_netSnmpHostAddressType(int type, long *val, size_t val_len, | ||
| 2712 | default: | ||
| 2713 | return SNMP_ERR_INCONSISTENTVALUE; | ||
| 2714 | } | ||
| 2715 | - ret = SNMP_ERR_NOERROR; | ||
| 2716 | - | ||
| 2717 | |||
| 2718 | /** looks ok, call the local version of the same function. */ | ||
| 2719 | return check_netSnmpHostAddressType_local(type, val, val_len, old_val, | ||
| 2720 | @@ -79,9 +74,6 @@ int | ||
| 2721 | check_netSnmpHostAddress(int type, char *val, size_t val_len, | ||
| 2722 | char *old_val, size_t old_val_len) | ||
| 2723 | { | ||
| 2724 | - | ||
| 2725 | - int ret; | ||
| 2726 | - | ||
| 2727 | /** Check to see that we were called legally */ | ||
| 2728 | if (!val) | ||
| 2729 | return SNMP_ERR_GENERR; | ||
| 2730 | @@ -91,11 +83,8 @@ check_netSnmpHostAddress(int type, char *val, size_t val_len, | ||
| 2731 | return SNMP_ERR_WRONGTYPE; | ||
| 2732 | |||
| 2733 | /** Check the ranges of the passed value for legality */ | ||
| 2734 | - if (!(val_len >= 0 && val_len <= 255) | ||
| 2735 | - ) { | ||
| 2736 | + if (!(val_len >= 0 && val_len <= 255)) | ||
| 2737 | return SNMP_ERR_WRONGVALUE; | ||
| 2738 | - } | ||
| 2739 | - | ||
| 2740 | |||
| 2741 | /** looks ok, call the local version of the same function. */ | ||
| 2742 | return check_netSnmpHostAddress_local(type, val, val_len, old_val, | ||
| 2743 | @@ -138,11 +127,10 @@ check_netSnmpHostStorage(int type, long *val, size_t val_len, | ||
| 2744 | default: | ||
| 2745 | return SNMP_ERR_INCONSISTENTVALUE; | ||
| 2746 | } | ||
| 2747 | - ret = SNMP_ERR_NOERROR; | ||
| 2748 | |||
| 2749 | - if (ret = | ||
| 2750 | - check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE, | ||
| 2751 | - *val)) | ||
| 2752 | + ret = check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE, | ||
| 2753 | + *val); | ||
| 2754 | + if (ret) | ||
| 2755 | return ret; | ||
| 2756 | |||
| 2757 | /** looks ok, call the local version of the same function. */ | ||
| 2758 | @@ -187,11 +175,10 @@ check_netSnmpHostRowStatus(int type, long *val, size_t val_len, | ||
| 2759 | default: | ||
| 2760 | return SNMP_ERR_INCONSISTENTVALUE; | ||
| 2761 | } | ||
| 2762 | - ret = SNMP_ERR_NOERROR; | ||
| 2763 | |||
| 2764 | - if (ret = | ||
| 2765 | - check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT, | ||
| 2766 | - *val)) | ||
| 2767 | + ret = check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT, | ||
| 2768 | + *val); | ||
| 2769 | + if (ret) | ||
| 2770 | return ret; | ||
| 2771 | |||
| 2772 | /** looks ok, call the local version of the same function. */ | ||
| 2773 | diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h | ||
| 2774 | index 335a0ae..6cd44c9 100644 | ||
| 2775 | --- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h | ||
| 2776 | +++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h | ||
| 2777 | @@ -3,8 +3,8 @@ | ||
| 2778 | * : : mib2c.check_values_local.conf,v 5.1 2003/05/30 23:53:15 hardaker Exp $ | ||
| 2779 | * | ||
| 2780 | */ | ||
| 2781 | -#ifndef NETSNMPHOSTSTABLE_CHECKFNS_H | ||
| 2782 | -#define NETSNMPHOSTSTABLE_CHECKFNS_H | ||
| 2783 | +#ifndef NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H | ||
| 2784 | +#define NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H | ||
| 2785 | |||
| 2786 | /* | ||
| 2787 | * these functions are designed to check incoming values for | ||
| 2788 | @@ -18,19 +18,32 @@ | ||
| 2789 | #ifdef __cplusplus | ||
| 2790 | extern "C" { | ||
| 2791 | #endif | ||
| 2792 | +#if 0 | ||
| 2793 | +} | ||
| 2794 | +#endif | ||
| 2795 | |||
| 2796 | -int check_(int type, long *val, size_t val_len, long *old_val, | ||
| 2797 | - size_t old_val_len); | ||
| 2798 | -int check_(int type, char *val, size_t val_len, char *old_val, | ||
| 2799 | - size_t old_val_len); | ||
| 2800 | -int check_(int type, long *val, size_t val_len, long *old_val, | ||
| 2801 | - size_t old_val_len); | ||
| 2802 | -int check_(int type, long *val, size_t val_len, long *old_val, | ||
| 2803 | - size_t old_val_len); | ||
| 2804 | - | ||
| 2805 | +int check_netSnmpHostAddressType_local(int type, long *val, | ||
| 2806 | + size_t val_len, | ||
| 2807 | + long *old_val, | ||
| 2808 | + size_t old_val_len); | ||
| 2809 | +int check_netSnmpHostAddress_local(int type, char *val, | ||
| 2810 | + size_t val_len, | ||
| 2811 | + char *old_val, | ||
| 2812 | + size_t old_val_len); | ||
| 2813 | +int check_netSnmpHostStorage_local(int type, long *val, | ||
| 2814 | + size_t val_len, | ||
| 2815 | + long *old_val, | ||
| 2816 | + size_t old_val_len); | ||
| 2817 | +int check_netSnmpHostRowStatus_local(int type, long *val, | ||
| 2818 | + size_t val_len, | ||
| 2819 | + long *old_val, | ||
| 2820 | + size_t old_val_len); | ||
| 2821 | |||
| 2822 | +#if 0 | ||
| 2823 | +{ | ||
| 2824 | +#endif | ||
| 2825 | #ifdef __cplusplus | ||
| 2826 | } | ||
| 2827 | #endif | ||
| 2828 | |||
| 2829 | -#endif /* NETSNMPHOSTSTABLE_CHECKFNS_H */ | ||
| 2830 | +#endif /* NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H */ | ||
| 2831 | diff --git a/agent/mibgroup/examples/ucdDemoPublic.c b/agent/mibgroup/examples/ucdDemoPublic.c | ||
| 2832 | index e935216..8e9e66a 100644 | ||
| 2833 | --- a/agent/mibgroup/examples/ucdDemoPublic.c | ||
| 2834 | +++ b/agent/mibgroup/examples/ucdDemoPublic.c | ||
| 2835 | @@ -25,6 +25,7 @@ | ||
| 2836 | |||
| 2837 | #include <net-snmp/net-snmp-includes.h> | ||
| 2838 | #include <net-snmp/agent/net-snmp-agent-includes.h> | ||
| 2839 | +#include <net-snmp/library/tools.h> | ||
| 2840 | |||
| 2841 | #include "util_funcs/header_generic.h" | ||
| 2842 | #include "ucdDemoPublic.h" | ||
| 2843 | @@ -213,16 +214,9 @@ write_ucdDemoPublicString(int action, | ||
| 2844 | return SNMP_ERR_WRONGLENGTH; | ||
| 2845 | } | ||
| 2846 | if (action == COMMIT) { | ||
| 2847 | - if (var_val_len != 0) { | ||
| 2848 | - strncpy((char*)publicString, (const char*)var_val, sizeof(publicString)-1); | ||
| 2849 | - /* some sanity checks */ | ||
| 2850 | - if (strlen((const char*)var_val) > sizeof(publicString)-1 || | ||
| 2851 | - strlen((const char*)var_val) != var_val_len) | ||
| 2852 | - publicString[sizeof(publicString)-1] = '\0'; | ||
| 2853 | - else | ||
| 2854 | - publicString[var_val_len] = '\0'; | ||
| 2855 | - } else | ||
| 2856 | - publicString[0] = '\0'; | ||
| 2857 | + sprintf((char*) publicString, "%.*s", | ||
| 2858 | + (int) SNMP_MIN(sizeof(publicString) - 1, var_val_len), | ||
| 2859 | + (const char*) var_val); | ||
| 2860 | } | ||
| 2861 | return SNMP_ERR_NOERROR; | ||
| 2862 | } | ||
| 2863 | diff --git a/agent/mibgroup/hardware/cpu/cpu.c b/agent/mibgroup/hardware/cpu/cpu.c | ||
| 2864 | index 3a0a5d4..2772001 100644 | ||
| 2865 | --- a/agent/mibgroup/hardware/cpu/cpu.c | ||
| 2866 | +++ b/agent/mibgroup/hardware/cpu/cpu.c | ||
| 2867 | @@ -142,6 +142,12 @@ netsnmp_cpu_info *netsnmp_cpu_get_byName( char *name, int create ) { | ||
| 2868 | cpu = SNMP_MALLOC_TYPEDEF( netsnmp_cpu_info ); | ||
| 2869 | if (!cpu) | ||
| 2870 | return NULL; | ||
| 2871 | + if (strlen(name) >= sizeof(cpu->name)) { | ||
| 2872 | + free(cpu); | ||
| 2873 | + snmp_log(LOG_ERR, "Name of CPU is too large: %s\n", name); | ||
| 2874 | + return NULL; | ||
| 2875 | + } | ||
| 2876 | + | ||
| 2877 | strcpy(cpu->name, name); | ||
| 2878 | if ( _cpu_tail ) { | ||
| 2879 | cpu->idx = _cpu_tail->idx+1; | ||
| 2880 | diff --git a/agent/mibgroup/hardware/cpu/cpu_kerndata.c b/agent/mibgroup/hardware/cpu/cpu_kerndata.c | ||
| 2881 | index 9a9c4a4..8a7f2b2 100644 | ||
| 2882 | --- a/agent/mibgroup/hardware/cpu/cpu_kerndata.c | ||
| 2883 | +++ b/agent/mibgroup/hardware/cpu/cpu_kerndata.c | ||
| 2884 | @@ -64,32 +64,32 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 2885 | for ( i=0; i < cpu_num; i++ ) { | ||
| 2886 | cpu2 = netsnmp_cpu_get_byIdx( i, 0 ); | ||
| 2887 | |||
| 2888 | - cpu2->user_ticks = (unsigned long)vminfo[i].v_time[V_CPU_USER]; | ||
| 2889 | - cpu2->idle_ticks = (unsigned long)vminfo[i].v_time[V_CPU_IDLE]; | ||
| 2890 | - cpu2->kern_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]; | ||
| 2891 | - cpu2->wait_ticks = (unsigned long)vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2892 | - cpu2->sys2_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+ | ||
| 2893 | + cpu2->user_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_USER]; | ||
| 2894 | + cpu2->idle_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_IDLE]; | ||
| 2895 | + cpu2->kern_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]; | ||
| 2896 | + cpu2->wait_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2897 | + cpu2->sys2_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+ | ||
| 2898 | vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2899 | /* nice_ticks, intrpt_ticks, sirq_ticks unused */ | ||
| 2900 | |||
| 2901 | /* sum these for the overall stats */ | ||
| 2902 | - cpu->user_ticks += (unsigned long)vminfo[i].v_time[V_CPU_USER]; | ||
| 2903 | - cpu->idle_ticks += (unsigned long)vminfo[i].v_time[V_CPU_IDLE]; | ||
| 2904 | - cpu->kern_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]; | ||
| 2905 | - cpu->wait_ticks += (unsigned long)vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2906 | - cpu->sys2_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+ | ||
| 2907 | + cpu->user_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_USER]; | ||
| 2908 | + cpu->idle_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_IDLE]; | ||
| 2909 | + cpu->kern_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]; | ||
| 2910 | + cpu->wait_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2911 | + cpu->sys2_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+ | ||
| 2912 | vminfo[i].v_time[V_CPU_STREAM]; | ||
| 2913 | |||
| 2914 | /* | ||
| 2915 | * Interrupt/Context Switch statistics | ||
| 2916 | * XXX - Do these really belong here ? | ||
| 2917 | */ | ||
| 2918 | - cpu->swapIn += (unsigned long)vminfo[i].v_swpin; | ||
| 2919 | - cpu->swapOut += (unsigned long)vminfo[i].v_swpout; | ||
| 2920 | - cpu->pageIn += (unsigned long)vminfo[i].v_phread; | ||
| 2921 | - cpu->pageOut += (unsigned long)vminfo[i].v_phwrite; | ||
| 2922 | - cpu->nInterrupts += (unsigned long)vminfo[i].v_intr; | ||
| 2923 | - cpu->nCtxSwitches += (unsigned long)vminfo[i].v_swtch; | ||
| 2924 | + cpu->swapIn += (unsigned long long)vminfo[i].v_swpin; | ||
| 2925 | + cpu->swapOut += (unsigned long long)vminfo[i].v_swpout; | ||
| 2926 | + cpu->pageIn += (unsigned long long)vminfo[i].v_phread; | ||
| 2927 | + cpu->pageOut += (unsigned long long)vminfo[i].v_phwrite; | ||
| 2928 | + cpu->nInterrupts += (unsigned long long)vminfo[i].v_intr; | ||
| 2929 | + cpu->nCtxSwitches += (unsigned long long)vminfo[i].v_swtch; | ||
| 2930 | } | ||
| 2931 | return 0; | ||
| 2932 | } | ||
| 2933 | diff --git a/agent/mibgroup/hardware/cpu/cpu_kstat.c b/agent/mibgroup/hardware/cpu/cpu_kstat.c | ||
| 2934 | index 32ccb00..049864c 100644 | ||
| 2935 | --- a/agent/mibgroup/hardware/cpu/cpu_kstat.c | ||
| 2936 | +++ b/agent/mibgroup/hardware/cpu/cpu_kstat.c | ||
| 2937 | @@ -48,16 +48,13 @@ void init_cpu_kstat( void ) { | ||
| 2938 | memset(state, 0, sizeof(state)); | ||
| 2939 | for (i=0, ks_data = ksp->ks_data; i < ksp->ks_ndata; i++, ks_data++) { | ||
| 2940 | if ( strcmp( ks_data->name, "state" ) == 0 ) { | ||
| 2941 | - strncpy( state, ks_data->value.c, sizeof(state)); | ||
| 2942 | - state[sizeof(state)-1] = '\0'; | ||
| 2943 | + strlcpy(state, ks_data->value.c, sizeof(state)); | ||
| 2944 | } else if ( strcmp( ks_data->name, "state_begin" ) == 0 ) { | ||
| 2945 | state_begin = ks_data->value.i32; | ||
| 2946 | } else if ( strcmp( ks_data->name, "cpu_type" ) == 0 ) { | ||
| 2947 | - strncpy( ctype, ks_data->value.c, sizeof(ctype)); | ||
| 2948 | - ctype[sizeof(ctype)-1] = '\0'; | ||
| 2949 | + strlcpy(ctype, ks_data->value.c, sizeof(ctype)); | ||
| 2950 | } else if ( strcmp( ks_data->name, "fpu_type" ) == 0 ) { | ||
| 2951 | - strncpy( ftype, ks_data->value.c, sizeof(ftype)); | ||
| 2952 | - ftype[sizeof(ftype)-1] = '\0'; | ||
| 2953 | + strlcpy(ftype, ks_data->value.c, sizeof(ftype)); | ||
| 2954 | } else if ( strcmp( ks_data->name, "clock_MHz" ) == 0 ) { | ||
| 2955 | clock = ks_data->value.i32; | ||
| 2956 | } | ||
| 2957 | @@ -112,30 +109,30 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 2958 | break; /* or continue ? */ | ||
| 2959 | } | ||
| 2960 | |||
| 2961 | - cpu2->user_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER]; | ||
| 2962 | - cpu2->idle_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE]; | ||
| 2963 | - cpu2->kern_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL]; | ||
| 2964 | - cpu2->wait_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT]; | ||
| 2965 | + cpu2->user_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER]; | ||
| 2966 | + cpu2->idle_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE]; | ||
| 2967 | + cpu2->kern_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL]; | ||
| 2968 | + cpu2->wait_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT]; | ||
| 2969 | /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */ | ||
| 2970 | - cpu2->sys2_ticks = (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks; | ||
| 2971 | + cpu2->sys2_ticks = (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks; | ||
| 2972 | /* nice_ticks, intrpt_ticks, sirq_ticks unused */ | ||
| 2973 | |||
| 2974 | /* sum these for the overall stats */ | ||
| 2975 | - cpu->user_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER]; | ||
| 2976 | - cpu->idle_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE]; | ||
| 2977 | - cpu->kern_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL]; | ||
| 2978 | - cpu->wait_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT]; | ||
| 2979 | + cpu->user_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER]; | ||
| 2980 | + cpu->idle_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE]; | ||
| 2981 | + cpu->kern_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL]; | ||
| 2982 | + cpu->wait_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT]; | ||
| 2983 | /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */ | ||
| 2984 | - cpu->sys2_ticks += (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks; | ||
| 2985 | + cpu->sys2_ticks += (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks; | ||
| 2986 | |||
| 2987 | /* | ||
| 2988 | * Interrupt/Context Switch statistics | ||
| 2989 | * XXX - Do these really belong here ? | ||
| 2990 | */ | ||
| 2991 | - cpu->swapIn += (unsigned long)cs.cpu_vminfo.swapin; | ||
| 2992 | - cpu->swapOut += (unsigned long)cs.cpu_vminfo.swapout; | ||
| 2993 | - cpu->nInterrupts += (unsigned long)cs.cpu_sysinfo.intr; | ||
| 2994 | - cpu->nCtxSwitches += (unsigned long)cs.cpu_sysinfo.pswitch; | ||
| 2995 | + cpu->swapIn += (unsigned long long)cs.cpu_vminfo.swapin; | ||
| 2996 | + cpu->swapOut += (unsigned long long)cs.cpu_vminfo.swapout; | ||
| 2997 | + cpu->nInterrupts += (unsigned long long)cs.cpu_sysinfo.intr; | ||
| 2998 | + cpu->nCtxSwitches += (unsigned long long)cs.cpu_sysinfo.pswitch; | ||
| 2999 | } | ||
| 3000 | } | ||
| 3001 | return 0; | ||
| 3002 | diff --git a/agent/mibgroup/hardware/cpu/cpu_linux.c b/agent/mibgroup/hardware/cpu/cpu_linux.c | ||
| 3003 | index 2edeccd..640407b 100644 | ||
| 3004 | --- a/agent/mibgroup/hardware/cpu/cpu_linux.c | ||
| 3005 | +++ b/agent/mibgroup/hardware/cpu/cpu_linux.c | ||
| 3006 | @@ -121,6 +121,10 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3007 | DEBUGMSGTL(("cpu", "/proc/stat buffer increased to %d\n", bsize)); | ||
| 3008 | close(statfd); | ||
| 3009 | statfd = open(STAT_FILE, O_RDONLY, 0); | ||
| 3010 | + if (statfd == -1) { | ||
| 3011 | + snmp_log_perror(STAT_FILE); | ||
| 3012 | + return -1; | ||
| 3013 | + } | ||
| 3014 | } | ||
| 3015 | close(statfd); | ||
| 3016 | |||
| 3017 | @@ -159,27 +163,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3018 | |||
| 3019 | /* kernel 2.6.33 and above */ | ||
| 3020 | if (num_cpuline_elem == 10) { | ||
| 3021 | - cpu->guestnice_ticks = (unsigned long)cguest_nicell; | ||
| 3022 | + cpu->guestnice_ticks = (unsigned long long)cguest_nicell; | ||
| 3023 | } | ||
| 3024 | /* kernel 2.6.24 and above */ | ||
| 3025 | if (num_cpuline_elem >= 9) { | ||
| 3026 | - cpu->guest_ticks = (unsigned long)cguestll; | ||
| 3027 | + cpu->guest_ticks = (unsigned long long)cguestll; | ||
| 3028 | } | ||
| 3029 | /* kernel 2.6.11 and above */ | ||
| 3030 | if (num_cpuline_elem >= 8) { | ||
| 3031 | - cpu->steal_ticks = (unsigned long)cstealll; | ||
| 3032 | + cpu->steal_ticks = (unsigned long long)cstealll; | ||
| 3033 | } | ||
| 3034 | /* kernel 2.6 */ | ||
| 3035 | if (num_cpuline_elem >= 5) { | ||
| 3036 | - cpu->wait_ticks = (unsigned long)ciowll; | ||
| 3037 | - cpu->intrpt_ticks = (unsigned long)cirqll; | ||
| 3038 | - cpu->sirq_ticks = (unsigned long)csoftll; | ||
| 3039 | + cpu->wait_ticks = (unsigned long long)ciowll; | ||
| 3040 | + cpu->intrpt_ticks = (unsigned long long)cirqll; | ||
| 3041 | + cpu->sirq_ticks = (unsigned long long)csoftll; | ||
| 3042 | } | ||
| 3043 | /* rest */ | ||
| 3044 | - cpu->user_ticks = (unsigned long)cusell; | ||
| 3045 | - cpu->nice_ticks = (unsigned long)cicell; | ||
| 3046 | - cpu->sys_ticks = (unsigned long)csysll; | ||
| 3047 | - cpu->idle_ticks = (unsigned long)cidell; | ||
| 3048 | + cpu->user_ticks = (unsigned long long)cusell; | ||
| 3049 | + cpu->nice_ticks = (unsigned long long)cicell; | ||
| 3050 | + cpu->sys_ticks = (unsigned long long)csysll; | ||
| 3051 | + cpu->idle_ticks = (unsigned long long)cidell; | ||
| 3052 | } | ||
| 3053 | if ( b1 == buff ) { | ||
| 3054 | if (first) | ||
| 3055 | @@ -232,6 +236,10 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3056 | vmbuff = (char*)realloc(vmbuff, vmbsize+1); | ||
| 3057 | close(vmstatfd); | ||
| 3058 | vmstatfd = open(VMSTAT_FILE, O_RDONLY, 0); | ||
| 3059 | + if (vmstatfd == -1) { | ||
| 3060 | + snmp_log_perror("cannot open " VMSTAT_FILE); | ||
| 3061 | + return; | ||
| 3062 | + } | ||
| 3063 | } | ||
| 3064 | close(vmstatfd); | ||
| 3065 | if ( bytes_read < 0 ) { | ||
| 3066 | @@ -246,7 +254,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3067 | b = strstr(vmbuff, "pgpgin "); | ||
| 3068 | if (b) { | ||
| 3069 | sscanf(b, "pgpgin %llu", &pin); | ||
| 3070 | - cpu->pageIn = (unsigned long)pin*2; /* ??? */ | ||
| 3071 | + cpu->pageIn = (unsigned long long)pin*2; /* ??? */ | ||
| 3072 | } else { | ||
| 3073 | if (first) | ||
| 3074 | snmp_log(LOG_ERR, "No pgpgin line in %s\n", VMSTAT_FILE); | ||
| 3075 | @@ -255,7 +263,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3076 | b = strstr(vmbuff, "pgpgout "); | ||
| 3077 | if (b) { | ||
| 3078 | sscanf(b, "pgpgout %llu", &pout); | ||
| 3079 | - cpu->pageOut = (unsigned long)pout*2; /* ??? */ | ||
| 3080 | + cpu->pageOut = (unsigned long long)pout*2; /* ??? */ | ||
| 3081 | } else { | ||
| 3082 | if (first) | ||
| 3083 | snmp_log(LOG_ERR, "No pgpgout line in %s\n", VMSTAT_FILE); | ||
| 3084 | @@ -264,7 +272,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3085 | b = strstr(vmbuff, "pswpin "); | ||
| 3086 | if (b) { | ||
| 3087 | sscanf(b, "pswpin %llu", &swpin); | ||
| 3088 | - cpu->swapIn = (unsigned long)swpin; | ||
| 3089 | + cpu->swapIn = (unsigned long long)swpin; | ||
| 3090 | } else { | ||
| 3091 | if (first) | ||
| 3092 | snmp_log(LOG_ERR, "No pswpin line in %s\n", VMSTAT_FILE); | ||
| 3093 | @@ -273,7 +281,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3094 | b = strstr(vmbuff, "pswpout "); | ||
| 3095 | if (b) { | ||
| 3096 | sscanf(b, "pswpout %llu", &swpout); | ||
| 3097 | - cpu->swapOut = (unsigned long)swpout; | ||
| 3098 | + cpu->swapOut = (unsigned long long)swpout; | ||
| 3099 | } else { | ||
| 3100 | if (first) | ||
| 3101 | snmp_log(LOG_ERR, "No pswpout line in %s\n", VMSTAT_FILE); | ||
| 3102 | @@ -284,8 +292,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3103 | b = strstr(buff, "page "); | ||
| 3104 | if (b) { | ||
| 3105 | sscanf(b, "page %llu %llu", &pin, &pout); | ||
| 3106 | - cpu->pageIn = (unsigned long)pin; | ||
| 3107 | - cpu->pageOut = (unsigned long)pout; | ||
| 3108 | + cpu->pageIn = (unsigned long long)pin; | ||
| 3109 | + cpu->pageOut = (unsigned long long)pout; | ||
| 3110 | } else { | ||
| 3111 | if (first) | ||
| 3112 | snmp_log(LOG_ERR, "No page line in %s\n", STAT_FILE); | ||
| 3113 | @@ -294,8 +302,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3114 | b = strstr(buff, "swap "); | ||
| 3115 | if (b) { | ||
| 3116 | sscanf(b, "swap %llu %llu", &swpin, &swpout); | ||
| 3117 | - cpu->swapIn = (unsigned long)swpin; | ||
| 3118 | - cpu->swapOut = (unsigned long)swpout; | ||
| 3119 | + cpu->swapIn = (unsigned long long)swpin; | ||
| 3120 | + cpu->swapOut = (unsigned long long)swpout; | ||
| 3121 | } else { | ||
| 3122 | if (first) | ||
| 3123 | snmp_log(LOG_ERR, "No swap line in %s\n", STAT_FILE); | ||
| 3124 | @@ -306,7 +314,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3125 | b = strstr(buff, "intr "); | ||
| 3126 | if (b) { | ||
| 3127 | sscanf(b, "intr %llu %llu", &itot, &iticks); | ||
| 3128 | - cpu->nInterrupts = (unsigned long)itot; | ||
| 3129 | + cpu->nInterrupts = (unsigned long long)itot; | ||
| 3130 | /* iticks not used? */ | ||
| 3131 | } else { | ||
| 3132 | if (first) | ||
| 3133 | @@ -315,7 +323,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) { | ||
| 3134 | b = strstr(buff, "ctxt "); | ||
| 3135 | if (b) { | ||
| 3136 | sscanf(b, "ctxt %llu", &ctx); | ||
| 3137 | - cpu->nCtxSwitches = (unsigned long)ctx; | ||
| 3138 | + cpu->nCtxSwitches = (unsigned long long)ctx; | ||
| 3139 | } else { | ||
| 3140 | if (first) | ||
| 3141 | snmp_log(LOG_ERR, "No ctxt line in %s\n", STAT_FILE); | ||
| 3142 | diff --git a/agent/mibgroup/hardware/cpu/cpu_nlist.c b/agent/mibgroup/hardware/cpu/cpu_nlist.c | ||
| 3143 | index b9554d7..974028a 100644 | ||
| 3144 | --- a/agent/mibgroup/hardware/cpu/cpu_nlist.c | ||
| 3145 | +++ b/agent/mibgroup/hardware/cpu/cpu_nlist.c | ||
| 3146 | @@ -76,12 +76,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3147 | auto_nlist( CPU_SYMBOL, (char *) cpu_stats, sizeof(cpu_stats)); | ||
| 3148 | auto_nlist( MEM_SYMBOL, (char *)&mem_stats, sizeof(mem_stats)); | ||
| 3149 | |||
| 3150 | - cpu->user_ticks = (unsigned long)cpu_stats[CP_USER]; | ||
| 3151 | - cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE]; | ||
| 3152 | - cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR]; | ||
| 3153 | - cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE]; | ||
| 3154 | - cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS]; | ||
| 3155 | - cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR]; | ||
| 3156 | + cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER]; | ||
| 3157 | + cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE]; | ||
| 3158 | + cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR]; | ||
| 3159 | + cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE]; | ||
| 3160 | + cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS]; | ||
| 3161 | + cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR]; | ||
| 3162 | /* wait_ticks, sirq_ticks unused */ | ||
| 3163 | |||
| 3164 | /* | ||
| 3165 | @@ -89,14 +89,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3166 | * XXX - Do these really belong here ? | ||
| 3167 | */ | ||
| 3168 | #if defined(openbsd2) || defined(darwin) | ||
| 3169 | - cpu->swapIn = (unsigned long)mem_stats.v_swpin; | ||
| 3170 | - cpu->swapOut = (unsigned long)mem_stats.v_swpout; | ||
| 3171 | + cpu->swapIn = (unsigned long long)mem_stats.v_swpin; | ||
| 3172 | + cpu->swapOut = (unsigned long long)mem_stats.v_swpout; | ||
| 3173 | #else | ||
| 3174 | - cpu->swapIn = (unsigned long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin; | ||
| 3175 | - cpu->swapOut = (unsigned long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout; | ||
| 3176 | + cpu->swapIn = (unsigned long long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin; | ||
| 3177 | + cpu->swapOut = (unsigned long long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout; | ||
| 3178 | #endif | ||
| 3179 | - cpu->nInterrupts = (unsigned long)mem_stats.v_intr; | ||
| 3180 | - cpu->nCtxSwitches = (unsigned long)mem_stats.v_swtch; | ||
| 3181 | + cpu->nInterrupts = (unsigned long long)mem_stats.v_intr; | ||
| 3182 | + cpu->nCtxSwitches = (unsigned long long)mem_stats.v_swtch; | ||
| 3183 | |||
| 3184 | #ifdef PER_CPU_INFO | ||
| 3185 | for ( i = 0; i < n; i++ ) { | ||
| 3186 | diff --git a/agent/mibgroup/hardware/cpu/cpu_pcp.c b/agent/mibgroup/hardware/cpu/cpu_pcp.c | ||
| 3187 | index dcc2724..94c7b5c 100644 | ||
| 3188 | --- a/agent/mibgroup/hardware/cpu/cpu_pcp.c | ||
| 3189 | +++ b/agent/mibgroup/hardware/cpu/cpu_pcp.c | ||
| 3190 | @@ -153,13 +153,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3191 | exit(1); | ||
| 3192 | } | ||
| 3193 | |||
| 3194 | - cpu->wait_ticks = (unsigned long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10; | ||
| 3195 | - cpu->intrpt_ticks = (unsigned long)resp->vset[CPUINTR]->vlist[0].value.lval / 10; | ||
| 3196 | + cpu->wait_ticks = (unsigned long long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10; | ||
| 3197 | + cpu->intrpt_ticks = (unsigned long long)resp->vset[CPUINTR]->vlist[0].value.lval / 10; | ||
| 3198 | /*cpu->sirq_ticks = (unsigned long)csoftll / 10;*/ | ||
| 3199 | - cpu->user_ticks = (unsigned long)resp->vset[CPUUSER]->vlist[0].value.lval / 10; | ||
| 3200 | + cpu->user_ticks = (unsigned long long)resp->vset[CPUUSER]->vlist[0].value.lval / 10; | ||
| 3201 | /*cpu->nice_ticks = (unsigned long)cicell / 10;*/ | ||
| 3202 | - cpu->sys_ticks = (unsigned long)resp->vset[CPUSYS]->vlist[0].value.lval / 10; | ||
| 3203 | - cpu->idle_ticks = (unsigned long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10; | ||
| 3204 | + cpu->sys_ticks = (unsigned long long)resp->vset[CPUSYS]->vlist[0].value.lval / 10; | ||
| 3205 | + cpu->idle_ticks = (unsigned long long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10; | ||
| 3206 | |||
| 3207 | |||
| 3208 | /* | ||
| 3209 | @@ -168,12 +168,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3210 | */ | ||
| 3211 | /*cpu = netsnmp_cpu_get_byIdx( -1, 0 );*/ | ||
| 3212 | /*_cpu_load_swap_etc( buff, cpu );*/ | ||
| 3213 | - cpu->pageIn = (unsigned long)resp->vset[PAGESIN]->vlist[0].value.lval; | ||
| 3214 | - cpu->pageOut = (unsigned long)resp->vset[PAGESOUT]->vlist[0].value.lval; | ||
| 3215 | - cpu->swapIn = (unsigned long)resp->vset[SWAPIN]->vlist[0].value.lval; | ||
| 3216 | - cpu->swapOut = (unsigned long)resp->vset[SWAPOUT]->vlist[0].value.lval; | ||
| 3217 | - cpu->nInterrupts = (unsigned long)resp->vset[INTR]->vlist[0].value.lval; | ||
| 3218 | - cpu->nCtxSwitches = (unsigned long)resp->vset[CTXT]->vlist[0].value.lval; | ||
| 3219 | + cpu->pageIn = (unsigned long long)resp->vset[PAGESIN]->vlist[0].value.lval; | ||
| 3220 | + cpu->pageOut = (unsigned long long)resp->vset[PAGESOUT]->vlist[0].value.lval; | ||
| 3221 | + cpu->swapIn = (unsigned long long)resp->vset[SWAPIN]->vlist[0].value.lval; | ||
| 3222 | + cpu->swapOut = (unsigned long long)resp->vset[SWAPOUT]->vlist[0].value.lval; | ||
| 3223 | + cpu->nInterrupts = (unsigned long long)resp->vset[INTR]->vlist[0].value.lval; | ||
| 3224 | + cpu->nCtxSwitches = (unsigned long long)resp->vset[CTXT]->vlist[0].value.lval; | ||
| 3225 | |||
| 3226 | /* | ||
| 3227 | * XXX - TODO: extract per-CPU statistics | ||
| 3228 | diff --git a/agent/mibgroup/hardware/cpu/cpu_perfstat.c b/agent/mibgroup/hardware/cpu/cpu_perfstat.c | ||
| 3229 | index 981656d..5f58190 100644 | ||
| 3230 | --- a/agent/mibgroup/hardware/cpu/cpu_perfstat.c | ||
| 3231 | +++ b/agent/mibgroup/hardware/cpu/cpu_perfstat.c | ||
| 3232 | @@ -58,27 +58,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3233 | sizeof(perfstat_cpu_total_t), 1) > 0) { | ||
| 3234 | |||
| 3235 | /* Returns 'u_longlong_t' statistics */ | ||
| 3236 | - cpu->user_ticks = (unsigned long)cs.user / cs.ncpus; | ||
| 3237 | - cpu->sys_ticks = ((unsigned long)cs.sys + (unsigned long)cs.wait) / cs.ncpus; | ||
| 3238 | - cpu->kern_ticks = (unsigned long)cs.sys / cs.ncpus; | ||
| 3239 | - cpu->wait_ticks = (unsigned long)cs.wait / cs.ncpus; | ||
| 3240 | - cpu->idle_ticks = (unsigned long)cs.idle / cs.ncpus; | ||
| 3241 | + cpu->user_ticks = (unsigned long long)cs.user / cs.ncpus; | ||
| 3242 | + cpu->sys_ticks = ((unsigned long long)cs.sys + (unsigned long long)cs.wait) / cs.ncpus; | ||
| 3243 | + cpu->kern_ticks = (unsigned long long)cs.sys / cs.ncpus; | ||
| 3244 | + cpu->wait_ticks = (unsigned long long)cs.wait / cs.ncpus; | ||
| 3245 | + cpu->idle_ticks = (unsigned long long)cs.idle / cs.ncpus; | ||
| 3246 | /* intrpt_ticks, sirq_ticks, nice_ticks unused */ | ||
| 3247 | |||
| 3248 | /* | ||
| 3249 | * Interrupt/Context Switch statistics | ||
| 3250 | * XXX - Do these really belong here ? | ||
| 3251 | */ | ||
| 3252 | - cpu->pageIn = (unsigned long)cs.sysread; | ||
| 3253 | - cpu->pageOut = (unsigned long)cs.syswrite; | ||
| 3254 | - cpu->nInterrupts = (unsigned long)cs.devintrs + cs.softintrs; | ||
| 3255 | - cpu->nCtxSwitches = (unsigned long)cs.pswitch; | ||
| 3256 | + cpu->pageIn = (unsigned long long)cs.sysread; | ||
| 3257 | + cpu->pageOut = (unsigned long long)cs.syswrite; | ||
| 3258 | + cpu->nInterrupts = (unsigned long long)cs.devintrs + cs.softintrs; | ||
| 3259 | + cpu->nCtxSwitches = (unsigned long long)cs.pswitch; | ||
| 3260 | } | ||
| 3261 | |||
| 3262 | if (perfstat_memory_total((perfstat_id_t *)NULL, &ms, | ||
| 3263 | sizeof(perfstat_memory_total_t), 1) > 0) { | ||
| 3264 | - cpu->swapIn = (unsigned long)ms.pgspins; | ||
| 3265 | - cpu->swapOut = (unsigned long)ms.pgspouts; | ||
| 3266 | + cpu->swapIn = (unsigned long long)ms.pgspins; | ||
| 3267 | + cpu->swapOut = (unsigned long long)ms.pgspouts; | ||
| 3268 | } | ||
| 3269 | |||
| 3270 | |||
| 3271 | @@ -91,14 +91,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3272 | if (perfstat_cpu(&name, cs2, sizeof(perfstat_cpu_t), n) > 0) { | ||
| 3273 | for ( i = 0; i < n; i++ ) { | ||
| 3274 | cpu = netsnmp_cpu_get_byIdx( i, 0 ); | ||
| 3275 | - cpu->user_ticks = (unsigned long)cs2[i].user; | ||
| 3276 | - cpu->sys_ticks = (unsigned long)cs2[i].sys + (unsigned long)cs2[i].wait; | ||
| 3277 | - cpu->kern_ticks = (unsigned long)cs2[i].sys; | ||
| 3278 | - cpu->wait_ticks = (unsigned long)cs2[i].wait; | ||
| 3279 | - cpu->idle_ticks = (unsigned long)cs2[i].idle; | ||
| 3280 | - cpu->pageIn = (unsigned long)cs2[i].sysread; | ||
| 3281 | - cpu->pageOut = (unsigned long)cs2[i].syswrite; | ||
| 3282 | - cpu->nCtxSwitches = (unsigned long)cs2[i].pswitch; | ||
| 3283 | + cpu->user_ticks = (unsigned long long)cs2[i].user; | ||
| 3284 | + cpu->sys_ticks = (unsigned long long)cs2[i].sys + (unsigned long long)cs2[i].wait; | ||
| 3285 | + cpu->kern_ticks = (unsigned long long)cs2[i].sys; | ||
| 3286 | + cpu->wait_ticks = (unsigned long long)cs2[i].wait; | ||
| 3287 | + cpu->idle_ticks = (unsigned long long)cs2[i].idle; | ||
| 3288 | + cpu->pageIn = (unsigned long long)cs2[i].sysread; | ||
| 3289 | + cpu->pageOut = (unsigned long long)cs2[i].syswrite; | ||
| 3290 | + cpu->nCtxSwitches = (unsigned long long)cs2[i].pswitch; | ||
| 3291 | /* Interrupt stats only apply overall, not per-CPU */ | ||
| 3292 | } | ||
| 3293 | } else { | ||
| 3294 | diff --git a/agent/mibgroup/hardware/cpu/cpu_pstat.c b/agent/mibgroup/hardware/cpu/cpu_pstat.c | ||
| 3295 | index c68739b..35c1d63 100644 | ||
| 3296 | --- a/agent/mibgroup/hardware/cpu/cpu_pstat.c | ||
| 3297 | +++ b/agent/mibgroup/hardware/cpu/cpu_pstat.c | ||
| 3298 | @@ -72,13 +72,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3299 | |||
| 3300 | pstat_getdynamic(&psd, sizeof(psd), 1, 0); | ||
| 3301 | /* XXX - Compare cpu_num against psd.psd_proc_cnt */ | ||
| 3302 | - cpu->user_ticks = (unsigned long)psd.psd_cpu_time[CP_USER]; | ||
| 3303 | - cpu->nice_ticks = (unsigned long)psd.psd_cpu_time[CP_NICE]; | ||
| 3304 | - cpu->sys2_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS]+ | ||
| 3305 | + cpu->user_ticks = (unsigned long long)psd.psd_cpu_time[CP_USER]; | ||
| 3306 | + cpu->nice_ticks = (unsigned long long)psd.psd_cpu_time[CP_NICE]; | ||
| 3307 | + cpu->sys2_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]+ | ||
| 3308 | psd.psd_cpu_time[CP_WAIT]; | ||
| 3309 | - cpu->idle_ticks = (unsigned long)psd.psd_cpu_time[CP_IDLE]; | ||
| 3310 | - cpu->wait_ticks = (unsigned long)psd.psd_cpu_time[CP_WAIT]; | ||
| 3311 | - cpu->kern_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS]; | ||
| 3312 | + cpu->idle_ticks = (unsigned long long)psd.psd_cpu_time[CP_IDLE]; | ||
| 3313 | + cpu->wait_ticks = (unsigned long long)psd.psd_cpu_time[CP_WAIT]; | ||
| 3314 | + cpu->kern_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]; | ||
| 3315 | /* XXX - record (sum of) "all other ticks" */ | ||
| 3316 | /* intrpt_ticks, sirq_ticks unused */ | ||
| 3317 | |||
| 3318 | @@ -87,21 +87,21 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3319 | * XXX - Do these really belong here ? | ||
| 3320 | */ | ||
| 3321 | pstat_getvminfo(&psv, sizeof(psv), 1, 0); | ||
| 3322 | - cpu->swapIn = (unsigned long)psv.psv_sswpin; | ||
| 3323 | - cpu->swapOut = (unsigned long)psv.psv_sswpout; | ||
| 3324 | - cpu->nInterrupts = (unsigned long)psv.psv_sintr; | ||
| 3325 | - cpu->nCtxSwitches = (unsigned long)psv.psv_sswtch; | ||
| 3326 | + cpu->swapIn = (unsigned long long)psv.psv_sswpin; | ||
| 3327 | + cpu->swapOut = (unsigned long long)psv.psv_sswpout; | ||
| 3328 | + cpu->nInterrupts = (unsigned long long)psv.psv_sintr; | ||
| 3329 | + cpu->nCtxSwitches = (unsigned long long)psv.psv_sswtch; | ||
| 3330 | |||
| 3331 | |||
| 3332 | for ( i = 0; i < psd.psd_proc_cnt; i++ ) { | ||
| 3333 | cpu = netsnmp_cpu_get_byIdx( i, 0 ); | ||
| 3334 | - cpu->user_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_USER]; | ||
| 3335 | - cpu->nice_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_NICE]; | ||
| 3336 | - cpu->sys2_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS]+ | ||
| 3337 | + cpu->user_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_USER]; | ||
| 3338 | + cpu->nice_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_NICE]; | ||
| 3339 | + cpu->sys2_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS]+ | ||
| 3340 | psd.psd_mp_cpu_time[i][CP_WAIT]; | ||
| 3341 | - cpu->idle_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_IDLE]; | ||
| 3342 | - cpu->wait_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_WAIT]; | ||
| 3343 | - cpu->kern_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS]; | ||
| 3344 | + cpu->idle_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_IDLE]; | ||
| 3345 | + cpu->wait_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_WAIT]; | ||
| 3346 | + cpu->kern_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS]; | ||
| 3347 | /* XXX - record (sum of) "all other ticks" */ | ||
| 3348 | } | ||
| 3349 | |||
| 3350 | diff --git a/agent/mibgroup/hardware/cpu/cpu_sysctl.c b/agent/mibgroup/hardware/cpu/cpu_sysctl.c | ||
| 3351 | index e549671..5599a58 100644 | ||
| 3352 | --- a/agent/mibgroup/hardware/cpu/cpu_sysctl.c | ||
| 3353 | +++ b/agent/mibgroup/hardware/cpu/cpu_sysctl.c | ||
| 3354 | @@ -40,23 +40,25 @@ void _cpu_copy_stats( netsnmp_cpu_info *cpu ); | ||
| 3355 | * (including descriptions) | ||
| 3356 | */ | ||
| 3357 | void init_cpu_sysctl( void ) { | ||
| 3358 | - int n; | ||
| 3359 | - size_t i; | ||
| 3360 | + int i, n; | ||
| 3361 | + size_t siz; | ||
| 3362 | int ncpu_mib[] = { CTL_HW, HW_NCPU }; | ||
| 3363 | +#if !(defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) ) ) | ||
| 3364 | int model_mib[] = { CTL_HW, HW_MODEL }; | ||
| 3365 | +#endif | ||
| 3366 | char descr[ SNMP_MAXBUF ]; | ||
| 3367 | netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( -1, 1 ); | ||
| 3368 | strcpy(cpu->name, "Overall CPU statistics"); | ||
| 3369 | |||
| 3370 | - i = sizeof(n); | ||
| 3371 | - sysctl(ncpu_mib, 2, &n, &i, NULL, 0); | ||
| 3372 | + siz = sizeof(n); | ||
| 3373 | + sysctl(ncpu_mib, 2, &n, &siz, NULL, 0); | ||
| 3374 | if ( n <= 0 ) | ||
| 3375 | n = 1; /* Single CPU system */ | ||
| 3376 | - i = sizeof(descr); | ||
| 3377 | + siz = sizeof(descr); | ||
| 3378 | #if defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) ) | ||
| 3379 | - sysctlbyname("machdep.cpu_brand", descr, (void *)&i, NULL, 0); | ||
| 3380 | + sysctlbyname("machdep.cpu_brand", descr, &siz, NULL, 0); | ||
| 3381 | #else | ||
| 3382 | - sysctl(model_mib, 2, descr, &i, NULL, 0); | ||
| 3383 | + sysctl(model_mib, 2, descr, &siz, NULL, 0); | ||
| 3384 | #endif | ||
| 3385 | for ( i = 0; i < n; i++ ) { | ||
| 3386 | cpu = netsnmp_cpu_get_byIdx( i, 1 ); | ||
| 3387 | @@ -176,12 +178,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3388 | #else | ||
| 3389 | sysctl(cpu_mib, 2, cpu_stats, &cpu_size, NULL, 0); | ||
| 3390 | #endif | ||
| 3391 | - cpu->user_ticks = (unsigned long)cpu_stats[CP_USER]; | ||
| 3392 | - cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE]; | ||
| 3393 | - cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR]; | ||
| 3394 | - cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS]; | ||
| 3395 | - cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE]; | ||
| 3396 | - cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR]; | ||
| 3397 | + cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER]; | ||
| 3398 | + cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE]; | ||
| 3399 | + cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR]; | ||
| 3400 | + cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS]; | ||
| 3401 | + cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE]; | ||
| 3402 | + cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR]; | ||
| 3403 | /* wait_ticks, sirq_ticks unused */ | ||
| 3404 | |||
| 3405 | /* | ||
| 3406 | @@ -189,15 +191,15 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3407 | * XXX - Do these really belong here ? | ||
| 3408 | */ | ||
| 3409 | sysctl(mem_mib, 2, &mem_stats, &mem_size, NULL, 0); | ||
| 3410 | - cpu->nInterrupts = (unsigned long)mem_stats.NS_VM_INTR; | ||
| 3411 | - cpu->nCtxSwitches = (unsigned long)mem_stats.NS_VM_SWTCH; | ||
| 3412 | - cpu->swapIn = (unsigned long)mem_stats.NS_VM_SWAPIN; | ||
| 3413 | - cpu->swapOut = (unsigned long)mem_stats.NS_VM_SWAPOUT; | ||
| 3414 | + cpu->nInterrupts = (unsigned long long)mem_stats.NS_VM_INTR; | ||
| 3415 | + cpu->nCtxSwitches = (unsigned long long)mem_stats.NS_VM_SWTCH; | ||
| 3416 | + cpu->swapIn = (unsigned long long)mem_stats.NS_VM_SWAPIN; | ||
| 3417 | + cpu->swapOut = (unsigned long long)mem_stats.NS_VM_SWAPOUT; | ||
| 3418 | #ifdef NS_VM_PAGEIN | ||
| 3419 | - cpu->pageIn = (unsigned long)mem_stats.NS_VM_PAGEIN; | ||
| 3420 | + cpu->pageIn = (unsigned long long)mem_stats.NS_VM_PAGEIN; | ||
| 3421 | #endif | ||
| 3422 | #ifdef NS_VM_PAGEOUT | ||
| 3423 | - cpu->pageOut = (unsigned long)mem_stats.NS_VM_PAGEOUT; | ||
| 3424 | + cpu->pageOut = (unsigned long long)mem_stats.NS_VM_PAGEOUT; | ||
| 3425 | #endif | ||
| 3426 | |||
| 3427 | #ifdef NETSNMP_KERN_MCPU | ||
| 3428 | diff --git a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c | ||
| 3429 | index d510308..ed1f357 100644 | ||
| 3430 | --- a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c | ||
| 3431 | +++ b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c | ||
| 3432 | @@ -91,20 +91,20 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) | ||
| 3433 | } | ||
| 3434 | |||
| 3435 | DEBUGMSGTL(("cpu_sysinfo", "total cpu kernel: %lu\n", sinfo_gen->cpu[CPU_KERNEL])); | ||
| 3436 | - cpu->sys2_ticks = (unsigned long) sinfo_gen->cpu[CPU_KERNEL] + (unsigned long) sinfo_gen->cpu[CPU_SXBRK] + (unsigned long) sinfo_gen->cpu[CPU_INTR]; | ||
| 3437 | - cpu->kern_ticks = (unsigned long) sinfo_gen->cpu[CPU_KERNEL]; | ||
| 3438 | - cpu->intrpt_ticks = (unsigned long) sinfo_gen->cpu[CPU_INTR]; | ||
| 3439 | - cpu->user_ticks = (unsigned long) sinfo_gen->cpu[CPU_USER]; | ||
| 3440 | - cpu->wait_ticks = (unsigned long) sinfo_gen->cpu[CPU_WAIT]; | ||
| 3441 | - cpu->idle_ticks = (unsigned long) sinfo_gen->cpu[CPU_IDLE]; | ||
| 3442 | + 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]; | ||
| 3443 | + cpu->kern_ticks = (unsigned long long) sinfo_gen->cpu[CPU_KERNEL]; | ||
| 3444 | + cpu->intrpt_ticks = (unsigned long long) sinfo_gen->cpu[CPU_INTR]; | ||
| 3445 | + cpu->user_ticks = (unsigned long long) sinfo_gen->cpu[CPU_USER]; | ||
| 3446 | + cpu->wait_ticks = (unsigned long long) sinfo_gen->cpu[CPU_WAIT]; | ||
| 3447 | + cpu->idle_ticks = (unsigned long long) sinfo_gen->cpu[CPU_IDLE]; | ||
| 3448 | |||
| 3449 | /* XXX - Do these really belong here ? */ | ||
| 3450 | - cpu->pageIn = (unsigned long)0; | ||
| 3451 | - cpu->pageOut = (unsigned long)0; | ||
| 3452 | - cpu->swapIn = (unsigned long)sinfo_gen->swapin; | ||
| 3453 | - cpu->swapOut = (unsigned long)sinfo_gen->swapout; | ||
| 3454 | - cpu->nInterrupts = (unsigned long)sinfo_gen->intr_svcd; | ||
| 3455 | - cpu->nCtxSwitches = (unsigned long)sinfo_gen->pswitch; | ||
| 3456 | + cpu->pageIn = (unsigned long long)0; | ||
| 3457 | + cpu->pageOut = (unsigned long long)0; | ||
| 3458 | + cpu->swapIn = (unsigned long long)sinfo_gen->swapin; | ||
| 3459 | + cpu->swapOut = (unsigned long long)sinfo_gen->swapout; | ||
| 3460 | + cpu->nInterrupts = (unsigned long long)sinfo_gen->intr_svcd; | ||
| 3461 | + cpu->nCtxSwitches = (unsigned long long)sinfo_gen->pswitch; | ||
| 3462 | |||
| 3463 | /* fetch individual cpu stats */ | ||
| 3464 | |||
| 3465 | @@ -120,11 +120,11 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) | ||
| 3466 | cpu = netsnmp_cpu_get_byIdx(i, 0); | ||
| 3467 | |||
| 3468 | DEBUGMSGTL(("cpu_sysinfo", "cpu %u kernel: %lu\n", i, sinfo_cpus[i].cpu[CPU_KERNEL])); | ||
| 3469 | - 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]; | ||
| 3470 | - cpu->intrpt_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_INTR]; | ||
| 3471 | - cpu->user_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_USER]; | ||
| 3472 | - cpu->wait_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_WAIT]; | ||
| 3473 | - cpu->idle_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_IDLE]; | ||
| 3474 | + 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]; | ||
| 3475 | + cpu->intrpt_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_INTR]; | ||
| 3476 | + cpu->user_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_USER]; | ||
| 3477 | + cpu->wait_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_WAIT]; | ||
| 3478 | + cpu->idle_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_IDLE]; | ||
| 3479 | } | ||
| 3480 | |||
| 3481 | return 0; | ||
| 3482 | diff --git a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c | ||
| 3483 | index 55327b7..93f38ce 100644 | ||
| 3484 | --- a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c | ||
| 3485 | +++ b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c | ||
| 3486 | @@ -164,7 +164,7 @@ netsnmp_fsys_arch_load( void ) | ||
| 3487 | entry->type = _fs_type( stats[i].f_fstypename ); | ||
| 3488 | entry->flags |= NETSNMP_FS_FLAG_ACTIVE; | ||
| 3489 | |||
| 3490 | - if (! stats[i].NSFS_FLAGS & MNT_LOCAL ) { | ||
| 3491 | + if (! (stats[i].NSFS_FLAGS & MNT_LOCAL )) { | ||
| 3492 | entry->flags |= NETSNMP_FS_FLAG_REMOTE; | ||
| 3493 | } | ||
| 3494 | if ( stats[i].NSFS_FLAGS & MNT_RDONLY ) { | ||
| 3495 | @@ -175,4 +175,6 @@ netsnmp_fsys_arch_load( void ) | ||
| 3496 | } | ||
| 3497 | netsnmp_fsys_calculate32(entry); | ||
| 3498 | } | ||
| 3499 | + | ||
| 3500 | + free(stats); | ||
| 3501 | } | ||
| 3502 | diff --git a/agent/mibgroup/hardware/fsys/fsys_mntctl.c b/agent/mibgroup/hardware/fsys/fsys_mntctl.c | ||
| 3503 | index e65d6d5..3ad68d4 100644 | ||
| 3504 | --- a/agent/mibgroup/hardware/fsys/fsys_mntctl.c | ||
| 3505 | +++ b/agent/mibgroup/hardware/fsys/fsys_mntctl.c | ||
| 3506 | @@ -128,9 +128,9 @@ netsnmp_fsys_arch_load( void ) | ||
| 3507 | continue; | ||
| 3508 | } | ||
| 3509 | |||
| 3510 | - strncpy( entry->path, path, sizeof( entry->path )); | ||
| 3511 | - strncpy( entry->device, vmt2dataptr( aixcurr, VMT_STUB), | ||
| 3512 | - sizeof( entry->device )); | ||
| 3513 | + strlcpy(entry->path, path, sizeof(entry->path)); | ||
| 3514 | + strlcpy(entry->device, vmt2dataptr(aixcurr, VMT_STUB), | ||
| 3515 | + sizeof(entry->device)); | ||
| 3516 | entry->type = _fsys_type( aixcurr->vmt_gfstype ); | ||
| 3517 | |||
| 3518 | if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT)) | ||
| 3519 | diff --git a/agent/mibgroup/hardware/fsys/fsys_mntent.c b/agent/mibgroup/hardware/fsys/fsys_mntent.c | ||
| 3520 | index 1a156f4..c380365 100644 | ||
| 3521 | --- a/agent/mibgroup/hardware/fsys/fsys_mntent.c | ||
| 3522 | +++ b/agent/mibgroup/hardware/fsys/fsys_mntent.c | ||
| 3523 | @@ -135,6 +135,9 @@ _fsys_type( char *typename ) | ||
| 3524 | !strcmp(typename, MNTTYPE_GFS2) || | ||
| 3525 | !strcmp(typename, MNTTYPE_XFS) || | ||
| 3526 | !strcmp(typename, MNTTYPE_JFS) || | ||
| 3527 | + !strcmp(typename, MNTTYPE_VXFS) || | ||
| 3528 | + !strcmp(typename, MNTTYPE_REISERFS) || | ||
| 3529 | + !strcmp(typename, MNTTYPE_OCFS2) || | ||
| 3530 | !strcmp(typename, MNTTYPE_LOFS)) | ||
| 3531 | return NETSNMP_FS_TYPE_OTHER; | ||
| 3532 | |||
| 3533 | @@ -190,11 +193,9 @@ netsnmp_fsys_arch_load( void ) | ||
| 3534 | continue; | ||
| 3535 | } | ||
| 3536 | |||
| 3537 | - strncpy( entry->path, m->NSFS_PATH, sizeof( entry->path )); | ||
| 3538 | - entry->path[sizeof(entry->path)-1] = '\0'; | ||
| 3539 | - strncpy( entry->device, m->NSFS_DEV, sizeof( entry->device )); | ||
| 3540 | - entry->device[sizeof(entry->device)-1] = '\0'; | ||
| 3541 | - entry->type = _fsys_type( m->NSFS_TYPE ); | ||
| 3542 | + strlcpy(entry->path, m->NSFS_PATH, sizeof(entry->path)); | ||
| 3543 | + strlcpy(entry->device, m->NSFS_DEV, sizeof(entry->device)); | ||
| 3544 | + entry->type = _fsys_type(m->NSFS_TYPE); | ||
| 3545 | if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT)) | ||
| 3546 | entry->flags |= NETSNMP_FS_FLAG_ACTIVE; | ||
| 3547 | |||
| 3548 | diff --git a/agent/mibgroup/hardware/fsys/hw_fsys.c b/agent/mibgroup/hardware/fsys/hw_fsys.c | ||
| 3549 | index c96284e..a6cd94d 100644 | ||
| 3550 | --- a/agent/mibgroup/hardware/fsys/hw_fsys.c | ||
| 3551 | +++ b/agent/mibgroup/hardware/fsys/hw_fsys.c | ||
| 3552 | @@ -3,6 +3,9 @@ | ||
| 3553 | #include <net-snmp/net-snmp-includes.h> | ||
| 3554 | #include <net-snmp/agent/net-snmp-agent-includes.h> | ||
| 3555 | #include <net-snmp/agent/hardware/fsys.h> | ||
| 3556 | +#ifdef HAVE_INTTYPES_H | ||
| 3557 | +#include <inttypes.h> | ||
| 3558 | +#endif | ||
| 3559 | |||
| 3560 | netsnmp_feature_child_of(hw_fsys_get_container, netsnmp_unused) | ||
| 3561 | |||
| 3562 | @@ -174,9 +177,8 @@ netsnmp_fsys_by_path( char *path, int create_type ) | ||
| 3563 | * ... so let's create a new one | ||
| 3564 | */ | ||
| 3565 | sp = _fsys_create_entry(); | ||
| 3566 | - if ( sp ) { | ||
| 3567 | - strncpy( sp->path, path, sizeof(sp->path) ); | ||
| 3568 | - } | ||
| 3569 | + if (sp) | ||
| 3570 | + strlcpy(sp->path, path, sizeof(sp->path)); | ||
| 3571 | return sp; | ||
| 3572 | } | ||
| 3573 | |||
| 3574 | @@ -217,9 +219,8 @@ netsnmp_fsys_by_device( char *device, int create_type ) | ||
| 3575 | * ... so let's create a new one | ||
| 3576 | */ | ||
| 3577 | sp = _fsys_create_entry(); | ||
| 3578 | - if ( sp ) { | ||
| 3579 | - strncpy( sp->device, device, sizeof(sp->device) ); | ||
| 3580 | - } | ||
| 3581 | + if (sp) | ||
| 3582 | + strlcpy(sp->device, device, sizeof(sp->device)); | ||
| 3583 | return sp; | ||
| 3584 | } | ||
| 3585 | |||
| 3586 | @@ -242,7 +243,7 @@ _fsys_create_entry( void ) | ||
| 3587 | sp->idx.oids[0] = ++_fsys_idx; | ||
| 3588 | } | ||
| 3589 | |||
| 3590 | - DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d\n", _fsys_idx)); | ||
| 3591 | + DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d)\n", _fsys_idx)); | ||
| 3592 | CONTAINER_INSERT( _fsys_container, sp ); | ||
| 3593 | return sp; | ||
| 3594 | } | ||
| 3595 | @@ -319,21 +320,30 @@ netsnmp_fsys_avail( netsnmp_fsys_info *f) { | ||
| 3596 | #define INT32_MAX 0x7fffffff | ||
| 3597 | #endif | ||
| 3598 | |||
| 3599 | +#ifndef PRIu64 | ||
| 3600 | +#define PRIu64 "llu" | ||
| 3601 | +#endif | ||
| 3602 | + | ||
| 3603 | /* recalculate f->size_32, used_32, avail_32 and units_32 from f->size & comp.*/ | ||
| 3604 | void | ||
| 3605 | -netsnmp_fsys_calculate32( netsnmp_fsys_info *f) | ||
| 3606 | +netsnmp_fsys_calculate32(netsnmp_fsys_info *f) | ||
| 3607 | { | ||
| 3608 | unsigned long long s = f->size; | ||
| 3609 | - unsigned long long u = f->units; | ||
| 3610 | - int factor = 0; | ||
| 3611 | + unsigned shift = 0; | ||
| 3612 | + | ||
| 3613 | while (s > INT32_MAX) { | ||
| 3614 | s = s >> 1; | ||
| 3615 | - u = u << 1; | ||
| 3616 | - factor++; | ||
| 3617 | + shift++; | ||
| 3618 | } | ||
| 3619 | |||
| 3620 | f->size_32 = s; | ||
| 3621 | - f->units_32 = u; | ||
| 3622 | - f->avail_32 = f->avail << factor; | ||
| 3623 | - f->used_32 = f->used << factor; | ||
| 3624 | + f->units_32 = f->units << shift; | ||
| 3625 | + f->avail_32 = f->avail >> shift; | ||
| 3626 | + f->used_32 = f->used >> shift; | ||
| 3627 | + | ||
| 3628 | + DEBUGMSGTL(("fsys", "Results of 32-bit conversion: size %" PRIu64 " -> %lu;" | ||
| 3629 | + " units %" PRIu64 " -> %lu; avail %" PRIu64 " -> %lu;" | ||
| 3630 | + " used %" PRIu64 " -> %lu\n", | ||
| 3631 | + (uint64_t)f->size, f->size_32, (uint64_t)f->units, f->units_32, | ||
| 3632 | + (uint64_t)f->avail, f->avail_32, (uint64_t)f->used, f->used_32)); | ||
| 3633 | } | ||
| 3634 | diff --git a/agent/mibgroup/hardware/fsys/mnttypes.h b/agent/mibgroup/hardware/fsys/mnttypes.h | ||
| 3635 | index f6d96fe..9183451 100644 | ||
| 3636 | --- a/agent/mibgroup/hardware/fsys/mnttypes.h | ||
| 3637 | +++ b/agent/mibgroup/hardware/fsys/mnttypes.h | ||
| 3638 | @@ -90,9 +90,6 @@ | ||
| 3639 | #ifndef MNTTYPE_PC | ||
| 3640 | #define MNTTYPE_PC "pc" | ||
| 3641 | #endif | ||
| 3642 | -#ifndef MNTTYPE_REISERFS | ||
| 3643 | -#define MNTTYPE_REISERFS "reiserfs" | ||
| 3644 | -#endif | ||
| 3645 | #ifndef MNTTYPE_SMBFS | ||
| 3646 | #define MNTTYPE_SMBFS "smbfs" | ||
| 3647 | #endif | ||
| 3648 | @@ -108,30 +105,48 @@ | ||
| 3649 | #ifndef MNTTYPE_VFAT | ||
| 3650 | #define MNTTYPE_VFAT "vfat" | ||
| 3651 | #endif | ||
| 3652 | + | ||
| 3653 | +/* | ||
| 3654 | + * File systems to monitor, but not covered by HR-TYPES enumerations | ||
| 3655 | + */ | ||
| 3656 | +#ifndef MNTTYPE_MVFS | ||
| 3657 | +#define MNTTYPE_MVFS "mvfs" | ||
| 3658 | +#endif | ||
| 3659 | +#ifndef MNTTYPE_TMPFS | ||
| 3660 | +#define MNTTYPE_TMPFS "tmpfs" | ||
| 3661 | +#endif | ||
| 3662 | #ifndef MNTTYPE_GFS | ||
| 3663 | #define MNTTYPE_GFS "gfs" | ||
| 3664 | #endif | ||
| 3665 | #ifndef MNTTYPE_GFS2 | ||
| 3666 | #define MNTTYPE_GFS2 "gfs2" | ||
| 3667 | #endif | ||
| 3668 | - | ||
| 3669 | -/* | ||
| 3670 | - * File systems to monitor, but not covered by HR-TYPES enumerations | ||
| 3671 | - */ | ||
| 3672 | +#ifndef MNTTYPE_XFS | ||
| 3673 | +#define MNTTYPE_XFS "xfs" | ||
| 3674 | +#endif | ||
| 3675 | +#ifndef MNTTYPE_JFS | ||
| 3676 | +#define MNTTYPE_JFS "jfs" | ||
| 3677 | +#endif | ||
| 3678 | +#ifndef MNTTYPE_VXFS | ||
| 3679 | +#define MNTTYPE_VXFS "vxfs" | ||
| 3680 | +#endif | ||
| 3681 | +#ifndef MNTTYPE_REISERFS | ||
| 3682 | +#define MNTTYPE_REISERFS "reiserfs" | ||
| 3683 | +#endif | ||
| 3684 | #ifndef MNTTYPE_LOFS | ||
| 3685 | #define MNTTYPE_LOFS "lofs" | ||
| 3686 | #endif | ||
| 3687 | -#ifndef MNTTYPE_APP | ||
| 3688 | -#define MNTTYPE_APP "app" | ||
| 3689 | -#endif | ||
| 3690 | -#ifndef MNTTYPE_MVFS | ||
| 3691 | -#define MNTTYPE_MVFS "mvfs" | ||
| 3692 | +#ifndef MNTTYPE_OCFS2 | ||
| 3693 | +#define MNTTYPE_OCFS2 "ocfs2" | ||
| 3694 | #endif | ||
| 3695 | |||
| 3696 | /* | ||
| 3697 | * File systems to skip | ||
| 3698 | * (Probably not strictly needed) | ||
| 3699 | */ | ||
| 3700 | +#ifndef MNTTYPE_APP | ||
| 3701 | +#define MNTTYPE_APP "app" | ||
| 3702 | +#endif | ||
| 3703 | #ifndef MNTTYPE_DEVPTS | ||
| 3704 | #define MNTTYPE_DEVPTS "devpts" | ||
| 3705 | #endif | ||
| 3706 | @@ -144,9 +159,6 @@ | ||
| 3707 | #ifndef MNTTYPE_SYSFS | ||
| 3708 | #define MNTTYPE_SYSFS "sysfs" | ||
| 3709 | #endif | ||
| 3710 | -#ifndef MNTTYPE_TMPFS | ||
| 3711 | -#define MNTTYPE_TMPFS "tmpfs" | ||
| 3712 | -#endif | ||
| 3713 | #ifndef MNTTYPE_USBFS | ||
| 3714 | #define MNTTYPE_USBFS "usbfs" | ||
| 3715 | #endif | ||
| 3716 | @@ -156,12 +168,5 @@ | ||
| 3717 | #ifndef MNTTYPE_RPCPIPE | ||
| 3718 | #define MNTTYPE_RPCPIPE "rpc_pipefs" | ||
| 3719 | #endif | ||
| 3720 | -#ifndef MNTTYPE_XFS | ||
| 3721 | -#define MNTTYPE_XFS "xfs" | ||
| 3722 | -#endif | ||
| 3723 | -#ifndef MNTTYPE_JFS | ||
| 3724 | -#define MNTTYPE_JFS "jfs" | ||
| 3725 | -#endif | ||
| 3726 | - | ||
| 3727 | |||
| 3728 | #endif /* _NETSNMP_FSYS_MNTTYPES_H */ | ||
| 3729 | diff --git a/agent/mibgroup/hardware/memory/memory_linux.c b/agent/mibgroup/hardware/memory/memory_linux.c | ||
| 3730 | index 89abf57..8c189c5 100644 | ||
| 3731 | --- a/agent/mibgroup/hardware/memory/memory_linux.c | ||
| 3732 | +++ b/agent/mibgroup/hardware/memory/memory_linux.c | ||
| 3733 | @@ -46,6 +46,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3734 | buff = (char*)malloc(bsize+1); | ||
| 3735 | if (NULL == buff) { | ||
| 3736 | snmp_log(LOG_ERR, "malloc failed\n"); | ||
| 3737 | + close(statfd); | ||
| 3738 | return -1; | ||
| 3739 | } | ||
| 3740 | } | ||
| 3741 | @@ -53,6 +54,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3742 | b = (char*)realloc(buff, bsize + MEMINFO_STEP_SIZE + 1); | ||
| 3743 | if (NULL == b) { | ||
| 3744 | snmp_log(LOG_ERR, "malloc failed\n"); | ||
| 3745 | + close(statfd); | ||
| 3746 | return -1; | ||
| 3747 | } | ||
| 3748 | buff = b; | ||
| 3749 | @@ -89,13 +91,19 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3750 | if (first) | ||
| 3751 | snmp_log(LOG_ERR, "No MemFree line in /proc/meminfo\n"); | ||
| 3752 | } | ||
| 3753 | - b = strstr(buff, "MemShared: "); | ||
| 3754 | - if (b) | ||
| 3755 | - sscanf(b, "MemShared: %lu", &memshared); | ||
| 3756 | + if (0 == netsnmp_os_prematch("Linux","2.4")) { | ||
| 3757 | + b = strstr(buff, "MemShared: "); | ||
| 3758 | + if (b) | ||
| 3759 | + sscanf(b, "MemShared: %lu", &memshared); | ||
| 3760 | + else if (first) | ||
| 3761 | + snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n"); | ||
| 3762 | + } | ||
| 3763 | else { | ||
| 3764 | - if (first) | ||
| 3765 | - if (0 == netsnmp_os_prematch("Linux","2.4")) | ||
| 3766 | - snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n"); | ||
| 3767 | + b = strstr(buff, "Shmem: "); | ||
| 3768 | + if (b) | ||
| 3769 | + sscanf(b, "Shmem: %lu", &memshared); | ||
| 3770 | + else if (first) | ||
| 3771 | + snmp_log(LOG_ERR, "No Shmem line in /proc/meminfo\n"); | ||
| 3772 | } | ||
| 3773 | b = strstr(buff, "Buffers: "); | ||
| 3774 | if (b) | ||
| 3775 | @@ -155,8 +163,6 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3776 | mem->other = -1; | ||
| 3777 | } | ||
| 3778 | |||
| 3779 | - /* Shared memory is not reported by Linux 2.6 kernel */ | ||
| 3780 | - if (0 != netsnmp_os_prematch("Linux","2.6")) { | ||
| 3781 | mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 1 ); | ||
| 3782 | if (!mem) { | ||
| 3783 | snmp_log_perror("No Shared Memory info entry"); | ||
| 3784 | @@ -165,10 +171,9 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) { | ||
| 3785 | mem->descr = strdup("Shared memory"); | ||
| 3786 | mem->units = 1024; | ||
| 3787 | mem->size = memshared; | ||
| 3788 | - mem->free = -1; | ||
| 3789 | + mem->free = 0; /* All in use */ | ||
| 3790 | mem->other = -1; | ||
| 3791 | } | ||
| 3792 | - } | ||
| 3793 | |||
| 3794 | mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 1 ); | ||
| 3795 | if (!mem) { | ||
| 3796 | diff --git a/agent/mibgroup/hardware/sensors/hw_sensors.c b/agent/mibgroup/hardware/sensors/hw_sensors.c | ||
| 3797 | index 508ad47..1a01645 100644 | ||
| 3798 | --- a/agent/mibgroup/hardware/sensors/hw_sensors.c | ||
| 3799 | +++ b/agent/mibgroup/hardware/sensors/hw_sensors.c | ||
| 3800 | @@ -163,6 +163,11 @@ sensor_by_name( const char *name, int create_type ) | ||
| 3801 | */ | ||
| 3802 | sp = SNMP_MALLOC_TYPEDEF( netsnmp_sensor_info ); | ||
| 3803 | if ( sp ) { | ||
| 3804 | + if (strlen(name) >= sizeof(sp->name)) { | ||
| 3805 | + snmp_log(LOG_ERR, "Sensor name is too large: %s\n", name); | ||
| 3806 | + free(sp); | ||
| 3807 | + return NULL; | ||
| 3808 | + } | ||
| 3809 | strcpy( sp->name, name ); | ||
| 3810 | sp->type = create_type; | ||
| 3811 | /* | ||
| 3812 | diff --git a/agent/mibgroup/hardware/sensors/lmsensors_v3.c b/agent/mibgroup/hardware/sensors/lmsensors_v3.c | ||
| 3813 | index d33a1c4..e34da19 100644 | ||
| 3814 | --- a/agent/mibgroup/hardware/sensors/lmsensors_v3.c | ||
| 3815 | +++ b/agent/mibgroup/hardware/sensors/lmsensors_v3.c | ||
| 3816 | @@ -32,7 +32,7 @@ netsnmp_sensor_arch_load(netsnmp_cache *cache, void *vp) { | ||
| 3817 | |||
| 3818 | while ((data2 = sensors_get_all_subfeatures( chip, data, &b))) { | ||
| 3819 | char *label = NULL; | ||
| 3820 | - double val; | ||
| 3821 | + double val = 0; | ||
| 3822 | int type = NETSNMP_SENSOR_TYPE_OTHER; | ||
| 3823 | |||
| 3824 | DEBUGMSGTL(("sensors:arch:detail", " get_subfeatures (%s, %d)\n", data2->name, data2->number)); | ||
| 3825 | diff --git a/agent/mibgroup/host/data_access/swinst_apt.c b/agent/mibgroup/host/data_access/swinst_apt.c | ||
| 3826 | index d204857..26cdba5 100644 | ||
| 3827 | --- a/agent/mibgroup/host/data_access/swinst_apt.c | ||
| 3828 | +++ b/agent/mibgroup/host/data_access/swinst_apt.c | ||
| 3829 | @@ -37,11 +37,10 @@ static char apt_fmt[SNMP_MAXBUF]; | ||
| 3830 | void | ||
| 3831 | netsnmp_swinst_arch_init(void) | ||
| 3832 | { | ||
| 3833 | - strncpy( pkg_directory, "/var/lib/dpkg/info", SNMP_MAXBUF ); | ||
| 3834 | + strlcpy(pkg_directory, "/var/lib/dpkg/info", sizeof(pkg_directory)); | ||
| 3835 | snprintf(apt_fmt, SNMP_MAXBUF, "%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%ds", | ||
| 3836 | SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF, | ||
| 3837 | SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF); | ||
| 3838 | - return; | ||
| 3839 | } | ||
| 3840 | |||
| 3841 | void | ||
| 3842 | @@ -95,7 +94,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) | ||
| 3843 | entry->swDate_len = 8; | ||
| 3844 | memcpy(entry->swDate, "\0\0\1\1\0\0\0\0", 8); | ||
| 3845 | } | ||
| 3846 | - fclose(p); | ||
| 3847 | + pclose(p); | ||
| 3848 | DEBUGMSGTL(("swinst:load:arch"," loaded %d entries\n", | ||
| 3849 | CONTAINER_SIZE(container))); | ||
| 3850 | |||
| 3851 | diff --git a/agent/mibgroup/host/data_access/swinst_pkginfo.c b/agent/mibgroup/host/data_access/swinst_pkginfo.c | ||
| 3852 | index 1ca40a2..327ca70 100644 | ||
| 3853 | --- a/agent/mibgroup/host/data_access/swinst_pkginfo.c | ||
| 3854 | +++ b/agent/mibgroup/host/data_access/swinst_pkginfo.c | ||
| 3855 | @@ -103,7 +103,9 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) | ||
| 3856 | if there isn't a list of them! */ | ||
| 3857 | } | ||
| 3858 | d = opendir( pkg_directory ); | ||
| 3859 | - while (d != NULL && (dp = readdir(d)) != NULL) { | ||
| 3860 | + if (!d) | ||
| 3861 | + return 1; | ||
| 3862 | + while ((dp = readdir(d)) != NULL) { | ||
| 3863 | if ( '.' == dp->d_name[0] ) | ||
| 3864 | continue; | ||
| 3865 | entry = netsnmp_swinst_entry_create( i++ ); | ||
| 3866 | diff --git a/agent/mibgroup/host/data_access/swinst_rpm.c b/agent/mibgroup/host/data_access/swinst_rpm.c | ||
| 3867 | index a2862e0..71595be 100644 | ||
| 3868 | --- a/agent/mibgroup/host/data_access/swinst_rpm.c | ||
| 3869 | +++ b/agent/mibgroup/host/data_access/swinst_rpm.c | ||
| 3870 | @@ -100,7 +100,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) | ||
| 3871 | int32_t *t; | ||
| 3872 | time_t install_time; | ||
| 3873 | size_t date_len; | ||
| 3874 | - int rc, i = 1; | ||
| 3875 | + int i = 1; | ||
| 3876 | netsnmp_swinst_entry *entry; | ||
| 3877 | |||
| 3878 | ts = rpmtsCreate(); | ||
| 3879 | @@ -112,11 +112,11 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) | ||
| 3880 | |||
| 3881 | while (NULL != (h = rpmdbNextIterator( mi ))) | ||
| 3882 | { | ||
| 3883 | - | ||
| 3884 | + const u_char *dt; | ||
| 3885 | entry = netsnmp_swinst_entry_create( i++ ); | ||
| 3886 | if (NULL == entry) | ||
| 3887 | continue; /* error already logged by function */ | ||
| 3888 | - rc = CONTAINER_INSERT(container, entry); | ||
| 3889 | + CONTAINER_INSERT(container, entry); | ||
| 3890 | |||
| 3891 | h = headerLink( h ); | ||
| 3892 | headerGetEntry( h, RPMTAG_NAME, NULL, (void**)&n, NULL); | ||
| 3893 | @@ -134,8 +134,15 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags) | ||
| 3894 | : 4; /* application */ | ||
| 3895 | |||
| 3896 | install_time = *t; | ||
| 3897 | - entry->swDate_len = snprintf( entry->swDate, sizeof(entry->swDate), | ||
| 3898 | - "%s", date_n_time( &install_time, &date_len )); | ||
| 3899 | + dt = date_n_time( &install_time, &date_len ); | ||
| 3900 | + if (date_len != 8 && date_len != 11) { | ||
| 3901 | + snmp_log(LOG_ERR, "Bogus length from date_n_time for %s", entry->swName); | ||
| 3902 | + entry->swDate_len = 0; | ||
| 3903 | + } | ||
| 3904 | + else { | ||
| 3905 | + entry->swDate_len = date_len; | ||
| 3906 | + memcpy(entry->swDate, dt, entry->swDate_len); | ||
| 3907 | + } | ||
| 3908 | |||
| 3909 | headerFree( h ); | ||
| 3910 | } | ||
| 3911 | diff --git a/agent/mibgroup/host/data_access/swrun_darwin.c b/agent/mibgroup/host/data_access/swrun_darwin.c | ||
| 3912 | index 7d07cd5..6c6b82a 100644 | ||
| 3913 | --- a/agent/mibgroup/host/data_access/swrun_darwin.c | ||
| 3914 | +++ b/agent/mibgroup/host/data_access/swrun_darwin.c | ||
| 3915 | @@ -289,8 +289,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry) | ||
| 3916 | exec_path = (char *)ip; | ||
| 3917 | DEBUGMSGTL(("swrun:load:arch:_cn"," exec_path %s\n", exec_path)); | ||
| 3918 | len = strlen(exec_path); | ||
| 3919 | - strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1); | ||
| 3920 | - entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0; | ||
| 3921 | + strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)); | ||
| 3922 | if (len > sizeof(entry->hrSWRunPath)-1) { | ||
| 3923 | DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n")); | ||
| 3924 | entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$'; | ||
| 3925 | @@ -326,8 +325,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry) | ||
| 3926 | DEBUGMSGTL(("swrun:load:arch:_cn", | ||
| 3927 | SWRUNINDENT "kernel name %s\n", command)); | ||
| 3928 | if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) { | ||
| 3929 | - strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1); | ||
| 3930 | - entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0; | ||
| 3931 | + strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)); | ||
| 3932 | entry->hrSWRunName_len = strlen(entry->hrSWRunName); | ||
| 3933 | DEBUGMSGTL(("swrun:load:arch:_cn", "**" | ||
| 3934 | SWRUNINDENT "updated name to %s\n", entry->hrSWRunName)); | ||
| 3935 | @@ -369,8 +367,7 @@ _set_command_name(netsnmp_swrun_entry *entry) | ||
| 3936 | |||
| 3937 | exec_path = arg_buf + sizeof(nargs); | ||
| 3938 | len = strlen(exec_path); | ||
| 3939 | - strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1); | ||
| 3940 | - entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0; | ||
| 3941 | + strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)); | ||
| 3942 | if (len > sizeof(entry->hrSWRunPath)-1) { | ||
| 3943 | DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n")); | ||
| 3944 | entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$'; | ||
| 3945 | @@ -459,8 +456,8 @@ _set_command_name(netsnmp_swrun_entry *entry) | ||
| 3946 | * save arg | ||
| 3947 | */ | ||
| 3948 | if(entry->hrSWRunParameters_len < sizeof(entry->hrSWRunParameters)-1) { | ||
| 3949 | - strncat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len], argN, | ||
| 3950 | - sizeof(entry->hrSWRunParameters) - entry->hrSWRunParameters_len - 2); | ||
| 3951 | + strlcat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len], | ||
| 3952 | + argN, sizeof(entry->hrSWRunParameters)); | ||
| 3953 | entry->hrSWRunParameters_len = strlen(entry->hrSWRunParameters); | ||
| 3954 | if ((entry->hrSWRunParameters_len+2 < sizeof(entry->hrSWRunParameters)-1) && (0 != nargs)) { | ||
| 3955 | /* add space between params */ | ||
| 3956 | @@ -486,8 +483,7 @@ _set_command_name(netsnmp_swrun_entry *entry) | ||
| 3957 | |||
| 3958 | /* Allocate space for the command and copy. */ | ||
| 3959 | if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) { | ||
| 3960 | - strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1); | ||
| 3961 | - entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0; | ||
| 3962 | + strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)); | ||
| 3963 | entry->hrSWRunName_len = strlen(entry->hrSWRunName); | ||
| 3964 | DEBUGMSGTL(("swrun:load:arch:_cn", | ||
| 3965 | " **updated name to %s\n", entry->hrSWRunName)); | ||
| 3966 | diff --git a/agent/mibgroup/host/data_access/swrun_kinfo.c b/agent/mibgroup/host/data_access/swrun_kinfo.c | ||
| 3967 | index aae5f62..64583bf 100644 | ||
| 3968 | --- a/agent/mibgroup/host/data_access/swrun_kinfo.c | ||
| 3969 | +++ b/agent/mibgroup/host/data_access/swrun_kinfo.c | ||
| 3970 | @@ -236,7 +236,7 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags) | ||
| 3971 | : 4 /* application */ | ||
| 3972 | ; | ||
| 3973 | |||
| 3974 | -#ifdef netbsdelf5 | ||
| 3975 | +#ifdef netbsd5 | ||
| 3976 | switch (proc_table[i].SWRUN_K_STAT) { | ||
| 3977 | case LSONPROC: | ||
| 3978 | case LSRUN: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING; | ||
| 3979 | diff --git a/agent/mibgroup/host/data_access/swrun_procfs_status.c b/agent/mibgroup/host/data_access/swrun_procfs_status.c | ||
| 3980 | index 367f422..a9aa2d8 100644 | ||
| 3981 | --- a/agent/mibgroup/host/data_access/swrun_procfs_status.c | ||
| 3982 | +++ b/agent/mibgroup/host/data_access/swrun_procfs_status.c | ||
| 3983 | @@ -123,32 +123,26 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags) | ||
| 3984 | } | ||
| 3985 | fclose(fp); | ||
| 3986 | |||
| 3987 | - if ( cp ) { | ||
| 3988 | - /* | ||
| 3989 | - * argv[0] is hrSWRunPath | ||
| 3990 | - */ | ||
| 3991 | - entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath, | ||
| 3992 | - sizeof(entry->hrSWRunPath)-1, "%s", buf); | ||
| 3993 | - /* | ||
| 3994 | - * Stitch together argv[1..] to construct hrSWRunParameters | ||
| 3995 | - */ | ||
| 3996 | - cp = buf + entry->hrSWRunPath_len+1; | ||
| 3997 | - while ( 1 ) { | ||
| 3998 | - while (*cp) | ||
| 3999 | - cp++; | ||
| 4000 | - if ( '\0' == *(cp+1)) | ||
| 4001 | - break; /* '\0''\0' => End of command line */ | ||
| 4002 | - *cp = ' '; | ||
| 4003 | - } | ||
| 4004 | - entry->hrSWRunParameters_len | ||
| 4005 | - = sprintf(entry->hrSWRunParameters, "%.*s", | ||
| 4006 | - (int)sizeof(entry->hrSWRunParameters) - 1, | ||
| 4007 | - buf + entry->hrSWRunPath_len + 1); | ||
| 4008 | - } else { | ||
| 4009 | - memcpy(entry->hrSWRunPath, entry->hrSWRunName, entry->hrSWRunName_len); | ||
| 4010 | - entry->hrSWRunPath_len = entry->hrSWRunName_len; | ||
| 4011 | - entry->hrSWRunParameters_len = 0; | ||
| 4012 | + /* | ||
| 4013 | + * argv[0] is hrSWRunPath | ||
| 4014 | + */ | ||
| 4015 | + entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath, | ||
| 4016 | + sizeof(entry->hrSWRunPath)-1, "%s", buf); | ||
| 4017 | + /* | ||
| 4018 | + * Stitch together argv[1..] to construct hrSWRunParameters | ||
| 4019 | + */ | ||
| 4020 | + cp = buf + entry->hrSWRunPath_len+1; | ||
| 4021 | + while ( 1 ) { | ||
| 4022 | + while (*cp) | ||
| 4023 | + cp++; | ||
| 4024 | + if ( '\0' == *(cp+1)) | ||
| 4025 | + break; /* '\0''\0' => End of command line */ | ||
| 4026 | + *cp = ' '; | ||
| 4027 | } | ||
| 4028 | + entry->hrSWRunParameters_len | ||
| 4029 | + = sprintf(entry->hrSWRunParameters, "%.*s", | ||
| 4030 | + (int)sizeof(entry->hrSWRunParameters) - 1, | ||
| 4031 | + buf + entry->hrSWRunPath_len + 1); | ||
| 4032 | |||
| 4033 | /* | ||
| 4034 | * XXX - No information regarding system processes vs applications | ||
| 4035 | diff --git a/agent/mibgroup/host/hrSWInstalledTable.c b/agent/mibgroup/host/hrSWInstalledTable.c | ||
| 4036 | index 71d2a38..ad8aee3 100644 | ||
| 4037 | --- a/agent/mibgroup/host/hrSWInstalledTable.c | ||
| 4038 | +++ b/agent/mibgroup/host/hrSWInstalledTable.c | ||
| 4039 | @@ -143,6 +143,7 @@ initialize_table_hrSWInstalledTable(void) | ||
| 4040 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 4041 | snmp_log(LOG_ERR,"error registering table handler for " | ||
| 4042 | MYTABLE "\n"); | ||
| 4043 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 4044 | goto bail; | ||
| 4045 | } | ||
| 4046 | |||
| 4047 | diff --git a/agent/mibgroup/host/hrSWRunPerfTable.c b/agent/mibgroup/host/hrSWRunPerfTable.c | ||
| 4048 | index 7a9adfa..43b44d1 100644 | ||
| 4049 | --- a/agent/mibgroup/host/hrSWRunPerfTable.c | ||
| 4050 | +++ b/agent/mibgroup/host/hrSWRunPerfTable.c | ||
| 4051 | @@ -115,6 +115,7 @@ initialize_table_hrSWRunPerfTable(void) | ||
| 4052 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 4053 | snmp_log(LOG_ERR,"error registering table handler for " | ||
| 4054 | MYTABLE "\n"); | ||
| 4055 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 4056 | goto bail; | ||
| 4057 | } | ||
| 4058 | |||
| 4059 | diff --git a/agent/mibgroup/host/hrSWRunTable.c b/agent/mibgroup/host/hrSWRunTable.c | ||
| 4060 | index 946813e..03ad256 100644 | ||
| 4061 | --- a/agent/mibgroup/host/hrSWRunTable.c | ||
| 4062 | +++ b/agent/mibgroup/host/hrSWRunTable.c | ||
| 4063 | @@ -128,6 +128,7 @@ initialize_table_hrSWRunTable(void) | ||
| 4064 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 4065 | snmp_log(LOG_ERR,"error registering table handler for " | ||
| 4066 | MYTABLE "\n"); | ||
| 4067 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 4068 | goto bail; | ||
| 4069 | } | ||
| 4070 | |||
| 4071 | diff --git a/agent/mibgroup/host/hr_device.c b/agent/mibgroup/host/hr_device.c | ||
| 4072 | index c2e112c..24031bf 100644 | ||
| 4073 | --- a/agent/mibgroup/host/hr_device.c | ||
| 4074 | +++ b/agent/mibgroup/host/hr_device.c | ||
| 4075 | @@ -250,8 +250,7 @@ really_try_next: | ||
| 4076 | case HRDEV_DESCR: | ||
| 4077 | if ((device_descr[type] != NULL) && | ||
| 4078 | (NULL!=(tmp_str=((*device_descr[type])(dev_idx))))) { | ||
| 4079 | - strncpy(string, tmp_str, sizeof(string)-1); | ||
| 4080 | - string[ sizeof(string)-1] = 0; | ||
| 4081 | + strlcpy(string, tmp_str, sizeof(string)); | ||
| 4082 | } else | ||
| 4083 | #if NETSNMP_NO_DUMMY_VALUES | ||
| 4084 | goto try_next; | ||
| 4085 | diff --git a/agent/mibgroup/host/hr_disk.c b/agent/mibgroup/host/hr_disk.c | ||
| 4086 | index d8f874f..679264b 100644 | ||
| 4087 | --- a/agent/mibgroup/host/hr_disk.c | ||
| 4088 | +++ b/agent/mibgroup/host/hr_disk.c | ||
| 4089 | @@ -355,7 +355,7 @@ parse_disk_config(const char *token, char *cptr) | ||
| 4090 | di_curr->item_details = (void *) 0; | ||
| 4091 | name++; | ||
| 4092 | } else if (*name == '[') { | ||
| 4093 | - d_set = (details_set *) malloc(sizeof(details_set)); | ||
| 4094 | + d_set = (details_set *) calloc(sizeof(details_set), 1); | ||
| 4095 | if (!d_set) { | ||
| 4096 | config_perror("Out of memory"); | ||
| 4097 | SNMP_FREE(d_new); | ||
| 4098 | @@ -364,8 +364,6 @@ parse_disk_config(const char *token, char *cptr) | ||
| 4099 | SNMP_FREE(d_str); | ||
| 4100 | return; | ||
| 4101 | } | ||
| 4102 | - for (i = 0; i < sizeof(details_set); i++) | ||
| 4103 | - (*d_set)[i] = (unsigned char) 0; | ||
| 4104 | name++; | ||
| 4105 | if (*name == '^' || *name == '!') { | ||
| 4106 | neg = 1; | ||
| 4107 | @@ -904,16 +902,14 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull) | ||
| 4108 | |||
| 4109 | sess_ref = DASessionCreate( NULL ); | ||
| 4110 | if (NULL == sess_ref) { | ||
| 4111 | - strncpy(string, devfull, str_len); | ||
| 4112 | - string[str_len-1] = 0; | ||
| 4113 | + strlcpy(string, devfull, str_len); | ||
| 4114 | return -1; | ||
| 4115 | } | ||
| 4116 | |||
| 4117 | disk = DADiskCreateFromBSDName( NULL, sess_ref, devfull ); | ||
| 4118 | if (NULL == disk) { | ||
| 4119 | CFRelease(sess_ref); | ||
| 4120 | - strncpy(string, devfull, str_len); | ||
| 4121 | - string[str_len-1] = 0; | ||
| 4122 | + strlcpy(string, devfull, str_len); | ||
| 4123 | return -1; | ||
| 4124 | } | ||
| 4125 | |||
| 4126 | @@ -924,7 +920,7 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull) | ||
| 4127 | devfull); | ||
| 4128 | CFRelease(disk); | ||
| 4129 | CFRelease(sess_ref); | ||
| 4130 | - strncpy(string, devfull, str_len); | ||
| 4131 | + strlcpy(string, devfull, str_len); | ||
| 4132 | return -1; | ||
| 4133 | } | ||
| 4134 | |||
| 4135 | @@ -932,14 +928,12 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull) | ||
| 4136 | str_ref = (CFStringRef) | ||
| 4137 | CFDictionaryGetValue(desc, kDADiskDescriptionMediaNameKey); | ||
| 4138 | if (str_ref) { | ||
| 4139 | - strncpy(string, CFStringGetCStringPtr(str_ref, sys_encoding), | ||
| 4140 | + strlcpy(string, CFStringGetCStringPtr(str_ref, sys_encoding), | ||
| 4141 | str_len); | ||
| 4142 | - string[str_len-1] = 0; | ||
| 4143 | DEBUGMSGTL(("verbose:diskmgr:darwin", " name %s\n", string)); | ||
| 4144 | } | ||
| 4145 | else { | ||
| 4146 | - strncpy(string, devfull, str_len); | ||
| 4147 | - string[str_len-1] = 0; | ||
| 4148 | + strlcpy(string, devfull, str_len); | ||
| 4149 | } | ||
| 4150 | |||
| 4151 | CFRelease(disk); | ||
| 4152 | @@ -984,27 +978,21 @@ static void | ||
| 4153 | Save_HR_Disk_General(void) | ||
| 4154 | { | ||
| 4155 | #ifdef DIOC_DESCRIBE | ||
| 4156 | - strncpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel)-1); | ||
| 4157 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4158 | + strlcpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel)); | ||
| 4159 | #endif | ||
| 4160 | #ifdef DKIOCINFO | ||
| 4161 | - strncpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel)-1); | ||
| 4162 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4163 | + strlcpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel)); | ||
| 4164 | #endif | ||
| 4165 | #ifdef HAVE_LINUX_HDREG_H | ||
| 4166 | - strncpy(HRD_savedModel, (const char *) HRD_info.model, | ||
| 4167 | - sizeof(HRD_savedModel)-1); | ||
| 4168 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4169 | + strlcpy(HRD_savedModel, (const char *) HRD_info.model, | ||
| 4170 | + sizeof(HRD_savedModel)); | ||
| 4171 | #endif | ||
| 4172 | #ifdef DIOCGDINFO | ||
| 4173 | - strncpy(HRD_savedModel, dktypenames[HRD_info.d_type], | ||
| 4174 | - sizeof(HRD_savedModel)-1); | ||
| 4175 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4176 | + strlcpy(HRD_savedModel, dktypenames[HRD_info.d_type], | ||
| 4177 | + sizeof(HRD_savedModel)); | ||
| 4178 | #endif | ||
| 4179 | #ifdef darwin | ||
| 4180 | - strncpy(HRD_savedModel, HRD_model, | ||
| 4181 | - sizeof(HRD_savedModel)-1); | ||
| 4182 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4183 | + strlcpy(HRD_savedModel, HRD_model, sizeof(HRD_savedModel)); | ||
| 4184 | #endif | ||
| 4185 | } | ||
| 4186 | |||
| 4187 | @@ -1149,9 +1137,8 @@ Query_Disk(int fd, const char *devfull) | ||
| 4188 | str_ref = (CFStringRef) | ||
| 4189 | CFDictionaryGetValue(desc, kDADiskDescriptionDeviceModelKey); | ||
| 4190 | if (str_ref) { | ||
| 4191 | - strncpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding), | ||
| 4192 | + strlcpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding), | ||
| 4193 | sizeof(HRD_model)); | ||
| 4194 | - HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0; | ||
| 4195 | DEBUGMSGTL(("verbose:diskmgr:darwin", " model %s\n", HRD_model)); | ||
| 4196 | } | ||
| 4197 | else | ||
| 4198 | diff --git a/agent/mibgroup/host/hr_filesys.c b/agent/mibgroup/host/hr_filesys.c | ||
| 4199 | index 660e706..b23d322 100644 | ||
| 4200 | --- a/agent/mibgroup/host/hr_filesys.c | ||
| 4201 | +++ b/agent/mibgroup/host/hr_filesys.c | ||
| 4202 | @@ -361,15 +361,13 @@ var_hrfilesys(struct variable *vp, | ||
| 4203 | long_return = fsys_idx; | ||
| 4204 | return (u_char *) & long_return; | ||
| 4205 | case HRFSYS_MOUNT: | ||
| 4206 | - snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_mount); | ||
| 4207 | - string[ sizeof(string)-1 ] = 0; | ||
| 4208 | + strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string)); | ||
| 4209 | *var_len = strlen(string); | ||
| 4210 | return (u_char *) string; | ||
| 4211 | case HRFSYS_RMOUNT: | ||
| 4212 | - if (Check_HR_FileSys_NFS()) { | ||
| 4213 | - snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_name); | ||
| 4214 | - string[ sizeof(string)-1 ] = 0; | ||
| 4215 | - } else | ||
| 4216 | + if (Check_HR_FileSys_NFS()) | ||
| 4217 | + strlcpy(string, HRFS_entry->HRFS_name, sizeof(string)); | ||
| 4218 | + else | ||
| 4219 | string[0] = '\0'; | ||
| 4220 | *var_len = strlen(string); | ||
| 4221 | return (u_char *) string; | ||
| 4222 | @@ -945,17 +943,14 @@ cook_device(char *dev) | ||
| 4223 | static char cooked_dev[SNMP_MAXPATH+1]; | ||
| 4224 | |||
| 4225 | if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) { | ||
| 4226 | - strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1); | ||
| 4227 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4228 | - strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX), | ||
| 4229 | - sizeof(cooked_dev)-strlen(cooked_dev)-1); | ||
| 4230 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4231 | + strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)); | ||
| 4232 | + strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX), | ||
| 4233 | + sizeof(cooked_dev)); | ||
| 4234 | } else { | ||
| 4235 | - strncpy(cooked_dev, dev, sizeof(cooked_dev)-1); | ||
| 4236 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4237 | + strlcpy(cooked_dev, dev, sizeof(cooked_dev)); | ||
| 4238 | } | ||
| 4239 | |||
| 4240 | - return (cooked_dev); | ||
| 4241 | + return cooked_dev; | ||
| 4242 | } | ||
| 4243 | |||
| 4244 | |||
| 4245 | diff --git a/agent/mibgroup/host/hr_proc.c b/agent/mibgroup/host/hr_proc.c | ||
| 4246 | index 9d44c7b..6f93079 100644 | ||
| 4247 | --- a/agent/mibgroup/host/hr_proc.c | ||
| 4248 | +++ b/agent/mibgroup/host/hr_proc.c | ||
| 4249 | @@ -164,6 +164,7 @@ var_hrproc(struct variable * vp, | ||
| 4250 | int exact, size_t * var_len, WriteMethod ** write_method) | ||
| 4251 | { | ||
| 4252 | int proc_idx; | ||
| 4253 | + unsigned long long value; | ||
| 4254 | netsnmp_cpu_info *cpu; | ||
| 4255 | |||
| 4256 | proc_idx = | ||
| 4257 | @@ -181,9 +182,9 @@ var_hrproc(struct variable * vp, | ||
| 4258 | ( cpu->history[0].total_hist == cpu->total_ticks )) | ||
| 4259 | return NULL; | ||
| 4260 | |||
| 4261 | - long_return = (cpu->idle_ticks - cpu->history[0].idle_hist)*100; | ||
| 4262 | - long_return /= (cpu->total_ticks - cpu->history[0].total_hist); | ||
| 4263 | - long_return = 100 - long_return; | ||
| 4264 | + value = (cpu->idle_ticks - cpu->history[0].idle_hist)*100; | ||
| 4265 | + value /= (cpu->total_ticks - cpu->history[0].total_hist); | ||
| 4266 | + long_return = 100 - value; | ||
| 4267 | if (long_return < 0) | ||
| 4268 | long_return = 0; | ||
| 4269 | return (u_char *) & long_return; | ||
| 4270 | diff --git a/agent/mibgroup/host/hr_storage.c b/agent/mibgroup/host/hr_storage.c | ||
| 4271 | index 4b8ba8a..264fecc 100644 | ||
| 4272 | --- a/agent/mibgroup/host/hr_storage.c | ||
| 4273 | +++ b/agent/mibgroup/host/hr_storage.c | ||
| 4274 | @@ -595,8 +595,7 @@ really_try_next: | ||
| 4275 | return (u_char *) storage_type_id; | ||
| 4276 | case HRSTORE_DESCR: | ||
| 4277 | if (store_idx > NETSNMP_MEM_TYPE_MAX) { | ||
| 4278 | - strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1); | ||
| 4279 | - string[ sizeof(string)-1 ] = 0; | ||
| 4280 | + strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string)); | ||
| 4281 | *var_len = strlen(string); | ||
| 4282 | return (u_char *) string; | ||
| 4283 | } else { | ||
| 4284 | diff --git a/agent/mibgroup/host/hr_swinst.c b/agent/mibgroup/host/hr_swinst.c | ||
| 4285 | index 91c660c..4aa4593 100644 | ||
| 4286 | --- a/agent/mibgroup/host/hr_swinst.c | ||
| 4287 | +++ b/agent/mibgroup/host/hr_swinst.c | ||
| 4288 | @@ -405,10 +405,8 @@ var_hrswinst(struct variable * vp, | ||
| 4289 | case HRSWINST_UPDATE: | ||
| 4290 | string[0] = '\0'; | ||
| 4291 | |||
| 4292 | - if (swi->swi_directory != NULL) { | ||
| 4293 | - strncpy(string, swi->swi_directory, sizeof(string)); | ||
| 4294 | - string[ sizeof(string)-1 ] = 0; | ||
| 4295 | - } | ||
| 4296 | + if (swi->swi_directory != NULL) | ||
| 4297 | + strlcpy(string, swi->swi_directory, sizeof(string)); | ||
| 4298 | |||
| 4299 | if (*string && (stat(string, &stat_buf) != -1)) { | ||
| 4300 | if (stat_buf.st_mtime > starttime.tv_sec) | ||
| 4301 | @@ -436,7 +434,7 @@ var_hrswinst(struct variable * vp, | ||
| 4302 | #ifdef HAVE_PKGINFO | ||
| 4303 | char *pver; | ||
| 4304 | # endif | ||
| 4305 | - strncpy(string, swi->swi_name, sizeof(string) - 1); | ||
| 4306 | + strlcpy(string, swi->swi_name, sizeof(string)); | ||
| 4307 | |||
| 4308 | /* If we are on a solaris machine, the package names do not include versioning info, | ||
| 4309 | * so we must add it manually | ||
| 4310 | diff --git a/agent/mibgroup/host/hr_swrun.c b/agent/mibgroup/host/hr_swrun.c | ||
| 4311 | index 9e11f2e..644e7bd 100644 | ||
| 4312 | --- a/agent/mibgroup/host/hr_swrun.c | ||
| 4313 | +++ b/agent/mibgroup/host/hr_swrun.c | ||
| 4314 | @@ -657,14 +657,12 @@ var_hrswrun(struct variable * vp, | ||
| 4315 | return (u_char *) & long_return; | ||
| 4316 | case HRSWRUN_NAME: | ||
| 4317 | #ifdef HAVE_SYS_PSTAT_H | ||
| 4318 | - snprintf(string, sizeof(string), "%s", proc_buf.pst_cmd); | ||
| 4319 | - string[ sizeof(string)-1 ] = 0; | ||
| 4320 | + strlcpy(string, proc_buf.pst_cmd, sizeof(string)); | ||
| 4321 | cp = strchr(string, ' '); | ||
| 4322 | if (cp != NULL) | ||
| 4323 | *cp = '\0'; | ||
| 4324 | #elif defined(dynix) | ||
| 4325 | - snprintf(string, sizeof(string), "%s", lowpsinfo.pr_fname); | ||
| 4326 | - string[ sizeof(string)-1 ] = 0; | ||
| 4327 | + strlcpy(string, lowpsinfo.pr_fname, sizeof(string)); | ||
| 4328 | cp = strchr(string, ' '); | ||
| 4329 | if (cp != NULL) | ||
| 4330 | *cp = '\0'; | ||
| 4331 | @@ -673,19 +671,16 @@ var_hrswrun(struct variable * vp, | ||
| 4332 | if (proc_buf) { | ||
| 4333 | char *pos=strchr(proc_buf->pr_psargs,' '); | ||
| 4334 | if (pos != NULL) *pos = '\0'; | ||
| 4335 | - strlcpy(string, basename(proc_buf->pr_psargs),sizeof(string)); | ||
| 4336 | + strlcpy(string, basename(proc_buf->pr_psargs), sizeof(string)); | ||
| 4337 | if (pos != NULL) *pos=' '; | ||
| 4338 | } else { | ||
| 4339 | - strcpy(string, "<exited>"); | ||
| 4340 | + strlcpy(string, "<exited>", sizeof(string)); | ||
| 4341 | } | ||
| 4342 | - string[ sizeof(string)-1 ] = 0; | ||
| 4343 | #else | ||
| 4344 | - strncpy(string, proc_buf->p_user.u_comm, sizeof(string)); | ||
| 4345 | - string[ sizeof(string)-1 ] = 0; | ||
| 4346 | + strlcpy(string, proc_buf->p_user.u_comm, sizeof(string)); | ||
| 4347 | #endif | ||
| 4348 | #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) | ||
| 4349 | - strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string)); | ||
| 4350 | - string[ sizeof(string)-1 ] = 0; | ||
| 4351 | + strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string)); | ||
| 4352 | cp = strchr(string, ' '); | ||
| 4353 | if (cp != NULL) | ||
| 4354 | *cp = '\0'; | ||
| 4355 | @@ -806,8 +801,7 @@ var_hrswrun(struct variable * vp, | ||
| 4356 | *cp1 = 0; | ||
| 4357 | #endif | ||
| 4358 | #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) | ||
| 4359 | - strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string)); | ||
| 4360 | - string[ sizeof(string)-1 ] = 0; | ||
| 4361 | + strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string)); | ||
| 4362 | cp = strchr(string, ' '); | ||
| 4363 | if (cp != NULL) | ||
| 4364 | *cp = '\0'; | ||
| 4365 | diff --git a/agent/mibgroup/host/hr_system.c b/agent/mibgroup/host/hr_system.c | ||
| 4366 | index da38c74..9fea4f4 100644 | ||
| 4367 | --- a/agent/mibgroup/host/hr_system.c | ||
| 4368 | +++ b/agent/mibgroup/host/hr_system.c | ||
| 4369 | @@ -469,9 +469,7 @@ static int set_solaris_eeprom_parameter(const char *key, const char *value, | ||
| 4370 | } | ||
| 4371 | |||
| 4372 | |||
| 4373 | - sprintf(pbuffer,"eeprom %s=\"",key); | ||
| 4374 | - strncat(pbuffer,value,var_val_len); | ||
| 4375 | - strcat(pbuffer,"\"\n"); | ||
| 4376 | + sprintf(pbuffer, "eeprom %s=\"%.*s\"\n", key, var_val_len, value); | ||
| 4377 | |||
| 4378 | status=system(pbuffer); | ||
| 4379 | |||
| 4380 | diff --git a/agent/mibgroup/host/hrh_filesys.c b/agent/mibgroup/host/hrh_filesys.c | ||
| 4381 | index fd84bde..4aab6a0 100644 | ||
| 4382 | --- a/agent/mibgroup/host/hrh_filesys.c | ||
| 4383 | +++ b/agent/mibgroup/host/hrh_filesys.c | ||
| 4384 | @@ -350,13 +350,13 @@ when_dumped(char *filesys, int level, size_t * length) | ||
| 4385 | continue; | ||
| 4386 | |||
| 4387 | ++cp2; | ||
| 4388 | - while (isspace(*cp2)) | ||
| 4389 | + while (isspace(0xFF & *cp2)) | ||
| 4390 | ++cp2; /* Now find the dump level */ | ||
| 4391 | |||
| 4392 | if (level == FULL_DUMP) { | ||
| 4393 | if (*(cp2++) != '0') | ||
| 4394 | continue; /* Not interested in partial dumps */ | ||
| 4395 | - while (isspace(*cp2)) | ||
| 4396 | + while (isspace(0xFF & *cp2)) | ||
| 4397 | ++cp2; | ||
| 4398 | |||
| 4399 | dumpdate = ctime_to_timet(cp2); | ||
| 4400 | @@ -365,7 +365,7 @@ when_dumped(char *filesys, int level, size_t * length) | ||
| 4401 | } else { /* Partial Dump */ | ||
| 4402 | if (*(cp2++) == '0') | ||
| 4403 | continue; /* Not interested in full dumps */ | ||
| 4404 | - while (isspace(*cp2)) | ||
| 4405 | + while (isspace(0xFF & *cp2)) | ||
| 4406 | ++cp2; | ||
| 4407 | |||
| 4408 | tmp = ctime_to_timet(cp2); | ||
| 4409 | @@ -390,17 +390,14 @@ cook_device(char *dev) | ||
| 4410 | static char cooked_dev[SNMP_MAXPATH+1]; | ||
| 4411 | |||
| 4412 | if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) { | ||
| 4413 | - strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1); | ||
| 4414 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4415 | - strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX), | ||
| 4416 | - sizeof(cooked_dev)-strlen(cooked_dev)-1); | ||
| 4417 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4418 | + strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)); | ||
| 4419 | + strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX), | ||
| 4420 | + sizeof(cooked_dev)); | ||
| 4421 | } else { | ||
| 4422 | - strncpy(cooked_dev, dev, sizeof(cooked_dev)-1); | ||
| 4423 | - cooked_dev[ sizeof(cooked_dev)-1 ] = 0; | ||
| 4424 | + strlcpy(cooked_dev, dev, sizeof(cooked_dev)); | ||
| 4425 | } | ||
| 4426 | |||
| 4427 | - return (cooked_dev); | ||
| 4428 | + return cooked_dev; | ||
| 4429 | } | ||
| 4430 | |||
| 4431 | |||
| 4432 | diff --git a/agent/mibgroup/host/hrh_storage.c b/agent/mibgroup/host/hrh_storage.c | ||
| 4433 | index 27841a4..ca2f854 100644 | ||
| 4434 | --- a/agent/mibgroup/host/hrh_storage.c | ||
| 4435 | +++ b/agent/mibgroup/host/hrh_storage.c | ||
| 4436 | @@ -408,8 +408,7 @@ really_try_next: | ||
| 4437 | return (u_char *) storage_type_id; | ||
| 4438 | case HRSTORE_DESCR: | ||
| 4439 | if (store_idx > NETSNMP_MEM_TYPE_MAX) { | ||
| 4440 | - strncpy(string, HRFS_entry->path, sizeof(string)-1); | ||
| 4441 | - string[ sizeof(string)-1 ] = 0; | ||
| 4442 | + strlcpy(string, HRFS_entry->path, sizeof(string)); | ||
| 4443 | *var_len = strlen(string); | ||
| 4444 | return (u_char *) string; | ||
| 4445 | } else { | ||
| 4446 | diff --git a/agent/mibgroup/if-mib/data_access/interface_ioctl.c b/agent/mibgroup/if-mib/data_access/interface_ioctl.c | ||
| 4447 | index 66aec99..db2c245 100644 | ||
| 4448 | --- a/agent/mibgroup/if-mib/data_access/interface_ioctl.c | ||
| 4449 | +++ b/agent/mibgroup/if-mib/data_access/interface_ioctl.c | ||
| 4450 | @@ -70,8 +70,7 @@ _ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name) | ||
| 4451 | } | ||
| 4452 | } | ||
| 4453 | |||
| 4454 | - strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 4455 | - ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0; | ||
| 4456 | + strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 4457 | rc = ioctl(fd, which, ifrq); | ||
| 4458 | if (rc < 0) { | ||
| 4459 | snmp_log(LOG_ERR,"ioctl %d returned %d\n", which, rc); | ||
| 4460 | @@ -157,6 +156,11 @@ netsnmp_access_interface_ioctl_physaddr_get(int fd, | ||
| 4461 | ifentry->type = IANAIFTYPE_TUNNEL; | ||
| 4462 | break; /* tunnel */ | ||
| 4463 | #endif | ||
| 4464 | +#ifdef ARPHRD_INFINIBAND | ||
| 4465 | + case ARPHRD_INFINIBAND: | ||
| 4466 | + ifentry->type = IANAIFTYPE_INFINIBAND; | ||
| 4467 | + break; | ||
| 4468 | +#endif | ||
| 4469 | #ifdef ARPHRD_SLIP | ||
| 4470 | case ARPHRD_SLIP: | ||
| 4471 | case ARPHRD_CSLIP: | ||
| 4472 | @@ -323,8 +327,7 @@ netsnmp_access_interface_ioctl_flags_set(int fd, | ||
| 4473 | } | ||
| 4474 | } | ||
| 4475 | |||
| 4476 | - strncpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name)); | ||
| 4477 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 4478 | + strlcpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name)); | ||
| 4479 | rc = ioctl(fd, SIOCGIFFLAGS, &ifrq); | ||
| 4480 | if(rc < 0) { | ||
| 4481 | snmp_log(LOG_ERR,"error getting flags\n"); | ||
| 4482 | diff --git a/agent/mibgroup/if-mib/data_access/interface_linux.c b/agent/mibgroup/if-mib/data_access/interface_linux.c | ||
| 4483 | index 9810b15..e291b9f 100644 | ||
| 4484 | --- a/agent/mibgroup/if-mib/data_access/interface_linux.c | ||
| 4485 | +++ b/agent/mibgroup/if-mib/data_access/interface_linux.c | ||
| 4486 | @@ -589,6 +589,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container, | ||
| 4487 | fd = socket(AF_INET, SOCK_DGRAM, 0); | ||
| 4488 | if(fd < 0) { | ||
| 4489 | snmp_log(LOG_ERR, "could not create socket\n"); | ||
| 4490 | + fclose(devin); | ||
| 4491 | return -2; | ||
| 4492 | } | ||
| 4493 | |||
| 4494 | @@ -727,6 +728,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container, | ||
| 4495 | {IANAIFTYPE_ISO88025TOKENRING, "tr"}, | ||
| 4496 | {IANAIFTYPE_FASTETHER, "feth"}, | ||
| 4497 | {IANAIFTYPE_GIGABITETHERNET,"gig"}, | ||
| 4498 | + {IANAIFTYPE_INFINIBAND,"ib"}, | ||
| 4499 | {IANAIFTYPE_PPP, "ppp"}, | ||
| 4500 | {IANAIFTYPE_SLIP, "sl"}, | ||
| 4501 | {IANAIFTYPE_TUNNEL, "sit"}, | ||
| 4502 | @@ -891,40 +893,38 @@ unsigned long long | ||
| 4503 | netsnmp_linux_interface_get_if_speed(int fd, const char *name, | ||
| 4504 | unsigned long long defaultspeed) | ||
| 4505 | { | ||
| 4506 | + int ret; | ||
| 4507 | struct ifreq ifr; | ||
| 4508 | struct ethtool_cmd edata; | ||
| 4509 | + uint16_t speed_hi; | ||
| 4510 | + uint32_t speed; | ||
| 4511 | |||
| 4512 | memset(&ifr, 0, sizeof(ifr)); | ||
| 4513 | + memset(&edata, 0, sizeof(edata)); | ||
| 4514 | edata.cmd = ETHTOOL_GSET; | ||
| 4515 | - edata.speed = 0; | ||
| 4516 | |||
| 4517 | - strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)-1); | ||
| 4518 | + strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); | ||
| 4519 | ifr.ifr_data = (char *) &edata; | ||
| 4520 | |||
| 4521 | - if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) { | ||
| 4522 | - DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed\n", | ||
| 4523 | - ifr.ifr_name)); | ||
| 4524 | - return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed); | ||
| 4525 | - } | ||
| 4526 | - | ||
| 4527 | - if (edata.speed != SPEED_10 && edata.speed != SPEED_100 | ||
| 4528 | -#ifdef SPEED_10000 | ||
| 4529 | - && edata.speed != SPEED_10000 | ||
| 4530 | -#endif | ||
| 4531 | -#ifdef SPEED_2500 | ||
| 4532 | - && edata.speed != SPEED_2500 | ||
| 4533 | -#endif | ||
| 4534 | - && edata.speed != SPEED_1000 ) { | ||
| 4535 | - DEBUGMSGTL(("mibII/interfaces", "fallback to mii for %s\n", | ||
| 4536 | - ifr.ifr_name)); | ||
| 4537 | - /* try MII */ | ||
| 4538 | + ret = ioctl(fd, SIOCETHTOOL, &ifr); | ||
| 4539 | + if (ret == -1 || edata.speed == 0) { | ||
| 4540 | + DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed (%d / %d)\n", | ||
| 4541 | + ifr.ifr_name, ret, edata.speed)); | ||
| 4542 | return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed); | ||
| 4543 | } | ||
| 4544 | |||
| 4545 | +#ifdef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI | ||
| 4546 | + speed_hi = edata.speed_hi; | ||
| 4547 | +#else | ||
| 4548 | + speed_hi = 0; | ||
| 4549 | +#endif | ||
| 4550 | + speed = speed_hi << 16 | edata.speed; | ||
| 4551 | + if (speed == 0xffff || speed == 0xffffffffUL /*SPEED_UNKNOWN*/) | ||
| 4552 | + speed = defaultspeed; | ||
| 4553 | /* return in bps */ | ||
| 4554 | - DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %d\n", | ||
| 4555 | - ifr.ifr_name, edata.speed)); | ||
| 4556 | - return edata.speed*1000LL*1000LL; | ||
| 4557 | + DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %#x -> %d\n", | ||
| 4558 | + ifr.ifr_name, speed_hi << 16 | edata.speed, speed)); | ||
| 4559 | + return speed * 1000LL * 1000LL; | ||
| 4560 | } | ||
| 4561 | #endif | ||
| 4562 | |||
| 4563 | @@ -954,8 +954,7 @@ netsnmp_linux_interface_get_if_speed(int fd, const char *name, | ||
| 4564 | const unsigned long long media_speeds[] = {10000000, 10000000, 100000000, 100000000, 10000000, 0}; | ||
| 4565 | /* It corresponds to "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4", "Flow-control", 0, */ | ||
| 4566 | |||
| 4567 | - strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); | ||
| 4568 | - ifr.ifr_name[ sizeof(ifr.ifr_name)-1 ] = 0; | ||
| 4569 | + strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); | ||
| 4570 | data[0] = 0; | ||
| 4571 | |||
| 4572 | /* | ||
| 4573 | @@ -1042,6 +1041,10 @@ int netsnmp_prefix_listen() | ||
| 4574 | unsigned groups = 0; | ||
| 4575 | |||
| 4576 | int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); | ||
| 4577 | + if (fd < 0) { | ||
| 4578 | + snmp_log(LOG_ERR, "netsnmp_prefix_listen: Cannot create socket.\n"); | ||
| 4579 | + return -1; | ||
| 4580 | + } | ||
| 4581 | |||
| 4582 | memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl)); | ||
| 4583 | |||
| 4584 | @@ -1052,6 +1055,7 @@ int netsnmp_prefix_listen() | ||
| 4585 | |||
| 4586 | if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) < 0) { | ||
| 4587 | snmp_log(LOG_ERR,"netsnmp_prefix_listen: Bind failed.\n"); | ||
| 4588 | + close(fd); | ||
| 4589 | return -1; | ||
| 4590 | } | ||
| 4591 | |||
| 4592 | @@ -1066,11 +1070,13 @@ int netsnmp_prefix_listen() | ||
| 4593 | status = send(fd, &req, req.n.nlmsg_len, 0); | ||
| 4594 | if (status < 0) { | ||
| 4595 | snmp_log(LOG_ERR,"netsnmp_prefix_listen: send failed\n"); | ||
| 4596 | + close(fd); | ||
| 4597 | return -1; | ||
| 4598 | } | ||
| 4599 | |||
| 4600 | if (register_readfd(fd, netsnmp_prefix_process, NULL) != 0) { | ||
| 4601 | snmp_log(LOG_ERR,"netsnmp_prefix_listen: error registering netlink socket\n"); | ||
| 4602 | + close(fd); | ||
| 4603 | return -1; | ||
| 4604 | } | ||
| 4605 | return 0; | ||
| 4606 | diff --git a/agent/mibgroup/if-mib/data_access/interface_openbsd.c b/agent/mibgroup/if-mib/data_access/interface_openbsd.c | ||
| 4607 | index 552043a..8340dc6 100644 | ||
| 4608 | --- a/agent/mibgroup/if-mib/data_access/interface_openbsd.c | ||
| 4609 | +++ b/agent/mibgroup/if-mib/data_access/interface_openbsd.c | ||
| 4610 | @@ -343,12 +343,10 @@ netsnmp_openbsd_interface_get_if_speed(char *name, u_int *speed, u_int *speed_hi | ||
| 4611 | return 0; | ||
| 4612 | } | ||
| 4613 | |||
| 4614 | - (void) memset(&ifmr, 0, sizeof(ifmr)); | ||
| 4615 | - (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name)); | ||
| 4616 | - | ||
| 4617 | - if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 || | ||
| 4618 | - ifmr.ifm_count == 0) { | ||
| 4619 | + memset(&ifmr, 0, sizeof(ifmr)); | ||
| 4620 | + strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name)); | ||
| 4621 | |||
| 4622 | + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 || ifmr.ifm_count == 0) { | ||
| 4623 | close(s); | ||
| 4624 | return 0; | ||
| 4625 | } | ||
| 4626 | diff --git a/agent/mibgroup/if-mib/data_access/interface_sysctl.c b/agent/mibgroup/if-mib/data_access/interface_sysctl.c | ||
| 4627 | index 0669ffc..81efbef 100644 | ||
| 4628 | --- a/agent/mibgroup/if-mib/data_access/interface_sysctl.c | ||
| 4629 | +++ b/agent/mibgroup/if-mib/data_access/interface_sysctl.c | ||
| 4630 | @@ -252,8 +252,8 @@ netsnmp_sysctl_get_if_speed(char *name, u_int *speed, | ||
| 4631 | return 0; | ||
| 4632 | } | ||
| 4633 | |||
| 4634 | - (void) memset(&ifmr, 0, sizeof(ifmr)); | ||
| 4635 | - (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name)); | ||
| 4636 | + memset(&ifmr, 0, sizeof(ifmr)); | ||
| 4637 | + strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name)); | ||
| 4638 | |||
| 4639 | DEBUGMSGTL(("access:interface:container:sysctl"," speed in\n")); | ||
| 4640 | if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 || | ||
| 4641 | @@ -326,6 +326,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container, | ||
| 4642 | int amask; | ||
| 4643 | char *if_name; | ||
| 4644 | int flags; | ||
| 4645 | +#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC | ||
| 4646 | + struct timespec startspec; | ||
| 4647 | + | ||
| 4648 | + TIMEVAL_TO_TIMESPEC(&starttime, &startspec); | ||
| 4649 | +#endif | ||
| 4650 | |||
| 4651 | DEBUGMSGTL(("access:interface:container:sysctl", | ||
| 4652 | "load (flags %u)\n", load_flags)); | ||
| 4653 | @@ -477,7 +482,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container, | ||
| 4654 | NETSNMP_INTERFACE_FLAGS_HAS_DROPS | | ||
| 4655 | NETSNMP_INTERFACE_FLAGS_HAS_MCAST_PKTS; | ||
| 4656 | |||
| 4657 | +#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC | ||
| 4658 | + if (timespeccmp(&ifp->ifm_data.ifi_lastchange, &startspec, >)) { | ||
| 4659 | +#else | ||
| 4660 | if (timercmp(&ifp->ifm_data.ifi_lastchange, &starttime, >)) { | ||
| 4661 | +#endif | ||
| 4662 | entry->lastchange = (ifp->ifm_data.ifi_lastchange.tv_sec - | ||
| 4663 | starttime.tv_sec) * 100; | ||
| 4664 | entry->ns_flags |= NETSNMP_INTERFACE_FLAGS_HAS_LASTCHANGE; | ||
| 4665 | @@ -502,7 +511,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container, | ||
| 4666 | |||
| 4667 | CONTAINER_INSERT(container, entry); | ||
| 4668 | DEBUGMSGTL(("access:interface:container:sysctl", | ||
| 4669 | - "created entry %d for %s\n", entry->index, entry->name)); | ||
| 4670 | + "created entry %d for %s\n", (int)entry->index, entry->name)); | ||
| 4671 | } /* for (each interface entry) */ | ||
| 4672 | |||
| 4673 | /* pass 2: walk addresses */ | ||
| 4674 | diff --git a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c | ||
| 4675 | index e82c2fd..6434b46 100644 | ||
| 4676 | --- a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c | ||
| 4677 | +++ b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c | ||
| 4678 | @@ -2021,7 +2021,7 @@ _ifXTable_container_row_restore(const char *token, char *buf) | ||
| 4679 | } | ||
| 4680 | rowreq_ctx = (ifXTable_rowreq_ctx*)CONTAINER_FIND(container, &index); | ||
| 4681 | if (NULL == rowreq_ctx) { | ||
| 4682 | - snmp_log(LOG_ERR, "error finding row index in " | ||
| 4683 | + snmp_log(LOG_DEBUG, "error finding row index in " | ||
| 4684 | "_ifXTable_container_row_restore\n"); | ||
| 4685 | return; | ||
| 4686 | } | ||
| 4687 | diff --git a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c | ||
| 4688 | index d620834..926ccb7 100644 | ||
| 4689 | --- a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c | ||
| 4690 | +++ b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c | ||
| 4691 | @@ -103,8 +103,7 @@ _load_ipv4(netsnmp_container* container, u_long *index ) | ||
| 4692 | /* | ||
| 4693 | * temporary null terminated name | ||
| 4694 | */ | ||
| 4695 | - strncpy(name, rtent_name, sizeof(name)); | ||
| 4696 | - name[ sizeof(name)-1 ] = 0; | ||
| 4697 | + strlcpy(name, rtent_name, sizeof(name)); | ||
| 4698 | |||
| 4699 | /* | ||
| 4700 | * don't bother to try and get the ifindex for routes with | ||
| 4701 | diff --git a/agent/mibgroup/ip-mib/data_access/arp_netlink.c b/agent/mibgroup/ip-mib/data_access/arp_netlink.c | ||
| 4702 | index 01a535a..2059c23 100644 | ||
| 4703 | --- a/agent/mibgroup/ip-mib/data_access/arp_netlink.c | ||
| 4704 | +++ b/agent/mibgroup/ip-mib/data_access/arp_netlink.c | ||
| 4705 | @@ -43,7 +43,7 @@ netsnmp_access_arp_create(u_int init_flags, | ||
| 4706 | if (cache_timeout != NULL) | ||
| 4707 | *cache_timeout = 5; | ||
| 4708 | if (cache_flags != NULL) | ||
| 4709 | - *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE; | ||
| 4710 | + *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD; | ||
| 4711 | access->cache_expired = cache_expired; | ||
| 4712 | |||
| 4713 | DEBUGMSGTL(("access:netlink:arp", "create arp cache\n")); | ||
| 4714 | @@ -131,6 +131,7 @@ int netsnmp_access_arp_unload(netsnmp_arp_access *access) | ||
| 4715 | unregister_readfd(fd); | ||
| 4716 | close(fd); | ||
| 4717 | access->arch_magic = NULL; | ||
| 4718 | + access->synchronized = 0; | ||
| 4719 | } | ||
| 4720 | return 0; | ||
| 4721 | } | ||
| 4722 | diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c | ||
| 4723 | index b4f7e3a..ba145cb 100644 | ||
| 4724 | --- a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c | ||
| 4725 | +++ b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c | ||
| 4726 | @@ -230,7 +230,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container, | ||
| 4727 | /* restore the interface name if we modifed it due to unaliasing | ||
| 4728 | * above | ||
| 4729 | */ | ||
| 4730 | - if (entry->flags | NETSNMP_ACCESS_IPADDRESS_ISALIAS) { | ||
| 4731 | + if (entry->flags & NETSNMP_ACCESS_IPADDRESS_ISALIAS) { | ||
| 4732 | memcpy(ifrp->ifr_name, extras->name, sizeof(extras->name)); | ||
| 4733 | } | ||
| 4734 | |||
| 4735 | @@ -242,7 +242,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container, | ||
| 4736 | addr_info = netsnmp_access_other_info_get(entry->if_index, AF_INET); | ||
| 4737 | if(addr_info.bcastflg) { | ||
| 4738 | bcastentry = netsnmp_access_ipaddress_entry_create(); | ||
| 4739 | - if(NULL == entry) { | ||
| 4740 | + if(NULL == bcastentry) { | ||
| 4741 | rc = -3; | ||
| 4742 | break; | ||
| 4743 | } | ||
| 4744 | @@ -491,11 +491,10 @@ _netsnmp_ioctl_ipaddress_set_v4(netsnmp_ipaddress_entry * entry) | ||
| 4745 | alias_idx = _next_alias(name); | ||
| 4746 | snprintf(ifrq.ifr_name,sizeof(ifrq.ifr_name), "%s:%d", | ||
| 4747 | name, alias_idx); | ||
| 4748 | + ifrq.ifr_name[sizeof(ifrq.ifr_name) - 1] = 0; | ||
| 4749 | } | ||
| 4750 | else | ||
| 4751 | - strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name)); | ||
| 4752 | - | ||
| 4753 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 4754 | + strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name)); | ||
| 4755 | |||
| 4756 | sin = (struct sockaddr_in*)&ifrq.ifr_addr; | ||
| 4757 | sin->sin_family = AF_INET; | ||
| 4758 | @@ -543,8 +542,7 @@ _netsnmp_ioctl_ipaddress_delete_v4(netsnmp_ipaddress_entry * entry) | ||
| 4759 | |||
| 4760 | memset(&ifrq, 0, sizeof(ifrq)); | ||
| 4761 | |||
| 4762 | - strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name)); | ||
| 4763 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 4764 | + strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name)); | ||
| 4765 | |||
| 4766 | ifrq.ifr_flags = 0; | ||
| 4767 | |||
| 4768 | diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c | ||
| 4769 | index 1a7d169..e2485e3 100644 | ||
| 4770 | --- a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c | ||
| 4771 | +++ b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c | ||
| 4772 | @@ -191,7 +191,7 @@ _load_v4(netsnmp_container *container, int idx_offset) | ||
| 4773 | |||
| 4774 | entry->ns_ia_index = ++idx_offset; | ||
| 4775 | |||
| 4776 | - DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", | ||
| 4777 | + DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", | ||
| 4778 | entry->if_index, entry->ia_address_len)); | ||
| 4779 | |||
| 4780 | if (CONTAINER_INSERT(container, entry) < 0) { | ||
| 4781 | @@ -276,7 +276,7 @@ _load_v6(netsnmp_container *container, int idx_offset) | ||
| 4782 | |||
| 4783 | entry->ns_ia_index = ++idx_offset; | ||
| 4784 | |||
| 4785 | - DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", | ||
| 4786 | + DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", | ||
| 4787 | entry->if_index, entry->ia_address_len)); | ||
| 4788 | |||
| 4789 | if (CONTAINER_INSERT(container, entry) < 0) { | ||
| 4790 | diff --git a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c | ||
| 4791 | index 61a4855..717fc17 100644 | ||
| 4792 | --- a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c | ||
| 4793 | +++ b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c | ||
| 4794 | @@ -356,7 +356,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin) | ||
| 4795 | char line[1024]; | ||
| 4796 | char *stats, *start = line; | ||
| 4797 | int len, rc; | ||
| 4798 | - int scan_count; | ||
| 4799 | uintmax_t scan_val; | ||
| 4800 | |||
| 4801 | /* | ||
| 4802 | @@ -516,8 +515,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin) | ||
| 4803 | |||
| 4804 | if (rc) | ||
| 4805 | DEBUGMSGTL(("access:systemstats", "unknown stat %s\n", line)); | ||
| 4806 | - else | ||
| 4807 | - ++scan_count; | ||
| 4808 | } | ||
| 4809 | /* | ||
| 4810 | * Let DiscontinuityTime and RefreshRate active | ||
| 4811 | diff --git a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c | ||
| 4812 | index dd39b07..4437829 100644 | ||
| 4813 | --- a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c | ||
| 4814 | +++ b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c | ||
| 4815 | @@ -287,6 +287,7 @@ ipAddressPrefixTable_container_load(netsnmp_container *container) | ||
| 4816 | "error setting index while loading " | ||
| 4817 | "ipAddressPrefixTable data.\n"); | ||
| 4818 | ipAddressPrefixTable_release_rowreq_ctx(rowreq_ctx); | ||
| 4819 | + rowreq_ctx = NULL; | ||
| 4820 | continue; | ||
| 4821 | } | ||
| 4822 | |||
| 4823 | diff --git a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c | ||
| 4824 | index 84a98ff..c9e14ff 100644 | ||
| 4825 | --- a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c | ||
| 4826 | +++ b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c | ||
| 4827 | @@ -138,7 +138,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4828 | * yes. | ||
| 4829 | */ | ||
| 4830 | DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates", | ||
| 4831 | - "inserted row for %d\n", entry->index)); | ||
| 4832 | + "inserted row for %" NETSNMP_PRIo "d\n", entry->index)); | ||
| 4833 | CONTAINER_INSERT(c, ift_rrc); | ||
| 4834 | changed = 1; | ||
| 4835 | } | ||
| 4836 | @@ -152,7 +152,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4837 | * no | ||
| 4838 | */ | ||
| 4839 | DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates", | ||
| 4840 | - "removed row for %d\n", | ||
| 4841 | + "removed row for %" NETSNMP_PRIo "d\n", | ||
| 4842 | ift_rrc->data.ifentry->index)); | ||
| 4843 | CONTAINER_REMOVE(c, ift_rrc); | ||
| 4844 | changed = 1; | ||
| 4845 | @@ -164,7 +164,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4846 | ift_rrc->data.ifentry->retransmit_v4) || | ||
| 4847 | (entry->reasm_max_v4 != ift_rrc->data.ifentry->reasm_max_v4)) { | ||
| 4848 | DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates", | ||
| 4849 | - "row changed for %d\n", | ||
| 4850 | + "row changed for %" NETSNMP_PRIo "d\n", | ||
| 4851 | ift_rrc->data.ifentry->index)); | ||
| 4852 | changed = 1; | ||
| 4853 | } | ||
| 4854 | diff --git a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c | ||
| 4855 | index ef7d533..33c65a9 100644 | ||
| 4856 | --- a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c | ||
| 4857 | +++ b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c | ||
| 4858 | @@ -138,7 +138,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4859 | * yes. | ||
| 4860 | */ | ||
| 4861 | DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates", | ||
| 4862 | - "inserted row for index %d\n", entry->index)); | ||
| 4863 | + "inserted row for index %" NETSNMP_PRIo "d\n", entry->index)); | ||
| 4864 | CONTAINER_INSERT(c, ift_rrc); | ||
| 4865 | changed = 1; | ||
| 4866 | } | ||
| 4867 | @@ -152,7 +152,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4868 | * no | ||
| 4869 | */ | ||
| 4870 | DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates", | ||
| 4871 | - "removed row for index %d\n", | ||
| 4872 | + "removed row for index %" NETSNMP_PRIo "d\n", | ||
| 4873 | ift_rrc->data.ifentry->index)); | ||
| 4874 | CONTAINER_REMOVE(c, ift_rrc); | ||
| 4875 | changed = 1; | ||
| 4876 | @@ -190,7 +190,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx * | ||
| 4877 | && (entry->forwarding_v6 != | ||
| 4878 | ift_rrc->data.ifentry->forwarding_v6))) { | ||
| 4879 | DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates", | ||
| 4880 | - "row changed for index %d\n", | ||
| 4881 | + "row changed for index %" NETSNMP_PRIo "d\n", | ||
| 4882 | ift_rrc->data.ifentry->index)); | ||
| 4883 | changed = 1; | ||
| 4884 | } | ||
| 4885 | diff --git a/agent/mibgroup/kernel_sunos5.c b/agent/mibgroup/kernel_sunos5.c | ||
| 4886 | index 984fc77..9ee0284 100644 | ||
| 4887 | --- a/agent/mibgroup/kernel_sunos5.c | ||
| 4888 | +++ b/agent/mibgroup/kernel_sunos5.c | ||
| 4889 | @@ -469,8 +469,7 @@ getKstat(const char *statname, const char *varname, void *value) | ||
| 4890 | case KSTAT_DATA_CHAR: | ||
| 4891 | DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c)); | ||
| 4892 | *(char **)v = buf; | ||
| 4893 | - buf[sizeof(buf)-1] = 0; | ||
| 4894 | - strncpy(buf, d->value.c, sizeof(buf)-1); | ||
| 4895 | + strlcpy(buf, d->value.c, sizeof(buf)); | ||
| 4896 | break; | ||
| 4897 | #ifdef KSTAT_DATA_INT32 /* Solaris 2.6 and up */ | ||
| 4898 | case KSTAT_DATA_INT32: | ||
| 4899 | @@ -623,8 +622,7 @@ getKstatString(const char *statname, const char *varname, | ||
| 4900 | if (strcmp(d->name, varname) == 0) { | ||
| 4901 | switch (d->data_type) { | ||
| 4902 | case KSTAT_DATA_CHAR: | ||
| 4903 | - value[value_len-1] = '\0'; | ||
| 4904 | - strncpy(value, d->value.c, value_len-1); | ||
| 4905 | + strlcpy(value, d->value.c, value_len); | ||
| 4906 | DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c)); | ||
| 4907 | break; | ||
| 4908 | default: | ||
| 4909 | diff --git a/agent/mibgroup/mibII/icmp.c b/agent/mibgroup/mibII/icmp.c | ||
| 4910 | index 977effa..429fa0b 100644 | ||
| 4911 | --- a/agent/mibgroup/mibII/icmp.c | ||
| 4912 | +++ b/agent/mibgroup/mibII/icmp.c | ||
| 4913 | @@ -456,9 +456,11 @@ icmp_msg_stats_first_entry(void **loop_context, | ||
| 4914 | void | ||
| 4915 | init_icmp(void) | ||
| 4916 | { | ||
| 4917 | - netsnmp_handler_registration *reginfo; | ||
| 4918 | + netsnmp_handler_registration *scalar_reginfo = NULL; | ||
| 4919 | + int rc; | ||
| 4920 | #ifdef linux | ||
| 4921 | - netsnmp_handler_registration *msg_stats_reginfo; | ||
| 4922 | + netsnmp_handler_registration *msg_stats_reginfo = NULL; | ||
| 4923 | + netsnmp_handler_registration *table_reginfo = NULL; | ||
| 4924 | netsnmp_iterator_info *iinfo; | ||
| 4925 | netsnmp_iterator_info *msg_stats_iinfo; | ||
| 4926 | netsnmp_table_registration_info *table_info; | ||
| 4927 | @@ -469,15 +471,17 @@ init_icmp(void) | ||
| 4928 | * register ourselves with the agent as a group of scalars... | ||
| 4929 | */ | ||
| 4930 | DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n")); | ||
| 4931 | - reginfo = netsnmp_create_handler_registration("icmp", icmp_handler, | ||
| 4932 | + scalar_reginfo = netsnmp_create_handler_registration("icmp", icmp_handler, | ||
| 4933 | icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY); | ||
| 4934 | - netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS); | ||
| 4935 | + rc = netsnmp_register_scalar_group(scalar_reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS); | ||
| 4936 | + if (rc != SNMPERR_SUCCESS) | ||
| 4937 | + return; | ||
| 4938 | /* | ||
| 4939 | * .... with a local cache | ||
| 4940 | * (except for HP-UX 11, which extracts objects individually) | ||
| 4941 | */ | ||
| 4942 | #ifndef hpux11 | ||
| 4943 | - netsnmp_inject_handler( reginfo, | ||
| 4944 | + netsnmp_inject_handler( scalar_reginfo, | ||
| 4945 | netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT, | ||
| 4946 | icmp_load, icmp_free, | ||
| 4947 | icmp_oid, OID_LENGTH(icmp_oid))); | ||
| 4948 | @@ -485,63 +489,64 @@ init_icmp(void) | ||
| 4949 | #ifdef linux | ||
| 4950 | |||
| 4951 | /* register icmpStatsTable */ | ||
| 4952 | - reginfo = netsnmp_create_handler_registration("icmpStatsTable", | ||
| 4953 | - icmp_stats_table_handler, icmp_stats_tbl_oid, | ||
| 4954 | - OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY); | ||
| 4955 | - | ||
| 4956 | table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); | ||
| 4957 | - if (!table_info) { | ||
| 4958 | - return; | ||
| 4959 | - } | ||
| 4960 | - | ||
| 4961 | + if (!table_info) | ||
| 4962 | + goto bail; | ||
| 4963 | netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0); | ||
| 4964 | table_info->min_column = ICMP_STAT_INMSG; | ||
| 4965 | table_info->max_column = ICMP_STAT_OUTERR; | ||
| 4966 | |||
| 4967 | |||
| 4968 | iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); | ||
| 4969 | - if (!iinfo) { | ||
| 4970 | - return; | ||
| 4971 | - } | ||
| 4972 | + if (!iinfo) | ||
| 4973 | + goto bail; | ||
| 4974 | iinfo->get_first_data_point = icmp_stats_first_entry; | ||
| 4975 | iinfo->get_next_data_point = icmp_stats_next_entry; | ||
| 4976 | iinfo->table_reginfo = table_info; | ||
| 4977 | |||
| 4978 | - netsnmp_register_table_iterator2(reginfo, iinfo); | ||
| 4979 | - | ||
| 4980 | - /* register icmpMsgStatsTable */ | ||
| 4981 | - msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable", | ||
| 4982 | - icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid, | ||
| 4983 | - OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY); | ||
| 4984 | + table_reginfo = netsnmp_create_handler_registration("icmpStatsTable", | ||
| 4985 | + icmp_stats_table_handler, icmp_stats_tbl_oid, | ||
| 4986 | + OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY); | ||
| 4987 | |||
| 4988 | - msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); | ||
| 4989 | - if (!msg_stats_table_info) { | ||
| 4990 | - return; | ||
| 4991 | + rc = netsnmp_register_table_iterator2(table_reginfo, iinfo); | ||
| 4992 | + if (rc != SNMPERR_SUCCESS) { | ||
| 4993 | + table_reginfo = NULL; | ||
| 4994 | + goto bail; | ||
| 4995 | } | ||
| 4996 | + netsnmp_inject_handler( table_reginfo, | ||
| 4997 | + netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT, | ||
| 4998 | + icmp_load, icmp_free, | ||
| 4999 | + icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid))); | ||
| 5000 | |||
| 5001 | + /* register icmpMsgStatsTable */ | ||
| 5002 | + msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); | ||
| 5003 | + if (!msg_stats_table_info) | ||
| 5004 | + goto bail; | ||
| 5005 | netsnmp_table_helper_add_indexes(msg_stats_table_info, ASN_INTEGER, ASN_INTEGER, 0); | ||
| 5006 | msg_stats_table_info->min_column = ICMP_MSG_STAT_IN_PKTS; | ||
| 5007 | msg_stats_table_info->max_column = ICMP_MSG_STAT_OUT_PKTS; | ||
| 5008 | |||
| 5009 | msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); | ||
| 5010 | - if (!msg_stats_iinfo) { | ||
| 5011 | - return; | ||
| 5012 | - } | ||
| 5013 | + if (!msg_stats_iinfo) | ||
| 5014 | + goto bail; | ||
| 5015 | msg_stats_iinfo->get_first_data_point = icmp_msg_stats_first_entry; | ||
| 5016 | msg_stats_iinfo->get_next_data_point = icmp_msg_stats_next_entry; | ||
| 5017 | msg_stats_iinfo->table_reginfo = msg_stats_table_info; | ||
| 5018 | |||
| 5019 | - netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo); | ||
| 5020 | + msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable", | ||
| 5021 | + icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid, | ||
| 5022 | + OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY); | ||
| 5023 | + | ||
| 5024 | + rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo); | ||
| 5025 | + if (rc != SNMPERR_SUCCESS) { | ||
| 5026 | + msg_stats_reginfo = NULL; | ||
| 5027 | + goto bail; | ||
| 5028 | + } | ||
| 5029 | + | ||
| 5030 | netsnmp_inject_handler( msg_stats_reginfo, | ||
| 5031 | netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT, | ||
| 5032 | icmp_load, icmp_free, | ||
| 5033 | icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid))); | ||
| 5034 | -#ifndef hpux11 | ||
| 5035 | - netsnmp_inject_handler( reginfo, | ||
| 5036 | - netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT, | ||
| 5037 | - icmp_load, icmp_free, | ||
| 5038 | - icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid))); | ||
| 5039 | -#endif /* ! hpux11 */ | ||
| 5040 | #endif /* linux */ | ||
| 5041 | |||
| 5042 | #ifdef USING_MIBII_IP_MODULE | ||
| 5043 | @@ -558,6 +563,17 @@ init_icmp(void) | ||
| 5044 | init_kernel_sunos5(); | ||
| 5045 | #endif | ||
| 5046 | #endif | ||
| 5047 | + return; | ||
| 5048 | + | ||
| 5049 | +#ifdef linux | ||
| 5050 | +bail: | ||
| 5051 | + if (scalar_reginfo) | ||
| 5052 | + netsnmp_unregister_handler(scalar_reginfo); | ||
| 5053 | + if (table_reginfo) | ||
| 5054 | + netsnmp_unregister_handler(table_reginfo); | ||
| 5055 | + if (msg_stats_reginfo) | ||
| 5056 | + netsnmp_unregister_handler(msg_stats_reginfo); | ||
| 5057 | +#endif | ||
| 5058 | } | ||
| 5059 | |||
| 5060 | |||
| 5061 | diff --git a/agent/mibgroup/mibII/interfaces.c b/agent/mibgroup/mibII/interfaces.c | ||
| 5062 | index 08c2a85..41d7287 100644 | ||
| 5063 | --- a/agent/mibgroup/mibII/interfaces.c | ||
| 5064 | +++ b/agent/mibgroup/mibII/interfaces.c | ||
| 5065 | @@ -463,10 +463,8 @@ Interface_Scan_By_Index(int iindex, | ||
| 5066 | a = get_address(ifp + 1, ifp->ifm_addrs, RTA_IFP); | ||
| 5067 | if (a == NULL) | ||
| 5068 | return 0; | ||
| 5069 | - strncpy(if_name, | ||
| 5070 | - ((const struct sockaddr_in *) a)->sin_zero, | ||
| 5071 | - ((const u_char *) a)[5]); | ||
| 5072 | - if_name[((const u_char *) a)[5]] = 0; | ||
| 5073 | + sprintf(if_name, "%.*s", ((const u_char *) a)[5], | ||
| 5074 | + ((const struct sockaddr_in *) a)->sin_zero); | ||
| 5075 | *if_msg = *ifp; | ||
| 5076 | ++have_ifinfo; | ||
| 5077 | } | ||
| 5078 | @@ -1603,8 +1601,7 @@ Interface_Scan_Init(void) | ||
| 5079 | } | ||
| 5080 | |||
| 5081 | *stats = 0; | ||
| 5082 | - strncpy(ifname_buf, ifstart, sizeof(ifname_buf)); | ||
| 5083 | - ifname_buf[ sizeof(ifname_buf)-1 ] = 0; | ||
| 5084 | + strlcpy(ifname_buf, ifstart, sizeof(ifname_buf)); | ||
| 5085 | *stats++ = ':'; | ||
| 5086 | while (*stats == ' ') | ||
| 5087 | stats++; | ||
| 5088 | @@ -1671,31 +1668,27 @@ Interface_Scan_Init(void) | ||
| 5089 | nnew->if_unit = strdup(*ptr ? ptr : ""); | ||
| 5090 | *ptr = 0; | ||
| 5091 | |||
| 5092 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5093 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5094 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5095 | if (ioctl(fd, SIOCGIFADDR, &ifrq) < 0) | ||
| 5096 | memset((char *) &nnew->if_addr, 0, sizeof(nnew->if_addr)); | ||
| 5097 | else | ||
| 5098 | nnew->if_addr = ifrq.ifr_addr; | ||
| 5099 | |||
| 5100 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5101 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5102 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5103 | if (ioctl(fd, SIOCGIFBRDADDR, &ifrq) < 0) | ||
| 5104 | memset((char *) &nnew->ifu_broadaddr, 0, | ||
| 5105 | sizeof(nnew->ifu_broadaddr)); | ||
| 5106 | else | ||
| 5107 | nnew->ifu_broadaddr = ifrq.ifr_broadaddr; | ||
| 5108 | |||
| 5109 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5110 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5111 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5112 | if (ioctl(fd, SIOCGIFNETMASK, &ifrq) < 0) | ||
| 5113 | memset((char *) &nnew->ia_subnetmask, 0, | ||
| 5114 | sizeof(nnew->ia_subnetmask)); | ||
| 5115 | else | ||
| 5116 | nnew->ia_subnetmask = ifrq.ifr_netmask; | ||
| 5117 | |||
| 5118 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5119 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5120 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5121 | nnew->if_flags = ioctl(fd, SIOCGIFFLAGS, &ifrq) < 0 | ||
| 5122 | ? 0 : ifrq.ifr_flags; | ||
| 5123 | |||
| 5124 | @@ -1707,8 +1700,7 @@ Interface_Scan_Init(void) | ||
| 5125 | * 4 bytes of sa_data. | ||
| 5126 | */ | ||
| 5127 | memset(ifrq.ifr_hwaddr.sa_data, (0), IFHWADDRLEN); | ||
| 5128 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5129 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5130 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5131 | if (ioctl(fd, SIOCGIFHWADDR, &ifrq) < 0) | ||
| 5132 | memset(nnew->if_hwaddr, (0), IFHWADDRLEN); | ||
| 5133 | else { | ||
| 5134 | @@ -1765,14 +1757,12 @@ Interface_Scan_Init(void) | ||
| 5135 | #endif | ||
| 5136 | } | ||
| 5137 | |||
| 5138 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5139 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5140 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5141 | nnew->if_metric = ioctl(fd, SIOCGIFMETRIC, &ifrq) < 0 | ||
| 5142 | ? 0 : ifrq.ifr_metric; | ||
| 5143 | |||
| 5144 | #ifdef SIOCGIFMTU | ||
| 5145 | - strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5146 | - ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0; | ||
| 5147 | + strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name)); | ||
| 5148 | nnew->if_mtu = (ioctl(fd, SIOCGIFMTU, &ifrq) < 0) | ||
| 5149 | ? 0 : ifrq.ifr_mtu; | ||
| 5150 | #else | ||
| 5151 | @@ -1882,14 +1872,13 @@ Interface_Scan_Next(short *Index, | ||
| 5152 | } | ||
| 5153 | #else | ||
| 5154 | ifnet = *ifnetaddr; | ||
| 5155 | - strncpy(saveName, ifnet.if_name, sizeof(saveName)); | ||
| 5156 | + strlcpy(saveName, ifnet.if_name, sizeof(saveName)); | ||
| 5157 | #endif | ||
| 5158 | |||
| 5159 | saveName[sizeof(saveName) - 1] = '\0'; | ||
| 5160 | cp = (char *) strchr(saveName, '\0'); | ||
| 5161 | #ifdef linux | ||
| 5162 | - strncat(cp, ifnet.if_unit, sizeof(saveName)-strlen(saveName)-1); | ||
| 5163 | - saveName[sizeof(saveName) - 1] = '\0'; | ||
| 5164 | + strlcat(saveName, ifnet.if_unit, sizeof(saveName)); | ||
| 5165 | #else | ||
| 5166 | #ifdef NETSNMP_FEATURE_CHECKIN | ||
| 5167 | /* this exists here just so we don't copy ifdef logic elsewhere */ | ||
| 5168 | @@ -2000,7 +1989,7 @@ Interface_Scan_Next(short *Index, | ||
| 5169 | } | ||
| 5170 | #if HAVE_STRUCT_IFNET_IF_XNAME | ||
| 5171 | #if defined(netbsd1) || defined(openbsd2) | ||
| 5172 | - strncpy(saveName, ifnet.if_xname, sizeof saveName); | ||
| 5173 | + strlcpy(saveName, ifnet.if_xname, sizeof(saveName)); | ||
| 5174 | #else | ||
| 5175 | if (!NETSNMP_KLOOKUP(ifnet.if_xname, (char *) saveName, sizeof saveName)) { | ||
| 5176 | DEBUGMSGTL(("mibII/interfaces:Interface_Scan_Next", "klookup failed\n")); | ||
| 5177 | diff --git a/agent/mibgroup/mibII/ip.c b/agent/mibgroup/mibII/ip.c | ||
| 5178 | index 56de408..40b5d2f 100644 | ||
| 5179 | --- a/agent/mibgroup/mibII/ip.c | ||
| 5180 | +++ b/agent/mibgroup/mibII/ip.c | ||
| 5181 | @@ -151,6 +151,7 @@ void | ||
| 5182 | init_ip(void) | ||
| 5183 | { | ||
| 5184 | netsnmp_handler_registration *reginfo; | ||
| 5185 | + int rc; | ||
| 5186 | |||
| 5187 | /* | ||
| 5188 | * register ourselves with the agent as a group of scalars... | ||
| 5189 | @@ -158,7 +159,9 @@ init_ip(void) | ||
| 5190 | DEBUGMSGTL(("mibII/ip", "Initialising IP group\n")); | ||
| 5191 | reginfo = netsnmp_create_handler_registration("ip", ip_handler, | ||
| 5192 | ip_oid, OID_LENGTH(ip_oid), HANDLER_CAN_RONLY); | ||
| 5193 | - netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS); | ||
| 5194 | + rc = netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS); | ||
| 5195 | + if (rc != SNMPERR_SUCCESS) | ||
| 5196 | + return; | ||
| 5197 | |||
| 5198 | /* | ||
| 5199 | * .... with a local cache | ||
| 5200 | diff --git a/agent/mibgroup/mibII/ipv6.c b/agent/mibgroup/mibII/ipv6.c | ||
| 5201 | index a372ca4..5714647 100644 | ||
| 5202 | --- a/agent/mibgroup/mibII/ipv6.c | ||
| 5203 | +++ b/agent/mibgroup/mibII/ipv6.c | ||
| 5204 | @@ -817,8 +817,7 @@ var_ifv6Entry(register struct variable * vp, | ||
| 5205 | |||
| 5206 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5207 | ifr.ifr_addr.sa_family = AF_INET6; | ||
| 5208 | - strncpy(ifr.ifr_name, if_getname(interface), | ||
| 5209 | - sizeof(ifr.ifr_name) - 1); | ||
| 5210 | + strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name)); | ||
| 5211 | if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) | ||
| 5212 | break; | ||
| 5213 | if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) { | ||
| 5214 | @@ -1019,8 +1018,7 @@ var_ifv6Entry(register struct variable * vp, | ||
| 5215 | int s; | ||
| 5216 | |||
| 5217 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5218 | - strncpy(ifr.ifr_name, if_getname(interface), | ||
| 5219 | - sizeof(ifr.ifr_name) - 1); | ||
| 5220 | + strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name)); | ||
| 5221 | if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) | ||
| 5222 | break; | ||
| 5223 | if (ioctl(s, SIOCGIFSTAT_IN6, (caddr_t) & ifr) < 0) { | ||
| 5224 | @@ -1176,8 +1174,7 @@ var_icmpv6Entry(register struct variable * vp, | ||
| 5225 | int s; | ||
| 5226 | |||
| 5227 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5228 | - strncpy(ifr.ifr_name, if_getname(interface), | ||
| 5229 | - sizeof(ifr.ifr_name) - 1); | ||
| 5230 | + strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name)); | ||
| 5231 | if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) | ||
| 5232 | break; | ||
| 5233 | if (ioctl(s, SIOCGIFSTAT_ICMP6, (caddr_t) & ifr) < 0) { | ||
| 5234 | @@ -2101,7 +2098,7 @@ var_ifv6Entry(register struct variable * vp, | ||
| 5235 | break; | ||
| 5236 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5237 | ifr.ifr_addr.sa_family = AF_INET6; | ||
| 5238 | - strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1); | ||
| 5239 | + strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name)); | ||
| 5240 | if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) | ||
| 5241 | break; | ||
| 5242 | if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) { | ||
| 5243 | @@ -2121,7 +2118,7 @@ var_ifv6Entry(register struct variable * vp, | ||
| 5244 | break; | ||
| 5245 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5246 | ifr.ifr_addr.sa_family = AF_INET6; | ||
| 5247 | - strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1); | ||
| 5248 | + strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name)); | ||
| 5249 | if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) | ||
| 5250 | break; | ||
| 5251 | if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { | ||
| 5252 | @@ -2150,7 +2147,7 @@ var_ifv6Entry(register struct variable * vp, | ||
| 5253 | break; | ||
| 5254 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5255 | ifr.ifr_addr.sa_family = AF_INET6; | ||
| 5256 | - strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1); | ||
| 5257 | + strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name)); | ||
| 5258 | if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) | ||
| 5259 | break; | ||
| 5260 | if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) { | ||
| 5261 | diff --git a/agent/mibgroup/mibII/kernel_linux.c b/agent/mibgroup/mibII/kernel_linux.c | ||
| 5262 | index dfa0b2b..b21a166 100644 | ||
| 5263 | --- a/agent/mibgroup/mibII/kernel_linux.c | ||
| 5264 | +++ b/agent/mibgroup/mibII/kernel_linux.c | ||
| 5265 | @@ -66,8 +66,8 @@ decode_icmp_msg(char *line, char *data, struct icmp4_msg_mib *msg) | ||
| 5266 | * getting modified. So we take a local copy for this purpose even though | ||
| 5267 | * its expensive. | ||
| 5268 | */ | ||
| 5269 | - strncpy(line_cpy, line, sizeof(line_cpy)); | ||
| 5270 | - strncpy(data_cpy, data, sizeof(data_cpy)); | ||
| 5271 | + strlcpy(line_cpy, line, sizeof(line_cpy)); | ||
| 5272 | + strlcpy(data_cpy, data, sizeof(data_cpy)); | ||
| 5273 | |||
| 5274 | lineptr = line_cpy; | ||
| 5275 | dataptr = data_cpy; | ||
| 5276 | diff --git a/agent/mibgroup/mibII/kernel_netbsd.c b/agent/mibgroup/mibII/kernel_netbsd.c | ||
| 5277 | index 7f0a690..93f38b7 100644 | ||
| 5278 | --- a/agent/mibgroup/mibII/kernel_netbsd.c | ||
| 5279 | +++ b/agent/mibgroup/mibII/kernel_netbsd.c | ||
| 5280 | @@ -32,8 +32,8 @@ | ||
| 5281 | int | ||
| 5282 | netbsd_read_icmp_stat(struct icmp_mib *mib) | ||
| 5283 | { | ||
| 5284 | - size_t size; | ||
| 5285 | uint64_t icmpstat[ICMP_NSTATS]; | ||
| 5286 | + size_t size = sizeof(icmpstat); | ||
| 5287 | int i; | ||
| 5288 | |||
| 5289 | (void)memset(mib, 0, sizeof(*mib)); | ||
| 5290 | @@ -89,8 +89,8 @@ netbsd_read_icmp_stat(struct icmp_mib *mib) | ||
| 5291 | int | ||
| 5292 | netbsd_read_ip_stat(struct ip_mib *mib) | ||
| 5293 | { | ||
| 5294 | - size_t size; | ||
| 5295 | uint64_t ipstat[IP_NSTATS]; | ||
| 5296 | + size_t size = sizeof(ipstat); | ||
| 5297 | int i; | ||
| 5298 | static int sname[4] = { 4, 2, 0, 0 }; /* CTL_NET, PF_INET, IPPROTO_IP, 0 */ | ||
| 5299 | size_t len; | ||
| 5300 | @@ -141,8 +141,8 @@ netbsd_read_ip_stat(struct ip_mib *mib) | ||
| 5301 | int | ||
| 5302 | netbsd_read_tcp_stat(struct tcp_mib *mib) | ||
| 5303 | { | ||
| 5304 | - size_t size; | ||
| 5305 | uint64_t tcpstat[TCP_NSTATS]; | ||
| 5306 | + size_t size = sizeof(tcpstat); | ||
| 5307 | |||
| 5308 | (void)memset(mib, 0, sizeof(*mib)); | ||
| 5309 | |||
| 5310 | @@ -177,8 +177,8 @@ netbsd_read_tcp_stat(struct tcp_mib *mib) | ||
| 5311 | int | ||
| 5312 | netbsd_read_udp_stat(struct udp_mib *mib) | ||
| 5313 | { | ||
| 5314 | - size_t size; | ||
| 5315 | uint64_t udpstat[UDP_NSTATS]; | ||
| 5316 | + size_t size = sizeof(udpstat); | ||
| 5317 | |||
| 5318 | (void)memset(mib, 0, sizeof(*mib)); | ||
| 5319 | |||
| 5320 | diff --git a/agent/mibgroup/mibII/mta_sendmail.c b/agent/mibgroup/mibII/mta_sendmail.c | ||
| 5321 | index 79a5182..00397d3 100644 | ||
| 5322 | --- a/agent/mibgroup/mibII/mta_sendmail.c | ||
| 5323 | +++ b/agent/mibgroup/mibII/mta_sendmail.c | ||
| 5324 | @@ -853,8 +853,7 @@ read_sendmailcf(BOOL config) | ||
| 5325 | } | ||
| 5326 | |||
| 5327 | if (strncasecmp(line + 2, "StatusFile", 10) == 0) { | ||
| 5328 | - strncpy(sendmailst_fn, filename, sizeof(sendmailst_fn)); | ||
| 5329 | - sendmailst_fn[ sizeof(sendmailst_fn)-1 ] = 0; | ||
| 5330 | + strlcpy(sendmailst_fn, filename, sizeof(sendmailst_fn)); | ||
| 5331 | found_sendmailst = TRUE; | ||
| 5332 | DEBUGMSGTL(("mibII/mta_sendmail.c:read_sendmailcf", | ||
| 5333 | "found statatistics file \"%s\"\n", | ||
| 5334 | @@ -975,11 +974,7 @@ read_sendmailcf(BOOL config) | ||
| 5335 | linenr++; | ||
| 5336 | } | ||
| 5337 | |||
| 5338 | - for (i = 0; i < 10 && fclose(sendmailcf_fp) != 0; i++) { | ||
| 5339 | - /* | ||
| 5340 | - * nothing to do | ||
| 5341 | - */ | ||
| 5342 | - } | ||
| 5343 | + fclose(sendmailcf_fp); | ||
| 5344 | |||
| 5345 | for (i = mailers; i < MAXMAILERS; i++) { | ||
| 5346 | mailernames[i][0] = '\0'; | ||
| 5347 | diff --git a/agent/mibgroup/mibII/route_write.c b/agent/mibgroup/mibII/route_write.c | ||
| 5348 | index b2e941b..5820ee1 100644 | ||
| 5349 | --- a/agent/mibgroup/mibII/route_write.c | ||
| 5350 | +++ b/agent/mibgroup/mibII/route_write.c | ||
| 5351 | @@ -434,11 +434,6 @@ write_rte(int action, | ||
| 5352 | |||
| 5353 | memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len); | ||
| 5354 | |||
| 5355 | - if (var_val_type != ASN_IPADDRESS) { | ||
| 5356 | - snmp_log(LOG_ERR, "not IP address 2"); | ||
| 5357 | - return SNMP_ERR_WRONGTYPE; | ||
| 5358 | - } | ||
| 5359 | - | ||
| 5360 | rp->xx_dst = *((u_long *) buf); | ||
| 5361 | |||
| 5362 | |||
| 5363 | @@ -509,16 +504,12 @@ write_rte(int action, | ||
| 5364 | |||
| 5365 | memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len); | ||
| 5366 | |||
| 5367 | - if (var_val_type != ASN_IPADDRESS) { | ||
| 5368 | - snmp_log(LOG_ERR, "not right5"); | ||
| 5369 | - return SNMP_ERR_WRONGTYPE; | ||
| 5370 | - } | ||
| 5371 | - | ||
| 5372 | rp->xx_nextIR = *((u_long *) buf); | ||
| 5373 | |||
| 5374 | } else if (action == COMMIT) { | ||
| 5375 | rp->rt_nextIR = rp->xx_nextIR; | ||
| 5376 | } | ||
| 5377 | + break; | ||
| 5378 | |||
| 5379 | |||
| 5380 | case IPROUTETYPE: | ||
| 5381 | diff --git a/agent/mibgroup/mibII/system_mib.c b/agent/mibgroup/mibII/system_mib.c | ||
| 5382 | index 7ca1227..65b0b7c 100644 | ||
| 5383 | --- a/agent/mibgroup/mibII/system_mib.c | ||
| 5384 | +++ b/agent/mibgroup/mibII/system_mib.c | ||
| 5385 | @@ -262,9 +262,9 @@ init_system_mib(void) | ||
| 5386 | extmp.type = EXECPROC; | ||
| 5387 | extmp.next = NULL; | ||
| 5388 | exec_command(&extmp); | ||
| 5389 | - strncpy(version_descr, extmp.output, sizeof(version_descr)); | ||
| 5390 | - version_descr[sizeof(version_descr) - 1] = 0; | ||
| 5391 | - version_descr[strlen(version_descr) - 1] = 0; /* chomp new line */ | ||
| 5392 | + strlcpy(version_descr, extmp.output, sizeof(version_descr)); | ||
| 5393 | + if (strlen(version_descr) >= 1) | ||
| 5394 | + version_descr[strlen(version_descr) - 1] = 0; /* chomp new line */ | ||
| 5395 | #else | ||
| 5396 | #if (defined (WIN32) && defined (HAVE_WIN32_PLATFORM_SDK)) || defined (mingw32) | ||
| 5397 | windowsOSVersionString(version_descr, sizeof(version_descr)); | ||
| 5398 | @@ -278,7 +278,7 @@ init_system_mib(void) | ||
| 5399 | gethostname(sysName, sizeof(sysName)); | ||
| 5400 | #else | ||
| 5401 | #ifdef HAVE_UNAME | ||
| 5402 | - strncpy(sysName, utsName.nodename, sizeof(sysName)); | ||
| 5403 | + strlcpy(sysName, utsName.nodename, sizeof(sysName)); | ||
| 5404 | #else | ||
| 5405 | #if defined (HAVE_EXECV) && !defined (mingw32) | ||
| 5406 | sprintf(extmp.command, "%s -n", UNAMEPROG); | ||
| 5407 | @@ -288,8 +288,9 @@ init_system_mib(void) | ||
| 5408 | extmp.type = EXECPROC; | ||
| 5409 | extmp.next = NULL; | ||
| 5410 | exec_command(&extmp); | ||
| 5411 | - strncpy(sysName, extmp.output, sizeof(sysName)); | ||
| 5412 | - sysName[strlen(sysName) - 1] = 0; /* chomp new line */ | ||
| 5413 | + strlcpy(sysName, extmp.output, sizeof(sysName)); | ||
| 5414 | + if (strlen(sysName) >= 1) | ||
| 5415 | + sysName[strlen(sysName) - 1] = 0; /* chomp new line */ | ||
| 5416 | #else | ||
| 5417 | strcpy(sysName, "unknown"); | ||
| 5418 | #endif /* HAVE_EXECV */ | ||
| 5419 | diff --git a/agent/mibgroup/mibII/tcp.c b/agent/mibgroup/mibII/tcp.c | ||
| 5420 | index d68e699..3c79fad 100644 | ||
| 5421 | --- a/agent/mibgroup/mibII/tcp.c | ||
| 5422 | +++ b/agent/mibgroup/mibII/tcp.c | ||
| 5423 | @@ -113,6 +113,7 @@ void | ||
| 5424 | init_tcp(void) | ||
| 5425 | { | ||
| 5426 | netsnmp_handler_registration *reginfo; | ||
| 5427 | + int rc; | ||
| 5428 | |||
| 5429 | /* | ||
| 5430 | * register ourselves with the agent as a group of scalars... | ||
| 5431 | @@ -120,7 +121,9 @@ init_tcp(void) | ||
| 5432 | DEBUGMSGTL(("mibII/tcpScalar", "Initialising TCP scalar group\n")); | ||
| 5433 | reginfo = netsnmp_create_handler_registration("tcp", tcp_handler, | ||
| 5434 | tcp_oid, OID_LENGTH(tcp_oid), HANDLER_CAN_RONLY); | ||
| 5435 | - netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS); | ||
| 5436 | + rc = netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS); | ||
| 5437 | + if (rc != SNMPERR_SUCCESS) | ||
| 5438 | + return; | ||
| 5439 | |||
| 5440 | /* | ||
| 5441 | * .... with a local cache | ||
| 5442 | diff --git a/agent/mibgroup/mibII/tcpTable.c b/agent/mibgroup/mibII/tcpTable.c | ||
| 5443 | index 01d00e5..088dd06 100644 | ||
| 5444 | --- a/agent/mibgroup/mibII/tcpTable.c | ||
| 5445 | +++ b/agent/mibgroup/mibII/tcpTable.c | ||
| 5446 | @@ -147,6 +147,7 @@ init_tcpTable(void) | ||
| 5447 | netsnmp_table_registration_info *table_info; | ||
| 5448 | netsnmp_iterator_info *iinfo; | ||
| 5449 | netsnmp_handler_registration *reginfo; | ||
| 5450 | + int rc; | ||
| 5451 | |||
| 5452 | DEBUGMSGTL(("mibII/tcpTable", "Initialising TCP Table\n")); | ||
| 5453 | /* | ||
| 5454 | @@ -186,7 +187,9 @@ init_tcpTable(void) | ||
| 5455 | tcpTable_handler, | ||
| 5456 | tcpTable_oid, OID_LENGTH(tcpTable_oid), | ||
| 5457 | HANDLER_CAN_RONLY), | ||
| 5458 | - netsnmp_register_table_iterator2(reginfo, iinfo); | ||
| 5459 | + rc = netsnmp_register_table_iterator2(reginfo, iinfo); | ||
| 5460 | + if (rc != SNMPERR_SUCCESS) | ||
| 5461 | + return; | ||
| 5462 | |||
| 5463 | /* | ||
| 5464 | * .... with a local cache | ||
| 5465 | diff --git a/agent/mibgroup/mibII/udp.c b/agent/mibgroup/mibII/udp.c | ||
| 5466 | index 8d2654d..1ddcbc5 100644 | ||
| 5467 | --- a/agent/mibgroup/mibII/udp.c | ||
| 5468 | +++ b/agent/mibgroup/mibII/udp.c | ||
| 5469 | @@ -74,6 +74,7 @@ void | ||
| 5470 | init_udp(void) | ||
| 5471 | { | ||
| 5472 | netsnmp_handler_registration *reginfo; | ||
| 5473 | + int rc; | ||
| 5474 | |||
| 5475 | /* | ||
| 5476 | * register ourselves with the agent as a group of scalars... | ||
| 5477 | @@ -81,7 +82,9 @@ init_udp(void) | ||
| 5478 | DEBUGMSGTL(("mibII/udpScalar", "Initialising UDP scalar group\n")); | ||
| 5479 | reginfo = netsnmp_create_handler_registration("udp", udp_handler, | ||
| 5480 | udp_oid, OID_LENGTH(udp_oid), HANDLER_CAN_RONLY); | ||
| 5481 | - netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS); | ||
| 5482 | + rc = netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS); | ||
| 5483 | + if (rc != SNMPERR_SUCCESS) | ||
| 5484 | + return; | ||
| 5485 | |||
| 5486 | /* | ||
| 5487 | * .... with a local cache | ||
| 5488 | diff --git a/agent/mibgroup/mibII/udpTable.c b/agent/mibgroup/mibII/udpTable.c | ||
| 5489 | index 162de1b..64f6dfb 100644 | ||
| 5490 | --- a/agent/mibgroup/mibII/udpTable.c | ||
| 5491 | +++ b/agent/mibgroup/mibII/udpTable.c | ||
| 5492 | @@ -129,6 +129,7 @@ init_udpTable(void) | ||
| 5493 | netsnmp_table_registration_info *table_info; | ||
| 5494 | netsnmp_iterator_info *iinfo; | ||
| 5495 | netsnmp_handler_registration *reginfo; | ||
| 5496 | + int rc; | ||
| 5497 | |||
| 5498 | DEBUGMSGTL(("mibII/udpTable", "Initialising UDP Table\n")); | ||
| 5499 | /* | ||
| 5500 | @@ -166,7 +167,9 @@ init_udpTable(void) | ||
| 5501 | udpTable_handler, | ||
| 5502 | udpTable_oid, OID_LENGTH(udpTable_oid), | ||
| 5503 | HANDLER_CAN_RONLY), | ||
| 5504 | - netsnmp_register_table_iterator2(reginfo, iinfo); | ||
| 5505 | + rc = netsnmp_register_table_iterator2(reginfo, iinfo); | ||
| 5506 | + if (rc != SNMPERR_SUCCESS) | ||
| 5507 | + return; | ||
| 5508 | |||
| 5509 | /* | ||
| 5510 | * .... with a local cache | ||
| 5511 | @@ -496,6 +499,7 @@ udpTable_load(netsnmp_cache *cache, void *vmagic) | ||
| 5512 | if (state != 7) /* fix me: UDP_LISTEN ??? */ | ||
| 5513 | continue; | ||
| 5514 | |||
| 5515 | + memset(&pcb, 0, sizeof(pcb)); | ||
| 5516 | /* store in network byte order */ | ||
| 5517 | pcb.inp_laddr.s_addr = htonl(pcb.inp_laddr.s_addr); | ||
| 5518 | pcb.inp_lport = htons((unsigned short) (lport)); | ||
| 5519 | diff --git a/agent/mibgroup/mibII/vacm_conf.c b/agent/mibgroup/mibII/vacm_conf.c | ||
| 5520 | index f62c6cc..f2faf86 100644 | ||
| 5521 | --- a/agent/mibgroup/mibII/vacm_conf.c | ||
| 5522 | +++ b/agent/mibgroup/mibII/vacm_conf.c | ||
| 5523 | @@ -201,8 +201,7 @@ vacm_parse_group(const char *token, char *param) | ||
| 5524 | config_perror("failed to create group entry"); | ||
| 5525 | return; | ||
| 5526 | } | ||
| 5527 | - strncpy(gp->groupName, group, sizeof(gp->groupName)); | ||
| 5528 | - gp->groupName[ sizeof(gp->groupName)-1 ] = 0; | ||
| 5529 | + strlcpy(gp->groupName, group, sizeof(gp->groupName)); | ||
| 5530 | gp->storageType = SNMP_STORAGE_PERMANENT; | ||
| 5531 | gp->status = SNMP_ROW_ACTIVE; | ||
| 5532 | free(gp->reserved); | ||
| 5533 | @@ -542,10 +541,6 @@ vacm_parse_setaccess(const char *token, char *param) | ||
| 5534 | config_perror("failed to create access entry"); | ||
| 5535 | return; | ||
| 5536 | } | ||
| 5537 | - if (!ap) { | ||
| 5538 | - config_perror("failed to create access entry"); | ||
| 5539 | - return; | ||
| 5540 | - } | ||
| 5541 | |||
| 5542 | strcpy(ap->views[viewnum], viewval); | ||
| 5543 | ap->contextMatch = iprefix; | ||
| 5544 | @@ -990,11 +985,9 @@ vacm_create_simple(const char *token, char *confline, | ||
| 5545 | sprintf(viewname,"viewUSM%d",commcount); | ||
| 5546 | } | ||
| 5547 | if ( strcmp( token, "authgroup" ) == 0 ) { | ||
| 5548 | - strncpy(grpname, community, sizeof(grpname)); | ||
| 5549 | - grpname[ sizeof(grpname)-1 ] = 0; | ||
| 5550 | + strlcpy(grpname, community, sizeof(grpname)); | ||
| 5551 | } else { | ||
| 5552 | - strncpy(secname, community, sizeof(secname)); | ||
| 5553 | - secname[ sizeof(secname)-1 ] = 0; | ||
| 5554 | + strlcpy(secname, community, sizeof(secname)); | ||
| 5555 | |||
| 5556 | /* | ||
| 5557 | * sec->group mapping | ||
| 5558 | @@ -1419,7 +1412,7 @@ vacm_check_view_contents(netsnmp_pdu *pdu, oid * name, size_t namelen, | ||
| 5559 | * NULL termination of the pdu field is ugly here. Do in PDU parsing? | ||
| 5560 | */ | ||
| 5561 | if (pdu->contextName) | ||
| 5562 | - strncpy(contextNameIndex, pdu->contextName, pdu->contextNameLen); | ||
| 5563 | + memcpy(contextNameIndex, pdu->contextName, pdu->contextNameLen); | ||
| 5564 | else | ||
| 5565 | contextNameIndex[0] = '\0'; | ||
| 5566 | |||
| 5567 | diff --git a/agent/mibgroup/mibII/vacm_vars.c b/agent/mibgroup/mibII/vacm_vars.c | ||
| 5568 | index 7860573..85cef94 100644 | ||
| 5569 | --- a/agent/mibgroup/mibII/vacm_vars.c | ||
| 5570 | +++ b/agent/mibgroup/mibII/vacm_vars.c | ||
| 5571 | @@ -1084,7 +1084,7 @@ write_vacmAccessStatus(int action, | ||
| 5572 | { | ||
| 5573 | static long long_ret; | ||
| 5574 | int model, level; | ||
| 5575 | - char *newGroupName, *newContextPrefix; | ||
| 5576 | + char *newGroupName = NULL, *newContextPrefix = NULL; | ||
| 5577 | size_t groupNameLen, contextPrefixLen; | ||
| 5578 | struct vacm_accessEntry *aptr = NULL; | ||
| 5579 | |||
| 5580 | diff --git a/agent/mibgroup/mibII/var_route.c b/agent/mibgroup/mibII/var_route.c | ||
| 5581 | index b5daed0..8488019 100644 | ||
| 5582 | --- a/agent/mibgroup/mibII/var_route.c | ||
| 5583 | +++ b/agent/mibgroup/mibII/var_route.c | ||
| 5584 | @@ -919,7 +919,7 @@ load_rtentries(struct radix_node *pt) | ||
| 5585 | } | ||
| 5586 | #if HAVE_STRUCT_IFNET_IF_XNAME | ||
| 5587 | #if defined(netbsd1) || defined(openbsd2) | ||
| 5588 | - strncpy(name, ifnet.if_xname, sizeof name); | ||
| 5589 | + strlcpy(name, ifnet.if_xname, sizeof(name)); | ||
| 5590 | #else | ||
| 5591 | if (!NETSNMP_KLOOKUP(ifnet.if_xname, name, sizeof name)) { | ||
| 5592 | DEBUGMSGTL(("mibII/var_route", "klookup failed\n")); | ||
| 5593 | @@ -1366,8 +1366,7 @@ Route_Scan_Reload(void) | ||
| 5594 | &(((struct sockaddr_in *) &(rtent.rt_genmask))->sin_addr.s_addr))) | ||
| 5595 | continue; | ||
| 5596 | |||
| 5597 | - strncpy(name, rt->rt_dev, sizeof(name)); | ||
| 5598 | - name[ sizeof(name)-1 ] = 0; | ||
| 5599 | + strlcpy(name, rt->rt_dev, sizeof(name)); | ||
| 5600 | |||
| 5601 | rt->rt_flags = flags, rt->rt_refcnt = refcnt; | ||
| 5602 | rt->rt_use = use, rt->rt_metric = metric; | ||
| 5603 | diff --git a/agent/mibgroup/notification-log-mib/notification_log.c b/agent/mibgroup/notification-log-mib/notification_log.c | ||
| 5604 | index 86efb34..a12a338 100644 | ||
| 5605 | --- a/agent/mibgroup/notification-log-mib/notification_log.c | ||
| 5606 | +++ b/agent/mibgroup/notification-log-mib/notification_log.c | ||
| 5607 | @@ -136,11 +136,9 @@ check_log_size(unsigned int clientreg, void *clientarg) | ||
| 5608 | netsnmp_table_row *row; | ||
| 5609 | netsnmp_table_data_set_storage *data; | ||
| 5610 | u_long count = 0; | ||
| 5611 | - struct timeval now; | ||
| 5612 | u_long uptime; | ||
| 5613 | |||
| 5614 | - gettimeofday(&now, NULL); | ||
| 5615 | - uptime = netsnmp_timeval_uptime(&now); | ||
| 5616 | + uptime = netsnmp_get_agent_uptime(); | ||
| 5617 | |||
| 5618 | if (!nlmLogTable || !nlmLogTable->table ) { | ||
| 5619 | DEBUGMSGTL(("notification_log", "missing log table\n")); | ||
| 5620 | @@ -580,7 +578,6 @@ void | ||
| 5621 | log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport) | ||
| 5622 | { | ||
| 5623 | long tmpl; | ||
| 5624 | - struct timeval now; | ||
| 5625 | netsnmp_table_row *row; | ||
| 5626 | |||
| 5627 | static u_long default_num = 0; | ||
| 5628 | @@ -620,8 +617,7 @@ log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport) | ||
| 5629 | /* | ||
| 5630 | * add the data | ||
| 5631 | */ | ||
| 5632 | - gettimeofday(&now, NULL); | ||
| 5633 | - tmpl = netsnmp_timeval_uptime(&now); | ||
| 5634 | + tmpl = netsnmp_get_agent_uptime(); | ||
| 5635 | netsnmp_set_row_column(row, COLUMN_NLMLOGTIME, ASN_TIMETICKS, | ||
| 5636 | &tmpl, sizeof(tmpl)); | ||
| 5637 | time(&timetnow); | ||
| 5638 | diff --git a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c | ||
| 5639 | index ac7f2ab..b12cdc8 100644 | ||
| 5640 | --- a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c | ||
| 5641 | +++ b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c | ||
| 5642 | @@ -194,6 +194,7 @@ parse_snmpNotifyFilterProfileTable(const char *token, char *line) | ||
| 5643 | &StorageTmp->snmpNotifyFilterProfileNameLen); | ||
| 5644 | if (StorageTmp->snmpNotifyFilterProfileName == NULL) { | ||
| 5645 | config_perror("invalid specification for snmpNotifyFilterProfileName"); | ||
| 5646 | + SNMP_FREE(StorageTmp); | ||
| 5647 | return; | ||
| 5648 | } | ||
| 5649 | |||
| 5650 | diff --git a/agent/mibgroup/notification/snmpNotifyTable.c b/agent/mibgroup/notification/snmpNotifyTable.c | ||
| 5651 | index 649b19e..8d09c59 100644 | ||
| 5652 | --- a/agent/mibgroup/notification/snmpNotifyTable.c | ||
| 5653 | +++ b/agent/mibgroup/notification/snmpNotifyTable.c | ||
| 5654 | @@ -317,9 +317,15 @@ notifyTable_register_notifications(int major, int minor, | ||
| 5655 | /* | ||
| 5656 | * address | ||
| 5657 | */ | ||
| 5658 | + t = snmp_sess_transport(snmp_sess_pointer(ss)); | ||
| 5659 | + if (!t) { | ||
| 5660 | + snmp_log(LOG_ERR, | ||
| 5661 | + "Cannot add new trap destination, transport is closed."); | ||
| 5662 | + snmp_sess_close(ss); | ||
| 5663 | + return 0; | ||
| 5664 | + } | ||
| 5665 | ptr = snmpTargetAddrTable_create(); | ||
| 5666 | ptr->name = strdup(buf); | ||
| 5667 | - t = snmp_sess_transport(snmp_sess_pointer(ss)); | ||
| 5668 | memcpy(ptr->tDomain, t->domain, t->domain_length * sizeof(oid)); | ||
| 5669 | ptr->tDomainLen = t->domain_length; | ||
| 5670 | ptr->tAddressLen = t->remote_length; | ||
| 5671 | @@ -346,8 +352,10 @@ notifyTable_register_notifications(int major, int minor, | ||
| 5672 | pptr->secModel = ss->securityModel; | ||
| 5673 | pptr->secLevel = ss->securityLevel; | ||
| 5674 | pptr->secName = (char *) malloc(ss->securityNameLen + 1); | ||
| 5675 | - if (pptr->secName == NULL) | ||
| 5676 | + if (pptr->secName == NULL) { | ||
| 5677 | + snmpTargetParamTable_dispose(pptr); | ||
| 5678 | return 0; | ||
| 5679 | + } | ||
| 5680 | memcpy((void *) pptr->secName, (void *) ss->securityName, | ||
| 5681 | ss->securityNameLen); | ||
| 5682 | pptr->secName[ss->securityNameLen] = 0; | ||
| 5683 | @@ -363,8 +371,10 @@ notifyTable_register_notifications(int major, int minor, | ||
| 5684 | pptr->secName = NULL; | ||
| 5685 | if (ss->community && (ss->community_len > 0)) { | ||
| 5686 | pptr->secName = (char *) malloc(ss->community_len + 1); | ||
| 5687 | - if (pptr->secName == NULL) | ||
| 5688 | + if (pptr->secName == NULL) { | ||
| 5689 | + snmpTargetParamTable_dispose(pptr); | ||
| 5690 | return 0; | ||
| 5691 | + } | ||
| 5692 | memcpy((void *) pptr->secName, (void *) ss->community, | ||
| 5693 | ss->community_len); | ||
| 5694 | pptr->secName[ss->community_len] = 0; | ||
| 5695 | @@ -573,6 +583,7 @@ parse_snmpNotifyTable(const char *token, char *line) | ||
| 5696 | &StorageTmp->snmpNotifyNameLen); | ||
| 5697 | if (StorageTmp->snmpNotifyName == NULL) { | ||
| 5698 | config_perror("invalid specification for snmpNotifyName"); | ||
| 5699 | + SNMP_FREE(StorageTmp); | ||
| 5700 | return; | ||
| 5701 | } | ||
| 5702 | |||
| 5703 | @@ -582,6 +593,7 @@ parse_snmpNotifyTable(const char *token, char *line) | ||
| 5704 | &StorageTmp->snmpNotifyTagLen); | ||
| 5705 | if (StorageTmp->snmpNotifyTag == NULL) { | ||
| 5706 | config_perror("invalid specification for snmpNotifyTag"); | ||
| 5707 | + SNMP_FREE(StorageTmp); | ||
| 5708 | return; | ||
| 5709 | } | ||
| 5710 | |||
| 5711 | diff --git a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c | ||
| 5712 | index cd35d09..d4b6e69 100644 | ||
| 5713 | --- a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c | ||
| 5714 | +++ b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c | ||
| 5715 | @@ -46,8 +46,8 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval) | ||
| 5716 | *retval = -2; | ||
| 5717 | return NULL; | ||
| 5718 | } | ||
| 5719 | - memset (list_head, 0, sizeof (struct ifname)); | ||
| 5720 | - strncpy (list_head->name, p->ifa_name, IF_NAMESIZE); | ||
| 5721 | + memset(list_head, 0, sizeof(struct ifname)); | ||
| 5722 | + strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE); | ||
| 5723 | continue; | ||
| 5724 | } | ||
| 5725 | for (nameptr1 = list_head; nameptr1; nameptr2 = nameptr1, nameptr1 = nameptr1->ifn_next) | ||
| 5726 | @@ -67,10 +67,9 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval) | ||
| 5727 | return NULL; | ||
| 5728 | } | ||
| 5729 | nameptr2 = nameptr2->ifn_next; | ||
| 5730 | - memset (nameptr2, 0, sizeof (struct ifname)); | ||
| 5731 | - strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE); | ||
| 5732 | + memset(nameptr2, 0, sizeof(struct ifname)); | ||
| 5733 | + strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE); | ||
| 5734 | continue; | ||
| 5735 | - | ||
| 5736 | } | ||
| 5737 | |||
| 5738 | freeifaddrs(addrs); | ||
| 5739 | @@ -162,7 +161,7 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd, | ||
| 5740 | "called\n")); | ||
| 5741 | |||
| 5742 | memset(&ifr, 0, sizeof(ifr)); | ||
| 5743 | - strcpy(ifr.ifr_name, name); | ||
| 5744 | + strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); | ||
| 5745 | |||
| 5746 | memset(&driver_info, 0, sizeof(driver_info)); | ||
| 5747 | driver_info.cmd = ETHTOOL_GDRVINFO; | ||
| 5748 | @@ -238,8 +237,8 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd, | ||
| 5749 | for (i = 0; i < nstats; i++) { | ||
| 5750 | char s[ETH_GSTRING_LEN]; | ||
| 5751 | |||
| 5752 | - strncpy(s, (const char *) ð_strings->data[i * ETH_GSTRING_LEN], | ||
| 5753 | - ETH_GSTRING_LEN); | ||
| 5754 | + strlcpy(s, (const char *) ð_strings->data[i * ETH_GSTRING_LEN], | ||
| 5755 | + sizeof(s)); | ||
| 5756 | |||
| 5757 | if (ETHERSTATSJABBERS(s)) { | ||
| 5758 | data->etherStatsJabbers = (u_long)eth_stats->data[i]; | ||
| 5759 | @@ -300,8 +299,7 @@ _etherStats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name) | ||
| 5760 | } | ||
| 5761 | } | ||
| 5762 | |||
| 5763 | - strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 5764 | - ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0; | ||
| 5765 | + strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name)); | ||
| 5766 | rc = ioctl(fd, which, ifrq); | ||
| 5767 | if (rc < 0) { | ||
| 5768 | DEBUGMSGTL(("access:etherStatsTable:ioctl", | ||
| 5769 | diff --git a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c | ||
| 5770 | index bc22430..d6023e5 100644 | ||
| 5771 | --- a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c | ||
| 5772 | +++ b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c | ||
| 5773 | @@ -102,6 +102,7 @@ initialize_table_sctpAssocLocalAddrTable(void) | ||
| 5774 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5775 | snmp_log(LOG_ERR, | ||
| 5776 | "error registering table handler for sctpAssocLocalAddrTable\n"); | ||
| 5777 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5778 | goto bail; | ||
| 5779 | } | ||
| 5780 | |||
| 5781 | diff --git a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c | ||
| 5782 | index bea3978..38ca8a3 100644 | ||
| 5783 | --- a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c | ||
| 5784 | +++ b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c | ||
| 5785 | @@ -101,6 +101,7 @@ initialize_table_sctpAssocRemAddrTable(void) | ||
| 5786 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5787 | snmp_log(LOG_ERR, | ||
| 5788 | "error registering table handler for sctpAssocRemAddrTable\n"); | ||
| 5789 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5790 | goto bail; | ||
| 5791 | } | ||
| 5792 | |||
| 5793 | diff --git a/agent/mibgroup/sctp-mib/sctpAssocTable.c b/agent/mibgroup/sctp-mib/sctpAssocTable.c | ||
| 5794 | index 951f778..9919075 100644 | ||
| 5795 | --- a/agent/mibgroup/sctp-mib/sctpAssocTable.c | ||
| 5796 | +++ b/agent/mibgroup/sctp-mib/sctpAssocTable.c | ||
| 5797 | @@ -135,6 +135,7 @@ initialize_table_sctpAssocTable(void) | ||
| 5798 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5799 | snmp_log(LOG_ERR, | ||
| 5800 | "error registering table handler for sctpAssocTable\n"); | ||
| 5801 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5802 | goto bail; | ||
| 5803 | } | ||
| 5804 | |||
| 5805 | diff --git a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c | ||
| 5806 | index f40db3a..1a6fd35 100644 | ||
| 5807 | --- a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c | ||
| 5808 | +++ b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c | ||
| 5809 | @@ -97,6 +97,7 @@ initialize_table_sctpLookupLocalPortTable(void) | ||
| 5810 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5811 | snmp_log(LOG_ERR, | ||
| 5812 | "error registering table handler for sctpLookupLocalPortTable\n"); | ||
| 5813 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5814 | goto bail; | ||
| 5815 | } | ||
| 5816 | |||
| 5817 | diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c | ||
| 5818 | index cfbceab..ae2ec91 100644 | ||
| 5819 | --- a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c | ||
| 5820 | +++ b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c | ||
| 5821 | @@ -99,6 +99,7 @@ initialize_table_sctpLookupRemHostNameTable(void) | ||
| 5822 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5823 | snmp_log(LOG_ERR, | ||
| 5824 | "error registering table handler for sctpLookupRemHostNameTable\n"); | ||
| 5825 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5826 | goto bail; | ||
| 5827 | } | ||
| 5828 | |||
| 5829 | diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c | ||
| 5830 | index c95bdf1..368dd51 100644 | ||
| 5831 | --- a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c | ||
| 5832 | +++ b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c | ||
| 5833 | @@ -98,6 +98,7 @@ initialize_table_sctpLookupRemIPAddrTable(void) | ||
| 5834 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5835 | snmp_log(LOG_ERR, | ||
| 5836 | "error registering table handler for sctpLookupRemIPAddrTable\n"); | ||
| 5837 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5838 | goto bail; | ||
| 5839 | } | ||
| 5840 | |||
| 5841 | diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c | ||
| 5842 | index eb1828b..c8a8874 100644 | ||
| 5843 | --- a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c | ||
| 5844 | +++ b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c | ||
| 5845 | @@ -97,6 +97,7 @@ initialize_table_sctpLookupRemPortTable(void) | ||
| 5846 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5847 | snmp_log(LOG_ERR, | ||
| 5848 | "error registering table handler for sctpLookupRemPortTable\n"); | ||
| 5849 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5850 | goto bail; | ||
| 5851 | } | ||
| 5852 | |||
| 5853 | diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c | ||
| 5854 | index 44d384f..d9966fc 100644 | ||
| 5855 | --- a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c | ||
| 5856 | +++ b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c | ||
| 5857 | @@ -99,6 +99,7 @@ initialize_table_sctpLookupRemPrimIPAddrTable(void) | ||
| 5858 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 5859 | snmp_log(LOG_ERR, | ||
| 5860 | "error registering table handler for sctpLookupRemPrimIPAddrTable\n"); | ||
| 5861 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 5862 | goto bail; | ||
| 5863 | } | ||
| 5864 | |||
| 5865 | diff --git a/agent/mibgroup/sctp-mib/sctpScalars.c b/agent/mibgroup/sctp-mib/sctpScalars.c | ||
| 5866 | index 6bcefd2..821079a 100644 | ||
| 5867 | --- a/agent/mibgroup/sctp-mib/sctpScalars.c | ||
| 5868 | +++ b/agent/mibgroup/sctp-mib/sctpScalars.c | ||
| 5869 | @@ -18,6 +18,7 @@ init_sctpScalars(void) | ||
| 5870 | { | ||
| 5871 | netsnmp_handler_registration *reginfo_stats; | ||
| 5872 | netsnmp_handler_registration *reginfo_params; | ||
| 5873 | + int rc; | ||
| 5874 | |||
| 5875 | DEBUGMSGTL(("sctp:scalars:init", "Initializing\n")); | ||
| 5876 | |||
| 5877 | @@ -27,8 +28,14 @@ init_sctpScalars(void) | ||
| 5878 | sctp_stats_oid, | ||
| 5879 | OID_LENGTH(sctp_stats_oid), | ||
| 5880 | HANDLER_CAN_RONLY); | ||
| 5881 | - netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB, | ||
| 5882 | + if (!reginfo_stats) | ||
| 5883 | + return; | ||
| 5884 | + | ||
| 5885 | + rc = netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB, | ||
| 5886 | SCTP_DISCONTINUITYTIME); | ||
| 5887 | + if (rc != SNMPERR_SUCCESS) | ||
| 5888 | + return; | ||
| 5889 | + | ||
| 5890 | netsnmp_inject_handler(reginfo_stats, | ||
| 5891 | netsnmp_get_cache_handler | ||
| 5892 | (SCTP_STATS_CACHE_TIMEOUT, | ||
| 5893 | @@ -43,8 +50,13 @@ init_sctpScalars(void) | ||
| 5894 | sctp_params_oid, | ||
| 5895 | OID_LENGTH(sctp_params_oid), | ||
| 5896 | HANDLER_CAN_RONLY); | ||
| 5897 | - netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM, | ||
| 5898 | + if (!reginfo_params) | ||
| 5899 | + return; | ||
| 5900 | + | ||
| 5901 | + rc = netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM, | ||
| 5902 | SCTP_MAXINITRETR); | ||
| 5903 | + if (!rc) | ||
| 5904 | + return; | ||
| 5905 | netsnmp_inject_handler(reginfo_params, | ||
| 5906 | netsnmp_get_cache_handler | ||
| 5907 | (SCTP_PARAMS_CACHE_TIMEOUT, | ||
| 5908 | diff --git a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c | ||
| 5909 | index a62b788..b8c723f 100644 | ||
| 5910 | --- a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c | ||
| 5911 | +++ b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c | ||
| 5912 | @@ -60,9 +60,7 @@ netsnmp_access_sctp_params_arch_init() | ||
| 5913 | int | ||
| 5914 | netsnmp_access_sctp_params_arch_load(netsnmp_sctp_params * sctp_params) | ||
| 5915 | { | ||
| 5916 | - int ret; | ||
| 5917 | size_t len = sizeof(uint32_t); | ||
| 5918 | - unsigned int cnt = 0; | ||
| 5919 | |||
| 5920 | sctp_params->rto_algorithm = NETSNMP_SCTP_ALGORITHM_VANJ; | ||
| 5921 | sctp_params->max_assocs = SCTP_MAX_NUM_OF_ASOC; | ||
| 5922 | diff --git a/agent/mibgroup/sctp-mib/sctpScalars_linux.c b/agent/mibgroup/sctp-mib/sctpScalars_linux.c | ||
| 5923 | index 8cbe90f..2e5b5af 100644 | ||
| 5924 | --- a/agent/mibgroup/sctp-mib/sctpScalars_linux.c | ||
| 5925 | +++ b/agent/mibgroup/sctp-mib/sctpScalars_linux.c | ||
| 5926 | @@ -35,6 +35,7 @@ load_uint_file(const char *filename, u_int * value) | ||
| 5927 | if (ret != 1) { | ||
| 5928 | DEBUGMSGTL(("sctp:scalars:arch:load", "Malformed file %s\n", | ||
| 5929 | filename)); | ||
| 5930 | + fclose(f); | ||
| 5931 | return -2; | ||
| 5932 | } | ||
| 5933 | |||
| 5934 | @@ -71,6 +72,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats) | ||
| 5935 | if (delimiter == NULL) { | ||
| 5936 | DEBUGMSGTL(("sctp:scalars:stats:arch_load", | ||
| 5937 | "Malformed line, cannot find '\\t'!\n")); | ||
| 5938 | + fclose(f); | ||
| 5939 | return -1; | ||
| 5940 | } | ||
| 5941 | errno = 0; | ||
| 5942 | @@ -78,6 +80,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats) | ||
| 5943 | if (errno != 0) { | ||
| 5944 | DEBUGMSGTL(("sctp:scalars:stats:arch_load", | ||
| 5945 | "Malformed value!'\n")); | ||
| 5946 | + fclose(f); | ||
| 5947 | return -1; | ||
| 5948 | } | ||
| 5949 | |||
| 5950 | @@ -136,11 +139,13 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats) | ||
| 5951 | if (ret < 0) { | ||
| 5952 | DEBUGMSGTL(("sctp:scalars:stats:arch_load", | ||
| 5953 | "Unknown entry!'\n")); | ||
| 5954 | + fclose(f); | ||
| 5955 | return ret; | ||
| 5956 | } | ||
| 5957 | } | ||
| 5958 | |||
| 5959 | sctp_stats->discontinuity_time = 0; | ||
| 5960 | + fclose(f); | ||
| 5961 | return 0; | ||
| 5962 | } | ||
| 5963 | |||
| 5964 | diff --git a/agent/mibgroup/sctp-mib/sctpTables_common.c b/agent/mibgroup/sctp-mib/sctpTables_common.c | ||
| 5965 | index 899d8d5..b28ea03 100644 | ||
| 5966 | --- a/agent/mibgroup/sctp-mib/sctpTables_common.c | ||
| 5967 | +++ b/agent/mibgroup/sctp-mib/sctpTables_common.c | ||
| 5968 | @@ -435,7 +435,7 @@ sctpTables_load(void) | ||
| 5969 | |||
| 5970 | ret = sctpTables_arch_load(&containers, &flags); | ||
| 5971 | |||
| 5972 | - if (flags | SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) { | ||
| 5973 | + if (flags & SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) { | ||
| 5974 | sctpAssocTable_delete_invalid(containers.sctpAssocTable); | ||
| 5975 | sctpAssocRemAddrTable_delete_invalid(containers. | ||
| 5976 | sctpAssocRemAddrTable); | ||
| 5977 | @@ -443,7 +443,7 @@ sctpTables_load(void) | ||
| 5978 | sctpAssocLocalAddrTable); | ||
| 5979 | } | ||
| 5980 | |||
| 5981 | - if (flags | SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) { | ||
| 5982 | + if (flags & SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) { | ||
| 5983 | ret = sctpTables_fill_lookup(&containers); | ||
| 5984 | } | ||
| 5985 | |||
| 5986 | diff --git a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c | ||
| 5987 | index db73e00..516e9f5 100644 | ||
| 5988 | --- a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c | ||
| 5989 | +++ b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c | ||
| 5990 | @@ -58,8 +58,6 @@ parse_assoc_local_addresses(sctpTables_containers * containers, | ||
| 5991 | static int | ||
| 5992 | parse_assoc_xstcb(sctpTables_containers * containers, struct xsctp_tcb *xstcb) | ||
| 5993 | { | ||
| 5994 | - long inode; | ||
| 5995 | - char *token; | ||
| 5996 | int ret; | ||
| 5997 | sctpAssocTable_entry *entry; | ||
| 5998 | |||
| 5999 | @@ -124,7 +122,6 @@ static int | ||
| 6000 | parse_remaddr_xraddr(sctpTables_containers * containers, | ||
| 6001 | struct xsctp_raddr *xraddr) | ||
| 6002 | { | ||
| 6003 | - char *token; | ||
| 6004 | int ret; | ||
| 6005 | sctpAssocRemAddrTable_entry *entry; | ||
| 6006 | |||
| 6007 | @@ -184,8 +181,6 @@ sctpTables_arch_load(sctpTables_containers * containers, u_long * flags) | ||
| 6008 | struct xsctp_tcb *xstcb; | ||
| 6009 | struct xsctp_laddr *xladdr; | ||
| 6010 | struct xsctp_raddr *xraddr; | ||
| 6011 | - sa_family_t family; | ||
| 6012 | - void *addr; | ||
| 6013 | |||
| 6014 | |||
| 6015 | *flags |= SCTP_TABLES_LOAD_FLAG_DELETE_INVALID; | ||
| 6016 | diff --git a/agent/mibgroup/smux/smux.c b/agent/mibgroup/smux/smux.c | ||
| 6017 | index fdb5e11..2055974 100644 | ||
| 6018 | --- a/agent/mibgroup/smux/smux.c | ||
| 6019 | +++ b/agent/mibgroup/smux/smux.c | ||
| 6020 | @@ -91,7 +91,7 @@ static u_char *smux_parse(u_char *, oid *, size_t *, size_t *, u_char *); | ||
| 6021 | static u_char *smux_parse_var(u_char *, size_t *, oid *, size_t *, | ||
| 6022 | size_t *, u_char *); | ||
| 6023 | static void smux_send_close(int, int); | ||
| 6024 | -static void smux_list_detach(smux_reg **, smux_reg **); | ||
| 6025 | +static void smux_list_detach(smux_reg **, smux_reg *); | ||
| 6026 | static void smux_replace_active(smux_reg *, smux_reg *); | ||
| 6027 | static void smux_peer_cleanup(int); | ||
| 6028 | static int smux_auth_peer(oid *, size_t, char *, int); | ||
| 6029 | @@ -145,6 +145,7 @@ smux_parse_peer_auth(const char *token, char *cptr) | ||
| 6030 | } | ||
| 6031 | if (nauths == SMUX_MAX_PEERS) { | ||
| 6032 | config_perror("Too many smuxpeers"); | ||
| 6033 | + free(aptr); | ||
| 6034 | return; | ||
| 6035 | } | ||
| 6036 | |||
| 6037 | @@ -169,10 +170,8 @@ smux_parse_peer_auth(const char *token, char *cptr) | ||
| 6038 | /* | ||
| 6039 | * password | ||
| 6040 | */ | ||
| 6041 | - if (*password_cptr) { | ||
| 6042 | - strncpy(aptr->sa_passwd, password_cptr, SMUXMAXSTRLEN-1); | ||
| 6043 | - aptr->sa_passwd[SMUXMAXSTRLEN-1] = '\0'; | ||
| 6044 | - } | ||
| 6045 | + if (*password_cptr) | ||
| 6046 | + strlcpy(aptr->sa_passwd, password_cptr, sizeof(aptr->sa_passwd)); | ||
| 6047 | } else { | ||
| 6048 | /* | ||
| 6049 | * null passwords OK | ||
| 6050 | @@ -369,6 +368,11 @@ var_smux_write(int action, | ||
| 6051 | break; | ||
| 6052 | } | ||
| 6053 | |||
| 6054 | + if (!rptr) { | ||
| 6055 | + DEBUGMSGTL(("smux", "[var_smux_write] unknown registration\n")); | ||
| 6056 | + return SNMP_ERR_GENERR; | ||
| 6057 | + } | ||
| 6058 | + | ||
| 6059 | switch (action) { | ||
| 6060 | case RESERVE1: | ||
| 6061 | DEBUGMSGTL(("smux", "[var_smux_write] entering RESERVE1\n")); | ||
| 6062 | @@ -1049,7 +1053,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len) | ||
| 6063 | /* | ||
| 6064 | * no replacement found | ||
| 6065 | */ | ||
| 6066 | - smux_list_detach(&ActiveRegs, &rptr); | ||
| 6067 | + smux_list_detach(&ActiveRegs, rptr); | ||
| 6068 | free(rptr); | ||
| 6069 | } | ||
| 6070 | smux_send_rrsp(sd, rpriority); | ||
| 6071 | @@ -1063,7 +1067,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len) | ||
| 6072 | priority); | ||
| 6073 | if (rptr) { | ||
| 6074 | rpriority = rptr->sr_priority; | ||
| 6075 | - smux_list_detach(&PassiveRegs, &rptr); | ||
| 6076 | + smux_list_detach(&PassiveRegs, rptr); | ||
| 6077 | free(rptr); | ||
| 6078 | smux_send_rrsp(sd, rpriority); | ||
| 6079 | return ptr; | ||
| 6080 | @@ -1104,7 +1108,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len) | ||
| 6081 | snmp_oid_compare(oid_name, oid_name_len, rptr->sr_name, | ||
| 6082 | rptr->sr_name_len); | ||
| 6083 | if (result == 0) { | ||
| 6084 | - if ((oid_name_len == rptr->sr_name_len)) { | ||
| 6085 | + if (oid_name_len == rptr->sr_name_len) { | ||
| 6086 | if ((nrptr->sr_priority == -1)) { | ||
| 6087 | nrptr->sr_priority = rptr->sr_priority; | ||
| 6088 | do { | ||
| 6089 | @@ -1154,9 +1158,17 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len) | ||
| 6090 | if (nrptr->sr_priority == -1) | ||
| 6091 | nrptr->sr_priority = 0; | ||
| 6092 | smux_list_add(&ActiveRegs, nrptr); | ||
| 6093 | - register_mib("smux", (struct variable *) | ||
| 6094 | - smux_variables, sizeof(struct variable2), | ||
| 6095 | - 1, nrptr->sr_name, nrptr->sr_name_len); | ||
| 6096 | + if (register_mib("smux", (struct variable *) | ||
| 6097 | + smux_variables, sizeof(struct variable2), | ||
| 6098 | + 1, nrptr->sr_name, nrptr->sr_name_len) | ||
| 6099 | + != SNMPERR_SUCCESS) { | ||
| 6100 | + DEBUGMSGTL(("smux", "[smux_rreq_process] Failed to register subtree\n")); | ||
| 6101 | + smux_list_detach(&ActiveRegs, nrptr); | ||
| 6102 | + free(nrptr); | ||
| 6103 | + smux_send_rrsp(sd, -1); | ||
| 6104 | + return NULL; | ||
| 6105 | + } | ||
| 6106 | + | ||
| 6107 | done: | ||
| 6108 | smux_send_rrsp(sd, nrptr->sr_priority); | ||
| 6109 | return ptr; | ||
| 6110 | @@ -1202,10 +1214,10 @@ smux_find_match(smux_reg * regs, int sd, oid * oid_name, | ||
| 6111 | static void | ||
| 6112 | smux_replace_active(smux_reg * actptr, smux_reg * pasptr) | ||
| 6113 | { | ||
| 6114 | - smux_list_detach(&ActiveRegs, &actptr); | ||
| 6115 | + smux_list_detach(&ActiveRegs, actptr); | ||
| 6116 | unregister_mib(actptr->sr_name, actptr->sr_name_len); | ||
| 6117 | |||
| 6118 | - smux_list_detach(&PassiveRegs, &pasptr); | ||
| 6119 | + smux_list_detach(&PassiveRegs, pasptr); | ||
| 6120 | (void) smux_list_add(&ActiveRegs, pasptr); | ||
| 6121 | |||
| 6122 | register_mib("smux", (struct variable *) smux_variables, | ||
| 6123 | @@ -1215,7 +1227,7 @@ smux_replace_active(smux_reg * actptr, smux_reg * pasptr) | ||
| 6124 | } | ||
| 6125 | |||
| 6126 | static void | ||
| 6127 | -smux_list_detach(smux_reg ** head, smux_reg ** m_remove) | ||
| 6128 | +smux_list_detach(smux_reg ** head, smux_reg * m_remove) | ||
| 6129 | { | ||
| 6130 | smux_reg *rptr, *rptr2; | ||
| 6131 | |||
| 6132 | @@ -1223,15 +1235,13 @@ smux_list_detach(smux_reg ** head, smux_reg ** m_remove) | ||
| 6133 | DEBUGMSGTL(("smux", "[smux_list_detach] Ouch!")); | ||
| 6134 | return; | ||
| 6135 | } | ||
| 6136 | - if (*head == *m_remove) { | ||
| 6137 | - *m_remove = *head; | ||
| 6138 | + if (*head == m_remove) { | ||
| 6139 | *head = (*head)->sr_next; | ||
| 6140 | return; | ||
| 6141 | } | ||
| 6142 | for (rptr = *head, rptr2 = rptr->sr_next; rptr2; | ||
| 6143 | rptr2 = rptr2->sr_next, rptr = rptr->sr_next) { | ||
| 6144 | - if (rptr2 == *m_remove) { | ||
| 6145 | - *m_remove = rptr2; | ||
| 6146 | + if (rptr2 == m_remove) { | ||
| 6147 | rptr->sr_next = rptr2->sr_next; | ||
| 6148 | return; | ||
| 6149 | } | ||
| 6150 | @@ -1337,7 +1347,7 @@ smux_find_replacement(oid * name, size_t name_len) | ||
| 6151 | if (!snmp_oidtree_compare(rptr->sr_name, rptr->sr_name_len, | ||
| 6152 | name, name_len)) { | ||
| 6153 | if ((difflen = rptr->sr_name_len - name_len) | ||
| 6154 | - < bestlen) { | ||
| 6155 | + < bestlen || !bestptr) { | ||
| 6156 | bestlen = difflen; | ||
| 6157 | bestptr = rptr; | ||
| 6158 | } else if ((difflen == bestlen) && | ||
| 6159 | @@ -1759,7 +1769,7 @@ smux_peer_cleanup(int sd) | ||
| 6160 | for (rptr = PassiveRegs; rptr; rptr = nrptr) { | ||
| 6161 | nrptr = rptr->sr_next; | ||
| 6162 | if (rptr->sr_fd == sd) { | ||
| 6163 | - smux_list_detach(&PassiveRegs, &rptr); | ||
| 6164 | + smux_list_detach(&PassiveRegs, rptr); | ||
| 6165 | free(rptr); | ||
| 6166 | } | ||
| 6167 | rptr = nrptr; | ||
| 6168 | @@ -1770,12 +1780,12 @@ smux_peer_cleanup(int sd) | ||
| 6169 | for (rptr = ActiveRegs; rptr; rptr = rptr2) { | ||
| 6170 | rptr2 = rptr->sr_next; | ||
| 6171 | if (rptr->sr_fd == sd) { | ||
| 6172 | - smux_list_detach(&ActiveRegs, &rptr); | ||
| 6173 | + smux_list_detach(&ActiveRegs, rptr); | ||
| 6174 | unregister_mib(rptr->sr_name, rptr->sr_name_len); | ||
| 6175 | if ((nrptr = smux_find_replacement(rptr->sr_name, | ||
| 6176 | rptr->sr_name_len)) != | ||
| 6177 | NULL) { | ||
| 6178 | - smux_list_detach(&PassiveRegs, &nrptr); | ||
| 6179 | + smux_list_detach(&PassiveRegs, nrptr); | ||
| 6180 | smux_list_add(&ActiveRegs, nrptr); | ||
| 6181 | register_mib("smux", (struct variable *) | ||
| 6182 | smux_variables, sizeof(struct variable2), | ||
| 6183 | diff --git a/agent/mibgroup/smux/snmp_bgp.c b/agent/mibgroup/smux/snmp_bgp.c | ||
| 6184 | index 70596a1..16b0185 100644 | ||
| 6185 | --- a/agent/mibgroup/smux/snmp_bgp.c | ||
| 6186 | +++ b/agent/mibgroup/smux/snmp_bgp.c | ||
| 6187 | @@ -109,8 +109,6 @@ init_snmp_bdp(void) | ||
| 6188 | bgp_variables_oid); | ||
| 6189 | } | ||
| 6190 | |||
| 6191 | - | ||
| 6192 | -#endif | ||
| 6193 | static oid max_bgp_mib[] = | ||
| 6194 | { 1, 3, 6, 1, 2, 1, 15, 5, 1, 6, 255, 255, 255, 255 }; | ||
| 6195 | static oid min_bgp_mib[] = { 1, 3, 6, 1, 2, 1, 15, 1, 0 }; | ||
| 6196 | diff --git a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c | ||
| 6197 | index fd7ab8e..942a865 100644 | ||
| 6198 | --- a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c | ||
| 6199 | +++ b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c | ||
| 6200 | @@ -247,7 +247,7 @@ snmpNotifyFilterTable_container_load(netsnmp_container *container) | ||
| 6201 | } | ||
| 6202 | |||
| 6203 | DEBUGMSGT(("verbose:snmpNotifyFilterTable:snmpNotifyFilterTable_container_load", | ||
| 6204 | - "inserted %lu records\n", (long)count)); | ||
| 6205 | + "inserted %" NETSNMP_PRIz "u records\n", count)); | ||
| 6206 | |||
| 6207 | return MFD_SUCCESS; | ||
| 6208 | } /* snmpNotifyFilterTable_container_load */ | ||
| 6209 | diff --git a/agent/mibgroup/target/snmpTargetAddrEntry.c b/agent/mibgroup/target/snmpTargetAddrEntry.c | ||
| 6210 | index ac77d52..50cfed6 100644 | ||
| 6211 | --- a/agent/mibgroup/target/snmpTargetAddrEntry.c | ||
| 6212 | +++ b/agent/mibgroup/target/snmpTargetAddrEntry.c | ||
| 6213 | @@ -372,9 +372,7 @@ snmpTargetAddr_addName(struct targetAddrTable_struct *entry, char *cptr) | ||
| 6214 | "ERROR snmpTargetAddrEntry: name out of range in config string\n")); | ||
| 6215 | return (0); | ||
| 6216 | } | ||
| 6217 | - entry->name = (char *) malloc(len + 1); | ||
| 6218 | - strncpy(entry->name, cptr, len); | ||
| 6219 | - entry->name[len] = '\0'; | ||
| 6220 | + entry->name = strdup(cptr); | ||
| 6221 | } | ||
| 6222 | return (1); | ||
| 6223 | } /* addName */ | ||
| 6224 | @@ -508,9 +506,7 @@ snmpTargetAddr_addTagList(struct targetAddrTable_struct *entry, char *cptr) | ||
| 6225 | return (0); | ||
| 6226 | } | ||
| 6227 | SNMP_FREE(entry->tagList); | ||
| 6228 | - entry->tagList = (char *) malloc(len + 1); | ||
| 6229 | - strncpy(entry->tagList, cptr, len); | ||
| 6230 | - entry->tagList[len] = '\0'; | ||
| 6231 | + entry->tagList = strdup(cptr); | ||
| 6232 | } | ||
| 6233 | return (1); | ||
| 6234 | } /* snmpTargetAddr_addTagList */ | ||
| 6235 | @@ -534,9 +530,7 @@ snmpTargetAddr_addParams(struct targetAddrTable_struct *entry, char *cptr) | ||
| 6236 | "ERROR snmpTargetAddrEntry: params out of range in config string\n")); | ||
| 6237 | return (0); | ||
| 6238 | } | ||
| 6239 | - entry->params = (char *) malloc(len + 1); | ||
| 6240 | - strncpy(entry->params, cptr, len); | ||
| 6241 | - entry->params[len] = '\0'; | ||
| 6242 | + entry->params = strdup(cptr); | ||
| 6243 | } | ||
| 6244 | return (1); | ||
| 6245 | } /* snmpTargetAddr_addParams */ | ||
| 6246 | @@ -725,10 +719,7 @@ store_snmpTargetAddrEntry(int majorID, int minorID, void *serverarg, | ||
| 6247 | (int) curr_struct->tDomain[i]); | ||
| 6248 | line[ sizeof(line)-1 ] = 0; | ||
| 6249 | } | ||
| 6250 | - if ( strlen(line)+2 < sizeof(line) ) { | ||
| 6251 | - line[ strlen(line)+1 ] = 0; | ||
| 6252 | - line[ strlen(line) ] = ' '; | ||
| 6253 | - } | ||
| 6254 | + strlcat(line, " ", sizeof(line)); | ||
| 6255 | read_config_save_octet_string(&line[strlen(line)], | ||
| 6256 | curr_struct->tAddress, | ||
| 6257 | curr_struct->tAddressLen); | ||
| 6258 | @@ -860,7 +851,7 @@ var_snmpTargetAddrEntry(struct variable * vp, | ||
| 6259 | |||
| 6260 | case SNMPTARGETADDRTAGLIST: | ||
| 6261 | if (temp_struct->tagList != NULL) { | ||
| 6262 | - strcpy(string, temp_struct->tagList); | ||
| 6263 | + strlcpy(string, temp_struct->tagList, sizeof(string)); | ||
| 6264 | *var_len = strlen(string); | ||
| 6265 | return (unsigned char *) string; | ||
| 6266 | } else { | ||
| 6267 | @@ -870,7 +861,7 @@ var_snmpTargetAddrEntry(struct variable * vp, | ||
| 6268 | case SNMPTARGETADDRPARAMS: | ||
| 6269 | if (temp_struct->params == NULL) | ||
| 6270 | return NULL; | ||
| 6271 | - strcpy(string, temp_struct->params); | ||
| 6272 | + strlcpy(string, temp_struct->params, sizeof(string)); | ||
| 6273 | *var_len = strlen(string); | ||
| 6274 | return (unsigned char *) string; | ||
| 6275 | |||
| 6276 | @@ -1342,7 +1333,7 @@ write_snmpTargetAddrParams(int action, | ||
| 6277 | } | ||
| 6278 | |||
| 6279 | old_params = target->params; | ||
| 6280 | - target->params = (char*)malloc(var_val_len + 1); | ||
| 6281 | + target->params = malloc(var_val_len + 1); | ||
| 6282 | if (target->params == NULL) { | ||
| 6283 | return SNMP_ERR_RESOURCEUNAVAILABLE; | ||
| 6284 | } | ||
| 6285 | diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.c b/agent/mibgroup/target/snmpTargetParamsEntry.c | ||
| 6286 | index 3a796c8..eed43f0 100644 | ||
| 6287 | --- a/agent/mibgroup/target/snmpTargetParamsEntry.c | ||
| 6288 | +++ b/agent/mibgroup/target/snmpTargetParamsEntry.c | ||
| 6289 | @@ -319,9 +319,7 @@ snmpTargetParams_addParamName(struct targetParamTable_struct *entry, | ||
| 6290 | "ERROR snmpTargetParamsEntry: param name out of range in config string\n")); | ||
| 6291 | return (0); | ||
| 6292 | } | ||
| 6293 | - entry->paramName = (char *) malloc(len + 1); | ||
| 6294 | - strncpy(entry->paramName, cptr, len); | ||
| 6295 | - entry->paramName[len] = '\0'; | ||
| 6296 | + entry->paramName = strdup(cptr); | ||
| 6297 | } | ||
| 6298 | return (1); | ||
| 6299 | } | ||
| 6300 | @@ -382,16 +380,12 @@ int | ||
| 6301 | snmpTargetParams_addSecName(struct targetParamTable_struct *entry, | ||
| 6302 | char *cptr) | ||
| 6303 | { | ||
| 6304 | - size_t len; | ||
| 6305 | if (cptr == NULL) { | ||
| 6306 | DEBUGMSGTL(("snmpTargetParamsEntry", | ||
| 6307 | "ERROR snmpTargetParamsEntry: no security name in config string\n")); | ||
| 6308 | return (0); | ||
| 6309 | } else { | ||
| 6310 | - len = strlen(cptr); | ||
| 6311 | - entry->secName = (char *) malloc(len + 1); | ||
| 6312 | - strncpy(entry->secName, cptr, len); | ||
| 6313 | - entry->secName[len] = '\0'; | ||
| 6314 | + entry->secName = strdup(cptr); | ||
| 6315 | } | ||
| 6316 | return (1); | ||
| 6317 | } /* snmpTargetParams_addSecName */ | ||
| 6318 | diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.h b/agent/mibgroup/target/snmpTargetParamsEntry.h | ||
| 6319 | index 2bd6e25..bd30582 100644 | ||
| 6320 | --- a/agent/mibgroup/target/snmpTargetParamsEntry.h | ||
| 6321 | +++ b/agent/mibgroup/target/snmpTargetParamsEntry.h | ||
| 6322 | @@ -47,6 +47,7 @@ | ||
| 6323 | targetParamTable_struct | ||
| 6324 | *newEntry); | ||
| 6325 | struct targetParamTable_struct *snmpTargetParamTable_create(void); | ||
| 6326 | + void snmpTargetParamTable_dispose(struct targetParamTable_struct *); | ||
| 6327 | |||
| 6328 | /* | ||
| 6329 | * function definitions | ||
| 6330 | diff --git a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c | ||
| 6331 | index ec0cbf0..9a5b466 100644 | ||
| 6332 | --- a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c | ||
| 6333 | +++ b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c | ||
| 6334 | @@ -291,7 +291,7 @@ _load6(netsnmp_container *container, u_int load_flags) | ||
| 6335 | */ | ||
| 6336 | while (fgets(line, sizeof(line), in)) { | ||
| 6337 | netsnmp_tcpconn_entry *entry; | ||
| 6338 | - int state, rc, local_port, remote_port, tmp_state; | ||
| 6339 | + int state, local_port, remote_port, tmp_state; | ||
| 6340 | unsigned long long inode; | ||
| 6341 | size_t buf_len, offset; | ||
| 6342 | char local_addr[48], remote_addr[48]; | ||
| 6343 | diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c | ||
| 6344 | index f8df440..5493ff9 100644 | ||
| 6345 | --- a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c | ||
| 6346 | +++ b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c | ||
| 6347 | @@ -1415,8 +1415,7 @@ _tlstmAddrTable_row_restore_mib(const char *token, char *buf) | ||
| 6348 | addr->hashType = hashType; | ||
| 6349 | addr->flags = TLSTM_ADDR_FROM_MIB | TLSTM_ADDR_NONVOLATILE; | ||
| 6350 | |||
| 6351 | - if (netsnmp_tlstmAddr_add(addr) != 0) | ||
| 6352 | - netsnmp_tlstmAddr_free(addr); | ||
| 6353 | + netsnmp_tlstmAddr_add(addr); | ||
| 6354 | } | ||
| 6355 | else { | ||
| 6356 | netsnmp_tdata_row *row; | ||
| 6357 | diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c | ||
| 6358 | index 7027114..cd54452 100644 | ||
| 6359 | --- a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c | ||
| 6360 | +++ b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c | ||
| 6361 | @@ -1275,7 +1275,7 @@ _tlstmParamsTable_row_restore_mib(const char *token, char *buf) | ||
| 6362 | entry = row->data; | ||
| 6363 | |||
| 6364 | entry->hashType = params->hashType; | ||
| 6365 | - strncpy(entry->snmpTlstmParamsClientFingerprint,params->fingerprint, | ||
| 6366 | + strlcpy(entry->snmpTlstmParamsClientFingerprint, params->fingerprint, | ||
| 6367 | sizeof(entry->snmpTlstmParamsClientFingerprint)); | ||
| 6368 | entry->snmpTlstmParamsClientFingerprint_len = | ||
| 6369 | strlen(entry->snmpTlstmParamsClientFingerprint); | ||
| 6370 | diff --git a/agent/mibgroup/ucd-snmp/disk.c b/agent/mibgroup/ucd-snmp/disk.c | ||
| 6371 | index 70f67f5..324fbc4 100644 | ||
| 6372 | --- a/agent/mibgroup/ucd-snmp/disk.c | ||
| 6373 | +++ b/agent/mibgroup/ucd-snmp/disk.c | ||
| 6374 | @@ -409,9 +409,8 @@ add_device(char *path, char *device, int minspace, int minpercent, int override) | ||
| 6375 | /* add if and only if the device was found */ | ||
| 6376 | if(device[0] != 0) { | ||
| 6377 | /* The following buffers are cleared above, no need to add '\0' */ | ||
| 6378 | - strncpy(disks[numdisks].path, path, sizeof(disks[numdisks].path) - 1); | ||
| 6379 | - strncpy(disks[numdisks].device, device, | ||
| 6380 | - sizeof(disks[numdisks].device) - 1); | ||
| 6381 | + strlcpy(disks[numdisks].path, path, sizeof(disks[numdisks].path)); | ||
| 6382 | + strlcpy(disks[numdisks].device, device, sizeof(disks[numdisks].device)); | ||
| 6383 | disks[numdisks].minimumspace = minspace; | ||
| 6384 | disks[numdisks].minpercent = minpercent; | ||
| 6385 | numdisks++; | ||
| 6386 | @@ -595,8 +594,7 @@ find_device(char *path) | ||
| 6387 | } | ||
| 6388 | while (mntfp && NULL != (mntent = getmntent(mntfp))) | ||
| 6389 | if (strcmp(path, mntent->mnt_dir) == 0) { | ||
| 6390 | - strncpy(device, mntent->mnt_fsname, sizeof(device)); | ||
| 6391 | - device[sizeof(device) - 1] = '\0'; | ||
| 6392 | + strlcpy(device, mntent->mnt_fsname, sizeof(device)); | ||
| 6393 | DEBUGMSGTL(("ucd-snmp/disk", "Disk: %s\n", | ||
| 6394 | mntent->mnt_fsname)); | ||
| 6395 | break; | ||
| 6396 | @@ -620,18 +618,14 @@ find_device(char *path) | ||
| 6397 | path, mnttab.mnt_mountp)); | ||
| 6398 | } | ||
| 6399 | fclose(mntfp); | ||
| 6400 | - if (i == 0) { | ||
| 6401 | - strncpy(device, mnttab.mnt_special, sizeof(device)); | ||
| 6402 | - device[sizeof(device) - 1] = '\0'; | ||
| 6403 | - } | ||
| 6404 | + if (i == 0) | ||
| 6405 | + strlcpy(device, mnttab.mnt_special, sizeof(device)); | ||
| 6406 | #endif /* HAVE_SETMNTENT */ | ||
| 6407 | #elif HAVE_FSTAB_H | ||
| 6408 | stat(path, &stat1); | ||
| 6409 | setfsent(); | ||
| 6410 | - if ((fstab = getfsfile(path))) { | ||
| 6411 | - strncpy(device, fstab->fs_spec, sizeof(device)); | ||
| 6412 | - device[sizeof(device) - 1] = '\0'; | ||
| 6413 | - } | ||
| 6414 | + if ((fstab = getfsfile(path))) | ||
| 6415 | + strlcpy(device, fstab->fs_spec, sizeof(device)); | ||
| 6416 | endfsent(); | ||
| 6417 | if (device[0] != '\0') { | ||
| 6418 | /* | ||
| 6419 | @@ -641,8 +635,7 @@ find_device(char *path) | ||
| 6420 | |||
| 6421 | #elif HAVE_STATFS | ||
| 6422 | if (statfs(path, &statf) == 0) { | ||
| 6423 | - strncpy(device, statf.f_mntfromname, sizeof(device) - 1); | ||
| 6424 | - device[sizeof(device) - 1] = '\0'; | ||
| 6425 | + strlcpy(device, statf.f_mntfromname, sizeof(device)); | ||
| 6426 | DEBUGMSGTL(("ucd-snmp/disk", "Disk: %s\n", | ||
| 6427 | statf.f_mntfromname)); | ||
| 6428 | } | ||
| 6429 | diff --git a/agent/mibgroup/ucd-snmp/disk_hw.c b/agent/mibgroup/ucd-snmp/disk_hw.c | ||
| 6430 | index 6fb9418..ba26479 100644 | ||
| 6431 | --- a/agent/mibgroup/ucd-snmp/disk_hw.c | ||
| 6432 | +++ b/agent/mibgroup/ucd-snmp/disk_hw.c | ||
| 6433 | @@ -1,5 +1,5 @@ | ||
| 6434 | /* | ||
| 6435 | - * disk.c | ||
| 6436 | + * disk_hw.c | ||
| 6437 | */ | ||
| 6438 | |||
| 6439 | #include <net-snmp/net-snmp-config.h> | ||
| 6440 | @@ -137,6 +137,7 @@ disk_free_config(void) | ||
| 6441 | if (disks) { | ||
| 6442 | free( disks ); | ||
| 6443 | disks = NULL; | ||
| 6444 | + maxdisks = numdisks = 0; | ||
| 6445 | } | ||
| 6446 | allDisksIncluded = 0; | ||
| 6447 | } | ||
| 6448 | @@ -321,7 +322,7 @@ tryAgain: | ||
| 6449 | |||
| 6450 | switch (vp->magic) { | ||
| 6451 | case MIBINDEX: | ||
| 6452 | - long_ret = disknum; | ||
| 6453 | + long_ret = disknum + 1; | ||
| 6454 | return ((u_char *) (&long_ret)); | ||
| 6455 | case ERRORNAME: /* DISKPATH */ | ||
| 6456 | *var_len = strlen(entry->path); | ||
| 6457 | diff --git a/agent/mibgroup/ucd-snmp/diskio.c b/agent/mibgroup/ucd-snmp/diskio.c | ||
| 6458 | index 769a365..4d6d05c 100644 | ||
| 6459 | --- a/agent/mibgroup/ucd-snmp/diskio.c | ||
| 6460 | +++ b/agent/mibgroup/ucd-snmp/diskio.c | ||
| 6461 | @@ -502,7 +502,8 @@ getstats(void) | ||
| 6462 | { | ||
| 6463 | time_t now; | ||
| 6464 | char *t, *tp; | ||
| 6465 | - int size, dkn_size, i; | ||
| 6466 | + size_t size, dkn_size; | ||
| 6467 | + int i; | ||
| 6468 | |||
| 6469 | now = time(NULL); | ||
| 6470 | if (cache_time + CACHE_TIMEOUT > now) { | ||
| 6471 | @@ -526,6 +527,7 @@ getstats(void) | ||
| 6472 | if (ndisk == 0) | ||
| 6473 | return 0; | ||
| 6474 | dkname = malloc(ndisk * sizeof(char *)); | ||
| 6475 | + dkn_size = 0; | ||
| 6476 | if (sysctl(nmib, 2, NULL, &dkn_size, NULL, 0) < 0) { | ||
| 6477 | perror("Can't get size of HW_DISKNAMES mib"); | ||
| 6478 | return 0; | ||
| 6479 | diff --git a/agent/mibgroup/ucd-snmp/dlmod.c b/agent/mibgroup/ucd-snmp/dlmod.c | ||
| 6480 | index eecd38f..e9742f2 100644 | ||
| 6481 | --- a/agent/mibgroup/ucd-snmp/dlmod.c | ||
| 6482 | +++ b/agent/mibgroup/ucd-snmp/dlmod.c | ||
| 6483 | @@ -18,8 +18,6 @@ | ||
| 6484 | #include <net-snmp/net-snmp-includes.h> | ||
| 6485 | #include <net-snmp/agent/net-snmp-agent-includes.h> | ||
| 6486 | |||
| 6487 | -#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN) | ||
| 6488 | - | ||
| 6489 | #include <dlfcn.h> | ||
| 6490 | #include "dlmod.h" | ||
| 6491 | |||
| 6492 | @@ -124,7 +122,7 @@ dlmod_load_module(struct dlmod *dlm) | ||
| 6493 | dlm->status = DLMOD_ERROR; | ||
| 6494 | } | ||
| 6495 | } | ||
| 6496 | - strncpy(dlm->path, tmp_path, sizeof(dlm->path)); | ||
| 6497 | + strlcpy(dlm->path, tmp_path, sizeof(dlm->path)); | ||
| 6498 | if (dlm->status == DLMOD_ERROR) | ||
| 6499 | return; | ||
| 6500 | } | ||
| 6501 | @@ -219,16 +217,16 @@ dlmod_parse_config(const char *token, char *cptr) | ||
| 6502 | dlmod_delete_module(dlm); | ||
| 6503 | return; | ||
| 6504 | } | ||
| 6505 | - strncpy(dlm->name, dlm_name, sizeof(dlm->name)); | ||
| 6506 | + strlcpy(dlm->name, dlm_name, sizeof(dlm->name)); | ||
| 6507 | |||
| 6508 | /* | ||
| 6509 | * dynamic module path | ||
| 6510 | */ | ||
| 6511 | dlm_path = strtok_r(NULL, "\t ", &st); | ||
| 6512 | if (dlm_path) | ||
| 6513 | - strncpy(dlm->path, dlm_path, sizeof(dlm->path)); | ||
| 6514 | + strlcpy(dlm->path, dlm_path, sizeof(dlm->path)); | ||
| 6515 | else | ||
| 6516 | - strncpy(dlm->path, dlm_name, sizeof(dlm->path)); | ||
| 6517 | + strlcpy(dlm->path, dlm_name, sizeof(dlm->path)); | ||
| 6518 | |||
| 6519 | dlmod_load_module(dlm); | ||
| 6520 | |||
| 6521 | @@ -573,9 +571,6 @@ static oid dlmod_variables_oid[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 14 }; | ||
| 6522 | void | ||
| 6523 | init_dlmod(void) | ||
| 6524 | { | ||
| 6525 | - char *p; | ||
| 6526 | - int len; | ||
| 6527 | - | ||
| 6528 | REGISTER_MIB("dlmod", dlmod_variables, variable4, dlmod_variables_oid); | ||
| 6529 | |||
| 6530 | /* | ||
| 6531 | @@ -588,20 +583,23 @@ init_dlmod(void) | ||
| 6532 | dlmod_free_config, | ||
| 6533 | "module-name module-path"); | ||
| 6534 | |||
| 6535 | - p = getenv("SNMPDLMODPATH"); | ||
| 6536 | - strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path)); | ||
| 6537 | - dlmod_path[ sizeof(dlmod_path)-1 ] = 0; | ||
| 6538 | - if (p) { | ||
| 6539 | - if (p[0] == ':') { | ||
| 6540 | - len = strlen(dlmod_path); | ||
| 6541 | - if (dlmod_path[len - 1] != ':') { | ||
| 6542 | - strncat(dlmod_path, ":", sizeof(dlmod_path) - len -1); | ||
| 6543 | - len++; | ||
| 6544 | - } | ||
| 6545 | - strncat(dlmod_path, p + 1, sizeof(dlmod_path) - len); | ||
| 6546 | - } else | ||
| 6547 | - strncpy(dlmod_path, p, sizeof(dlmod_path)); | ||
| 6548 | + { | ||
| 6549 | + const char * const p = getenv("SNMPDLMODPATH"); | ||
| 6550 | + strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path)); | ||
| 6551 | + dlmod_path[ sizeof(dlmod_path) - 1 ] = 0; | ||
| 6552 | + if (p) { | ||
| 6553 | + if (p[0] == ':') { | ||
| 6554 | + int len = strlen(dlmod_path); | ||
| 6555 | + if (dlmod_path[len - 1] != ':') { | ||
| 6556 | + strncat(dlmod_path, ":", sizeof(dlmod_path) - len - 1); | ||
| 6557 | + len++; | ||
| 6558 | + } | ||
| 6559 | + strncat(dlmod_path, p + 1, sizeof(dlmod_path) - len); | ||
| 6560 | + } else | ||
| 6561 | + strncpy(dlmod_path, p, sizeof(dlmod_path)); | ||
| 6562 | + } | ||
| 6563 | } | ||
| 6564 | + | ||
| 6565 | dlmod_path[ sizeof(dlmod_path)-1 ] = 0; | ||
| 6566 | DEBUGMSGTL(("dlmod", "dlmod_path: %s\n", dlmod_path)); | ||
| 6567 | } | ||
| 6568 | @@ -614,19 +612,3 @@ shutdown_dlmod(void) | ||
| 6569 | snmpd_unregister_config_handler("dlmod"); | ||
| 6570 | unregister_mib(dlmod_variables_oid, OID_LENGTH(dlmod_variables_oid)); | ||
| 6571 | } | ||
| 6572 | - | ||
| 6573 | -#else /* no dlopen support */ | ||
| 6574 | - | ||
| 6575 | -void | ||
| 6576 | -init_dlmod(void) | ||
| 6577 | -{ | ||
| 6578 | - DEBUGMSGTL(("dlmod", | ||
| 6579 | - "Dynamic modules not support on this platform\n")); | ||
| 6580 | -} | ||
| 6581 | - | ||
| 6582 | -void | ||
| 6583 | -shutdown_dlmod(void) | ||
| 6584 | -{ | ||
| 6585 | -} | ||
| 6586 | - | ||
| 6587 | -#endif | ||
| 6588 | diff --git a/agent/mibgroup/ucd-snmp/dlmod.h b/agent/mibgroup/ucd-snmp/dlmod.h | ||
| 6589 | index 79d960b..df8bef7 100644 | ||
| 6590 | --- a/agent/mibgroup/ucd-snmp/dlmod.h | ||
| 6591 | +++ b/agent/mibgroup/ucd-snmp/dlmod.h | ||
| 6592 | @@ -6,6 +6,10 @@ | ||
| 6593 | #ifndef MIBGROUP_DLMOD_H | ||
| 6594 | #define MIBGROUP_DLMOD_H | ||
| 6595 | |||
| 6596 | +#if !defined(HAVE_DLFCN_H) || !defined(HAVE_DLOPEN) | ||
| 6597 | +config_error(Dynamic modules not supported on this platform) | ||
| 6598 | +#endif | ||
| 6599 | + | ||
| 6600 | config_add_mib(UCD-DLMOD-MIB) | ||
| 6601 | |||
| 6602 | void init_dlmod(void); | ||
| 6603 | diff --git a/agent/mibgroup/ucd-snmp/errormib.c b/agent/mibgroup/ucd-snmp/errormib.c | ||
| 6604 | index cbdd25b..7f3bcb1 100644 | ||
| 6605 | --- a/agent/mibgroup/ucd-snmp/errormib.c | ||
| 6606 | +++ b/agent/mibgroup/ucd-snmp/errormib.c | ||
| 6607 | @@ -137,8 +137,7 @@ seterrorstatus(const char *to, int prior) | ||
| 6608 | { | ||
| 6609 | if (errorstatusprior <= prior || | ||
| 6610 | (NETSNMP_ERRORTIMELENGTH < (time(NULL) - errorstatustime))) { | ||
| 6611 | - strncpy(errorstring, to, sizeof(errorstring)); | ||
| 6612 | - errorstring[ sizeof(errorstring)-1 ] = 0; | ||
| 6613 | + strlcpy(errorstring, to, sizeof(errorstring)); | ||
| 6614 | errorstatusprior = prior; | ||
| 6615 | errorstatustime = time(NULL); | ||
| 6616 | } | ||
| 6617 | @@ -219,8 +218,7 @@ var_extensible_errors(struct variable *vp, | ||
| 6618 | return ((u_char *) (&long_ret)); | ||
| 6619 | case ERRORMSG: | ||
| 6620 | if ((NETSNMP_ERRORTIMELENGTH >= time(NULL) - errorstatustime) ? 1 : 0) { | ||
| 6621 | - strncpy(errmsg, errorstring, sizeof(errmsg)); | ||
| 6622 | - errmsg[ sizeof(errmsg)-1 ] = 0; | ||
| 6623 | + strlcpy(errmsg, errorstring, sizeof(errmsg)); | ||
| 6624 | } else | ||
| 6625 | errmsg[0] = 0; | ||
| 6626 | *var_len = strlen(errmsg); | ||
| 6627 | diff --git a/agent/mibgroup/ucd-snmp/extensible.c b/agent/mibgroup/ucd-snmp/extensible.c | ||
| 6628 | index edea93a..d1752ef 100644 | ||
| 6629 | --- a/agent/mibgroup/ucd-snmp/extensible.c | ||
| 6630 | +++ b/agent/mibgroup/ucd-snmp/extensible.c | ||
| 6631 | @@ -262,8 +262,7 @@ extensible_parse_config(const char *token, char *cptr) | ||
| 6632 | for (tcptr = cptr; *tcptr != 0 && *tcptr != '#'; tcptr++) | ||
| 6633 | if (*tcptr == ';' && ptmp->type == EXECPROC) | ||
| 6634 | break; | ||
| 6635 | - strncpy(ptmp->command, cptr, tcptr - cptr); | ||
| 6636 | - ptmp->command[tcptr - cptr] = 0; | ||
| 6637 | + sprintf(ptmp->command, "%.*s", (int) (tcptr - cptr), cptr); | ||
| 6638 | } | ||
| 6639 | #ifdef NETSNMP_EXECFIXCMD | ||
| 6640 | sprintf(ptmp->fixcmd, NETSNMP_EXECFIXCMD, ptmp->name); | ||
| 6641 | @@ -419,8 +418,7 @@ execfix_parse_config(const char *token, char *cptr) | ||
| 6642 | return; | ||
| 6643 | } | ||
| 6644 | |||
| 6645 | - strncpy(execp->fixcmd, cptr, sizeof(execp->fixcmd)); | ||
| 6646 | - execp->fixcmd[ sizeof(execp->fixcmd)-1 ] = 0; | ||
| 6647 | + strlcpy(execp->fixcmd, cptr, sizeof(execp->fixcmd)); | ||
| 6648 | } | ||
| 6649 | |||
| 6650 | u_char * | ||
| 6651 | @@ -623,8 +621,7 @@ var_extensible_relocatable(struct variable *vp, | ||
| 6652 | cp = strchr(cp1, '\n'); | ||
| 6653 | if (cp) | ||
| 6654 | *cp = 0; | ||
| 6655 | - strncpy(errmsg, cp1, sizeof(errmsg)); | ||
| 6656 | - errmsg[ sizeof(errmsg)-1 ] = 0; | ||
| 6657 | + strlcpy(errmsg, cp1, sizeof(errmsg)); | ||
| 6658 | *var_len = strlen(errmsg); | ||
| 6659 | if (errmsg[*var_len - 1] == '\n') | ||
| 6660 | errmsg[--(*var_len)] = '\0'; | ||
| 6661 | diff --git a/agent/mibgroup/ucd-snmp/lmSensors.c b/agent/mibgroup/ucd-snmp/lmSensors.c | ||
| 6662 | index d6436bf..05c60b7 100644 | ||
| 6663 | --- a/agent/mibgroup/ucd-snmp/lmSensors.c | ||
| 6664 | +++ b/agent/mibgroup/ucd-snmp/lmSensors.c | ||
| 6665 | @@ -331,7 +331,7 @@ var_lmSensorsTable(struct variable *vp, | ||
| 6666 | case LMFANSENSORSDEVICE: | ||
| 6667 | case LMVOLTSENSORSDEVICE: | ||
| 6668 | case LMMISCSENSORSDEVICE: | ||
| 6669 | - strncpy(string, s.name, SPRINT_MAX_LEN - 1); | ||
| 6670 | + strlcpy(string, s.name, sizeof(string)); | ||
| 6671 | *var_len = strlen(string); | ||
| 6672 | ret = (unsigned char *) string; | ||
| 6673 | goto leaving; | ||
| 6674 | @@ -891,32 +891,32 @@ else{ | ||
| 6675 | DEBUGMSG(("ucd-snmp/lmSensors", "front panel value %d\n",enc_info->value)); | ||
| 6676 | typ = 3; /* misc */ | ||
| 6677 | sensor_array[typ].sensor[other].value = enc_info->value; | ||
| 6678 | - strncpy(sensor_array[typ].sensor[other].name,"FSP",MAX_NAME-1); | ||
| 6679 | - sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */ | ||
| 6680 | + strlcpy(sensor_array[typ].sensor[other].name, "FSP", | ||
| 6681 | + MAX_NAME); | ||
| 6682 | other++; | ||
| 6683 | break; | ||
| 6684 | case ENVCTRL_ENCL_AMBTEMPR: | ||
| 6685 | DEBUGMSG(("ucd-snmp/lmSensors", "ambient temp mC %d\n",enc_info->value*1000)); | ||
| 6686 | typ = 0; /* temperature sensor */ | ||
| 6687 | sensor_array[typ].sensor[temp].value = enc_info->value*1000; | ||
| 6688 | - strncpy(sensor_array[typ].sensor[temp].name,"Ambient",MAX_NAME-1); | ||
| 6689 | - sensor_array[typ].sensor[temp].name[MAX_NAME-1]='\0'; /* null terminate */ | ||
| 6690 | + strlcpy(sensor_array[typ].sensor[temp].name, "Ambient", | ||
| 6691 | + MAX_NAME); | ||
| 6692 | temp++; | ||
| 6693 | break; | ||
| 6694 | case ENVCTRL_ENCL_BACKPLANE4: | ||
| 6695 | DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane4\n")); | ||
| 6696 | typ = 3; /* misc */ | ||
| 6697 | sensor_array[typ].sensor[other].value = enc_info->value; | ||
| 6698 | - strncpy(sensor_array[typ].sensor[other].name,"Backplane4",MAX_NAME-1); | ||
| 6699 | - sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */ | ||
| 6700 | + strlcpy(sensor_array[typ].sensor[other].name, "Backplane4", | ||
| 6701 | + MAX_NAME); | ||
| 6702 | other++; | ||
| 6703 | break; | ||
| 6704 | case ENVCTRL_ENCL_BACKPLANE8: | ||
| 6705 | DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane8\n")); | ||
| 6706 | typ = 3; /* misc */ | ||
| 6707 | sensor_array[typ].sensor[other].value = enc_info->value; | ||
| 6708 | - strncpy(sensor_array[typ].sensor[other].name,"Backplane8",MAX_NAME-1); | ||
| 6709 | - sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */ | ||
| 6710 | + strlcpy(sensor_array[typ].sensor[other].name, "Backplane8", | ||
| 6711 | + MAX_NAME); | ||
| 6712 | other++; | ||
| 6713 | break; | ||
| 6714 | case ENVCTRL_ENCL_CPUTEMPR: | ||
| 6715 | @@ -1029,7 +1029,7 @@ else{ | ||
| 6716 | array->current_len = new_size / sizeof(_sensor); | ||
| 6717 | DEBUGMSG(("ucd-snmp/lmSensors", "type #%d increased to %d elements\n", type, (int)array->current_len)); | ||
| 6718 | } /* end if array->current */ | ||
| 6719 | - strncpy(array->sensor[array->n].name, label, MAX_NAME); | ||
| 6720 | + strlcpy(array->sensor[array->n].name, label, MAX_NAME); | ||
| 6721 | array->sensor[array->n].value = (int) (val * mul); | ||
| 6722 | DEBUGMSGTL(("sensors","sensor %s, value %d\n", | ||
| 6723 | array->sensor[array->n].name, | ||
| 6724 | diff --git a/agent/mibgroup/ucd-snmp/loadave.c b/agent/mibgroup/ucd-snmp/loadave.c | ||
| 6725 | index 2321d29..6efc5e9 100644 | ||
| 6726 | --- a/agent/mibgroup/ucd-snmp/loadave.c | ||
| 6727 | +++ b/agent/mibgroup/ucd-snmp/loadave.c | ||
| 6728 | @@ -393,8 +393,7 @@ write_laConfig(int action, | ||
| 6729 | double val; | ||
| 6730 | char *endp; | ||
| 6731 | |||
| 6732 | - strncpy(buf, (char *)var_val, var_val_len); | ||
| 6733 | - buf[var_val_len] = '\0'; | ||
| 6734 | + sprintf(buf, "%.*s", (int) var_val_len, (char *)var_val); | ||
| 6735 | val = strtod(buf, &endp); | ||
| 6736 | |||
| 6737 | if (errno == ERANGE || *endp != '\0' || val < 0 || val > 65536.00) { | ||
| 6738 | @@ -481,10 +480,12 @@ var_extensible_loadave(struct variable * vp, | ||
| 6739 | if (maxload[name[*length - 1] - 1] != 0 && | ||
| 6740 | avenrun[name[*length - 1] - 1] >= | ||
| 6741 | maxload[name[*length - 1] - 1]) { | ||
| 6742 | - sprintf(errmsg, "%d min Load Average too high (= %.2f)", | ||
| 6743 | + snprintf(errmsg, sizeof(errmsg), | ||
| 6744 | + "%d min Load Average too high (= %.2f)", | ||
| 6745 | (name[*length - 1] == | ||
| 6746 | 1) ? 1 : ((name[*length - 1] == 2) ? 5 : 15), | ||
| 6747 | avenrun[name[*length - 1] - 1]); | ||
| 6748 | + errmsg[sizeof(errmsg) - 1] = '\0'; | ||
| 6749 | } else { | ||
| 6750 | errmsg[0] = 0; | ||
| 6751 | } | ||
| 6752 | diff --git a/agent/mibgroup/ucd-snmp/logmatch.c b/agent/mibgroup/ucd-snmp/logmatch.c | ||
| 6753 | index eb21a68..abca5ce 100644 | ||
| 6754 | --- a/agent/mibgroup/ucd-snmp/logmatch.c | ||
| 6755 | +++ b/agent/mibgroup/ucd-snmp/logmatch.c | ||
| 6756 | @@ -110,7 +110,6 @@ static void | ||
| 6757 | updateLogmatch(int iindex) | ||
| 6758 | { | ||
| 6759 | |||
| 6760 | - regmatch_t myMatch; | ||
| 6761 | int matchResultCode; | ||
| 6762 | char inbuf[1024]; | ||
| 6763 | char perfilename[1024]; | ||
| 6764 | @@ -288,7 +287,7 @@ updateLogmatch(int iindex) | ||
| 6765 | |||
| 6766 | matchResultCode = | ||
| 6767 | regexec(&(logmatchTable[iindex].regexBuffer), | ||
| 6768 | - inbuf, 0, &myMatch, REG_NOTEOL); | ||
| 6769 | + inbuf, 0, NULL, REG_NOTEOL); | ||
| 6770 | |||
| 6771 | if (matchResultCode == 0) { | ||
| 6772 | logmatchTable[iindex].globalMatchCounter++; | ||
| 6773 | diff --git a/agent/mibgroup/ucd-snmp/pass.c b/agent/mibgroup/ucd-snmp/pass.c | ||
| 6774 | index 4440baa..ac14b41 100644 | ||
| 6775 | --- a/agent/mibgroup/ucd-snmp/pass.c | ||
| 6776 | +++ b/agent/mibgroup/ucd-snmp/pass.c | ||
| 6777 | @@ -33,6 +33,7 @@ | ||
| 6778 | |||
| 6779 | #include "struct.h" | ||
| 6780 | #include "pass.h" | ||
| 6781 | +#include "pass_common.h" | ||
| 6782 | #include "extensible.h" | ||
| 6783 | #include "util_funcs.h" | ||
| 6784 | |||
| 6785 | @@ -55,152 +56,6 @@ struct variable2 extensible_passthru_variables[] = { | ||
| 6786 | |||
| 6787 | |||
| 6788 | |||
| 6789 | -/* | ||
| 6790 | - * lexicographical compare two object identifiers. | ||
| 6791 | - * * Returns -1 if name1 < name2, | ||
| 6792 | - * * 0 if name1 = name2, | ||
| 6793 | - * * 1 if name1 > name2 | ||
| 6794 | - * * | ||
| 6795 | - * * This method differs from snmp_oid_compare | ||
| 6796 | - * * in that the comparison stops at the length | ||
| 6797 | - * * of the smallest object identifier. | ||
| 6798 | - */ | ||
| 6799 | -int | ||
| 6800 | -snmp_oid_min_compare(const oid * in_name1, | ||
| 6801 | - size_t len1, const oid * in_name2, size_t len2) | ||
| 6802 | -{ | ||
| 6803 | - register int len; | ||
| 6804 | - register const oid *name1 = in_name1; | ||
| 6805 | - register const oid *name2 = in_name2; | ||
| 6806 | - | ||
| 6807 | - /* | ||
| 6808 | - * len = minimum of len1 and len2 | ||
| 6809 | - */ | ||
| 6810 | - if (len1 < len2) | ||
| 6811 | - len = len1; | ||
| 6812 | - else | ||
| 6813 | - len = len2; | ||
| 6814 | - /* | ||
| 6815 | - * find first non-matching OID | ||
| 6816 | - */ | ||
| 6817 | - while (len-- > 0) { | ||
| 6818 | - /* | ||
| 6819 | - * these must be done in seperate comparisons, since | ||
| 6820 | - * subtracting them and using that result has problems with | ||
| 6821 | - * subids > 2^31. | ||
| 6822 | - */ | ||
| 6823 | - if (*(name1) < *(name2)) | ||
| 6824 | - return -1; | ||
| 6825 | - if (*(name1++) > *(name2++)) | ||
| 6826 | - return 1; | ||
| 6827 | - } | ||
| 6828 | - /* | ||
| 6829 | - * both OIDs equal up to length of shorter OID | ||
| 6830 | - */ | ||
| 6831 | - | ||
| 6832 | - return 0; | ||
| 6833 | -} | ||
| 6834 | - | ||
| 6835 | - | ||
| 6836 | -/* | ||
| 6837 | - * This is also called from pass_persist.c | ||
| 6838 | - */ | ||
| 6839 | -int | ||
| 6840 | -asc2bin(char *p) | ||
| 6841 | -{ | ||
| 6842 | - char *r, *q = p; | ||
| 6843 | - char c; | ||
| 6844 | - int n = 0; | ||
| 6845 | - | ||
| 6846 | - for (;;) { | ||
| 6847 | - c = (char) strtol(q, &r, 16); | ||
| 6848 | - if (r == q) | ||
| 6849 | - break; | ||
| 6850 | - *p++ = c; | ||
| 6851 | - q = r; | ||
| 6852 | - n++; | ||
| 6853 | - } | ||
| 6854 | - return n; | ||
| 6855 | -} | ||
| 6856 | - | ||
| 6857 | -/* | ||
| 6858 | - * This is also called from pass_persist.c | ||
| 6859 | - */ | ||
| 6860 | -int | ||
| 6861 | -bin2asc(char *p, size_t n) | ||
| 6862 | -{ | ||
| 6863 | - size_t i, flag = 0; | ||
| 6864 | - char buffer[SNMP_MAXBUF]; | ||
| 6865 | - | ||
| 6866 | - /* prevent buffer overflow */ | ||
| 6867 | - if (n > (sizeof(buffer) - 1)) | ||
| 6868 | - n = sizeof(buffer) - 1; | ||
| 6869 | - | ||
| 6870 | - for (i = 0; i < n; i++) { | ||
| 6871 | - buffer[i] = p[i]; | ||
| 6872 | - if (!isprint((unsigned char)(p[i]))) | ||
| 6873 | - flag = 1; | ||
| 6874 | - } | ||
| 6875 | - if (flag == 0) { | ||
| 6876 | - p[n] = 0; | ||
| 6877 | - return n; | ||
| 6878 | - } | ||
| 6879 | - for (i = 0; i < n; i++) { | ||
| 6880 | - sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff)); | ||
| 6881 | - p += 3; | ||
| 6882 | - } | ||
| 6883 | - *--p = 0; | ||
| 6884 | - return 3 * n - 1; | ||
| 6885 | -} | ||
| 6886 | - | ||
| 6887 | -/* | ||
| 6888 | - * This is also called from pass_persist.c | ||
| 6889 | - */ | ||
| 6890 | -int | ||
| 6891 | -netsnmp_pass_str_to_errno(const char *buf) | ||
| 6892 | -{ | ||
| 6893 | - if (!strncasecmp(buf, "too-big", 7)) { | ||
| 6894 | - /* Shouldn't happen */ | ||
| 6895 | - return SNMP_ERR_TOOBIG; | ||
| 6896 | - } else if (!strncasecmp(buf, "no-such-name", 12)) { | ||
| 6897 | - return SNMP_ERR_NOSUCHNAME; | ||
| 6898 | - } else if (!strncasecmp(buf, "bad-value", 9)) { | ||
| 6899 | - return SNMP_ERR_BADVALUE; | ||
| 6900 | - } else if (!strncasecmp(buf, "read-only", 9)) { | ||
| 6901 | - return SNMP_ERR_READONLY; | ||
| 6902 | - } else if (!strncasecmp(buf, "gen-error", 9)) { | ||
| 6903 | - return SNMP_ERR_GENERR; | ||
| 6904 | - } else if (!strncasecmp(buf, "no-access", 9)) { | ||
| 6905 | - return SNMP_ERR_NOACCESS; | ||
| 6906 | - } else if (!strncasecmp(buf, "wrong-type", 10)) { | ||
| 6907 | - return SNMP_ERR_WRONGTYPE; | ||
| 6908 | - } else if (!strncasecmp(buf, "wrong-length", 12)) { | ||
| 6909 | - return SNMP_ERR_WRONGLENGTH; | ||
| 6910 | - } else if (!strncasecmp(buf, "wrong-encoding", 14)) { | ||
| 6911 | - return SNMP_ERR_WRONGENCODING; | ||
| 6912 | - } else if (!strncasecmp(buf, "wrong-value", 11)) { | ||
| 6913 | - return SNMP_ERR_WRONGVALUE; | ||
| 6914 | - } else if (!strncasecmp(buf, "no-creation", 11)) { | ||
| 6915 | - return SNMP_ERR_NOCREATION; | ||
| 6916 | - } else if (!strncasecmp(buf, "inconsistent-value", 18)) { | ||
| 6917 | - return SNMP_ERR_INCONSISTENTVALUE; | ||
| 6918 | - } else if (!strncasecmp(buf, "resource-unavailable", 20)) { | ||
| 6919 | - return SNMP_ERR_RESOURCEUNAVAILABLE; | ||
| 6920 | - } else if (!strncasecmp(buf, "commit-failed", 13)) { | ||
| 6921 | - return SNMP_ERR_COMMITFAILED; | ||
| 6922 | - } else if (!strncasecmp(buf, "undo-failed", 11)) { | ||
| 6923 | - return SNMP_ERR_UNDOFAILED; | ||
| 6924 | - } else if (!strncasecmp(buf, "authorization-error", 19)) { | ||
| 6925 | - return SNMP_ERR_AUTHORIZATIONERROR; | ||
| 6926 | - } else if (!strncasecmp(buf, "not-writable", 12)) { | ||
| 6927 | - return SNMP_ERR_NOTWRITABLE; | ||
| 6928 | - } else if (!strncasecmp(buf, "inconsistent-name", 17)) { | ||
| 6929 | - return SNMP_ERR_INCONSISTENTNAME; | ||
| 6930 | - } | ||
| 6931 | - | ||
| 6932 | - return SNMP_ERR_NOERROR; | ||
| 6933 | -} | ||
| 6934 | - | ||
| 6935 | void | ||
| 6936 | init_pass(void) | ||
| 6937 | { | ||
| 6938 | @@ -276,11 +131,9 @@ pass_parse_config(const char *token, char *cptr) | ||
| 6939 | } else { | ||
| 6940 | for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';'; | ||
| 6941 | tcptr++); | ||
| 6942 | - strncpy((*ppass)->command, cptr, tcptr - cptr); | ||
| 6943 | - (*ppass)->command[tcptr - cptr] = 0; | ||
| 6944 | + sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr); | ||
| 6945 | } | ||
| 6946 | - strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name)); | ||
| 6947 | - (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0; | ||
| 6948 | + strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name)); | ||
| 6949 | (*ppass)->next = NULL; | ||
| 6950 | |||
| 6951 | register_mib_priority("pass", (struct variable *) extensible_passthru_variables, | ||
| 6952 | @@ -337,18 +190,14 @@ var_extensible_pass(struct variable *vp, | ||
| 6953 | { | ||
| 6954 | oid newname[MAX_OID_LEN]; | ||
| 6955 | int i, rtest, fd, newlen; | ||
| 6956 | - static long long_ret; | ||
| 6957 | - static in_addr_t addr_ret; | ||
| 6958 | char buf[SNMP_MAXBUF]; | ||
| 6959 | static char buf2[SNMP_MAXBUF]; | ||
| 6960 | - static oid objid[MAX_OID_LEN]; | ||
| 6961 | struct extensible *passthru; | ||
| 6962 | FILE *file; | ||
| 6963 | |||
| 6964 | - long_ret = *length; | ||
| 6965 | for (i = 1; i <= numpassthrus; i++) { | ||
| 6966 | passthru = get_exten_instance(passthrus, i); | ||
| 6967 | - rtest = snmp_oid_min_compare(name, *length, | ||
| 6968 | + rtest = snmp_oidtree_compare(name, *length, | ||
| 6969 | passthru->miboid, passthru->miblen); | ||
| 6970 | if ((exact && rtest == 0) || (!exact && rtest <= 0)) { | ||
| 6971 | /* | ||
| 6972 | @@ -409,89 +258,7 @@ var_extensible_pass(struct variable *vp, | ||
| 6973 | fclose(file); | ||
| 6974 | wait_on_exec(passthru); | ||
| 6975 | |||
| 6976 | - /* | ||
| 6977 | - * buf contains the return type, and buf2 contains the data | ||
| 6978 | - */ | ||
| 6979 | - if (!strncasecmp(buf, "string", 6)) { | ||
| 6980 | - buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */ | ||
| 6981 | - *var_len = strlen(buf2); | ||
| 6982 | - vp->type = ASN_OCTET_STR; | ||
| 6983 | - return ((unsigned char *) buf2); | ||
| 6984 | - } | ||
| 6985 | - else if (!strncasecmp(buf, "integer64", 9)) { | ||
| 6986 | - static struct counter64 c64; | ||
| 6987 | - uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 6988 | - c64.high = (unsigned long)(v64 >> 32); | ||
| 6989 | - c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 6990 | - *var_len = sizeof(c64); | ||
| 6991 | - vp->type = ASN_INTEGER64; | ||
| 6992 | - return ((unsigned char *) &c64); | ||
| 6993 | - } | ||
| 6994 | - else if (!strncasecmp(buf, "integer", 7)) { | ||
| 6995 | - *var_len = sizeof(long_ret); | ||
| 6996 | - long_ret = strtol(buf2, NULL, 10); | ||
| 6997 | - vp->type = ASN_INTEGER; | ||
| 6998 | - return ((unsigned char *) &long_ret); | ||
| 6999 | - } else if (!strncasecmp(buf, "unsigned", 8)) { | ||
| 7000 | - *var_len = sizeof(long_ret); | ||
| 7001 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7002 | - vp->type = ASN_UNSIGNED; | ||
| 7003 | - return ((unsigned char *) &long_ret); | ||
| 7004 | - } | ||
| 7005 | - else if (!strncasecmp(buf, "counter64", 9)) { | ||
| 7006 | - static struct counter64 c64; | ||
| 7007 | - uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 7008 | - c64.high = (unsigned long)(v64 >> 32); | ||
| 7009 | - c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 7010 | - *var_len = sizeof(c64); | ||
| 7011 | - vp->type = ASN_COUNTER64; | ||
| 7012 | - return ((unsigned char *) &c64); | ||
| 7013 | - } | ||
| 7014 | - else if (!strncasecmp(buf, "counter", 7)) { | ||
| 7015 | - *var_len = sizeof(long_ret); | ||
| 7016 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7017 | - vp->type = ASN_COUNTER; | ||
| 7018 | - return ((unsigned char *) &long_ret); | ||
| 7019 | - } else if (!strncasecmp(buf, "octet", 5)) { | ||
| 7020 | - *var_len = asc2bin(buf2); | ||
| 7021 | - vp->type = ASN_OCTET_STR; | ||
| 7022 | - return ((unsigned char *) buf2); | ||
| 7023 | - } else if (!strncasecmp(buf, "opaque", 6)) { | ||
| 7024 | - *var_len = asc2bin(buf2); | ||
| 7025 | - vp->type = ASN_OPAQUE; | ||
| 7026 | - return ((unsigned char *) buf2); | ||
| 7027 | - } else if (!strncasecmp(buf, "gauge", 5)) { | ||
| 7028 | - *var_len = sizeof(long_ret); | ||
| 7029 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7030 | - vp->type = ASN_GAUGE; | ||
| 7031 | - return ((unsigned char *) &long_ret); | ||
| 7032 | - } else if (!strncasecmp(buf, "objectid", 8)) { | ||
| 7033 | - newlen = parse_miboid(buf2, objid); | ||
| 7034 | - *var_len = newlen * sizeof(oid); | ||
| 7035 | - vp->type = ASN_OBJECT_ID; | ||
| 7036 | - return ((unsigned char *) objid); | ||
| 7037 | - } else if (!strncasecmp(buf, "timetick", 8)) { | ||
| 7038 | - *var_len = sizeof(long_ret); | ||
| 7039 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7040 | - vp->type = ASN_TIMETICKS; | ||
| 7041 | - return ((unsigned char *) &long_ret); | ||
| 7042 | - } else if (!strncasecmp(buf, "ipaddress", 9)) { | ||
| 7043 | - newlen = parse_miboid(buf2, objid); | ||
| 7044 | - if (newlen != 4) { | ||
| 7045 | - snmp_log(LOG_ERR, | ||
| 7046 | - "invalid ipaddress returned: %s\n", | ||
| 7047 | - buf2); | ||
| 7048 | - *var_len = 0; | ||
| 7049 | - return (NULL); | ||
| 7050 | - } | ||
| 7051 | - addr_ret = | ||
| 7052 | - (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) + | ||
| 7053 | - (objid[2] << 8) + objid[3]; | ||
| 7054 | - addr_ret = htonl(addr_ret); | ||
| 7055 | - *var_len = sizeof(addr_ret); | ||
| 7056 | - vp->type = ASN_IPADDRESS; | ||
| 7057 | - return ((unsigned char *) &addr_ret); | ||
| 7058 | - } | ||
| 7059 | + return netsnmp_internal_pass_parse(buf, buf2, var_len, vp); | ||
| 7060 | } | ||
| 7061 | *var_len = 0; | ||
| 7062 | return (NULL); | ||
| 7063 | @@ -504,21 +271,16 @@ var_extensible_pass(struct variable *vp, | ||
| 7064 | } | ||
| 7065 | |||
| 7066 | int | ||
| 7067 | -setPass(int action, | ||
| 7068 | - u_char * var_val, | ||
| 7069 | - u_char var_val_type, | ||
| 7070 | +setPass(int action, u_char * var_val, u_char var_val_type, | ||
| 7071 | size_t var_val_len, u_char * statP, oid * name, size_t name_len) | ||
| 7072 | { | ||
| 7073 | int i, rtest; | ||
| 7074 | struct extensible *passthru; | ||
| 7075 | - | ||
| 7076 | char buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF]; | ||
| 7077 | - long tmp; | ||
| 7078 | - unsigned long utmp; | ||
| 7079 | |||
| 7080 | for (i = 1; i <= numpassthrus; i++) { | ||
| 7081 | passthru = get_exten_instance(passthrus, i); | ||
| 7082 | - rtest = snmp_oid_min_compare(name, name_len, | ||
| 7083 | + rtest = snmp_oidtree_compare(name, name_len, | ||
| 7084 | passthru->miboid, passthru->miblen); | ||
| 7085 | if (rtest <= 0) { | ||
| 7086 | if (action != ACTION) | ||
| 7087 | @@ -533,60 +295,14 @@ setPass(int action, | ||
| 7088 | snprintf(passthru->command, sizeof(passthru->command), | ||
| 7089 | "%s -s %s ", passthru->name, buf); | ||
| 7090 | passthru->command[ sizeof(passthru->command)-1 ] = 0; | ||
| 7091 | - switch (var_val_type) { | ||
| 7092 | - case ASN_INTEGER: | ||
| 7093 | - case ASN_COUNTER: | ||
| 7094 | - case ASN_GAUGE: | ||
| 7095 | - case ASN_TIMETICKS: | ||
| 7096 | - tmp = *((long *) var_val); | ||
| 7097 | - switch (var_val_type) { | ||
| 7098 | - case ASN_INTEGER: | ||
| 7099 | - sprintf(buf, "integer %d\n", (int) tmp); | ||
| 7100 | - break; | ||
| 7101 | - case ASN_COUNTER: | ||
| 7102 | - sprintf(buf, "counter %d\n", (int) tmp); | ||
| 7103 | - break; | ||
| 7104 | - case ASN_GAUGE: | ||
| 7105 | - sprintf(buf, "gauge %d\n", (int) tmp); | ||
| 7106 | - break; | ||
| 7107 | - case ASN_TIMETICKS: | ||
| 7108 | - sprintf(buf, "timeticks %d\n", (int) tmp); | ||
| 7109 | - break; | ||
| 7110 | - } | ||
| 7111 | - break; | ||
| 7112 | - case ASN_IPADDRESS: | ||
| 7113 | - utmp = *((u_long *) var_val); | ||
| 7114 | - utmp = ntohl(utmp); | ||
| 7115 | - sprintf(buf, "ipaddress %d.%d.%d.%d\n", | ||
| 7116 | - (int) ((utmp & 0xff000000) >> (8 * 3)), | ||
| 7117 | - (int) ((utmp & 0xff0000) >> (8 * 2)), | ||
| 7118 | - (int) ((utmp & 0xff00) >> (8)), | ||
| 7119 | - (int) ((utmp & 0xff))); | ||
| 7120 | - break; | ||
| 7121 | - case ASN_OCTET_STR: | ||
| 7122 | - memcpy(buf2, var_val, var_val_len); | ||
| 7123 | - if (var_val_len == 0) | ||
| 7124 | - sprintf(buf, "string \"\"\n"); | ||
| 7125 | - else if (bin2asc(buf2, var_val_len) == (int) var_val_len) | ||
| 7126 | - snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2); | ||
| 7127 | - else | ||
| 7128 | - snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2); | ||
| 7129 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 7130 | - break; | ||
| 7131 | - case ASN_OBJECT_ID: | ||
| 7132 | - sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid)); | ||
| 7133 | - snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2); | ||
| 7134 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 7135 | - break; | ||
| 7136 | - } | ||
| 7137 | - strncat(passthru->command, buf, sizeof(passthru->command)-strlen(passthru->command)-1); | ||
| 7138 | - passthru->command[ sizeof(passthru->command)-1 ] = 0; | ||
| 7139 | + netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len); | ||
| 7140 | + strlcat(passthru->command, buf, sizeof(passthru->command)); | ||
| 7141 | DEBUGMSGTL(("ucd-snmp/pass", "pass-running: %s", | ||
| 7142 | passthru->command)); | ||
| 7143 | exec_command(passthru); | ||
| 7144 | DEBUGMSGTL(("ucd-snmp/pass", "pass-running returned: %s", | ||
| 7145 | passthru->output)); | ||
| 7146 | - return netsnmp_pass_str_to_errno(passthru->output); | ||
| 7147 | + return netsnmp_internal_pass_str_to_errno(passthru->output); | ||
| 7148 | } | ||
| 7149 | } | ||
| 7150 | if (snmp_get_do_debugging()) { | ||
| 7151 | diff --git a/agent/mibgroup/ucd-snmp/pass.h b/agent/mibgroup/ucd-snmp/pass.h | ||
| 7152 | index 089c9ca..51c0689 100644 | ||
| 7153 | --- a/agent/mibgroup/ucd-snmp/pass.h | ||
| 7154 | +++ b/agent/mibgroup/ucd-snmp/pass.h | ||
| 7155 | @@ -6,7 +6,9 @@ | ||
| 7156 | |||
| 7157 | void init_pass(void); | ||
| 7158 | |||
| 7159 | +config_require(ucd-snmp/pass_common) | ||
| 7160 | config_require(util_funcs) | ||
| 7161 | +config_require(utilities/execute) | ||
| 7162 | config_add_mib(NET-SNMP-PASS-MIB) | ||
| 7163 | |||
| 7164 | extern FindVarMethod var_extensible_pass; | ||
| 7165 | diff --git a/agent/mibgroup/ucd-snmp/pass_common.c b/agent/mibgroup/ucd-snmp/pass_common.c | ||
| 7166 | new file mode 100644 | ||
| 7167 | index 0000000..38a0443 | ||
| 7168 | --- /dev/null | ||
| 7169 | +++ b/agent/mibgroup/ucd-snmp/pass_common.c | ||
| 7170 | @@ -0,0 +1,264 @@ | ||
| 7171 | +#include <net-snmp/net-snmp-config.h> | ||
| 7172 | + | ||
| 7173 | +#include <ctype.h> | ||
| 7174 | +#if HAVE_STDDEF_H | ||
| 7175 | +#include <stddef.h> | ||
| 7176 | +#endif | ||
| 7177 | +#include <stdio.h> | ||
| 7178 | +#if HAVE_STRING_H | ||
| 7179 | +#include <string.h> | ||
| 7180 | +#else | ||
| 7181 | +#include <strings.h> | ||
| 7182 | +#endif | ||
| 7183 | + | ||
| 7184 | +#include <net-snmp/net-snmp-includes.h> | ||
| 7185 | +#include <net-snmp/agent/net-snmp-agent-includes.h> | ||
| 7186 | +#include "mibgroup/util_funcs.h" | ||
| 7187 | +#include "pass_common.h" | ||
| 7188 | + | ||
| 7189 | +static int | ||
| 7190 | +netsnmp_internal_asc2bin(char *p) | ||
| 7191 | +{ | ||
| 7192 | + char *r, *q = p; | ||
| 7193 | + char c; | ||
| 7194 | + int n = 0; | ||
| 7195 | + | ||
| 7196 | + for (;;) { | ||
| 7197 | + c = (char) strtol(q, &r, 16); | ||
| 7198 | + if (r == q) | ||
| 7199 | + break; | ||
| 7200 | + *p++ = c; | ||
| 7201 | + q = r; | ||
| 7202 | + n++; | ||
| 7203 | + } | ||
| 7204 | + return n; | ||
| 7205 | +} | ||
| 7206 | + | ||
| 7207 | +static int | ||
| 7208 | +netsnmp_internal_bin2asc(char *p, size_t n) | ||
| 7209 | +{ | ||
| 7210 | + int i, flag = 0; | ||
| 7211 | + char buffer[SNMP_MAXBUF]; | ||
| 7212 | + | ||
| 7213 | + /* prevent buffer overflow */ | ||
| 7214 | + if ((int)n > (sizeof(buffer) - 1)) | ||
| 7215 | + n = sizeof(buffer) - 1; | ||
| 7216 | + | ||
| 7217 | + for (i = 0; i < (int) n; i++) { | ||
| 7218 | + buffer[i] = p[i]; | ||
| 7219 | + if (!isprint((unsigned char) (p[i]))) | ||
| 7220 | + flag = 1; | ||
| 7221 | + } | ||
| 7222 | + if (flag == 0) { | ||
| 7223 | + p[n] = 0; | ||
| 7224 | + return n; | ||
| 7225 | + } | ||
| 7226 | + for (i = 0; i < (int) n; i++) { | ||
| 7227 | + sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff)); | ||
| 7228 | + p += 3; | ||
| 7229 | + } | ||
| 7230 | + *--p = 0; | ||
| 7231 | + return 3 * n - 1; | ||
| 7232 | +} | ||
| 7233 | + | ||
| 7234 | +int | ||
| 7235 | +netsnmp_internal_pass_str_to_errno(const char *buf) | ||
| 7236 | +{ | ||
| 7237 | + if (!strncasecmp(buf, "too-big", 7)) { | ||
| 7238 | + /* Shouldn't happen */ | ||
| 7239 | + return SNMP_ERR_TOOBIG; | ||
| 7240 | + } else if (!strncasecmp(buf, "no-such-name", 12)) { | ||
| 7241 | + return SNMP_ERR_NOSUCHNAME; | ||
| 7242 | + } else if (!strncasecmp(buf, "bad-value", 9)) { | ||
| 7243 | + return SNMP_ERR_BADVALUE; | ||
| 7244 | + } else if (!strncasecmp(buf, "read-only", 9)) { | ||
| 7245 | + return SNMP_ERR_READONLY; | ||
| 7246 | + } else if (!strncasecmp(buf, "gen-error", 9)) { | ||
| 7247 | + return SNMP_ERR_GENERR; | ||
| 7248 | + } else if (!strncasecmp(buf, "no-access", 9)) { | ||
| 7249 | + return SNMP_ERR_NOACCESS; | ||
| 7250 | + } else if (!strncasecmp(buf, "wrong-type", 10)) { | ||
| 7251 | + return SNMP_ERR_WRONGTYPE; | ||
| 7252 | + } else if (!strncasecmp(buf, "wrong-length", 12)) { | ||
| 7253 | + return SNMP_ERR_WRONGLENGTH; | ||
| 7254 | + } else if (!strncasecmp(buf, "wrong-encoding", 14)) { | ||
| 7255 | + return SNMP_ERR_WRONGENCODING; | ||
| 7256 | + } else if (!strncasecmp(buf, "wrong-value", 11)) { | ||
| 7257 | + return SNMP_ERR_WRONGVALUE; | ||
| 7258 | + } else if (!strncasecmp(buf, "no-creation", 11)) { | ||
| 7259 | + return SNMP_ERR_NOCREATION; | ||
| 7260 | + } else if (!strncasecmp(buf, "inconsistent-value", 18)) { | ||
| 7261 | + return SNMP_ERR_INCONSISTENTVALUE; | ||
| 7262 | + } else if (!strncasecmp(buf, "resource-unavailable", 20)) { | ||
| 7263 | + return SNMP_ERR_RESOURCEUNAVAILABLE; | ||
| 7264 | + } else if (!strncasecmp(buf, "commit-failed", 13)) { | ||
| 7265 | + return SNMP_ERR_COMMITFAILED; | ||
| 7266 | + } else if (!strncasecmp(buf, "undo-failed", 11)) { | ||
| 7267 | + return SNMP_ERR_UNDOFAILED; | ||
| 7268 | + } else if (!strncasecmp(buf, "authorization-error", 19)) { | ||
| 7269 | + return SNMP_ERR_AUTHORIZATIONERROR; | ||
| 7270 | + } else if (!strncasecmp(buf, "not-writable", 12)) { | ||
| 7271 | + return SNMP_ERR_NOTWRITABLE; | ||
| 7272 | + } else if (!strncasecmp(buf, "inconsistent-name", 17)) { | ||
| 7273 | + return SNMP_ERR_INCONSISTENTNAME; | ||
| 7274 | + } | ||
| 7275 | + | ||
| 7276 | + return SNMP_ERR_NOERROR; | ||
| 7277 | +} | ||
| 7278 | + | ||
| 7279 | +unsigned char * | ||
| 7280 | +netsnmp_internal_pass_parse(char * buf, | ||
| 7281 | + char * buf2, | ||
| 7282 | + size_t * var_len, | ||
| 7283 | + struct variable *vp) | ||
| 7284 | +{ | ||
| 7285 | + static long long_ret; | ||
| 7286 | + static in_addr_t addr_ret; | ||
| 7287 | + int newlen; | ||
| 7288 | + static oid objid[MAX_OID_LEN]; | ||
| 7289 | + | ||
| 7290 | + /* | ||
| 7291 | + * buf contains the return type, and buf2 contains the data | ||
| 7292 | + */ | ||
| 7293 | + if (!strncasecmp(buf, "string", 6)) { | ||
| 7294 | + buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */ | ||
| 7295 | + *var_len = strlen(buf2); | ||
| 7296 | + vp->type = ASN_OCTET_STR; | ||
| 7297 | + return ((unsigned char *) buf2); | ||
| 7298 | + } | ||
| 7299 | +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | ||
| 7300 | + else if (!strncasecmp(buf, "integer64", 9)) { | ||
| 7301 | + static struct counter64 c64; | ||
| 7302 | + uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 7303 | + c64.high = (unsigned long)(v64 >> 32); | ||
| 7304 | + c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 7305 | + *var_len = sizeof(c64); | ||
| 7306 | + vp->type = ASN_INTEGER64; | ||
| 7307 | + return ((unsigned char *) &c64); | ||
| 7308 | + } | ||
| 7309 | +#endif | ||
| 7310 | + else if (!strncasecmp(buf, "integer", 7)) { | ||
| 7311 | + *var_len = sizeof(long_ret); | ||
| 7312 | + long_ret = strtol(buf2, NULL, 10); | ||
| 7313 | + vp->type = ASN_INTEGER; | ||
| 7314 | + return ((unsigned char *) &long_ret); | ||
| 7315 | + } else if (!strncasecmp(buf, "unsigned", 8)) { | ||
| 7316 | + *var_len = sizeof(long_ret); | ||
| 7317 | + long_ret = strtoul(buf2, NULL, 10); | ||
| 7318 | + vp->type = ASN_UNSIGNED; | ||
| 7319 | + return ((unsigned char *) &long_ret); | ||
| 7320 | + } | ||
| 7321 | + else if (!strncasecmp(buf, "counter64", 9)) { | ||
| 7322 | + static struct counter64 c64; | ||
| 7323 | + uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 7324 | + c64.high = (unsigned long)(v64 >> 32); | ||
| 7325 | + c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 7326 | + *var_len = sizeof(c64); | ||
| 7327 | + vp->type = ASN_COUNTER64; | ||
| 7328 | + return ((unsigned char *) &c64); | ||
| 7329 | + } | ||
| 7330 | + else if (!strncasecmp(buf, "counter", 7)) { | ||
| 7331 | + *var_len = sizeof(long_ret); | ||
| 7332 | + long_ret = strtoul(buf2, NULL, 10); | ||
| 7333 | + vp->type = ASN_COUNTER; | ||
| 7334 | + return ((unsigned char *) &long_ret); | ||
| 7335 | + } else if (!strncasecmp(buf, "octet", 5)) { | ||
| 7336 | + *var_len = netsnmp_internal_asc2bin(buf2); | ||
| 7337 | + vp->type = ASN_OCTET_STR; | ||
| 7338 | + return ((unsigned char *) buf2); | ||
| 7339 | + } else if (!strncasecmp(buf, "opaque", 6)) { | ||
| 7340 | + *var_len = netsnmp_internal_asc2bin(buf2); | ||
| 7341 | + vp->type = ASN_OPAQUE; | ||
| 7342 | + return ((unsigned char *) buf2); | ||
| 7343 | + } else if (!strncasecmp(buf, "gauge", 5)) { | ||
| 7344 | + *var_len = sizeof(long_ret); | ||
| 7345 | + long_ret = strtoul(buf2, NULL, 10); | ||
| 7346 | + vp->type = ASN_GAUGE; | ||
| 7347 | + return ((unsigned char *) &long_ret); | ||
| 7348 | + } else if (!strncasecmp(buf, "objectid", 8)) { | ||
| 7349 | + newlen = parse_miboid(buf2, objid); | ||
| 7350 | + *var_len = newlen * sizeof(oid); | ||
| 7351 | + vp->type = ASN_OBJECT_ID; | ||
| 7352 | + return ((unsigned char *) objid); | ||
| 7353 | + } else if (!strncasecmp(buf, "timetick", 8)) { | ||
| 7354 | + *var_len = sizeof(long_ret); | ||
| 7355 | + long_ret = strtoul(buf2, NULL, 10); | ||
| 7356 | + vp->type = ASN_TIMETICKS; | ||
| 7357 | + return ((unsigned char *) &long_ret); | ||
| 7358 | + } else if (!strncasecmp(buf, "ipaddress", 9)) { | ||
| 7359 | + newlen = parse_miboid(buf2, objid); | ||
| 7360 | + if (newlen != 4) { | ||
| 7361 | + snmp_log(LOG_ERR, "invalid ipaddress returned: %s\n", buf2); | ||
| 7362 | + *var_len = 0; | ||
| 7363 | + return (NULL); | ||
| 7364 | + } | ||
| 7365 | + addr_ret = | ||
| 7366 | + (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) + | ||
| 7367 | + (objid[2] << 8) + objid[3]; | ||
| 7368 | + addr_ret = htonl(addr_ret); | ||
| 7369 | + *var_len = sizeof(addr_ret); | ||
| 7370 | + vp->type = ASN_IPADDRESS; | ||
| 7371 | + return ((unsigned char *) &addr_ret); | ||
| 7372 | + } | ||
| 7373 | + *var_len = 0; | ||
| 7374 | + return (NULL); | ||
| 7375 | +} | ||
| 7376 | + | ||
| 7377 | +void | ||
| 7378 | +netsnmp_internal_pass_set_format(char *buf, | ||
| 7379 | + const u_char *var_val, | ||
| 7380 | + u_char var_val_type, | ||
| 7381 | + size_t var_val_len) | ||
| 7382 | +{ | ||
| 7383 | + char buf2[SNMP_MAXBUF]; | ||
| 7384 | + long tmp; | ||
| 7385 | + unsigned long utmp; | ||
| 7386 | + | ||
| 7387 | + switch (var_val_type) { | ||
| 7388 | + case ASN_INTEGER: | ||
| 7389 | + case ASN_COUNTER: | ||
| 7390 | + case ASN_GAUGE: | ||
| 7391 | + case ASN_TIMETICKS: | ||
| 7392 | + tmp = *((const long *) var_val); | ||
| 7393 | + switch (var_val_type) { | ||
| 7394 | + case ASN_INTEGER: | ||
| 7395 | + sprintf(buf, "integer %d\n", (int) tmp); | ||
| 7396 | + break; | ||
| 7397 | + case ASN_COUNTER: | ||
| 7398 | + sprintf(buf, "counter %d\n", (int) tmp); | ||
| 7399 | + break; | ||
| 7400 | + case ASN_GAUGE: | ||
| 7401 | + sprintf(buf, "gauge %d\n", (int) tmp); | ||
| 7402 | + break; | ||
| 7403 | + case ASN_TIMETICKS: | ||
| 7404 | + sprintf(buf, "timeticks %d\n", (int) tmp); | ||
| 7405 | + break; | ||
| 7406 | + } | ||
| 7407 | + break; | ||
| 7408 | + case ASN_IPADDRESS: | ||
| 7409 | + utmp = *((const u_long *) var_val); | ||
| 7410 | + utmp = ntohl(utmp); | ||
| 7411 | + sprintf(buf, "ipaddress %d.%d.%d.%d\n", | ||
| 7412 | + (int) ((utmp & 0xff000000) >> (8 * 3)), | ||
| 7413 | + (int) ((utmp & 0xff0000) >> (8 * 2)), | ||
| 7414 | + (int) ((utmp & 0xff00) >> (8)), | ||
| 7415 | + (int) ((utmp & 0xff))); | ||
| 7416 | + break; | ||
| 7417 | + case ASN_OCTET_STR: | ||
| 7418 | + memcpy(buf2, var_val, var_val_len); | ||
| 7419 | + if (var_val_len == 0) | ||
| 7420 | + sprintf(buf, "string \"\"\n"); | ||
| 7421 | + else if (netsnmp_internal_bin2asc(buf2, var_val_len) == | ||
| 7422 | + (int) var_val_len) | ||
| 7423 | + snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2); | ||
| 7424 | + else | ||
| 7425 | + snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2); | ||
| 7426 | + buf[ sizeof(buf)-1 ] = 0; | ||
| 7427 | + break; | ||
| 7428 | + case ASN_OBJECT_ID: | ||
| 7429 | + sprint_mib_oid(buf2, (const oid *) var_val, var_val_len/sizeof(oid)); | ||
| 7430 | + snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2); | ||
| 7431 | + buf[ sizeof(buf)-1 ] = 0; | ||
| 7432 | + break; | ||
| 7433 | + } | ||
| 7434 | +} | ||
| 7435 | diff --git a/agent/mibgroup/ucd-snmp/pass_common.h b/agent/mibgroup/ucd-snmp/pass_common.h | ||
| 7436 | new file mode 100644 | ||
| 7437 | index 0000000..b1d7e4b | ||
| 7438 | --- /dev/null | ||
| 7439 | +++ b/agent/mibgroup/ucd-snmp/pass_common.h | ||
| 7440 | @@ -0,0 +1,20 @@ | ||
| 7441 | +#ifndef NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H | ||
| 7442 | +#define NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H | ||
| 7443 | + | ||
| 7444 | +/* | ||
| 7445 | + * This is an internal header file. The functions declared here might change | ||
| 7446 | + * or disappear at any time | ||
| 7447 | + */ | ||
| 7448 | + | ||
| 7449 | +int | ||
| 7450 | +netsnmp_internal_pass_str_to_errno(const char *buf); | ||
| 7451 | + | ||
| 7452 | +unsigned char * | ||
| 7453 | +netsnmp_internal_pass_parse(char *buf, char *buf2, size_t *var_len, | ||
| 7454 | + struct variable *vp); | ||
| 7455 | + | ||
| 7456 | +void | ||
| 7457 | +netsnmp_internal_pass_set_format(char *buf, const u_char *var_val, | ||
| 7458 | + u_char var_val_type, size_t var_val_len); | ||
| 7459 | + | ||
| 7460 | +#endif /* !NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H */ | ||
| 7461 | diff --git a/agent/mibgroup/ucd-snmp/pass_persist.c b/agent/mibgroup/ucd-snmp/pass_persist.c | ||
| 7462 | index c18a84c..6cce6f4 100644 | ||
| 7463 | --- a/agent/mibgroup/ucd-snmp/pass_persist.c | ||
| 7464 | +++ b/agent/mibgroup/ucd-snmp/pass_persist.c | ||
| 7465 | @@ -38,6 +38,7 @@ | ||
| 7466 | |||
| 7467 | #include "struct.h" | ||
| 7468 | #include "pass_persist.h" | ||
| 7469 | +#include "pass_common.h" | ||
| 7470 | #include "extensible.h" | ||
| 7471 | #include "util_funcs.h" | ||
| 7472 | |||
| 7473 | @@ -60,15 +61,6 @@ static void destruct_persist_pipes(void); | ||
| 7474 | static int write_persist_pipe(int iindex, const char *data); | ||
| 7475 | |||
| 7476 | /* | ||
| 7477 | - * These are defined in pass.c | ||
| 7478 | - */ | ||
| 7479 | -extern int asc2bin(char *p); | ||
| 7480 | -extern int bin2asc(char *p, size_t n); | ||
| 7481 | -extern int netsnmp_pass_str_to_errno(const char *buf); | ||
| 7482 | -extern int snmp_oid_min_compare(const oid *, size_t, const oid *, | ||
| 7483 | - size_t); | ||
| 7484 | - | ||
| 7485 | -/* | ||
| 7486 | * the relocatable extensible commands variables | ||
| 7487 | */ | ||
| 7488 | struct variable2 extensible_persist_passthru_variables[] = { | ||
| 7489 | @@ -169,11 +161,9 @@ pass_persist_parse_config(const char *token, char *cptr) | ||
| 7490 | } else { | ||
| 7491 | for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';'; | ||
| 7492 | tcptr++); | ||
| 7493 | - strncpy((*ppass)->command, cptr, tcptr - cptr); | ||
| 7494 | - (*ppass)->command[tcptr - cptr] = 0; | ||
| 7495 | + sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr); | ||
| 7496 | } | ||
| 7497 | - strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name)); | ||
| 7498 | - (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0; | ||
| 7499 | + strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name)); | ||
| 7500 | (*ppass)->next = NULL; | ||
| 7501 | |||
| 7502 | register_mib_priority("pass_persist", | ||
| 7503 | @@ -230,11 +220,8 @@ var_extensible_pass_persist(struct variable *vp, | ||
| 7504 | { | ||
| 7505 | oid newname[MAX_OID_LEN]; | ||
| 7506 | int i, rtest, newlen; | ||
| 7507 | - static long long_ret; | ||
| 7508 | - static in_addr_t addr_ret; | ||
| 7509 | char buf[SNMP_MAXBUF]; | ||
| 7510 | static char buf2[SNMP_MAXBUF]; | ||
| 7511 | - static oid objid[MAX_OID_LEN]; | ||
| 7512 | struct extensible *persistpassthru; | ||
| 7513 | FILE *file; | ||
| 7514 | |||
| 7515 | @@ -243,10 +230,9 @@ var_extensible_pass_persist(struct variable *vp, | ||
| 7516 | */ | ||
| 7517 | init_persist_pipes(); | ||
| 7518 | |||
| 7519 | - long_ret = *length; | ||
| 7520 | for (i = 1; i <= numpersistpassthrus; i++) { | ||
| 7521 | persistpassthru = get_exten_instance(persistpassthrus, i); | ||
| 7522 | - rtest = snmp_oid_min_compare(name, *length, | ||
| 7523 | + rtest = snmp_oidtree_compare(name, *length, | ||
| 7524 | persistpassthru->miboid, | ||
| 7525 | persistpassthru->miblen); | ||
| 7526 | if ((exact && rtest == 0) || (!exact && rtest <= 0)) { | ||
| 7527 | @@ -325,89 +311,7 @@ var_extensible_pass_persist(struct variable *vp, | ||
| 7528 | close_persist_pipe(i); | ||
| 7529 | return (NULL); | ||
| 7530 | } | ||
| 7531 | - /* | ||
| 7532 | - * buf contains the return type, and buf2 contains the data | ||
| 7533 | - */ | ||
| 7534 | - if (!strncasecmp(buf, "string", 6)) { | ||
| 7535 | - buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */ | ||
| 7536 | - *var_len = strlen(buf2); | ||
| 7537 | - vp->type = ASN_OCTET_STR; | ||
| 7538 | - return ((unsigned char *) buf2); | ||
| 7539 | - } | ||
| 7540 | - else if (!strncasecmp(buf, "integer64", 9)) { | ||
| 7541 | - static struct counter64 c64; | ||
| 7542 | - uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 7543 | - c64.high = (unsigned long)(v64 >> 32); | ||
| 7544 | - c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 7545 | - *var_len = sizeof(c64); | ||
| 7546 | - vp->type = ASN_INTEGER64; | ||
| 7547 | - return ((unsigned char *) &c64); | ||
| 7548 | - } | ||
| 7549 | - else if (!strncasecmp(buf, "integer", 7)) { | ||
| 7550 | - *var_len = sizeof(long_ret); | ||
| 7551 | - long_ret = strtol(buf2, NULL, 10); | ||
| 7552 | - vp->type = ASN_INTEGER; | ||
| 7553 | - return ((unsigned char *) &long_ret); | ||
| 7554 | - } else if (!strncasecmp(buf, "unsigned", 8)) { | ||
| 7555 | - *var_len = sizeof(long_ret); | ||
| 7556 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7557 | - vp->type = ASN_UNSIGNED; | ||
| 7558 | - return ((unsigned char *) &long_ret); | ||
| 7559 | - } | ||
| 7560 | - else if (!strncasecmp(buf, "counter64", 9)) { | ||
| 7561 | - static struct counter64 c64; | ||
| 7562 | - uint64_t v64 = strtoull(buf2, NULL, 10); | ||
| 7563 | - c64.high = (unsigned long)(v64 >> 32); | ||
| 7564 | - c64.low = (unsigned long)(v64 & 0xffffffff); | ||
| 7565 | - *var_len = sizeof(c64); | ||
| 7566 | - vp->type = ASN_COUNTER64; | ||
| 7567 | - return ((unsigned char *) &c64); | ||
| 7568 | - } | ||
| 7569 | - else if (!strncasecmp(buf, "counter", 7)) { | ||
| 7570 | - *var_len = sizeof(long_ret); | ||
| 7571 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7572 | - vp->type = ASN_COUNTER; | ||
| 7573 | - return ((unsigned char *) &long_ret); | ||
| 7574 | - } else if (!strncasecmp(buf, "octet", 5)) { | ||
| 7575 | - *var_len = asc2bin(buf2); | ||
| 7576 | - vp->type = ASN_OCTET_STR; | ||
| 7577 | - return ((unsigned char *) buf2); | ||
| 7578 | - } else if (!strncasecmp(buf, "opaque", 6)) { | ||
| 7579 | - *var_len = asc2bin(buf2); | ||
| 7580 | - vp->type = ASN_OPAQUE; | ||
| 7581 | - return ((unsigned char *) buf2); | ||
| 7582 | - } else if (!strncasecmp(buf, "gauge", 5)) { | ||
| 7583 | - *var_len = sizeof(long_ret); | ||
| 7584 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7585 | - vp->type = ASN_GAUGE; | ||
| 7586 | - return ((unsigned char *) &long_ret); | ||
| 7587 | - } else if (!strncasecmp(buf, "objectid", 8)) { | ||
| 7588 | - newlen = parse_miboid(buf2, objid); | ||
| 7589 | - *var_len = newlen * sizeof(oid); | ||
| 7590 | - vp->type = ASN_OBJECT_ID; | ||
| 7591 | - return ((unsigned char *) objid); | ||
| 7592 | - } else if (!strncasecmp(buf, "timetick", 8)) { | ||
| 7593 | - *var_len = sizeof(long_ret); | ||
| 7594 | - long_ret = strtoul(buf2, NULL, 10); | ||
| 7595 | - vp->type = ASN_TIMETICKS; | ||
| 7596 | - return ((unsigned char *) &long_ret); | ||
| 7597 | - } else if (!strncasecmp(buf, "ipaddress", 9)) { | ||
| 7598 | - newlen = parse_miboid(buf2, objid); | ||
| 7599 | - if (newlen != 4) { | ||
| 7600 | - snmp_log(LOG_ERR, | ||
| 7601 | - "invalid ipaddress returned: %s\n", | ||
| 7602 | - buf2); | ||
| 7603 | - *var_len = 0; | ||
| 7604 | - return (NULL); | ||
| 7605 | - } | ||
| 7606 | - addr_ret = | ||
| 7607 | - (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) + | ||
| 7608 | - (objid[2] << 8) + objid[3]; | ||
| 7609 | - addr_ret = htonl(addr_ret); | ||
| 7610 | - *var_len = sizeof(addr_ret); | ||
| 7611 | - vp->type = ASN_IPADDRESS; | ||
| 7612 | - return ((unsigned char *) &addr_ret); | ||
| 7613 | - } | ||
| 7614 | + return netsnmp_internal_pass_parse(buf, buf2, var_len, vp); | ||
| 7615 | } | ||
| 7616 | *var_len = 0; | ||
| 7617 | return (NULL); | ||
| 7618 | @@ -430,8 +334,6 @@ setPassPersist(int action, | ||
| 7619 | struct extensible *persistpassthru; | ||
| 7620 | |||
| 7621 | char buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF]; | ||
| 7622 | - long tmp; | ||
| 7623 | - unsigned long utmp; | ||
| 7624 | |||
| 7625 | /* | ||
| 7626 | * Make sure that our basic pipe structure is malloced | ||
| 7627 | @@ -440,7 +342,7 @@ setPassPersist(int action, | ||
| 7628 | |||
| 7629 | for (i = 1; i <= numpersistpassthrus; i++) { | ||
| 7630 | persistpassthru = get_exten_instance(persistpassthrus, i); | ||
| 7631 | - rtest = snmp_oid_min_compare(name, name_len, | ||
| 7632 | + rtest = snmp_oidtree_compare(name, name_len, | ||
| 7633 | persistpassthru->miboid, | ||
| 7634 | persistpassthru->miblen); | ||
| 7635 | if (rtest <= 0) { | ||
| 7636 | @@ -457,55 +359,9 @@ setPassPersist(int action, | ||
| 7637 | snprintf(persistpassthru->command, | ||
| 7638 | sizeof(persistpassthru->command), "set\n%s\n", buf); | ||
| 7639 | persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0; | ||
| 7640 | - switch (var_val_type) { | ||
| 7641 | - case ASN_INTEGER: | ||
| 7642 | - case ASN_COUNTER: | ||
| 7643 | - case ASN_GAUGE: | ||
| 7644 | - case ASN_TIMETICKS: | ||
| 7645 | - tmp = *((long *) var_val); | ||
| 7646 | - switch (var_val_type) { | ||
| 7647 | - case ASN_INTEGER: | ||
| 7648 | - sprintf(buf, "integer %d\n", (int) tmp); | ||
| 7649 | - break; | ||
| 7650 | - case ASN_COUNTER: | ||
| 7651 | - sprintf(buf, "counter %d\n", (int) tmp); | ||
| 7652 | - break; | ||
| 7653 | - case ASN_GAUGE: | ||
| 7654 | - sprintf(buf, "gauge %d\n", (int) tmp); | ||
| 7655 | - break; | ||
| 7656 | - case ASN_TIMETICKS: | ||
| 7657 | - sprintf(buf, "timeticks %d\n", (int) tmp); | ||
| 7658 | - break; | ||
| 7659 | - } | ||
| 7660 | - break; | ||
| 7661 | - case ASN_IPADDRESS: | ||
| 7662 | - utmp = *((u_long *) var_val); | ||
| 7663 | - utmp = ntohl(utmp); | ||
| 7664 | - sprintf(buf, "ipaddress %d.%d.%d.%d\n", | ||
| 7665 | - (int) ((utmp & 0xff000000) >> (8 * 3)), | ||
| 7666 | - (int) ((utmp & 0xff0000) >> (8 * 2)), | ||
| 7667 | - (int) ((utmp & 0xff00) >> (8)), | ||
| 7668 | - (int) ((utmp & 0xff))); | ||
| 7669 | - break; | ||
| 7670 | - case ASN_OCTET_STR: | ||
| 7671 | - memcpy(buf2, var_val, var_val_len); | ||
| 7672 | - if (var_val_len == 0) | ||
| 7673 | - sprintf(buf, "string \"\"\n"); | ||
| 7674 | - else if (bin2asc(buf2, var_val_len) == (int) var_val_len) | ||
| 7675 | - snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2); | ||
| 7676 | - else | ||
| 7677 | - snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2); | ||
| 7678 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 7679 | - break; | ||
| 7680 | - case ASN_OBJECT_ID: | ||
| 7681 | - sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid)); | ||
| 7682 | - snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2); | ||
| 7683 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 7684 | - break; | ||
| 7685 | - } | ||
| 7686 | - strncat(persistpassthru->command, buf, | ||
| 7687 | - sizeof(persistpassthru->command) - | ||
| 7688 | - strlen(persistpassthru->command) - 2); | ||
| 7689 | + netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len); | ||
| 7690 | + strlcat(persistpassthru->command, buf, | ||
| 7691 | + sizeof(persistpassthru->command)); | ||
| 7692 | persistpassthru->command[ sizeof(persistpassthru->command)-2 ] = '\n'; | ||
| 7693 | persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0; | ||
| 7694 | |||
| 7695 | @@ -526,7 +382,7 @@ setPassPersist(int action, | ||
| 7696 | return SNMP_ERR_NOTWRITABLE; | ||
| 7697 | } | ||
| 7698 | |||
| 7699 | - return netsnmp_pass_str_to_errno(buf); | ||
| 7700 | + return netsnmp_internal_pass_str_to_errno(buf); | ||
| 7701 | } | ||
| 7702 | } | ||
| 7703 | if (snmp_get_do_debugging()) { | ||
| 7704 | @@ -650,8 +506,8 @@ open_persist_pipe(int iindex, char *command) | ||
| 7705 | { | ||
| 7706 | static int recurse = 0; /* used to allow one level of recursion */ | ||
| 7707 | |||
| 7708 | - DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s')\n", | ||
| 7709 | - iindex, command)); | ||
| 7710 | + DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s') recurse=%d\n", | ||
| 7711 | + iindex, command, recurse)); | ||
| 7712 | /* | ||
| 7713 | * Open if it's not already open | ||
| 7714 | */ | ||
| 7715 | @@ -683,6 +539,7 @@ open_persist_pipe(int iindex, char *command) | ||
| 7716 | * Setup our -non-buffered-io- | ||
| 7717 | */ | ||
| 7718 | setbuf(persist_pipes[iindex].fOut, (char *) 0); | ||
| 7719 | + DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: opened the pipes\n")); | ||
| 7720 | } | ||
| 7721 | |||
| 7722 | /* | ||
| 7723 | @@ -702,6 +559,7 @@ open_persist_pipe(int iindex, char *command) | ||
| 7724 | * Recurse one time if we get a SIGPIPE | ||
| 7725 | */ | ||
| 7726 | if (!recurse) { | ||
| 7727 | + DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: recursing to reopen\n")); | ||
| 7728 | recurse = 1; | ||
| 7729 | return open_persist_pipe(iindex, command); | ||
| 7730 | } | ||
| 7731 | @@ -717,7 +575,7 @@ open_persist_pipe(int iindex, char *command) | ||
| 7732 | } | ||
| 7733 | if (strncmp(buf, "PONG", 4)) { | ||
| 7734 | DEBUGMSGTL(("ucd-snmp/pass_persist", | ||
| 7735 | - "open_persist_pipe: PONG not received!\n")); | ||
| 7736 | + "open_persist_pipe: Got %s instead of PONG!\n", buf)); | ||
| 7737 | close_persist_pipe(iindex); | ||
| 7738 | recurse = 0; | ||
| 7739 | return 0; | ||
| 7740 | @@ -728,17 +586,6 @@ open_persist_pipe(int iindex, char *command) | ||
| 7741 | return 1; | ||
| 7742 | } | ||
| 7743 | |||
| 7744 | -#if HAVE_STRUCT_SIGACTION_SA_SIGACTION | ||
| 7745 | -/* | ||
| 7746 | - * Generic handler | ||
| 7747 | - */ | ||
| 7748 | -void | ||
| 7749 | -sigpipe_handler(int sig, siginfo_t * sip, void *uap) | ||
| 7750 | -{ | ||
| 7751 | - return; | ||
| 7752 | -} | ||
| 7753 | -#endif | ||
| 7754 | - | ||
| 7755 | static int | ||
| 7756 | write_persist_pipe(int iindex, const char *data) | ||
| 7757 | { | ||
| 7758 | @@ -750,16 +597,16 @@ write_persist_pipe(int iindex, const char *data) | ||
| 7759 | * Don't write to a non-existant process | ||
| 7760 | */ | ||
| 7761 | if (persist_pipes[iindex].pid == NETSNMP_NO_SUCH_PROCESS) { | ||
| 7762 | + DEBUGMSGTL(("ucd-snmp/pass_persist", | ||
| 7763 | + "write_persist_pipe: not writing %s, process is non-existent", | ||
| 7764 | + data)); | ||
| 7765 | return 0; | ||
| 7766 | } | ||
| 7767 | |||
| 7768 | /* | ||
| 7769 | - * Setup our signal action to catch SIGPIPEs | ||
| 7770 | + * Setup our signal action to ignore SIGPIPEs | ||
| 7771 | */ | ||
| 7772 | - sa.sa_handler = NULL; | ||
| 7773 | -#if HAVE_STRUCT_SIGACTION_SA_SIGACTION | ||
| 7774 | - sa.sa_sigaction = &sigpipe_handler; | ||
| 7775 | -#endif | ||
| 7776 | + sa.sa_handler = SIG_IGN; | ||
| 7777 | sigemptyset(&sa.sa_mask); | ||
| 7778 | sa.sa_flags = 0; | ||
| 7779 | if (sigaction(SIGPIPE, &sa, &osa)) { | ||
| 7780 | @@ -779,10 +626,10 @@ write_persist_pipe(int iindex, const char *data) | ||
| 7781 | sigaction(SIGPIPE, &osa, (struct sigaction *) 0); | ||
| 7782 | |||
| 7783 | if (wret < 0) { | ||
| 7784 | - if (werrno != EINTR) { | ||
| 7785 | + if (werrno != EPIPE) { | ||
| 7786 | DEBUGMSGTL(("ucd-snmp/pass_persist", | ||
| 7787 | - "write_persist_pipe: write returned unknown error %d\n", | ||
| 7788 | - errno)); | ||
| 7789 | + "write_persist_pipe: write returned unknown error %d (%s)\n", | ||
| 7790 | + werrno, strerror(werrno))); | ||
| 7791 | } | ||
| 7792 | close_persist_pipe(iindex); | ||
| 7793 | return 0; | ||
| 7794 | diff --git a/agent/mibgroup/ucd-snmp/pass_persist.h b/agent/mibgroup/ucd-snmp/pass_persist.h | ||
| 7795 | index c7a2aa8..0537abc 100644 | ||
| 7796 | --- a/agent/mibgroup/ucd-snmp/pass_persist.h | ||
| 7797 | +++ b/agent/mibgroup/ucd-snmp/pass_persist.h | ||
| 7798 | @@ -4,7 +4,9 @@ | ||
| 7799 | #ifndef _MIBGROUP_PASS_PERSIST_H | ||
| 7800 | #define _MIBGROUP_PASS_PERSIST_H | ||
| 7801 | |||
| 7802 | +config_require(ucd-snmp/pass_common) | ||
| 7803 | config_require(util_funcs) | ||
| 7804 | +config_require(utilities/execute) | ||
| 7805 | |||
| 7806 | void init_pass_persist(void); | ||
| 7807 | void shutdown_pass_persist(void); | ||
| 7808 | diff --git a/agent/mibgroup/ucd-snmp/proc.c b/agent/mibgroup/ucd-snmp/proc.c | ||
| 7809 | index 32ac0df..e90c2e8 100644 | ||
| 7810 | --- a/agent/mibgroup/ucd-snmp/proc.c | ||
| 7811 | +++ b/agent/mibgroup/ucd-snmp/proc.c | ||
| 7812 | @@ -437,8 +437,7 @@ sh_count_procs(char *procname) | ||
| 7813 | count = 0; | ||
| 7814 | |||
| 7815 | while(getprocs(&pinfo, sizeof(pinfo), NULL, 0, &index, 1) == 1) { | ||
| 7816 | - strncpy(pinfo_name, pinfo.pi_comm, 256); | ||
| 7817 | - pinfo_name[255] = 0; | ||
| 7818 | + strlcpy(pinfo_name, pinfo.pi_comm, sizeof(pinfo_name)); | ||
| 7819 | sep = strchr(pinfo_name, ' '); | ||
| 7820 | if(sep != NULL) *sep = 0; | ||
| 7821 | if(strcmp(procname, pinfo_name) == 0) count++; | ||
| 7822 | diff --git a/agent/mibgroup/ucd-snmp/proxy.c b/agent/mibgroup/ucd-snmp/proxy.c | ||
| 7823 | index ec1aac7..017fd5c 100644 | ||
| 7824 | --- a/agent/mibgroup/ucd-snmp/proxy.c | ||
| 7825 | +++ b/agent/mibgroup/ucd-snmp/proxy.c | ||
| 7826 | @@ -285,14 +285,13 @@ proxy_fill_in_session(netsnmp_mib_handler *handler, | ||
| 7827 | return 0; | ||
| 7828 | } | ||
| 7829 | |||
| 7830 | - *configured = malloc(strlen("-c") + 1); | ||
| 7831 | - strcpy((char*)*configured, "-c"); | ||
| 7832 | + *configured = strdup("-c"); | ||
| 7833 | DEBUGMSGTL(("proxy", "pdu has community string\n")); | ||
| 7834 | session->community_len = reqinfo->asp->pdu->community_len; | ||
| 7835 | - session->community = (u_char*)malloc(session->community_len + 1); | ||
| 7836 | - strncpy((char *)session->community, | ||
| 7837 | - (const char *)reqinfo->asp->pdu->community, | ||
| 7838 | - session->community_len); | ||
| 7839 | + session->community = malloc(session->community_len + 1); | ||
| 7840 | + sprintf((char *)session->community, "%.*s", | ||
| 7841 | + (int) session->community_len, | ||
| 7842 | + (const char *)reqinfo->asp->pdu->community); | ||
| 7843 | } | ||
| 7844 | } | ||
| 7845 | #endif | ||
| 7846 | @@ -401,6 +400,8 @@ proxy_handler(netsnmp_mib_handler *handler, | ||
| 7847 | |||
| 7848 | if (!pdu || !sp) { | ||
| 7849 | netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR); | ||
| 7850 | + if (pdu) | ||
| 7851 | + snmp_free_pdu(pdu); | ||
| 7852 | return SNMP_ERR_NOERROR; | ||
| 7853 | } | ||
| 7854 | |||
| 7855 | @@ -561,7 +562,7 @@ proxy_got_response(int operation, netsnmp_session * sess, int reqid, | ||
| 7856 | REQUEST_IS_NOT_DELEGATED); | ||
| 7857 | } | ||
| 7858 | #ifndef NETSNMP_NO_WRITE_SUPPORT | ||
| 7859 | - else if ((cache->reqinfo->mode == MODE_SET_ACTION)) { | ||
| 7860 | + else if (cache->reqinfo->mode == MODE_SET_ACTION) { | ||
| 7861 | /* | ||
| 7862 | * In order for netsnmp_wrap_up_request to consider the | ||
| 7863 | * SET request complete, | ||
| 7864 | diff --git a/agent/mibgroup/ucd-snmp/versioninfo.c b/agent/mibgroup/ucd-snmp/versioninfo.c | ||
| 7865 | index 60a3c71..f7a8c63 100644 | ||
| 7866 | --- a/agent/mibgroup/ucd-snmp/versioninfo.c | ||
| 7867 | +++ b/agent/mibgroup/ucd-snmp/versioninfo.c | ||
| 7868 | @@ -108,22 +108,21 @@ var_extensible_version(struct variable *vp, | ||
| 7869 | long_ret = name[8]; | ||
| 7870 | return ((u_char *) (&long_ret)); | ||
| 7871 | case VERTAG: | ||
| 7872 | - strcpy(errmsg, netsnmp_get_version()); | ||
| 7873 | + strlcpy(errmsg, netsnmp_get_version(), sizeof(errmsg)); | ||
| 7874 | *var_len = strlen(errmsg); | ||
| 7875 | return ((u_char *) errmsg); | ||
| 7876 | case VERDATE: | ||
| 7877 | - sprintf(errmsg, "$Date$"); | ||
| 7878 | + strlcpy(errmsg, "$Date$", sizeof(errmsg)); | ||
| 7879 | *var_len = strlen(errmsg); | ||
| 7880 | return ((u_char *) errmsg); | ||
| 7881 | case VERCDATE: | ||
| 7882 | curtime = time(NULL); | ||
| 7883 | cptr = ctime(&curtime); | ||
| 7884 | - strcpy(errmsg, cptr); | ||
| 7885 | - *var_len = strlen(errmsg) - 1; | ||
| 7886 | + strlcpy(errmsg, cptr, sizeof(errmsg)); | ||
| 7887 | + *var_len = strlen(errmsg) - 1; /* - 1 to strip trailing newline */ | ||
| 7888 | return ((u_char *) errmsg); | ||
| 7889 | case VERIDENT: | ||
| 7890 | - sprintf(errmsg, | ||
| 7891 | - "$Id$"); | ||
| 7892 | + strlcpy(errmsg, "$Id$", sizeof(errmsg)); | ||
| 7893 | *var_len = strlen(errmsg); | ||
| 7894 | return ((u_char *) errmsg); | ||
| 7895 | case VERCONFIG: | ||
| 7896 | @@ -133,7 +132,7 @@ var_extensible_version(struct variable *vp, | ||
| 7897 | *var_len = 1024; /* mib imposed restriction */ | ||
| 7898 | return (u_char *) config_opts; | ||
| 7899 | #else | ||
| 7900 | - sprintf(errmsg, ""); | ||
| 7901 | + strlcpy(errmsg, "", sizeof(errmsg))); | ||
| 7902 | *var_len = strlen(errmsg); | ||
| 7903 | return ((u_char *) errmsg); | ||
| 7904 | #endif | ||
| 7905 | diff --git a/agent/mibgroup/ucd-snmp/vmstat.c b/agent/mibgroup/ucd-snmp/vmstat.c | ||
| 7906 | index b613ee1..d52a5b6 100644 | ||
| 7907 | --- a/agent/mibgroup/ucd-snmp/vmstat.c | ||
| 7908 | +++ b/agent/mibgroup/ucd-snmp/vmstat.c | ||
| 7909 | @@ -31,7 +31,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7910 | netsnmp_request_info *requests) | ||
| 7911 | { | ||
| 7912 | oid obj; | ||
| 7913 | - long value = 0; | ||
| 7914 | + unsigned long long value = 0; | ||
| 7915 | char cp[300]; | ||
| 7916 | netsnmp_cpu_info *info = netsnmp_cpu_get_byIdx( -1, 0 ); | ||
| 7917 | |||
| 7918 | @@ -147,7 +147,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7919 | else | ||
| 7920 | value = 0; /* or skip this entry */ | ||
| 7921 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7922 | - ASN_INTEGER, value); | ||
| 7923 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7924 | } | ||
| 7925 | break; | ||
| 7926 | case CPUSYSTEM: | ||
| 7927 | @@ -159,7 +159,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7928 | else | ||
| 7929 | value = 0; /* or skip this entry */ | ||
| 7930 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7931 | - ASN_INTEGER, value); | ||
| 7932 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7933 | } | ||
| 7934 | break; | ||
| 7935 | case CPUIDLE: | ||
| 7936 | @@ -170,7 +170,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7937 | else | ||
| 7938 | value = 0; /* or skip this entry */ | ||
| 7939 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7940 | - ASN_INTEGER, value); | ||
| 7941 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7942 | } | ||
| 7943 | break; | ||
| 7944 | |||
| 7945 | @@ -190,14 +190,14 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7946 | if ( info->history && info->history[0].total_hist ) { | ||
| 7947 | value = (info->nInterrupts - info->history[0].intr_hist)/60; | ||
| 7948 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7949 | - ASN_INTEGER, value); | ||
| 7950 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7951 | } | ||
| 7952 | break; | ||
| 7953 | case SYSCONTEXT: | ||
| 7954 | if ( info->history && info->history[0].total_hist ) { | ||
| 7955 | value = (info->nCtxSwitches - info->history[0].ctx_hist)/60; | ||
| 7956 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7957 | - ASN_INTEGER, value); | ||
| 7958 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7959 | } | ||
| 7960 | break; | ||
| 7961 | |||
| 7962 | @@ -217,7 +217,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7963 | value = (info->swapIn - info->history[0].swpi_hist)/60; | ||
| 7964 | /* ??? value *= PAGE_SIZE; */ | ||
| 7965 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7966 | - ASN_INTEGER, value); | ||
| 7967 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7968 | } | ||
| 7969 | break; | ||
| 7970 | case SWAPOUT: | ||
| 7971 | @@ -225,7 +225,7 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7972 | value = (info->swapOut - info->history[0].swpo_hist)/60; | ||
| 7973 | /* ??? value *= PAGE_SIZE; */ | ||
| 7974 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7975 | - ASN_INTEGER, value); | ||
| 7976 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7977 | } | ||
| 7978 | break; | ||
| 7979 | |||
| 7980 | @@ -244,14 +244,14 @@ vmstat_handler(netsnmp_mib_handler *handler, | ||
| 7981 | if ( info->history && info->history[0].total_hist ) { | ||
| 7982 | value = (info->pageOut - info->history[0].pageo_hist)/60; | ||
| 7983 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7984 | - ASN_INTEGER, value); | ||
| 7985 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7986 | } | ||
| 7987 | break; | ||
| 7988 | case IORECEIVE: | ||
| 7989 | if ( info->history && info->history[0].total_hist ) { | ||
| 7990 | value = (info->pageIn - info->history[0].pagei_hist)/60; | ||
| 7991 | snmp_set_var_typed_integer(requests->requestvb, | ||
| 7992 | - ASN_INTEGER, value); | ||
| 7993 | + ASN_INTEGER, value & 0x7fffffff); | ||
| 7994 | } | ||
| 7995 | break; | ||
| 7996 | |||
| 7997 | diff --git a/agent/mibgroup/ucd_snmp.h b/agent/mibgroup/ucd_snmp.h | ||
| 7998 | index c371dd4..0d87ec1 100644 | ||
| 7999 | --- a/agent/mibgroup/ucd_snmp.h | ||
| 8000 | +++ b/agent/mibgroup/ucd_snmp.h | ||
| 8001 | @@ -8,7 +8,9 @@ config_require(ucd-snmp/loadave) | ||
| 8002 | config_require(agent/extend) | ||
| 8003 | config_require(ucd-snmp/errormib) | ||
| 8004 | config_require(ucd-snmp/file) | ||
| 8005 | +#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN) | ||
| 8006 | config_require(ucd-snmp/dlmod) | ||
| 8007 | +#endif | ||
| 8008 | config_require(ucd-snmp/proxy) | ||
| 8009 | config_require(ucd-snmp/logmatch) | ||
| 8010 | config_require(ucd-snmp/memory) | ||
| 8011 | diff --git a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c | ||
| 8012 | index 9ea23a9..0e25c21 100644 | ||
| 8013 | --- a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c | ||
| 8014 | +++ b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c | ||
| 8015 | @@ -239,7 +239,7 @@ udpEndpointTable_container_load(netsnmp_container *container) | ||
| 8016 | if (NULL == ep_c) | ||
| 8017 | return MFD_RESOURCE_UNAVAILABLE; | ||
| 8018 | ep_it = CONTAINER_ITERATOR(ep_c); | ||
| 8019 | - if (NULL == ep_c) { | ||
| 8020 | + if (NULL == ep_it) { | ||
| 8021 | netsnmp_access_udp_endpoint_container_free(ep_c, 0); | ||
| 8022 | return MFD_RESOURCE_UNAVAILABLE; | ||
| 8023 | } | ||
| 8024 | diff --git a/agent/mibgroup/util_funcs.c b/agent/mibgroup/util_funcs.c | ||
| 8025 | index 55d80c5..69d7190 100644 | ||
| 8026 | --- a/agent/mibgroup/util_funcs.c | ||
| 8027 | +++ b/agent/mibgroup/util_funcs.c | ||
| 8028 | @@ -126,31 +126,7 @@ extern int numprocs, numextens; | ||
| 8029 | const char * | ||
| 8030 | make_tempfile(void) | ||
| 8031 | { | ||
| 8032 | - static char name[32]; | ||
| 8033 | - int fd = -1; | ||
| 8034 | - | ||
| 8035 | - strcpy(name, get_temp_file_pattern()); | ||
| 8036 | -#ifdef HAVE_MKSTEMP | ||
| 8037 | - fd = mkstemp(name); | ||
| 8038 | -#else | ||
| 8039 | - if (mktemp(name)) { | ||
| 8040 | -# ifndef WIN32 | ||
| 8041 | - fd = open(name, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR); | ||
| 8042 | -# else | ||
| 8043 | - /* | ||
| 8044 | - Win32 needs _S_IREAD | _S_IWRITE to set permissions on file after closing | ||
| 8045 | - */ | ||
| 8046 | - fd = _open(name, _O_CREAT | _O_EXCL | _O_WRONLY, _S_IREAD | _S_IWRITE); | ||
| 8047 | -# endif | ||
| 8048 | - } | ||
| 8049 | -#endif | ||
| 8050 | - if (fd >= 0) { | ||
| 8051 | - close(fd); | ||
| 8052 | - DEBUGMSGTL(("make_tempfile", "temp file created: %s\n", name)); | ||
| 8053 | - return name; | ||
| 8054 | - } | ||
| 8055 | - snmp_log(LOG_ERR,"make_tempfile: error creating file %s\n", name); | ||
| 8056 | - return NULL; | ||
| 8057 | + return netsnmp_mktemp(); | ||
| 8058 | } | ||
| 8059 | |||
| 8060 | #ifndef NETSNMP_FEATURE_REMOVE_SHELL_COMMAND | ||
| 8061 | @@ -718,14 +694,12 @@ print_mib_oid(oid name[], size_t len) | ||
| 8062 | } | ||
| 8063 | |||
| 8064 | void | ||
| 8065 | -sprint_mib_oid(char *buf, oid name[], size_t len) | ||
| 8066 | +sprint_mib_oid(char *buf, const oid *name, size_t len) | ||
| 8067 | { | ||
| 8068 | int i; | ||
| 8069 | - for (i = 0; i < (int) len; i++) { | ||
| 8070 | - sprintf(buf, ".%d", (int) name[i]); | ||
| 8071 | - while (*buf != 0) | ||
| 8072 | - buf++; | ||
| 8073 | - } | ||
| 8074 | + | ||
| 8075 | + for (i = 0; i < (int) len; i++) | ||
| 8076 | + buf += sprintf(buf, ".%" NETSNMP_PRIo "u", name[i]); | ||
| 8077 | } | ||
| 8078 | |||
| 8079 | /* | ||
| 8080 | @@ -798,7 +772,10 @@ parse_miboid(const char *buf, oid * oidout) | ||
| 8081 | if (*buf == '.') | ||
| 8082 | buf++; | ||
| 8083 | for (i = 0; isdigit((unsigned char)(*buf)); i++) { | ||
| 8084 | - oidout[i] = atoi(buf); | ||
| 8085 | + /* Subidentifiers are unsigned values, up to 2^32-1 | ||
| 8086 | + * so we need to use 'strtoul' rather than 'atoi' | ||
| 8087 | + */ | ||
| 8088 | + oidout[i] = strtoul(buf, NULL, 10) & 0xffffffff; | ||
| 8089 | while (isdigit((unsigned char)(*buf++))); | ||
| 8090 | if (*buf == '.') | ||
| 8091 | buf++; | ||
| 8092 | @@ -1146,7 +1123,7 @@ int net_snmp_delete_prefix_info(prefix_cbx **head, | ||
| 8093 | } | ||
| 8094 | return 0; | ||
| 8095 | } | ||
| 8096 | -#endif | ||
| 8097 | +#endif /* NETSNMP_FEATURE_REMOVE_DELETE_PREFIX_INFO */ | ||
| 8098 | |||
| 8099 | #endif /* HAVE_LINUX_RTNETLINK_H */ | ||
| 8100 | |||
| 8101 | diff --git a/agent/mibgroup/util_funcs.h b/agent/mibgroup/util_funcs.h | ||
| 8102 | index 5bef2a8..7f59780 100644 | ||
| 8103 | --- a/agent/mibgroup/util_funcs.h | ||
| 8104 | +++ b/agent/mibgroup/util_funcs.h | ||
| 8105 | @@ -43,7 +43,7 @@ int get_exec_pipes(char *cmd, int *fdIn, int *fdOut, pid_t *pid); | ||
| 8106 | #endif | ||
| 8107 | WriteMethod clear_cache; | ||
| 8108 | void print_mib_oid(oid *, size_t); | ||
| 8109 | -void sprint_mib_oid(char *, oid *, size_t); | ||
| 8110 | +void sprint_mib_oid(char *, const oid *, size_t); | ||
| 8111 | int checkmib(struct variable *, oid *, size_t *, int, size_t *, | ||
| 8112 | WriteMethod ** write_method, int); | ||
| 8113 | char *find_field(char *, int); | ||
| 8114 | diff --git a/agent/mibgroup/utilities/override.c b/agent/mibgroup/utilities/override.c | ||
| 8115 | index 298883e..2b083a9 100644 | ||
| 8116 | --- a/agent/mibgroup/utilities/override.c | ||
| 8117 | +++ b/agent/mibgroup/utilities/override.c | ||
| 8118 | @@ -216,6 +216,8 @@ netsnmp_parse_override(const char *token, char *line) | ||
| 8119 | case ASN_OBJECT_ID: | ||
| 8120 | read_config_read_objid(buf, (oid **) & thedata->value, | ||
| 8121 | &thedata->value_len); | ||
| 8122 | + /* We need the size of the value in bytes, not in oids */ | ||
| 8123 | + thedata->value_len *= sizeof(oid); | ||
| 8124 | break; | ||
| 8125 | |||
| 8126 | case ASN_NULL: | ||
| 8127 | diff --git a/agent/mibgroup/winExtDLL.c b/agent/mibgroup/winExtDLL.c | ||
| 8128 | index ddf613b..c693913 100644 | ||
| 8129 | --- a/agent/mibgroup/winExtDLL.c | ||
| 8130 | +++ b/agent/mibgroup/winExtDLL.c | ||
| 8131 | @@ -692,7 +692,6 @@ var_winExtDLL(netsnmp_mib_handler *handler, | ||
| 8132 | winextdll *ext_dll_info; | ||
| 8133 | netsnmp_request_info *request; | ||
| 8134 | UINT nRequestType; | ||
| 8135 | - const char *mode_name; | ||
| 8136 | int rc; | ||
| 8137 | |||
| 8138 | netsnmp_assert(ext_dll_view_info); | ||
| 8139 | @@ -711,35 +710,27 @@ var_winExtDLL(netsnmp_mib_handler *handler, | ||
| 8140 | |||
| 8141 | switch (reqinfo->mode) { | ||
| 8142 | case MODE_GET: | ||
| 8143 | - mode_name = "GET"; | ||
| 8144 | nRequestType = SNMP_EXTENSION_GET; | ||
| 8145 | netsnmp_assert(!context_info_head); | ||
| 8146 | break; | ||
| 8147 | case MODE_GETNEXT: | ||
| 8148 | - mode_name = "GETNEXT"; | ||
| 8149 | nRequestType = SNMP_EXTENSION_GET_NEXT; | ||
| 8150 | netsnmp_assert(!context_info_head); | ||
| 8151 | break; | ||
| 8152 | case MODE_SET_RESERVE1: | ||
| 8153 | - mode_name = "SET_RESERVE1"; | ||
| 8154 | nRequestType = SNMP_EXTENSION_SET_TEST; | ||
| 8155 | break; | ||
| 8156 | case MODE_SET_RESERVE2: | ||
| 8157 | - mode_name = "SET_RESERVE2"; | ||
| 8158 | return SNMP_ERR_NOERROR; | ||
| 8159 | case MODE_SET_ACTION: | ||
| 8160 | - mode_name = "SET_ACTION"; | ||
| 8161 | return SNMP_ERR_NOERROR; | ||
| 8162 | case MODE_SET_UNDO: | ||
| 8163 | - mode_name = "SET_UNDO"; | ||
| 8164 | nRequestType = SNMP_EXTENSION_SET_UNDO; | ||
| 8165 | break; | ||
| 8166 | case MODE_SET_COMMIT: | ||
| 8167 | - mode_name = "SET_COMMIT"; | ||
| 8168 | nRequestType = SNMP_EXTENSION_SET_COMMIT; | ||
| 8169 | break; | ||
| 8170 | case MODE_SET_FREE: | ||
| 8171 | - mode_name = "SET_FREE"; | ||
| 8172 | nRequestType = SNMP_EXTENSION_SET_CLEANUP; | ||
| 8173 | break; | ||
| 8174 | default: | ||
| 8175 | diff --git a/agent/snmp_agent.c b/agent/snmp_agent.c | ||
| 8176 | index b38ef4a..2532da1 100644 | ||
| 8177 | --- a/agent/snmp_agent.c | ||
| 8178 | +++ b/agent/snmp_agent.c | ||
| 8179 | @@ -662,8 +662,7 @@ agent_check_and_process(int block) | ||
| 8180 | * The caller does not want us to block at all. | ||
| 8181 | */ | ||
| 8182 | |||
| 8183 | - tvp->tv_sec = 0; | ||
| 8184 | - tvp->tv_usec = 0; | ||
| 8185 | + timerclear(tvp); | ||
| 8186 | } | ||
| 8187 | |||
| 8188 | count = select(numfds, &fdset, NULL, NULL, tvp); | ||
| 8189 | @@ -778,7 +777,7 @@ netsnmp_addrcache_add(const char *addr) | ||
| 8190 | /* | ||
| 8191 | * found a match | ||
| 8192 | */ | ||
| 8193 | - memcpy(&addrCache[i].lastHit, &now, sizeof(struct timeval)); | ||
| 8194 | + addrCache[i].lastHit = now; | ||
| 8195 | if (timercmp(&addrCache[i].lastHit, &aged, <)) | ||
| 8196 | rc = 1; /* should have expired, so is new */ | ||
| 8197 | else | ||
| 8198 | @@ -825,7 +824,7 @@ netsnmp_addrcache_add(const char *addr) | ||
| 8199 | */ | ||
| 8200 | addrCache[unused].addr = strdup(addr); | ||
| 8201 | addrCache[unused].status = SNMP_ADDRCACHE_USED; | ||
| 8202 | - memcpy(&addrCache[unused].lastHit, &now, sizeof(struct timeval)); | ||
| 8203 | + addrCache[unused].lastHit = now; | ||
| 8204 | } | ||
| 8205 | else { /* Otherwise, replace oldest entry */ | ||
| 8206 | if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, | ||
| 8207 | @@ -835,7 +834,7 @@ netsnmp_addrcache_add(const char *addr) | ||
| 8208 | |||
| 8209 | free(addrCache[oldest].addr); | ||
| 8210 | addrCache[oldest].addr = strdup(addr); | ||
| 8211 | - memcpy(&addrCache[oldest].lastHit, &now, sizeof(struct timeval)); | ||
| 8212 | + addrCache[oldest].lastHit = now; | ||
| 8213 | } | ||
| 8214 | rc = 1; | ||
| 8215 | } | ||
| 8216 | @@ -884,7 +883,7 @@ netsnmp_agent_check_packet(netsnmp_session * session, | ||
| 8217 | { | ||
| 8218 | char *addr_string = NULL; | ||
| 8219 | #ifdef NETSNMP_USE_LIBWRAP | ||
| 8220 | - char *tcpudpaddr, *name; | ||
| 8221 | + char *tcpudpaddr = NULL, *name; | ||
| 8222 | short not_log_connection; | ||
| 8223 | |||
| 8224 | name = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, | ||
| 8225 | @@ -918,12 +917,13 @@ netsnmp_agent_check_packet(netsnmp_session * session, | ||
| 8226 | } | ||
| 8227 | #ifdef NETSNMP_USE_LIBWRAP | ||
| 8228 | /* Catch udp,udp6,tcp,tcp6 transports using "[" */ | ||
| 8229 | - tcpudpaddr = strstr(addr_string, "["); | ||
| 8230 | + if (addr_string) | ||
| 8231 | + tcpudpaddr = strstr(addr_string, "["); | ||
| 8232 | if ( tcpudpaddr != 0 ) { | ||
| 8233 | char sbuf[64]; | ||
| 8234 | char *xp; | ||
| 8235 | - strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf)); | ||
| 8236 | - sbuf[sizeof(sbuf)-1] = '\0'; | ||
| 8237 | + | ||
| 8238 | + strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf)); | ||
| 8239 | xp = strstr(sbuf, "]"); | ||
| 8240 | if (xp) | ||
| 8241 | *xp = '\0'; | ||
| 8242 | @@ -3310,57 +3310,6 @@ netsnmp_handle_request(netsnmp_agent_session *asp, int status) | ||
| 8243 | return 1; | ||
| 8244 | } | ||
| 8245 | |||
| 8246 | -/** | ||
| 8247 | - * This function calls into netsnmp_set_mode_request_error, sets | ||
| 8248 | - * error_value given a reqinfo->mode value. It's used to send specific | ||
| 8249 | - * errors back to the agent to process accordingly. | ||
| 8250 | - * | ||
| 8251 | - * If error_value is set to SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE, | ||
| 8252 | - * or SNMP_ENDOFMIBVIEW the following is applicable: | ||
| 8253 | - * Sets the error_value to request->requestvb->type if | ||
| 8254 | - * reqinfo->mode value is set to MODE_GET. If the reqinfo->mode | ||
| 8255 | - * value is set to MODE_GETNEXT or MODE_GETBULK the code calls | ||
| 8256 | - * snmp_log logging an error message. | ||
| 8257 | - * | ||
| 8258 | - * Otherwise, the request->status value is checked, if it's < 0 | ||
| 8259 | - * snmp_log is called with an error message and SNMP_ERR_GENERR is | ||
| 8260 | - * assigned to request->status. If the request->status value is >= 0 the | ||
| 8261 | - * error_value is set to request->status. | ||
| 8262 | - * | ||
| 8263 | - * @param reqinfo is a pointer to the netsnmp_agent_request_info struct. It | ||
| 8264 | - * contains the reqinfo->mode which is required to set error_value or | ||
| 8265 | - * log error messages. | ||
| 8266 | - * | ||
| 8267 | - * @param request is a pointer to the netsnmp_request_info struct. The | ||
| 8268 | - * error_value is set to request->requestvb->type | ||
| 8269 | - * | ||
| 8270 | - * @param error_value is the exception value you want to set, below are | ||
| 8271 | - * possible values. | ||
| 8272 | - * - SNMP_NOSUCHOBJECT | ||
| 8273 | - * - SNMP_NOSUCHINSTANCE | ||
| 8274 | - * - SNMP_ENDOFMIBVIEW | ||
| 8275 | - * - SNMP_ERR_NOERROR | ||
| 8276 | - * - SNMP_ERR_TOOBIG | ||
| 8277 | - * - SNMP_ERR_NOSUCHNAME | ||
| 8278 | - * - SNMP_ERR_BADVALUE | ||
| 8279 | - * - SNMP_ERR_READONLY | ||
| 8280 | - * - SNMP_ERR_GENERR | ||
| 8281 | - * - SNMP_ERR_NOACCESS | ||
| 8282 | - * - SNMP_ERR_WRONGTYPE | ||
| 8283 | - * - SNMP_ERR_WRONGLENGTH | ||
| 8284 | - * - SNMP_ERR_WRONGENCODING | ||
| 8285 | - * - SNMP_ERR_WRONGVALUE | ||
| 8286 | - * - SNMP_ERR_NOCREATION | ||
| 8287 | - * - SNMP_ERR_INCONSISTENTVALUE | ||
| 8288 | - * - SNMP_ERR_RESOURCEUNAVAILABLE | ||
| 8289 | - * - SNMP_ERR_COMMITFAILED | ||
| 8290 | - * - SNMP_ERR_UNDOFAILED | ||
| 8291 | - * - SNMP_ERR_AUTHORIZATIONERROR | ||
| 8292 | - * - SNMP_ERR_NOTWRITABLE | ||
| 8293 | - * - SNMP_ERR_INCONSISTENTNAME | ||
| 8294 | - * | ||
| 8295 | - * @return Returns error_value under all conditions. | ||
| 8296 | - */ | ||
| 8297 | int | ||
| 8298 | handle_pdu(netsnmp_agent_session *asp) | ||
| 8299 | { | ||
| 8300 | @@ -3702,9 +3651,13 @@ netsnmp_request_set_error_all( netsnmp_request_info *requests, int error) | ||
| 8301 | return result; | ||
| 8302 | } | ||
| 8303 | |||
| 8304 | - /* | ||
| 8305 | - * Return the value of 'sysUpTime' at the given marker | ||
| 8306 | - */ | ||
| 8307 | +/** | ||
| 8308 | + * Return the value of 'sysUpTime' at the given marker | ||
| 8309 | + * | ||
| 8310 | + * @note Use netsnmp_get_agent_runtime() instead of this function if you need | ||
| 8311 | + * to know how much time elapsed since netsnmp_set_agent_starttime() has been | ||
| 8312 | + * called. | ||
| 8313 | + */ | ||
| 8314 | u_long | ||
| 8315 | netsnmp_marker_uptime(marker_t pm) | ||
| 8316 | { | ||
| 8317 | @@ -3738,6 +3691,22 @@ netsnmp_get_agent_starttime(void) | ||
| 8318 | } | ||
| 8319 | |||
| 8320 | /** | ||
| 8321 | + * Report the time that elapsed since the agent start time in hundredths of a | ||
| 8322 | + * second. | ||
| 8323 | + * | ||
| 8324 | + * @see See also netsnmp_set_agent_starttime(). | ||
| 8325 | + */ | ||
| 8326 | +uint64_t | ||
| 8327 | +netsnmp_get_agent_runtime(void) | ||
| 8328 | +{ | ||
| 8329 | + struct timeval now, delta; | ||
| 8330 | + | ||
| 8331 | + gettimeofday(&now, NULL); | ||
| 8332 | + NETSNMP_TIMERSUB(&now, &starttime, &delta); | ||
| 8333 | + return delta.tv_sec * (uint64_t)100 + delta.tv_usec / 10000; | ||
| 8334 | +} | ||
| 8335 | + | ||
| 8336 | +/** | ||
| 8337 | * Set the time at which Net-SNMP started either to the current time | ||
| 8338 | * (if s == NULL) or to *s (if s is not NULL). | ||
| 8339 | */ | ||
| 8340 | diff --git a/agent/snmp_perl.c b/agent/snmp_perl.c | ||
| 8341 | index f974023..48d9695 100644 | ||
| 8342 | --- a/agent/snmp_perl.c | ||
| 8343 | +++ b/agent/snmp_perl.c | ||
| 8344 | @@ -36,6 +36,7 @@ maybe_source_perl_startup(void) | ||
| 8345 | const char *perl_init_file = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID, | ||
| 8346 | NETSNMP_DS_AGENT_PERL_INIT_FILE); | ||
| 8347 | char init_file[SNMP_MAXBUF]; | ||
| 8348 | + int res; | ||
| 8349 | |||
| 8350 | static int have_done_init = 0; | ||
| 8351 | |||
| 8352 | @@ -57,8 +58,11 @@ maybe_source_perl_startup(void) | ||
| 8353 | env = NULL; | ||
| 8354 | PERL_SYS_INIT3(&argc, &argv, &env); | ||
| 8355 | my_perl = perl_alloc(); | ||
| 8356 | - if (!my_perl) | ||
| 8357 | + if (!my_perl) { | ||
| 8358 | + snmp_log(LOG_ERR, | ||
| 8359 | + "embedded perl support failed to initialize (perl_alloc())\n"); | ||
| 8360 | goto bail_out; | ||
| 8361 | + } | ||
| 8362 | |||
| 8363 | perl_construct(my_perl); | ||
| 8364 | |||
| 8365 | @@ -66,11 +70,21 @@ maybe_source_perl_startup(void) | ||
| 8366 | PL_exit_flags |= PERL_EXIT_DESTRUCT_END; | ||
| 8367 | #endif | ||
| 8368 | |||
| 8369 | - if (perl_parse(my_perl, xs_init, 2, embedargs, NULL)) | ||
| 8370 | + res = perl_parse(my_perl, xs_init, 2, embedargs, NULL); | ||
| 8371 | + if (res) { | ||
| 8372 | + snmp_log(LOG_ERR, | ||
| 8373 | + "embedded perl support failed to initialize (perl_parse(%s)" | ||
| 8374 | + " returned %d)\n", embedargs[1], res); | ||
| 8375 | goto bail_out; | ||
| 8376 | + } | ||
| 8377 | |||
| 8378 | - if (perl_run(my_perl)) | ||
| 8379 | + res = perl_run(my_perl); | ||
| 8380 | + if (res) { | ||
| 8381 | + snmp_log(LOG_ERR, | ||
| 8382 | + "embedded perl support failed to initialize (perl_run()" | ||
| 8383 | + " returned %d)\n", res); | ||
| 8384 | goto bail_out; | ||
| 8385 | + } | ||
| 8386 | |||
| 8387 | free(embedargs[0]); | ||
| 8388 | free(embedargs[1]); | ||
| 8389 | @@ -82,7 +96,6 @@ maybe_source_perl_startup(void) | ||
| 8390 | bail_out: | ||
| 8391 | free(embedargs[0]); | ||
| 8392 | free(embedargs[1]); | ||
| 8393 | - snmp_log(LOG_ERR, "embedded perl support failed to initialize\n"); | ||
| 8394 | netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, | ||
| 8395 | NETSNMP_DS_AGENT_DISABLE_PERL, 1); | ||
| 8396 | return; | ||
| 8397 | @@ -168,5 +181,6 @@ shutdown_perl(void) | ||
| 8398 | } | ||
| 8399 | DEBUGMSGTL(("perl", "shutting down perl\n")); | ||
| 8400 | perl_destruct(my_perl); | ||
| 8401 | + my_perl = NULL; | ||
| 8402 | DEBUGMSGTL(("perl", "finished shutting down perl\n")); | ||
| 8403 | } | ||
| 8404 | diff --git a/agent/snmpd.c b/agent/snmpd.c | ||
| 8405 | index 0deff09..ee458c3 100644 | ||
| 8406 | --- a/agent/snmpd.c | ||
| 8407 | +++ b/agent/snmpd.c | ||
| 8408 | @@ -438,7 +438,6 @@ main(int argc, char *argv[]) | ||
| 8409 | int arg, i, ret; | ||
| 8410 | int dont_fork = 0, do_help = 0; | ||
| 8411 | int log_set = 0; | ||
| 8412 | - int uid = 0, gid = 0; | ||
| 8413 | int agent_mode = -1; | ||
| 8414 | char *pid_file = NULL; | ||
| 8415 | char option_compatability[] = "-Le"; | ||
| 8416 | @@ -446,12 +445,6 @@ main(int argc, char *argv[]) | ||
| 8417 | int fd; | ||
| 8418 | FILE *PID; | ||
| 8419 | #endif | ||
| 8420 | -#if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 8421 | - struct passwd *info; | ||
| 8422 | -#endif | ||
| 8423 | -#if HAVE_UNISTD_H | ||
| 8424 | - const char *persistent_dir; | ||
| 8425 | -#endif | ||
| 8426 | |||
| 8427 | #ifndef WIN32 | ||
| 8428 | /* | ||
| 8429 | @@ -602,19 +595,18 @@ main(int argc, char *argv[]) | ||
| 8430 | int gid; | ||
| 8431 | |||
| 8432 | gid = strtoul(optarg, &ecp, 10); | ||
| 8433 | +#if HAVE_GETGRNAM && HAVE_PWD_H | ||
| 8434 | if (*ecp) { | ||
| 8435 | -#if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 8436 | struct group *info; | ||
| 8437 | + | ||
| 8438 | info = getgrnam(optarg); | ||
| 8439 | - if (info) { | ||
| 8440 | - gid = info->gr_gid; | ||
| 8441 | - } else { | ||
| 8442 | -#endif | ||
| 8443 | - fprintf(stderr, "Bad group id: %s\n", optarg); | ||
| 8444 | - exit(1); | ||
| 8445 | -#if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 8446 | - } | ||
| 8447 | + gid = info ? info->gr_gid : -1; | ||
| 8448 | + endgrent(); | ||
| 8449 | + } | ||
| 8450 | #endif | ||
| 8451 | + if (gid < 0) { | ||
| 8452 | + fprintf(stderr, "Bad group id: %s\n", optarg); | ||
| 8453 | + exit(1); | ||
| 8454 | } | ||
| 8455 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8456 | NETSNMP_DS_AGENT_GROUPID, gid); | ||
| 8457 | @@ -781,18 +773,18 @@ main(int argc, char *argv[]) | ||
| 8458 | int uid; | ||
| 8459 | |||
| 8460 | uid = strtoul(optarg, &ecp, 10); | ||
| 8461 | - if (*ecp) { | ||
| 8462 | #if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 8463 | + if (*ecp) { | ||
| 8464 | + struct passwd *info; | ||
| 8465 | + | ||
| 8466 | info = getpwnam(optarg); | ||
| 8467 | - if (info) { | ||
| 8468 | - uid = info->pw_uid; | ||
| 8469 | - } else { | ||
| 8470 | -#endif | ||
| 8471 | - fprintf(stderr, "Bad user id: %s\n", optarg); | ||
| 8472 | - exit(1); | ||
| 8473 | -#if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 8474 | - } | ||
| 8475 | + uid = info ? info->pw_uid : -1; | ||
| 8476 | + endpwent(); | ||
| 8477 | + } | ||
| 8478 | #endif | ||
| 8479 | + if (uid < 0) { | ||
| 8480 | + fprintf(stderr, "Bad user id: %s\n", optarg); | ||
| 8481 | + exit(1); | ||
| 8482 | } | ||
| 8483 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8484 | NETSNMP_DS_AGENT_USERID, uid); | ||
| 8485 | @@ -1009,7 +1001,11 @@ main(int argc, char *argv[]) | ||
| 8486 | } | ||
| 8487 | #endif | ||
| 8488 | |||
| 8489 | -#if HAVE_UNISTD_H | ||
| 8490 | +#if defined(HAVE_UNISTD_H) && (defined(HAVE_CHOWN) || defined(HAVE_SETGID) || defined(HAVE_SETUID)) | ||
| 8491 | + { | ||
| 8492 | + const char *persistent_dir; | ||
| 8493 | + int uid, gid; | ||
| 8494 | + | ||
| 8495 | persistent_dir = get_persistent_directory(); | ||
| 8496 | mkdirhier( persistent_dir, NETSNMP_AGENT_DIRECTORY_MODE, 0 ); | ||
| 8497 | |||
| 8498 | @@ -1025,7 +1021,7 @@ main(int argc, char *argv[]) | ||
| 8499 | |||
| 8500 | #ifdef HAVE_SETGID | ||
| 8501 | if ((gid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8502 | - NETSNMP_DS_AGENT_GROUPID)) != 0) { | ||
| 8503 | + NETSNMP_DS_AGENT_GROUPID)) > 0) { | ||
| 8504 | DEBUGMSGTL(("snmpd/main", "Changing gid to %d.\n", gid)); | ||
| 8505 | if (setgid(gid) == -1 | ||
| 8506 | #ifdef HAVE_SETGROUPS | ||
| 8507 | @@ -1042,8 +1038,10 @@ main(int argc, char *argv[]) | ||
| 8508 | #endif | ||
| 8509 | #ifdef HAVE_SETUID | ||
| 8510 | if ((uid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8511 | - NETSNMP_DS_AGENT_USERID)) != 0) { | ||
| 8512 | + NETSNMP_DS_AGENT_USERID)) > 0) { | ||
| 8513 | #if HAVE_GETPWNAM && HAVE_PWD_H && HAVE_INITGROUPS | ||
| 8514 | + struct passwd *info; | ||
| 8515 | + | ||
| 8516 | /* | ||
| 8517 | * Set supplementary groups before changing UID | ||
| 8518 | * (which probably involves giving up privileges) | ||
| 8519 | @@ -1059,6 +1057,7 @@ main(int argc, char *argv[]) | ||
| 8520 | } | ||
| 8521 | } | ||
| 8522 | } | ||
| 8523 | + endpwent(); | ||
| 8524 | #endif | ||
| 8525 | DEBUGMSGTL(("snmpd/main", "Changing uid to %d.\n", uid)); | ||
| 8526 | if (setuid(uid) == -1) { | ||
| 8527 | @@ -1070,6 +1069,7 @@ main(int argc, char *argv[]) | ||
| 8528 | } | ||
| 8529 | } | ||
| 8530 | #endif | ||
| 8531 | + } | ||
| 8532 | #endif | ||
| 8533 | |||
| 8534 | /* | ||
| 8535 | @@ -1273,7 +1273,7 @@ receive(void) | ||
| 8536 | DEBUGMSGTL(("snmpd/select", "select( numfds=%d, ..., tvp=%p)\n", | ||
| 8537 | numfds, tvp)); | ||
| 8538 | if(tvp) | ||
| 8539 | - DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, tvp->tv_usec)); | ||
| 8540 | + DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, (long)tvp->tv_usec)); | ||
| 8541 | count = netsnmp_large_fd_set_select(numfds, &readfds, &writefds, &exceptfds, | ||
| 8542 | tvp); | ||
| 8543 | DEBUGMSGTL(("snmpd/select", "returned, count = %d\n", count)); | ||
| 8544 | diff --git a/apps/Makefile.in b/apps/Makefile.in | ||
| 8545 | index 43cb007..77404dd 100644 | ||
| 8546 | --- a/apps/Makefile.in | ||
| 8547 | +++ b/apps/Makefile.in | ||
| 8548 | @@ -84,9 +84,6 @@ USEAGENTLIBS = $(MIBLIB) $(AGENTLIB) $(USELIBS) | ||
| 8549 | MYSQL_LIBS = @MYSQL_LIBS@ | ||
| 8550 | MYSQL_INCLUDES = @MYSQL_INCLUDES@ | ||
| 8551 | |||
| 8552 | -# | ||
| 8553 | -# link path in src dir | ||
| 8554 | -LOCAL_LIBS = -L../snmplib/.libs -L../snmplib -L../agent/.libs -L../agent | ||
| 8555 | VAL_LIBS = @VAL_LIBS@ | ||
| 8556 | LIBS = $(USELIBS) $(VAL_LIBS) @LIBS@ | ||
| 8557 | PERLLDOPTS_FOR_APPS = @PERLLDOPTS_FOR_APPS@ | ||
| 8558 | @@ -146,65 +143,65 @@ OTHERUNINSTALL=snmpinformuninstall snmptrapdperluninstall | ||
| 8559 | # build rules | ||
| 8560 | # | ||
| 8561 | snmpwalk$(EXEEXT): snmpwalk.$(OSUFFIX) $(USELIBS) | ||
| 8562 | - $(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8563 | + $(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8564 | |||
| 8565 | snmpbulkwalk$(EXEEXT): snmpbulkwalk.$(OSUFFIX) $(USELIBS) | ||
| 8566 | - $(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8567 | + $(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8568 | |||
| 8569 | snmpbulkget$(EXEEXT): snmpbulkget.$(OSUFFIX) $(USELIBS) | ||
| 8570 | - $(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8571 | + $(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8572 | |||
| 8573 | snmptranslate$(EXEEXT): snmptranslate.$(OSUFFIX) $(USELIBS) | ||
| 8574 | - $(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8575 | + $(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8576 | |||
| 8577 | snmpstatus$(EXEEXT): snmpstatus.$(OSUFFIX) $(USELIBS) | ||
| 8578 | - $(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8579 | + $(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8580 | |||
| 8581 | snmpget$(EXEEXT): snmpget.$(OSUFFIX) $(USELIBS) | ||
| 8582 | - $(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8583 | + $(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8584 | |||
| 8585 | snmpdelta$(EXEEXT): snmpdelta.$(OSUFFIX) $(USELIBS) | ||
| 8586 | - $(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8587 | + $(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8588 | |||
| 8589 | snmptable$(EXEEXT): snmptable.$(OSUFFIX) $(USELIBS) | ||
| 8590 | - $(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8591 | + $(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8592 | |||
| 8593 | snmptest$(EXEEXT): snmptest.$(OSUFFIX) $(USELIBS) | ||
| 8594 | - $(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8595 | + $(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8596 | |||
| 8597 | snmptrapd$(EXEEXT): $(TRAPD_OBJECTS) $(USETRAPLIBS) $(INSTALLLIBS) | ||
| 8598 | - $(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) $(LOCAL_LIBS) ${LDFLAGS} ${TRAPLIBS} | ||
| 8599 | + $(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) ${LDFLAGS} ${TRAPLIBS} | ||
| 8600 | |||
| 8601 | snmptrap$(EXEEXT): snmptrap.$(OSUFFIX) $(USELIBS) | ||
| 8602 | - $(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8603 | + $(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8604 | |||
| 8605 | snmpinform$(EXEEXT): snmptrap$(EXEEXT) | ||
| 8606 | rm -f snmpinform | ||
| 8607 | $(LN_S) snmptrap$(EXEEXT) snmpinform$(EXEEXT) | ||
| 8608 | |||
| 8609 | snmpset$(EXEEXT): snmpset.$(OSUFFIX) $(USELIBS) | ||
| 8610 | - $(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8611 | + $(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8612 | |||
| 8613 | snmpusm$(EXEEXT): snmpusm.$(OSUFFIX) $(USELIBS) | ||
| 8614 | - $(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8615 | + $(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8616 | |||
| 8617 | snmpvacm$(EXEEXT): snmpvacm.$(OSUFFIX) $(USELIBS) | ||
| 8618 | - $(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8619 | + $(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8620 | |||
| 8621 | snmptls$(EXEEXT): snmptls.$(OSUFFIX) $(USELIBS) | ||
| 8622 | - $(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8623 | + $(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8624 | |||
| 8625 | agentxtrap$(EXEEXT): agentxtrap.$(OSUFFIX) $(USEAGENTLIBS) | ||
| 8626 | - $(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS} | ||
| 8627 | + $(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS} | ||
| 8628 | |||
| 8629 | snmpgetnext$(EXEEXT): snmpgetnext.$(OSUFFIX) $(USELIBS) | ||
| 8630 | - $(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8631 | + $(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8632 | |||
| 8633 | encode_keychange$(EXEEXT): encode_keychange.$(OSUFFIX) $(USELIBS) | ||
| 8634 | - $(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8635 | + $(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8636 | |||
| 8637 | snmpdf$(EXEEXT): snmpdf.$(OSUFFIX) $(USELIBS) | ||
| 8638 | - $(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} | ||
| 8639 | + $(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) ${LDFLAGS} ${LIBS} | ||
| 8640 | |||
| 8641 | libnetsnmptrapd.$(LIB_EXTENSION)$(LIB_VERSION): $(LLIBTRAPD_OBJS) | ||
| 8642 | $(LIB_LD_CMD) $@ ${LLIBTRAPD_OBJS} $(MIBLIB) $(USELIBS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) | ||
| 8643 | diff --git a/apps/encode_keychange.c b/apps/encode_keychange.c | ||
| 8644 | index bae2139..5bf8e4c 100644 | ||
| 8645 | --- a/apps/encode_keychange.c | ||
| 8646 | +++ b/apps/encode_keychange.c | ||
| 8647 | @@ -108,7 +108,7 @@ int _getch(void); | ||
| 8648 | int | ||
| 8649 | main(int argc, char **argv) | ||
| 8650 | { | ||
| 8651 | - int rval = SNMPERR_SUCCESS; | ||
| 8652 | + int rval = 1; | ||
| 8653 | size_t oldKu_len = SNMP_MAXBUF_SMALL, | ||
| 8654 | newKu_len = SNMP_MAXBUF_SMALL, | ||
| 8655 | oldkul_len = SNMP_MAXBUF_SMALL, | ||
| 8656 | @@ -170,6 +170,7 @@ main(int argc, char **argv) | ||
| 8657 | break; | ||
| 8658 | case 'h': | ||
| 8659 | rval = 0; | ||
| 8660 | + /* fallthrough */ | ||
| 8661 | default: | ||
| 8662 | usage_to_file(stdout); | ||
| 8663 | exit(rval); | ||
| 8664 | @@ -201,7 +202,7 @@ main(int argc, char **argv) | ||
| 8665 | "Unrecognized hash transform: \"%s\".\n", | ||
| 8666 | transform_type_input); | ||
| 8667 | usage_synopsis(stderr); | ||
| 8668 | - QUITFUN(rval = SNMPERR_GENERR, main_quit); | ||
| 8669 | + QUITFUN(SNMPERR_GENERR, main_quit); | ||
| 8670 | } | ||
| 8671 | |||
| 8672 | if (verbose) { | ||
| 8673 | @@ -254,12 +255,12 @@ main(int argc, char **argv) | ||
| 8674 | if (strlen(oldpass) < USM_LENGTH_P_MIN) { | ||
| 8675 | fprintf(stderr, "Old passphrase must be greater than %d " | ||
| 8676 | "characters in length.\n", USM_LENGTH_P_MIN); | ||
| 8677 | - QUITFUN(rval = SNMPERR_GENERR, main_quit); | ||
| 8678 | + QUITFUN(SNMPERR_GENERR, main_quit); | ||
| 8679 | |||
| 8680 | } else if (strlen(newpass) < USM_LENGTH_P_MIN) { | ||
| 8681 | fprintf(stderr, "New passphrase must be greater than %d " | ||
| 8682 | "characters in length.\n", USM_LENGTH_P_MIN); | ||
| 8683 | - QUITFUN(rval = SNMPERR_GENERR, main_quit); | ||
| 8684 | + QUITFUN(SNMPERR_GENERR, main_quit); | ||
| 8685 | } | ||
| 8686 | |||
| 8687 | if (verbose) { | ||
| 8688 | @@ -503,13 +504,13 @@ get_user_passphrases(void) | ||
| 8689 | */ | ||
| 8690 | if (stat(path, &statbuf) < 0) { | ||
| 8691 | fprintf(stderr, "Cannot access directory \"%s\".\n", path); | ||
| 8692 | - QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8693 | + QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8694 | #ifndef WIN32 | ||
| 8695 | } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) { | ||
| 8696 | fprintf(stderr, | ||
| 8697 | "Directory \"%s\" is accessible by group or world.\n", | ||
| 8698 | path); | ||
| 8699 | - QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8700 | + QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8701 | #endif /* !WIN32 */ | ||
| 8702 | } | ||
| 8703 | |||
| 8704 | @@ -520,12 +521,12 @@ get_user_passphrases(void) | ||
| 8705 | path[ sizeof(path)-1 ] = 0; | ||
| 8706 | if (stat(path, &statbuf) < 0) { | ||
| 8707 | fprintf(stderr, "Cannot access file \"%s\".\n", path); | ||
| 8708 | - QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8709 | + QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8710 | #ifndef WIN32 | ||
| 8711 | } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) { | ||
| 8712 | fprintf(stderr, | ||
| 8713 | "File \"%s\" is accessible by group or world.\n", path); | ||
| 8714 | - QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8715 | + QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8716 | #endif /* !WIN32 */ | ||
| 8717 | } | ||
| 8718 | |||
| 8719 | @@ -534,7 +535,7 @@ get_user_passphrases(void) | ||
| 8720 | */ | ||
| 8721 | if ((fp = fopen(path, "r")) == NULL) { | ||
| 8722 | fprintf(stderr, "Cannot open \"%s\".", path); | ||
| 8723 | - QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8724 | + QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit); | ||
| 8725 | } | ||
| 8726 | |||
| 8727 | /* | ||
| 8728 | diff --git a/apps/snmpbulkwalk.c b/apps/snmpbulkwalk.c | ||
| 8729 | index 62874fa..379d2ae 100644 | ||
| 8730 | --- a/apps/snmpbulkwalk.c | ||
| 8731 | +++ b/apps/snmpbulkwalk.c | ||
| 8732 | @@ -184,7 +184,7 @@ main(int argc, char *argv[]) | ||
| 8733 | size_t rootlen; | ||
| 8734 | int count; | ||
| 8735 | int running; | ||
| 8736 | - int status; | ||
| 8737 | + int status = STAT_ERROR; | ||
| 8738 | int check; | ||
| 8739 | int exitval = 0; | ||
| 8740 | |||
| 8741 | diff --git a/apps/snmpdelta.c b/apps/snmpdelta.c | ||
| 8742 | index e334698..08e2ebc 100644 | ||
| 8743 | --- a/apps/snmpdelta.c | ||
| 8744 | +++ b/apps/snmpdelta.c | ||
| 8745 | @@ -471,7 +471,7 @@ main(int argc, char *argv[]) | ||
| 8746 | printf("\t%s", vip->descriptor); | ||
| 8747 | } else { | ||
| 8748 | vip->oidlen = 0; | ||
| 8749 | - strcpy(vip->descriptor, SumFile); | ||
| 8750 | + strlcpy(vip->descriptor, SumFile, sizeof(vip->descriptor)); | ||
| 8751 | } | ||
| 8752 | vip->value = 0; | ||
| 8753 | zeroU64(&vip->c64value); | ||
| 8754 | diff --git a/apps/snmpnetstat/inet.c b/apps/snmpnetstat/inet.c | ||
| 8755 | index 00b14e0..0ae810d 100644 | ||
| 8756 | --- a/apps/snmpnetstat/inet.c | ||
| 8757 | +++ b/apps/snmpnetstat/inet.c | ||
| 8758 | @@ -249,7 +249,7 @@ tcpprotopr_bulkget(const char *name, oid *root, size_t root_len) | ||
| 8759 | /* | ||
| 8760 | * setup initial object name | ||
| 8761 | */ | ||
| 8762 | - memmove(tcpConnState_oid, root, sizeof(root) * root_len); | ||
| 8763 | + memmove(tcpConnState_oid, root, sizeof(oid) * root_len); | ||
| 8764 | tcpConnState_len = root_len; | ||
| 8765 | |||
| 8766 | /* | ||
| 8767 | diff --git a/apps/snmpnetstat/inet6.c b/apps/snmpnetstat/inet6.c | ||
| 8768 | index bad4db9..d4ad391 100644 | ||
| 8769 | --- a/apps/snmpnetstat/inet6.c | ||
| 8770 | +++ b/apps/snmpnetstat/inet6.c | ||
| 8771 | @@ -128,7 +128,7 @@ tcp6protopr(const char *name) | ||
| 8772 | return; | ||
| 8773 | |||
| 8774 | for (vp = var; vp ; vp=vp->next_variable) { | ||
| 8775 | - state = *var->val.integer; | ||
| 8776 | + state = *vp->val.integer; | ||
| 8777 | if (!aflag && state == MIB_TCPCONNSTATE_LISTEN) | ||
| 8778 | continue; | ||
| 8779 | |||
| 8780 | @@ -144,12 +144,12 @@ tcp6protopr(const char *name) | ||
| 8781 | |||
| 8782 | /* Extract the local/remote information from the index values */ | ||
| 8783 | for (i=0; i<16; i++) | ||
| 8784 | - localAddr[i] = var->name[ 10+i ]; | ||
| 8785 | - localPort = var->name[ 26 ]; | ||
| 8786 | + localAddr[i] = vp->name[ 10+i ]; | ||
| 8787 | + localPort = vp->name[ 26 ]; | ||
| 8788 | for (i=0; i<16; i++) | ||
| 8789 | - remoteAddr[i] = var->name[ 27+i ]; | ||
| 8790 | - remotePort = var->name[ 43 ]; | ||
| 8791 | - ifIndex = var->name[ 44 ]; | ||
| 8792 | + remoteAddr[i] = vp->name[ 27+i ]; | ||
| 8793 | + remotePort = vp->name[ 43 ]; | ||
| 8794 | + ifIndex = vp->name[ 44 ]; | ||
| 8795 | |||
| 8796 | printf("%-5.5s", name); | ||
| 8797 | inet6print(localAddr, localPort, name, 1); | ||
| 8798 | @@ -196,9 +196,9 @@ udp6protopr(const char *name) | ||
| 8799 | * the IP address from the varbind value, (which is why | ||
| 8800 | * we walked udpLocalAddress rather than udpLocalPort) | ||
| 8801 | */ | ||
| 8802 | - localPort = var->name[ var->name_length-2 ]; | ||
| 8803 | - ifIndex = var->name[ var->name_length-1 ]; | ||
| 8804 | - inet6print(var->val.string, localPort, name, 1); | ||
| 8805 | + localPort = vp->name[ vp->name_length-2 ]; | ||
| 8806 | + ifIndex = vp->name[ vp->name_length-1 ]; | ||
| 8807 | + inet6print(vp->val.string, localPort, name, 1); | ||
| 8808 | printf(" %4d\n", ifIndex ); | ||
| 8809 | } | ||
| 8810 | snmp_free_varbind( var ); | ||
| 8811 | @@ -223,20 +223,21 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len, | ||
| 8812 | { | ||
| 8813 | netsnmp_variable_list *var, *vp; | ||
| 8814 | struct stat_table *sp; | ||
| 8815 | - oid *stats, stat; | ||
| 8816 | + long *stats; | ||
| 8817 | + oid stat; | ||
| 8818 | unsigned int max_stat = 0; | ||
| 8819 | int active = 0; | ||
| 8820 | |||
| 8821 | var = NULL; | ||
| 8822 | for (sp=stable; sp->entry; sp++) { | ||
| 8823 | oid_buf[buf_len-1] = sp->entry; | ||
| 8824 | - if (sp->entry>max_stat) | ||
| 8825 | + if (sp->entry > max_stat) | ||
| 8826 | max_stat = sp->entry; | ||
| 8827 | snmp_varlist_add_variable( &var, oid_buf, buf_len, | ||
| 8828 | ASN_NULL, NULL, 0); | ||
| 8829 | } | ||
| 8830 | oid_buf[buf_len-1] = stable[0].entry; | ||
| 8831 | - stats = (oid *)calloc(max_stat+1, sizeof(oid)); | ||
| 8832 | + stats = (long *)calloc(max_stat+1, sizeof(long)); | ||
| 8833 | |||
| 8834 | /* | ||
| 8835 | * Walk the specified column(s), and total the individual statistics | ||
| 8836 | @@ -244,12 +245,12 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len, | ||
| 8837 | while (1) { | ||
| 8838 | if (netsnmp_query_getnext( var, ss ) != SNMP_ERR_NOERROR) | ||
| 8839 | break; | ||
| 8840 | - if ( snmp_oid_compare( oid_buf, buf_len-1, | ||
| 8841 | - var->name, buf_len-1) != 0 ) | ||
| 8842 | + if ( snmp_oid_compare( oid_buf, buf_len, | ||
| 8843 | + var->name, buf_len) != 0 ) | ||
| 8844 | break; /* End of Table */ | ||
| 8845 | |||
| 8846 | for ( vp=var; vp; vp=vp->next_variable ) { | ||
| 8847 | - stat = var->name[ buf_len-1 ]; | ||
| 8848 | + stat = vp->name[ buf_len-1 ]; | ||
| 8849 | stats[stat] += *vp->val.integer; | ||
| 8850 | } | ||
| 8851 | active=1; | ||
| 8852 | diff --git a/apps/snmpset.c b/apps/snmpset.c | ||
| 8853 | index aaacf8c..1b29a6c 100644 | ||
| 8854 | --- a/apps/snmpset.c | ||
| 8855 | +++ b/apps/snmpset.c | ||
| 8856 | @@ -171,6 +171,7 @@ main(int argc, char *argv[]) | ||
| 8857 | case '=': | ||
| 8858 | case 'i': | ||
| 8859 | case 'u': | ||
| 8860 | + case '3': | ||
| 8861 | case 't': | ||
| 8862 | case 'a': | ||
| 8863 | case 'o': | ||
| 8864 | diff --git a/apps/snmptls.c b/apps/snmptls.c | ||
| 8865 | index 7dffcd9..93b648b 100644 | ||
| 8866 | --- a/apps/snmptls.c | ||
| 8867 | +++ b/apps/snmptls.c | ||
| 8868 | @@ -332,7 +332,7 @@ optProc(int argc, char *const *argv, int opt) | ||
| 8869 | |||
| 8870 | case 's': | ||
| 8871 | if (optind < argc) { | ||
| 8872 | - if (isdigit(argv[optind][0])) | ||
| 8873 | + if (isdigit(0xFF & argv[optind][0])) | ||
| 8874 | _storage_type = atoi(argv[optind++]); | ||
| 8875 | else | ||
| 8876 | _storage_type_str = argv[optind++]; | ||
| 8877 | @@ -345,7 +345,7 @@ optProc(int argc, char *const *argv, int opt) | ||
| 8878 | |||
| 8879 | case 'h': | ||
| 8880 | if (optind < argc) { | ||
| 8881 | - if (isdigit(argv[optind][0])) | ||
| 8882 | + if (isdigit(0xFF & argv[optind][0])) | ||
| 8883 | _hash_type = atoi(argv[optind++]); | ||
| 8884 | } | ||
| 8885 | else { | ||
| 8886 | diff --git a/apps/snmptrapd.c b/apps/snmptrapd.c | ||
| 8887 | index 7742eff..1a52080 100644 | ||
| 8888 | --- a/apps/snmptrapd.c | ||
| 8889 | +++ b/apps/snmptrapd.c | ||
| 8890 | @@ -217,8 +217,6 @@ LPCTSTR app_name_long = _T("Net-SNMP Trap Handler"); /* Application | ||
| 8891 | |||
| 8892 | const char *app_name = "snmptrapd"; | ||
| 8893 | |||
| 8894 | -struct timeval Now; | ||
| 8895 | - | ||
| 8896 | void trapd_update_config(void); | ||
| 8897 | |||
| 8898 | #ifdef WIN32SERVICE | ||
| 8899 | @@ -360,8 +358,8 @@ pre_parse(netsnmp_session * session, netsnmp_transport *transport, | ||
| 8900 | if ( tcpudpaddr != 0 ) { | ||
| 8901 | char sbuf[64]; | ||
| 8902 | char *xp; | ||
| 8903 | - strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf)); | ||
| 8904 | - sbuf[sizeof(sbuf)-1] = '\0'; | ||
| 8905 | + | ||
| 8906 | + strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf)); | ||
| 8907 | xp = strstr(sbuf, "]"); | ||
| 8908 | if (xp) | ||
| 8909 | *xp = '\0'; | ||
| 8910 | @@ -423,15 +421,20 @@ void | ||
| 8911 | parse_trapd_address(const char *token, char *cptr) | ||
| 8912 | { | ||
| 8913 | char buf[BUFSIZ]; | ||
| 8914 | + char *p; | ||
| 8915 | cptr = copy_nword(cptr, buf, sizeof(buf)); | ||
| 8916 | |||
| 8917 | if (default_port == ddefault_port) { | ||
| 8918 | default_port = strdup(buf); | ||
| 8919 | } else { | ||
| 8920 | - strcat( buf, "," ); | ||
| 8921 | - strcat( buf, default_port ); | ||
| 8922 | + p = malloc(strlen(buf) + 1 + strlen(default_port) + 1); | ||
| 8923 | + if (p) { | ||
| 8924 | + strcat(p, buf); | ||
| 8925 | + strcat(p, ","); | ||
| 8926 | + strcat(p, default_port ); | ||
| 8927 | + } | ||
| 8928 | free(default_port); | ||
| 8929 | - default_port = strdup(buf); | ||
| 8930 | + default_port = p; | ||
| 8931 | } | ||
| 8932 | } | ||
| 8933 | |||
| 8934 | @@ -469,13 +472,10 @@ parse_config_pidFile(const char *token, char *cptr) | ||
| 8935 | void | ||
| 8936 | parse_config_agentuser(const char *token, char *cptr) | ||
| 8937 | { | ||
| 8938 | -#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H) | ||
| 8939 | - struct passwd *info; | ||
| 8940 | -#endif | ||
| 8941 | - | ||
| 8942 | if (cptr[0] == '#') { | ||
| 8943 | char *ecp; | ||
| 8944 | int uid; | ||
| 8945 | + | ||
| 8946 | uid = strtoul(cptr + 1, &ecp, 10); | ||
| 8947 | if (*ecp != 0) { | ||
| 8948 | config_perror("Bad number"); | ||
| 8949 | @@ -483,44 +483,47 @@ parse_config_agentuser(const char *token, char *cptr) | ||
| 8950 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8951 | NETSNMP_DS_AGENT_USERID, uid); | ||
| 8952 | } | ||
| 8953 | - } | ||
| 8954 | #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H) | ||
| 8955 | - else if ((info = getpwnam(cptr)) != NULL) { | ||
| 8956 | - netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8957 | - NETSNMP_DS_AGENT_USERID, info->pw_uid); | ||
| 8958 | } else { | ||
| 8959 | - config_perror("User not found in passwd database"); | ||
| 8960 | - } | ||
| 8961 | - endpwent(); | ||
| 8962 | + struct passwd *info; | ||
| 8963 | + | ||
| 8964 | + info = getpwnam(cptr); | ||
| 8965 | + if (info) | ||
| 8966 | + netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8967 | + NETSNMP_DS_AGENT_USERID, info->pw_uid); | ||
| 8968 | + else | ||
| 8969 | + config_perror("User not found in passwd database"); | ||
| 8970 | + endpwent(); | ||
| 8971 | #endif | ||
| 8972 | + } | ||
| 8973 | } | ||
| 8974 | |||
| 8975 | void | ||
| 8976 | parse_config_agentgroup(const char *token, char *cptr) | ||
| 8977 | { | ||
| 8978 | -#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H) | ||
| 8979 | - struct group *info; | ||
| 8980 | -#endif | ||
| 8981 | - | ||
| 8982 | if (cptr[0] == '#') { | ||
| 8983 | char *ecp; | ||
| 8984 | int gid = strtoul(cptr + 1, &ecp, 10); | ||
| 8985 | + | ||
| 8986 | if (*ecp != 0) { | ||
| 8987 | config_perror("Bad number"); | ||
| 8988 | } else { | ||
| 8989 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8990 | NETSNMP_DS_AGENT_GROUPID, gid); | ||
| 8991 | } | ||
| 8992 | - } | ||
| 8993 | #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H) | ||
| 8994 | - else if ((info = getgrnam(cptr)) != NULL) { | ||
| 8995 | - netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 8996 | - NETSNMP_DS_AGENT_GROUPID, info->gr_gid); | ||
| 8997 | } else { | ||
| 8998 | - config_perror("Group not found in group database"); | ||
| 8999 | - } | ||
| 9000 | - endpwent(); | ||
| 9001 | + struct group *info; | ||
| 9002 | + | ||
| 9003 | + info = getgrnam(cptr); | ||
| 9004 | + if (info) | ||
| 9005 | + netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 9006 | + NETSNMP_DS_AGENT_GROUPID, info->gr_gid); | ||
| 9007 | + else | ||
| 9008 | + config_perror("Group not found in group database"); | ||
| 9009 | + endgrent(); | ||
| 9010 | #endif | ||
| 9011 | + } | ||
| 9012 | } | ||
| 9013 | #endif | ||
| 9014 | |||
| 9015 | @@ -550,6 +553,74 @@ parse_config_outputOption(const char *token, char *cptr) | ||
| 9016 | } | ||
| 9017 | } | ||
| 9018 | |||
| 9019 | +static void | ||
| 9020 | +snmptrapd_main_loop(void) | ||
| 9021 | +{ | ||
| 9022 | + int count, numfds, block; | ||
| 9023 | + fd_set readfds,writefds,exceptfds; | ||
| 9024 | + struct timeval timeout, *tvp; | ||
| 9025 | + | ||
| 9026 | + while (netsnmp_running) { | ||
| 9027 | + if (reconfig) { | ||
| 9028 | + /* | ||
| 9029 | + * If we are logging to a file, receipt of SIGHUP also | ||
| 9030 | + * indicates that the log file should be closed and | ||
| 9031 | + * re-opened. This is useful for users that want to | ||
| 9032 | + * rotate logs in a more predictable manner. | ||
| 9033 | + */ | ||
| 9034 | + netsnmp_logging_restart(); | ||
| 9035 | + snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n", | ||
| 9036 | + netsnmp_get_version()); | ||
| 9037 | + trapd_update_config(); | ||
| 9038 | + if (trap1_fmt_str_remember) { | ||
| 9039 | + parse_format( NULL, trap1_fmt_str_remember ); | ||
| 9040 | + } | ||
| 9041 | + reconfig = 0; | ||
| 9042 | + } | ||
| 9043 | + numfds = 0; | ||
| 9044 | + FD_ZERO(&readfds); | ||
| 9045 | + FD_ZERO(&writefds); | ||
| 9046 | + FD_ZERO(&exceptfds); | ||
| 9047 | + block = 0; | ||
| 9048 | + tvp = &timeout; | ||
| 9049 | + timerclear(tvp); | ||
| 9050 | + tvp->tv_sec = 5; | ||
| 9051 | + snmp_select_info(&numfds, &readfds, tvp, &block); | ||
| 9052 | + if (block == 1) | ||
| 9053 | + tvp = NULL; /* block without timeout */ | ||
| 9054 | +#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER | ||
| 9055 | + netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds); | ||
| 9056 | +#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */ | ||
| 9057 | + count = select(numfds, &readfds, &writefds, &exceptfds, tvp); | ||
| 9058 | + if (count > 0) { | ||
| 9059 | +#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER | ||
| 9060 | + netsnmp_dispatch_external_events(&count, &readfds, &writefds, | ||
| 9061 | + &exceptfds); | ||
| 9062 | +#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */ | ||
| 9063 | + /* If there are any more events after external events, then | ||
| 9064 | + * try SNMP events. */ | ||
| 9065 | + if (count > 0) { | ||
| 9066 | + snmp_read(&readfds); | ||
| 9067 | + } | ||
| 9068 | + } else { | ||
| 9069 | + switch (count) { | ||
| 9070 | + case 0: | ||
| 9071 | + snmp_timeout(); | ||
| 9072 | + break; | ||
| 9073 | + case -1: | ||
| 9074 | + if (errno == EINTR) | ||
| 9075 | + continue; | ||
| 9076 | + snmp_log_perror("select"); | ||
| 9077 | + netsnmp_running = 0; | ||
| 9078 | + break; | ||
| 9079 | + default: | ||
| 9080 | + fprintf(stderr, "select returned %d\n", count); | ||
| 9081 | + netsnmp_running = 0; | ||
| 9082 | + } | ||
| 9083 | + } | ||
| 9084 | + run_alarms(); | ||
| 9085 | + } | ||
| 9086 | +} | ||
| 9087 | |||
| 9088 | /*******************************************************************-o-****** | ||
| 9089 | * main - Non Windows | ||
| 9090 | @@ -579,9 +650,6 @@ main(int argc, char *argv[]) | ||
| 9091 | netsnmp_transport *transport = NULL; | ||
| 9092 | int arg, i = 0; | ||
| 9093 | int uid = 0, gid = 0; | ||
| 9094 | - int count, numfds, block; | ||
| 9095 | - fd_set readfds,writefds,exceptfds; | ||
| 9096 | - struct timeval timeout, *tvp; | ||
| 9097 | char *cp, *listen_ports = NULL; | ||
| 9098 | #if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX) | ||
| 9099 | int agentx_subagent = 1; | ||
| 9100 | @@ -732,7 +800,7 @@ main(int argc, char *argv[]) | ||
| 9101 | *cp = ' '; | ||
| 9102 | } else { | ||
| 9103 | /* Old style: implicitly "print=format" */ | ||
| 9104 | - trap1_fmt_str_remember = (char *)malloc(strlen(optarg) + 7); | ||
| 9105 | + trap1_fmt_str_remember = malloc(strlen(optarg) + 7); | ||
| 9106 | sprintf( trap1_fmt_str_remember, "print %s", optarg ); | ||
| 9107 | } | ||
| 9108 | } else { | ||
| 9109 | @@ -863,19 +931,18 @@ main(int argc, char *argv[]) | ||
| 9110 | char *ecp; | ||
| 9111 | |||
| 9112 | uid = strtoul(optarg, &ecp, 10); | ||
| 9113 | - if (*ecp) { | ||
| 9114 | #if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 9115 | + if (*ecp) { | ||
| 9116 | struct passwd *info; | ||
| 9117 | + | ||
| 9118 | info = getpwnam(optarg); | ||
| 9119 | - if (info) { | ||
| 9120 | - uid = info->pw_uid; | ||
| 9121 | - } else { | ||
| 9122 | -#endif | ||
| 9123 | - fprintf(stderr, "Bad user id: %s\n", optarg); | ||
| 9124 | - exit(1); | ||
| 9125 | -#if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 9126 | - } | ||
| 9127 | + uid = info ? info->pw_uid : -1; | ||
| 9128 | + endpwent(); | ||
| 9129 | + } | ||
| 9130 | #endif | ||
| 9131 | + if (uid < 0) { | ||
| 9132 | + fprintf(stderr, "Bad user id: %s\n", optarg); | ||
| 9133 | + exit(1); | ||
| 9134 | } | ||
| 9135 | netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, | ||
| 9136 | NETSNMP_DS_AGENT_USERID, uid); | ||
| 9137 | @@ -916,7 +983,7 @@ main(int argc, char *argv[]) | ||
| 9138 | for (i = optind; i < argc; i++) { | ||
| 9139 | char *astring; | ||
| 9140 | if (listen_ports != NULL) { | ||
| 9141 | - astring = (char *)malloc(strlen(listen_ports) + 2 + strlen(argv[i])); | ||
| 9142 | + astring = malloc(strlen(listen_ports) + 2 + strlen(argv[i])); | ||
| 9143 | if (astring == NULL) { | ||
| 9144 | fprintf(stderr, "malloc failure processing argv[%d]\n", i); | ||
| 9145 | exit(1); | ||
| 9146 | @@ -1247,66 +1314,8 @@ main(int argc, char *argv[]) | ||
| 9147 | #ifdef WIN32SERVICE | ||
| 9148 | trapd_status = SNMPTRAPD_RUNNING; | ||
| 9149 | #endif | ||
| 9150 | - while (netsnmp_running) { | ||
| 9151 | - if (reconfig) { | ||
| 9152 | - /* | ||
| 9153 | - * If we are logging to a file, receipt of SIGHUP also | ||
| 9154 | - * indicates the the log file should be closed and | ||
| 9155 | - * re-opened. This is useful for users that want to | ||
| 9156 | - * rotate logs in a more predictable manner. | ||
| 9157 | - */ | ||
| 9158 | - netsnmp_logging_restart(); | ||
| 9159 | - snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n", | ||
| 9160 | - netsnmp_get_version()); | ||
| 9161 | - trapd_update_config(); | ||
| 9162 | - if (trap1_fmt_str_remember) { | ||
| 9163 | - parse_format( NULL, trap1_fmt_str_remember ); | ||
| 9164 | - } | ||
| 9165 | - reconfig = 0; | ||
| 9166 | - } | ||
| 9167 | - numfds = 0; | ||
| 9168 | - FD_ZERO(&readfds); | ||
| 9169 | - FD_ZERO(&writefds); | ||
| 9170 | - FD_ZERO(&exceptfds); | ||
| 9171 | - block = 0; | ||
| 9172 | - tvp = &timeout; | ||
| 9173 | - timerclear(tvp); | ||
| 9174 | - tvp->tv_sec = 5; | ||
| 9175 | - snmp_select_info(&numfds, &readfds, tvp, &block); | ||
| 9176 | - if (block == 1) | ||
| 9177 | - tvp = NULL; /* block without timeout */ | ||
| 9178 | -#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER | ||
| 9179 | - netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds); | ||
| 9180 | -#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */ | ||
| 9181 | - count = select(numfds, &readfds, &writefds, &exceptfds, tvp); | ||
| 9182 | - gettimeofday(&Now, NULL); | ||
| 9183 | - if (count > 0) { | ||
| 9184 | -#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER | ||
| 9185 | - netsnmp_dispatch_external_events(&count, &readfds, &writefds, | ||
| 9186 | - &exceptfds); | ||
| 9187 | -#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */ | ||
| 9188 | - /* If there are any more events after external events, then | ||
| 9189 | - * try SNMP events. */ | ||
| 9190 | - if (count > 0) { | ||
| 9191 | - snmp_read(&readfds); | ||
| 9192 | - } | ||
| 9193 | - } else | ||
| 9194 | - switch (count) { | ||
| 9195 | - case 0: | ||
| 9196 | - snmp_timeout(); | ||
| 9197 | - break; | ||
| 9198 | - case -1: | ||
| 9199 | - if (errno == EINTR) | ||
| 9200 | - continue; | ||
| 9201 | - snmp_log_perror("select"); | ||
| 9202 | - netsnmp_running = 0; | ||
| 9203 | - break; | ||
| 9204 | - default: | ||
| 9205 | - fprintf(stderr, "select returned %d\n", count); | ||
| 9206 | - netsnmp_running = 0; | ||
| 9207 | - } | ||
| 9208 | - run_alarms(); | ||
| 9209 | - } | ||
| 9210 | + | ||
| 9211 | + snmptrapd_main_loop(); | ||
| 9212 | |||
| 9213 | if (snmp_get_do_logging()) { | ||
| 9214 | struct tm *tm; | ||
| 9215 | diff --git a/apps/snmptrapd_log.c b/apps/snmptrapd_log.c | ||
| 9216 | index c1742f4..774f797 100644 | ||
| 9217 | --- a/apps/snmptrapd_log.c | ||
| 9218 | +++ b/apps/snmptrapd_log.c | ||
| 9219 | @@ -1020,6 +1020,8 @@ realloc_handle_auth_fmt(u_char ** buf, size_t * buf_len, size_t * out_len, | ||
| 9220 | #if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C) | ||
| 9221 | while ((*out_len + pdu->community_len + 1) >= *buf_len) { | ||
| 9222 | if (!(allow_realloc && snmp_realloc(buf, buf_len))) { | ||
| 9223 | + if (temp_buf) | ||
| 9224 | + free(temp_buf); | ||
| 9225 | return 0; | ||
| 9226 | } | ||
| 9227 | } | ||
| 9228 | diff --git a/apps/snmptrapd_sql.c b/apps/snmptrapd_sql.c | ||
| 9229 | index c7433dc..ccba258 100644 | ||
| 9230 | --- a/apps/snmptrapd_sql.c | ||
| 9231 | +++ b/apps/snmptrapd_sql.c | ||
| 9232 | @@ -437,7 +437,11 @@ netsnmp_mysql_init(void) | ||
| 9233 | return -1; | ||
| 9234 | } | ||
| 9235 | |||
| 9236 | +#ifdef HAVE_BROKEN_LIBMYSQLCLIENT | ||
| 9237 | + my_init(); | ||
| 9238 | +#else | ||
| 9239 | MY_INIT("snmptrapd"); | ||
| 9240 | +#endif | ||
| 9241 | |||
| 9242 | /** load .my.cnf values */ | ||
| 9243 | load_defaults ("my", _sql.groups, ¬_argc, ¬_argv); | ||
| 9244 | @@ -704,7 +708,7 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu *pdu, | ||
| 9245 | struct tm *cur_time; | ||
| 9246 | size_t tmp_size; | ||
| 9247 | size_t buf_host_len_t, buf_oid_len_t, buf_user_len_t; | ||
| 9248 | - int oid_overflow, rc, trap_oid_len; | ||
| 9249 | + int oid_overflow, trap_oid_len; | ||
| 9250 | netsnmp_variable_list *vars; | ||
| 9251 | |||
| 9252 | if ((NULL == sqlb) || (NULL == pdu) || (NULL == transport)) | ||
| 9253 | @@ -727,8 +731,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu *pdu, | ||
| 9254 | /** host name */ | ||
| 9255 | buf_host_len_t = 0; | ||
| 9256 | tmp_size = sizeof(sqlb->host); | ||
| 9257 | - rc = realloc_format_trap((u_char**)&sqlb->host, &tmp_size, | ||
| 9258 | - &buf_host_len_t, 1, "%B", pdu, transport); | ||
| 9259 | + realloc_format_trap((u_char**)&sqlb->host, &tmp_size, | ||
| 9260 | + &buf_host_len_t, 1, "%B", pdu, transport); | ||
| 9261 | sqlb->host_len = buf_host_len_t; | ||
| 9262 | |||
| 9263 | /* snmpTrapOID */ | ||
| 9264 | @@ -782,8 +786,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu *pdu, | ||
| 9265 | /** community string/user name */ | ||
| 9266 | tmp_size = 0; | ||
| 9267 | buf_user_len_t = 0; | ||
| 9268 | - rc = realloc_format_trap((u_char**)&sqlb->user, &tmp_size, | ||
| 9269 | - &buf_user_len_t, 1, "%u", pdu, transport); | ||
| 9270 | + realloc_format_trap((u_char**)&sqlb->user, &tmp_size, | ||
| 9271 | + &buf_user_len_t, 1, "%u", pdu, transport); | ||
| 9272 | sqlb->user_len = buf_user_len_t; | ||
| 9273 | |||
| 9274 | /** transport */ | ||
| 9275 | diff --git a/apps/snmpwalk.c b/apps/snmpwalk.c | ||
| 9276 | index 7473b91..2bed0e8 100644 | ||
| 9277 | --- a/apps/snmpwalk.c | ||
| 9278 | +++ b/apps/snmpwalk.c | ||
| 9279 | @@ -185,7 +185,7 @@ main(int argc, char *argv[]) | ||
| 9280 | size_t end_len = 0; | ||
| 9281 | int count; | ||
| 9282 | int running; | ||
| 9283 | - int status; | ||
| 9284 | + int status = STAT_ERROR; | ||
| 9285 | int check; | ||
| 9286 | int exitval = 0; | ||
| 9287 | struct timeval tv1, tv2, tv_a, tv_b; | ||
| 9288 | diff --git a/configure b/configure | ||
| 9289 | index 8b2a66f..77c0475 100755 | ||
| 9290 | --- a/configure | ||
| 9291 | +++ b/configure | ||
| 9292 | @@ -3434,6 +3434,10 @@ if test "${with_openssl+set}" = set; then : | ||
| 9293 | elif test "x$withval" = "xno"; then | ||
| 9294 | tryopenssl=no | ||
| 9295 | elif test -d "$withval"; then | ||
| 9296 | + if test -d "$withval/lib/MinGW"; then | ||
| 9297 | + LDFLAGS="-L$withval/lib/MinGW $LDFLAGS" | ||
| 9298 | + CPPFLAGS="-I$withval/include $CPPFLAGS" | ||
| 9299 | + else | ||
| 9300 | |||
| 9301 | if test "x$withval" != x -a -d $withval; then | ||
| 9302 | if test -d $withval/lib; then | ||
| 9303 | @@ -3444,6 +3448,7 @@ if test "${with_openssl+set}" = set; then : | ||
| 9304 | fi | ||
| 9305 | fi | ||
| 9306 | |||
| 9307 | + fi | ||
| 9308 | tryopenssl=yes | ||
| 9309 | askedopenssl=yes | ||
| 9310 | fi | ||
| 9311 | @@ -16180,8 +16185,29 @@ fi | ||
| 9312 | done | ||
| 9313 | |||
| 9314 | |||
| 9315 | +# Library and Agent: | ||
| 9316 | +for ac_header in nlist.h | ||
| 9317 | +do : | ||
| 9318 | + ac_fn_c_check_header_compile "$LINENO" "nlist.h" "ac_cv_header_nlist_h" " | ||
| 9319 | +$ac_includes_default | ||
| 9320 | + | ||
| 9321 | +#ifndef LIBBSD_DISABLE_DEPRECATED | ||
| 9322 | +#define LIBBSD_DISABLE_DEPRECATED 1 | ||
| 9323 | +#endif | ||
| 9324 | + | ||
| 9325 | +" | ||
| 9326 | +if test "x$ac_cv_header_nlist_h" = xyes; then : | ||
| 9327 | + cat >>confdefs.h <<_ACEOF | ||
| 9328 | +#define HAVE_NLIST_H 1 | ||
| 9329 | +_ACEOF | ||
| 9330 | + | ||
| 9331 | +fi | ||
| 9332 | + | ||
| 9333 | +done | ||
| 9334 | + | ||
| 9335 | + | ||
| 9336 | # Library: | ||
| 9337 | -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 | ||
| 9338 | +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 | ||
| 9339 | do : | ||
| 9340 | as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` | ||
| 9341 | ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" | ||
| 9342 | @@ -16196,7 +16222,7 @@ done | ||
| 9343 | |||
| 9344 | |||
| 9345 | # Agent: | ||
| 9346 | -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 | ||
| 9347 | +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 | ||
| 9348 | do : | ||
| 9349 | as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` | ||
| 9350 | ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" | ||
| 9351 | @@ -18318,7 +18344,7 @@ while test "x$new_transport_list" != "x"; do | ||
| 9352 | /* end confdefs.h. */ | ||
| 9353 | |||
| 9354 | #include NETSNMP_SYSTEM_INCLUDE_FILE | ||
| 9355 | -#define NETSNMP_FEATURE_CHECKING | ||
| 9356 | +#undef NETSNMP_MINIMAL_CODE | ||
| 9357 | #define NET_SNMP_CONFIG_H | ||
| 9358 | #undef config_require | ||
| 9359 | #define config_require(foo) config_checkit_require(foo) | ||
| 9360 | @@ -19861,6 +19887,99 @@ done | ||
| 9361 | |||
| 9362 | LIBS="$netsnmp_save_LIBS" | ||
| 9363 | |||
| 9364 | +# | ||
| 9365 | +# dynamic module support | ||
| 9366 | +# | ||
| 9367 | + | ||
| 9368 | + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 | ||
| 9369 | +$as_echo_n "checking for library containing dlopen... " >&6; } | ||
| 9370 | +if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then : | ||
| 9371 | + $as_echo_n "(cached) " >&6 | ||
| 9372 | +else | ||
| 9373 | + netsnmp_func_search_save_LIBS="$LIBS" | ||
| 9374 | + netsnmp_target_val="$LMIBLIBS" | ||
| 9375 | + netsnmp_temp_LIBS="${netsnmp_target_val} $LAGENTLIBS $LSNMPLIBS ${LIBS}" | ||
| 9376 | + netsnmp_result=no | ||
| 9377 | + LIBS="${netsnmp_temp_LIBS}" | ||
| 9378 | + cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9379 | +/* end confdefs.h. */ | ||
| 9380 | + | ||
| 9381 | +/* Override any GCC internal prototype to avoid an error. | ||
| 9382 | + Use char because int might match the return type of a GCC | ||
| 9383 | + builtin and then its argument prototype would still apply. */ | ||
| 9384 | +#ifdef __cplusplus | ||
| 9385 | +extern "C" | ||
| 9386 | +#endif | ||
| 9387 | +char dlopen (); | ||
| 9388 | +int | ||
| 9389 | +main () | ||
| 9390 | +{ | ||
| 9391 | +return dlopen (); | ||
| 9392 | + ; | ||
| 9393 | + return 0; | ||
| 9394 | +} | ||
| 9395 | +_ACEOF | ||
| 9396 | +if ac_fn_c_try_link "$LINENO"; then : | ||
| 9397 | + netsnmp_result="none required" | ||
| 9398 | +else | ||
| 9399 | + for netsnmp_cur_lib in dl ; do | ||
| 9400 | + LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}" | ||
| 9401 | + cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9402 | +/* end confdefs.h. */ | ||
| 9403 | + | ||
| 9404 | +/* Override any GCC internal prototype to avoid an error. | ||
| 9405 | + Use char because int might match the return type of a GCC | ||
| 9406 | + builtin and then its argument prototype would still apply. */ | ||
| 9407 | +#ifdef __cplusplus | ||
| 9408 | +extern "C" | ||
| 9409 | +#endif | ||
| 9410 | +char dlopen (); | ||
| 9411 | +int | ||
| 9412 | +main () | ||
| 9413 | +{ | ||
| 9414 | +return dlopen (); | ||
| 9415 | + ; | ||
| 9416 | + return 0; | ||
| 9417 | +} | ||
| 9418 | +_ACEOF | ||
| 9419 | +if ac_fn_c_try_link "$LINENO"; then : | ||
| 9420 | + netsnmp_result=-l${netsnmp_cur_lib} | ||
| 9421 | + break | ||
| 9422 | +fi | ||
| 9423 | +rm -f core conftest.err conftest.$ac_objext \ | ||
| 9424 | + conftest$ac_exeext conftest.$ac_ext | ||
| 9425 | + done | ||
| 9426 | +fi | ||
| 9427 | +rm -f core conftest.err conftest.$ac_objext \ | ||
| 9428 | + conftest$ac_exeext conftest.$ac_ext | ||
| 9429 | + LIBS="${netsnmp_func_search_save_LIBS}" | ||
| 9430 | + netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}" | ||
| 9431 | +fi | ||
| 9432 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5 | ||
| 9433 | +$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; } | ||
| 9434 | + if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then | ||
| 9435 | + if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then | ||
| 9436 | + LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}" | ||
| 9437 | + fi | ||
| 9438 | + | ||
| 9439 | + | ||
| 9440 | + fi | ||
| 9441 | + | ||
| 9442 | +netsnmp_save_LIBS="$LIBS" | ||
| 9443 | +LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS" | ||
| 9444 | +for ac_func in dlopen | ||
| 9445 | +do : | ||
| 9446 | + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" | ||
| 9447 | +if test "x$ac_cv_func_dlopen" = xyes; then : | ||
| 9448 | + cat >>confdefs.h <<_ACEOF | ||
| 9449 | +#define HAVE_DLOPEN 1 | ||
| 9450 | +_ACEOF | ||
| 9451 | + | ||
| 9452 | +fi | ||
| 9453 | +done | ||
| 9454 | + | ||
| 9455 | +LIBS="$netsnmp_save_LIBS" | ||
| 9456 | + | ||
| 9457 | # -*- autoconf -*- | ||
| 9458 | # | ||
| 9459 | # generate empty files | ||
| 9460 | @@ -20087,7 +20206,8 @@ _ACEOF | ||
| 9461 | module_type=mib_module | ||
| 9462 | if test -f $srcdir/$mibdir/$i.h; then | ||
| 9463 | |||
| 9464 | - module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'` | ||
| 9465 | + module_type=`$MODULECPP module_tmp_header.h | \ | ||
| 9466 | + $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'` | ||
| 9467 | |||
| 9468 | fi | ||
| 9469 | if test "x$module_type" = "x" ; then | ||
| 9470 | @@ -20188,7 +20308,8 @@ _ACEOF | ||
| 9471 | # check if $i has any conflicts | ||
| 9472 | # | ||
| 9473 | |||
| 9474 | - new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'` | ||
| 9475 | + new_list_excl=`$MODULECPP module_tmp_header.h | \ | ||
| 9476 | + $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'` | ||
| 9477 | if test "x$new_list_excl" != "x"; then | ||
| 9478 | |||
| 9479 | if test $module_debug = 1; then | ||
| 9480 | @@ -20233,7 +20354,8 @@ EOF | ||
| 9481 | # | ||
| 9482 | |||
| 9483 | |||
| 9484 | - new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'` | ||
| 9485 | + new_list_arch=`$MODULECPP module_tmp_header.h | \ | ||
| 9486 | + $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'` | ||
| 9487 | |||
| 9488 | if test "x$new_list_arch" != "x"; then | ||
| 9489 | for j in $new_list_arch | ||
| 9490 | @@ -20264,11 +20386,7 @@ EOF | ||
| 9491 | # | ||
| 9492 | |||
| 9493 | new_list_alt3=`$MODULECPP module_tmp_header.h | \ | ||
| 9494 | - $GREP config_version_require | \ | ||
| 9495 | - $SED -e 's/ */ /g' \ | ||
| 9496 | - -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \ | ||
| 9497 | - -e 's/ *, */,/g' | \ | ||
| 9498 | - awk ' | ||
| 9499 | + $AWK ' | ||
| 9500 | BEGIN { | ||
| 9501 | if("'"$enable_new_features"'" == "yes") | ||
| 9502 | method="max"; | ||
| 9503 | @@ -20280,7 +20398,10 @@ EOF | ||
| 9504 | split("'"$with_features_of"'", a); | ||
| 9505 | version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]); | ||
| 9506 | } | ||
| 9507 | - { | ||
| 9508 | + /config_version_require/ { | ||
| 9509 | + gsub("^.*config_version_require *\\\\(\\\\(", ""); | ||
| 9510 | + gsub("\\\\)\\\\).*$", ""); | ||
| 9511 | + gsub(", *", ","); | ||
| 9512 | FS = ","; | ||
| 9513 | n = split($0, a); | ||
| 9514 | FS = "."; | ||
| 9515 | @@ -20311,7 +20432,8 @@ EOF | ||
| 9516 | # check if $i has any other required modules | ||
| 9517 | # | ||
| 9518 | |||
| 9519 | - new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`" | ||
| 9520 | + new_list="$new_list `$MODULECPP module_tmp_header.h | \ | ||
| 9521 | + $SED -n 's/.*config_require(\(.*\)).*/\1/p'`" | ||
| 9522 | |||
| 9523 | if test $module_debug = 1; then | ||
| 9524 | echo " $i will test: $new_list" | ||
| 9525 | @@ -20369,7 +20491,8 @@ EOF | ||
| 9526 | # check if $i has any mibs to add | ||
| 9527 | # | ||
| 9528 | |||
| 9529 | - new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'` | ||
| 9530 | + new_mibs=`$MODULECPP module_tmp_header.h | \ | ||
| 9531 | + $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'` | ||
| 9532 | if test "x$new_mibs" != "x"; then | ||
| 9533 | for j in $new_mibs | ||
| 9534 | do | ||
| 9535 | @@ -20410,7 +20533,7 @@ EOF | ||
| 9536 | #------------------- | ||
| 9537 | # check for unsupported config_load_mib | ||
| 9538 | # | ||
| 9539 | - if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then | ||
| 9540 | + if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then | ||
| 9541 | { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mib module error" >&5 | ||
| 9542 | $as_echo "$as_me: WARNING: mib module error" >&2;} | ||
| 9543 | { $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 | ||
| 9544 | @@ -20423,7 +20546,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct | ||
| 9545 | # | ||
| 9546 | |||
| 9547 | |||
| 9548 | - $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 | ||
| 9549 | + $MODULECPP module_tmp_header.h | \ | ||
| 9550 | + $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h | ||
| 9551 | |||
| 9552 | |||
| 9553 | #--------------------- | ||
| 9554 | @@ -20433,7 +20557,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct | ||
| 9555 | # check if $i has any errors, or warnings | ||
| 9556 | # | ||
| 9557 | |||
| 9558 | - error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'` | ||
| 9559 | + error=`$MODULECPP module_tmp_header.h | \ | ||
| 9560 | + $SED -n 's/.*config_error(\(.*\)).*/\1/p'` | ||
| 9561 | if test "x$error" != "x"; then | ||
| 9562 | echo | ||
| 9563 | echo | ||
| 9564 | @@ -20445,7 +20570,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct | ||
| 9565 | # - used to signal a configuration "warning" to be printed to the user | ||
| 9566 | # | ||
| 9567 | |||
| 9568 | - warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'` | ||
| 9569 | + warning=`$MODULECPP module_tmp_header.h | \ | ||
| 9570 | + $SED -n 's/.*config_warning(\(.*\)).*/\1/p'` | ||
| 9571 | if test "x$warning" != "x"; then | ||
| 9572 | all_warnings="$all_warnings $warning | ||
| 9573 | " | ||
| 9574 | @@ -21653,99 +21779,6 @@ $as_echo "#define HAVE_LIBKSTAT 1" >>confdefs.h | ||
| 9575 | |||
| 9576 | |||
| 9577 | |||
| 9578 | -# dynamic module support | ||
| 9579 | -# | ||
| 9580 | - | ||
| 9581 | - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 | ||
| 9582 | -$as_echo_n "checking for library containing dlopen... " >&6; } | ||
| 9583 | -if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then : | ||
| 9584 | - $as_echo_n "(cached) " >&6 | ||
| 9585 | -else | ||
| 9586 | - netsnmp_func_search_save_LIBS="$LIBS" | ||
| 9587 | - netsnmp_target_val="$LMIBLIBS" | ||
| 9588 | - netsnmp_temp_LIBS="${netsnmp_target_val} ${LIBS}" | ||
| 9589 | - netsnmp_result=no | ||
| 9590 | - LIBS="${netsnmp_temp_LIBS}" | ||
| 9591 | - cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9592 | -/* end confdefs.h. */ | ||
| 9593 | - | ||
| 9594 | -/* Override any GCC internal prototype to avoid an error. | ||
| 9595 | - Use char because int might match the return type of a GCC | ||
| 9596 | - builtin and then its argument prototype would still apply. */ | ||
| 9597 | -#ifdef __cplusplus | ||
| 9598 | -extern "C" | ||
| 9599 | -#endif | ||
| 9600 | -char dlopen (); | ||
| 9601 | -int | ||
| 9602 | -main () | ||
| 9603 | -{ | ||
| 9604 | -return dlopen (); | ||
| 9605 | - ; | ||
| 9606 | - return 0; | ||
| 9607 | -} | ||
| 9608 | -_ACEOF | ||
| 9609 | -if ac_fn_c_try_link "$LINENO"; then : | ||
| 9610 | - netsnmp_result="none required" | ||
| 9611 | -else | ||
| 9612 | - for netsnmp_cur_lib in dl ; do | ||
| 9613 | - LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}" | ||
| 9614 | - cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9615 | -/* end confdefs.h. */ | ||
| 9616 | - | ||
| 9617 | -/* Override any GCC internal prototype to avoid an error. | ||
| 9618 | - Use char because int might match the return type of a GCC | ||
| 9619 | - builtin and then its argument prototype would still apply. */ | ||
| 9620 | -#ifdef __cplusplus | ||
| 9621 | -extern "C" | ||
| 9622 | -#endif | ||
| 9623 | -char dlopen (); | ||
| 9624 | -int | ||
| 9625 | -main () | ||
| 9626 | -{ | ||
| 9627 | -return dlopen (); | ||
| 9628 | - ; | ||
| 9629 | - return 0; | ||
| 9630 | -} | ||
| 9631 | -_ACEOF | ||
| 9632 | -if ac_fn_c_try_link "$LINENO"; then : | ||
| 9633 | - netsnmp_result=-l${netsnmp_cur_lib} | ||
| 9634 | - break | ||
| 9635 | -fi | ||
| 9636 | -rm -f core conftest.err conftest.$ac_objext \ | ||
| 9637 | - conftest$ac_exeext conftest.$ac_ext | ||
| 9638 | - done | ||
| 9639 | -fi | ||
| 9640 | -rm -f core conftest.err conftest.$ac_objext \ | ||
| 9641 | - conftest$ac_exeext conftest.$ac_ext | ||
| 9642 | - LIBS="${netsnmp_func_search_save_LIBS}" | ||
| 9643 | - netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}" | ||
| 9644 | -fi | ||
| 9645 | -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5 | ||
| 9646 | -$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; } | ||
| 9647 | - if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then | ||
| 9648 | - if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then | ||
| 9649 | - LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}" | ||
| 9650 | - fi | ||
| 9651 | - | ||
| 9652 | - | ||
| 9653 | - fi | ||
| 9654 | - | ||
| 9655 | -netsnmp_save_LIBS="$LIBS" | ||
| 9656 | -LIBS="$LMIBLIBS $LIBS" | ||
| 9657 | -for ac_func in dlopen | ||
| 9658 | -do : | ||
| 9659 | - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" | ||
| 9660 | -if test "x$ac_cv_func_dlopen" = xyes; then : | ||
| 9661 | - cat >>confdefs.h <<_ACEOF | ||
| 9662 | -#define HAVE_DLOPEN 1 | ||
| 9663 | -_ACEOF | ||
| 9664 | - | ||
| 9665 | -fi | ||
| 9666 | -done | ||
| 9667 | - | ||
| 9668 | -LIBS="$netsnmp_save_LIBS" | ||
| 9669 | - | ||
| 9670 | - | ||
| 9671 | ## | ||
| 9672 | # MIB-module-specific checks | ||
| 9673 | ## | ||
| 9674 | @@ -22482,6 +22515,54 @@ $as_echo "#define HAVE_AES_CFB128_ENCRYPT 1" >>confdefs.h | ||
| 9675 | |||
| 9676 | fi | ||
| 9677 | |||
| 9678 | + | ||
| 9679 | + as_ac_Lib=`$as_echo "ac_cv_lib_${CRYPTO}''_EVP_MD_CTX_create" | $as_tr_sh` | ||
| 9680 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EVP_MD_CTX_create in -l${CRYPTO}" >&5 | ||
| 9681 | +$as_echo_n "checking for EVP_MD_CTX_create in -l${CRYPTO}... " >&6; } | ||
| 9682 | +if eval \${$as_ac_Lib+:} false; then : | ||
| 9683 | + $as_echo_n "(cached) " >&6 | ||
| 9684 | +else | ||
| 9685 | + ac_check_lib_save_LIBS=$LIBS | ||
| 9686 | +LIBS="-l${CRYPTO} $LIBS" | ||
| 9687 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9688 | +/* end confdefs.h. */ | ||
| 9689 | + | ||
| 9690 | +/* Override any GCC internal prototype to avoid an error. | ||
| 9691 | + Use char because int might match the return type of a GCC | ||
| 9692 | + builtin and then its argument prototype would still apply. */ | ||
| 9693 | +#ifdef __cplusplus | ||
| 9694 | +extern "C" | ||
| 9695 | +#endif | ||
| 9696 | +char EVP_MD_CTX_create (); | ||
| 9697 | +int | ||
| 9698 | +main () | ||
| 9699 | +{ | ||
| 9700 | +return EVP_MD_CTX_create (); | ||
| 9701 | + ; | ||
| 9702 | + return 0; | ||
| 9703 | +} | ||
| 9704 | +_ACEOF | ||
| 9705 | +if ac_fn_c_try_link "$LINENO"; then : | ||
| 9706 | + eval "$as_ac_Lib=yes" | ||
| 9707 | +else | ||
| 9708 | + eval "$as_ac_Lib=no" | ||
| 9709 | +fi | ||
| 9710 | +rm -f core conftest.err conftest.$ac_objext \ | ||
| 9711 | + conftest$ac_exeext conftest.$ac_ext | ||
| 9712 | +LIBS=$ac_check_lib_save_LIBS | ||
| 9713 | +fi | ||
| 9714 | +eval ac_res=\$$as_ac_Lib | ||
| 9715 | + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | ||
| 9716 | +$as_echo "$ac_res" >&6; } | ||
| 9717 | +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : | ||
| 9718 | + | ||
| 9719 | +$as_echo "#define HAVE_EVP_MD_CTX_CREATE /**/" >>confdefs.h | ||
| 9720 | + | ||
| 9721 | + | ||
| 9722 | +$as_echo "#define HAVE_EVP_MD_CTX_DESTROY /**/" >>confdefs.h | ||
| 9723 | + | ||
| 9724 | +fi | ||
| 9725 | + | ||
| 9726 | fi | ||
| 9727 | if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then | ||
| 9728 | { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DTLSv1_method in -lssl" >&5 | ||
| 9729 | @@ -22984,6 +23065,38 @@ fi | ||
| 9730 | fi | ||
| 9731 | MYSQL_LIBS=`$MYSQLCONFIG --libs` | ||
| 9732 | MYSQL_INCLUDES=`$MYSQLCONFIG --cflags` | ||
| 9733 | + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MY_INIT() works" >&5 | ||
| 9734 | +$as_echo_n "checking whether MY_INIT() works... " >&6; } | ||
| 9735 | + _libs="${LIBS}" | ||
| 9736 | + _cppflags="${CPPFLAGS}" | ||
| 9737 | + LIBS="${LIBS} ${MYSQL_LIBS}" | ||
| 9738 | + CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}" | ||
| 9739 | + cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9740 | +/* end confdefs.h. */ | ||
| 9741 | +#include <mysql/my_global.h> | ||
| 9742 | + #include <mysql/my_sys.h> | ||
| 9743 | +int | ||
| 9744 | +main () | ||
| 9745 | +{ | ||
| 9746 | +MY_INIT("my_init_test") | ||
| 9747 | + ; | ||
| 9748 | + return 0; | ||
| 9749 | +} | ||
| 9750 | +_ACEOF | ||
| 9751 | +if ac_fn_c_try_link "$LINENO"; then : | ||
| 9752 | + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 | ||
| 9753 | +$as_echo "yes" >&6; } | ||
| 9754 | +else | ||
| 9755 | + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 | ||
| 9756 | +$as_echo "no" >&6; } | ||
| 9757 | + | ||
| 9758 | +$as_echo "#define HAVE_BROKEN_LIBMYSQLCLIENT 1" >>confdefs.h | ||
| 9759 | + | ||
| 9760 | +fi | ||
| 9761 | +rm -f core conftest.err conftest.$ac_objext \ | ||
| 9762 | + conftest$ac_exeext conftest.$ac_ext | ||
| 9763 | + CPPFLAGS="${_cppflags}" | ||
| 9764 | + LIBS="${_libs}" | ||
| 9765 | |||
| 9766 | cat >> configure-summary << EOF | ||
| 9767 | MYSQL Trap Logging: enabled | ||
| 9768 | @@ -24771,7 +24884,7 @@ done | ||
| 9769 | |||
| 9770 | |||
| 9771 | # Library: | ||
| 9772 | -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 | ||
| 9773 | +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 | ||
| 9774 | do : | ||
| 9775 | as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | ||
| 9776 | ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" | ||
| 9777 | @@ -24941,6 +25054,19 @@ esac | ||
| 9778 | |||
| 9779 | fi | ||
| 9780 | |||
| 9781 | +ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" | ||
| 9782 | +if test "x$ac_cv_func_strlcat" = xyes; then : | ||
| 9783 | + $as_echo "#define HAVE_STRLCAT 1" >>confdefs.h | ||
| 9784 | + | ||
| 9785 | +else | ||
| 9786 | + case " $LIBOBJS " in | ||
| 9787 | + *" strlcat.$ac_objext "* ) ;; | ||
| 9788 | + *) LIBOBJS="$LIBOBJS strlcat.$ac_objext" | ||
| 9789 | + ;; | ||
| 9790 | +esac | ||
| 9791 | + | ||
| 9792 | +fi | ||
| 9793 | + | ||
| 9794 | ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" | ||
| 9795 | if test "x$ac_cv_func_strlcpy" = xyes; then : | ||
| 9796 | $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h | ||
| 9797 | @@ -25651,6 +25777,28 @@ _ACEOF | ||
| 9798 | fi | ||
| 9799 | |||
| 9800 | |||
| 9801 | +# struct ethtool_cmd | ||
| 9802 | +# | ||
| 9803 | +if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then | ||
| 9804 | +ac_fn_c_check_member "$LINENO" "struct ethtool_cmd" "speed_hi" "ac_cv_member_struct_ethtool_cmd_speed_hi" " | ||
| 9805 | + $ac_includes_default | ||
| 9806 | + | ||
| 9807 | +#ifdef HAVE_LINUX_ETHTOOL_H | ||
| 9808 | +#include <linux/ethtool.h> | ||
| 9809 | +#endif | ||
| 9810 | + | ||
| 9811 | +" | ||
| 9812 | +if test "x$ac_cv_member_struct_ethtool_cmd_speed_hi" = xyes; then : | ||
| 9813 | + | ||
| 9814 | +cat >>confdefs.h <<_ACEOF | ||
| 9815 | +#define HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI 1 | ||
| 9816 | +_ACEOF | ||
| 9817 | + | ||
| 9818 | + | ||
| 9819 | +fi | ||
| 9820 | + | ||
| 9821 | +fi | ||
| 9822 | + | ||
| 9823 | # struct ipstat | ||
| 9824 | # Agent: | ||
| 9825 | # | ||
| 9826 | @@ -26526,6 +26674,50 @@ _ACEOF | ||
| 9827 | fi | ||
| 9828 | |||
| 9829 | |||
| 9830 | +# extern timezone | ||
| 9831 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking extern timezone" >&5 | ||
| 9832 | +$as_echo_n "checking extern timezone... " >&6; } | ||
| 9833 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | ||
| 9834 | +/* end confdefs.h. */ | ||
| 9835 | + | ||
| 9836 | +#if TIME_WITH_SYS_TIME | ||
| 9837 | +# include <sys/time.h> | ||
| 9838 | +# include <time.h> | ||
| 9839 | +#else | ||
| 9840 | +# if HAVE_SYS_TIME_H | ||
| 9841 | +# include <sys/time.h> | ||
| 9842 | +# else | ||
| 9843 | +# include <time.h> | ||
| 9844 | +# endif | ||
| 9845 | +#endif | ||
| 9846 | + | ||
| 9847 | +int | ||
| 9848 | +main () | ||
| 9849 | +{ | ||
| 9850 | + | ||
| 9851 | + return timezone; | ||
| 9852 | + | ||
| 9853 | + ; | ||
| 9854 | + return 0; | ||
| 9855 | +} | ||
| 9856 | +_ACEOF | ||
| 9857 | +if ac_fn_c_try_link "$LINENO"; then : | ||
| 9858 | + | ||
| 9859 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 | ||
| 9860 | +$as_echo "yes" >&6; } | ||
| 9861 | + | ||
| 9862 | +$as_echo "#define HAVE_TIMEZONE_VARIABLE 1" >>confdefs.h | ||
| 9863 | + | ||
| 9864 | + | ||
| 9865 | +else | ||
| 9866 | + | ||
| 9867 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 | ||
| 9868 | +$as_echo "no" >&6; } | ||
| 9869 | + | ||
| 9870 | +fi | ||
| 9871 | +rm -f core conftest.err conftest.$ac_objext \ | ||
| 9872 | + conftest$ac_exeext conftest.$ac_ext | ||
| 9873 | + | ||
| 9874 | # struct timezone | ||
| 9875 | # Library: | ||
| 9876 | # | ||
| 9877 | diff --git a/configure.d/config_modules_agent b/configure.d/config_modules_agent | ||
| 9878 | index 87ec3a5..3272679 100644 | ||
| 9879 | --- a/configure.d/config_modules_agent | ||
| 9880 | +++ b/configure.d/config_modules_agent | ||
| 9881 | @@ -189,7 +189,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9882 | module_type=mib_module | ||
| 9883 | if test -f $srcdir/$mibdir/$i.h; then | ||
| 9884 | changequote(, ) | ||
| 9885 | - module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'` | ||
| 9886 | + module_type=`$MODULECPP module_tmp_header.h | \ | ||
| 9887 | + $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'` | ||
| 9888 | changequote([, ]) | ||
| 9889 | fi | ||
| 9890 | if test "x$module_type" = "x" ; then | ||
| 9891 | @@ -270,7 +271,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9892 | # check if $i has any conflicts | ||
| 9893 | # | ||
| 9894 | AH_TOP([#define config_exclude(x)]) | ||
| 9895 | - new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'` | ||
| 9896 | + new_list_excl=`$MODULECPP module_tmp_header.h | \ | ||
| 9897 | + $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'` | ||
| 9898 | if test "x$new_list_excl" != "x"; then | ||
| 9899 | AC_MSG_MODULE_DBG("$i excludes $new_list_excl") | ||
| 9900 | for j in $new_list_excl | ||
| 9901 | @@ -299,7 +301,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9902 | # | ||
| 9903 | AH_TOP([#define config_arch_require(x,y)]) | ||
| 9904 | changequote(, ) | ||
| 9905 | - new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'` | ||
| 9906 | + new_list_arch=`$MODULECPP module_tmp_header.h | \ | ||
| 9907 | + $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'` | ||
| 9908 | changequote([, ]) | ||
| 9909 | if test "x$new_list_arch" != "x"; then | ||
| 9910 | for j in $new_list_arch | ||
| 9911 | @@ -320,11 +323,7 @@ while test "x$new_module_list" != "x"; do | ||
| 9912 | # | ||
| 9913 | AH_TOP([#define config_version_require(x)]) | ||
| 9914 | [new_list_alt3=`$MODULECPP module_tmp_header.h | \ | ||
| 9915 | - $GREP config_version_require | \ | ||
| 9916 | - $SED -e 's/ */ /g' \ | ||
| 9917 | - -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \ | ||
| 9918 | - -e 's/ *, */,/g' | \ | ||
| 9919 | - awk ' | ||
| 9920 | + $AWK ' | ||
| 9921 | BEGIN { | ||
| 9922 | if("'"$enable_new_features"'" == "yes") | ||
| 9923 | method="max"; | ||
| 9924 | @@ -336,7 +335,10 @@ while test "x$new_module_list" != "x"; do | ||
| 9925 | split("'"$with_features_of"'", a); | ||
| 9926 | version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]); | ||
| 9927 | } | ||
| 9928 | - { | ||
| 9929 | + /config_version_require/ { | ||
| 9930 | + gsub("^.*config_version_require *\\\\(\\\\(", ""); | ||
| 9931 | + gsub("\\\\)\\\\).*$", ""); | ||
| 9932 | + gsub(", *", ","); | ||
| 9933 | FS = ","; | ||
| 9934 | n = split($0, a); | ||
| 9935 | FS = "."; | ||
| 9936 | @@ -362,7 +364,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9937 | # check if $i has any other required modules | ||
| 9938 | # | ||
| 9939 | AH_TOP([#define config_require(x)]) | ||
| 9940 | - new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`" | ||
| 9941 | + new_list="$new_list `$MODULECPP module_tmp_header.h | \ | ||
| 9942 | + $SED -n 's/.*config_require(\(.*\)).*/\1/p'`" | ||
| 9943 | AC_MSG_MODULE_DBG(" $i will test: $new_list") | ||
| 9944 | if test "x$new_list" != "x"; then | ||
| 9945 | for j in $new_list | ||
| 9946 | @@ -398,7 +401,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9947 | # check if $i has any mibs to add | ||
| 9948 | # | ||
| 9949 | AH_TOP([#define config_add_mib(x)]) | ||
| 9950 | - new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'` | ||
| 9951 | + new_mibs=`$MODULECPP module_tmp_header.h | \ | ||
| 9952 | + $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'` | ||
| 9953 | if test "x$new_mibs" != "x"; then | ||
| 9954 | for j in $new_mibs | ||
| 9955 | do | ||
| 9956 | @@ -434,7 +438,7 @@ while test "x$new_module_list" != "x"; do | ||
| 9957 | #------------------- | ||
| 9958 | # check for unsupported config_load_mib | ||
| 9959 | # | ||
| 9960 | - if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then | ||
| 9961 | + if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then | ||
| 9962 | AC_MSG_WARN([mib module error]) | ||
| 9963 | AC_MSG_WARN([mib module "$i" uses the "config_load_mib" directive, which is no longer supported. It probably won't work.]) | ||
| 9964 | fi # grep config_load_mib | ||
| 9965 | @@ -445,7 +449,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9966 | # | ||
| 9967 | AH_TOP([#define config_parse_dot_conf(w,x,y,z)]) | ||
| 9968 | changequote(, ) | ||
| 9969 | - $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 | ||
| 9970 | + $MODULECPP module_tmp_header.h | \ | ||
| 9971 | + $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h | ||
| 9972 | changequote([, ]) | ||
| 9973 | |||
| 9974 | #--------------------- | ||
| 9975 | @@ -455,7 +460,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9976 | # check if $i has any errors, or warnings | ||
| 9977 | # | ||
| 9978 | AH_TOP([#define config_error(x)]) | ||
| 9979 | - error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'` | ||
| 9980 | + error=`$MODULECPP module_tmp_header.h | \ | ||
| 9981 | + $SED -n 's/.*config_error(\(.*\)).*/\1/p'` | ||
| 9982 | if test "x$error" != "x"; then | ||
| 9983 | echo | ||
| 9984 | echo | ||
| 9985 | @@ -467,7 +473,8 @@ while test "x$new_module_list" != "x"; do | ||
| 9986 | # - used to signal a configuration "warning" to be printed to the user | ||
| 9987 | # | ||
| 9988 | AH_TOP([#define config_warning(x)]) | ||
| 9989 | - warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'` | ||
| 9990 | + warning=`$MODULECPP module_tmp_header.h | \ | ||
| 9991 | + $SED -n 's/.*config_warning(\(.*\)).*/\1/p'` | ||
| 9992 | if test "x$warning" != "x"; then | ||
| 9993 | all_warnings="$all_warnings $warning | ||
| 9994 | " | ||
| 9995 | diff --git a/configure.d/config_modules_transports b/configure.d/config_modules_transports | ||
| 9996 | index 2a49da8..b10b960 100644 | ||
| 9997 | --- a/configure.d/config_modules_transports | ||
| 9998 | +++ b/configure.d/config_modules_transports | ||
| 9999 | @@ -71,7 +71,7 @@ while test "x$new_transport_list" != "x"; do | ||
| 10000 | rm -f conftest.$ac_ext module_tmp_header.h | ||
| 10001 | AC_LANG_CONFTEST([AC_LANG_SOURCE([[ | ||
| 10002 | #include NETSNMP_SYSTEM_INCLUDE_FILE | ||
| 10003 | -#define NETSNMP_FEATURE_CHECKING | ||
| 10004 | +#undef NETSNMP_MINIMAL_CODE | ||
| 10005 | #define NET_SNMP_CONFIG_H | ||
| 10006 | #undef config_require | ||
| 10007 | #define config_require(foo) config_checkit_require(foo) | ||
| 10008 | diff --git a/configure.d/config_os_functions b/configure.d/config_os_functions | ||
| 10009 | index 7736994..3c5385b 100644 | ||
| 10010 | --- a/configure.d/config_os_functions | ||
| 10011 | +++ b/configure.d/config_os_functions | ||
| 10012 | @@ -31,7 +31,8 @@ AC_CHECK_FUNCS([lrand48 rand random ] dnl | ||
| 10013 | [signal sigset ] ) | ||
| 10014 | |||
| 10015 | # Library: | ||
| 10016 | -AC_CHECK_FUNCS([closedir fork getipnodebyname ] dnl | ||
| 10017 | +AC_CHECK_FUNCS([closedir fgetc_unlocked flockfile ] dnl | ||
| 10018 | + [fork funlockfile getipnodebyname ] dnl | ||
| 10019 | [gettimeofday if_nametoindex mkstemp ] dnl | ||
| 10020 | [opendir readdir regcomp ] dnl | ||
| 10021 | [setenv setitimer setlocale ] dnl | ||
| 10022 | @@ -82,8 +83,8 @@ esac | ||
| 10023 | AC_CONFIG_LIBOBJ_DIR([snmplib]) | ||
| 10024 | |||
| 10025 | AC_REPLACE_FUNCS([getopt inet_ntop inet_pton ] dnl | ||
| 10026 | - [strlcpy strtok_r strtol ] dnl | ||
| 10027 | - [strtoul strtoull ] ) | ||
| 10028 | + [strlcat strlcpy strtok_r ] dnl | ||
| 10029 | + [strtol strtoul strtoull ] ) | ||
| 10030 | |||
| 10031 | # Agent: | ||
| 10032 | AC_CHECK_FUNCS([cgetnext chown execv ] dnl | ||
| 10033 | @@ -133,7 +134,7 @@ fi | ||
| 10034 | AC_MSG_CHECKING([[for two-argument statfs with struct fs_data (Ultrix)]]) | ||
| 10035 | AC_CACHE_VAL( | ||
| 10036 | fu_cv_sys_stat_fs_data, | ||
| 10037 | - [AC_TRY_RUN([ | ||
| 10038 | + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ | ||
| 10039 | #ifdef HAVE_SYS_PARAM_H | ||
| 10040 | #include <sys/param.h> | ||
| 10041 | #endif | ||
| 10042 | @@ -150,10 +151,10 @@ struct fs_data fsd; | ||
| 10043 | /* Ultrix's statfs returns 1 for success, | ||
| 10044 | 0 for not mounted, -1 for failure. */ | ||
| 10045 | exit (statfs (".", &fsd) != 1); | ||
| 10046 | -}], | ||
| 10047 | - fu_cv_sys_stat_fs_data=yes, | ||
| 10048 | - fu_cv_sys_stat_fs_data=no, | ||
| 10049 | - fu_cv_sys_stat_fs_data=no)]) | ||
| 10050 | +}]])], | ||
| 10051 | + [fu_cv_sys_stat_fs_data=yes], | ||
| 10052 | + [fu_cv_sys_stat_fs_data=no], | ||
| 10053 | + [fu_cv_sys_stat_fs_data=no])]) | ||
| 10054 | AC_MSG_RESULT($fu_cv_sys_stat_fs_data) | ||
| 10055 | if test $fu_cv_sys_stat_fs_data = yes; then | ||
| 10056 | AC_DEFINE(STAT_STATFS_FS_DATA, 1, | ||
| 10057 | @@ -309,10 +310,11 @@ if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then | ||
| 10058 | [ | ||
| 10059 | oldLIBS="$LIBS" | ||
| 10060 | LIBS="$LIBS -lcrypto" | ||
| 10061 | - AC_TRY_LINK( | ||
| 10062 | - [#include <openssl/bio.h>], | ||
| 10063 | - [BIO_dgram_get_peer(NULL, NULL);],, | ||
| 10064 | - AC_MSG_ERROR([DTLS support requires a newer version of OpenSSL])) | ||
| 10065 | + AC_LINK_IFELSE( | ||
| 10066 | + [AC_LANG_PROGRAM( | ||
| 10067 | + [[#include <openssl/bio.h>]], | ||
| 10068 | + [[BIO_dgram_get_peer(NULL, NULL);]])], [], | ||
| 10069 | + [AC_MSG_ERROR(DTLS support requires a newer version of OpenSSL)]) | ||
| 10070 | |||
| 10071 | LIBS="$oldLIBS" | ||
| 10072 | ] | ||
| 10073 | diff --git a/configure.d/config_os_headers b/configure.d/config_os_headers | ||
| 10074 | index 23cc38d..d903f58 100644 | ||
| 10075 | --- a/configure.d/config_os_headers | ||
| 10076 | +++ b/configure.d/config_os_headers | ||
| 10077 | @@ -30,9 +30,18 @@ AC_CHECK_HEADERS([getopt.h pthread.h regex.h ] dnl | ||
| 10078 | [sys/timeb.h ] dnl | ||
| 10079 | [sys/un.h ]) | ||
| 10080 | |||
| 10081 | +# Library and Agent: | ||
| 10082 | +AC_CHECK_HEADERS([nlist.h],,,[ | ||
| 10083 | +AC_INCLUDES_DEFAULT | ||
| 10084 | +[ | ||
| 10085 | +#ifndef LIBBSD_DISABLE_DEPRECATED | ||
| 10086 | +#define LIBBSD_DISABLE_DEPRECATED 1 | ||
| 10087 | +#endif | ||
| 10088 | +]]) | ||
| 10089 | + | ||
| 10090 | # Library: | ||
| 10091 | AC_CHECK_HEADERS([fcntl.h io.h kstat.h ] dnl | ||
| 10092 | - [limits.h locale.h nlist.h ] dnl | ||
| 10093 | + [limits.h locale.h ] dnl | ||
| 10094 | [sys/file.h sys/ioctl.h ] dnl | ||
| 10095 | [sys/sockio.h sys/stat.h ] dnl | ||
| 10096 | [sys/systemcfg.h sys/systeminfo.h ] dnl | ||
| 10097 | @@ -45,7 +54,7 @@ AC_CHECK_HEADERS([dlfcn.h err.h fcntl.h fstab.h ] dnl | ||
| 10098 | [ grp.h io.h ] dnl | ||
| 10099 | [ioctls.h kstat.h kvm.h limits.h ] dnl | ||
| 10100 | [ mntent.h mtab.h ] dnl | ||
| 10101 | - [nlist.h pkglocs.h pwd.h ] dnl | ||
| 10102 | + [ pkglocs.h pwd.h ] dnl | ||
| 10103 | [ utmpx.h utsname.h ]) | ||
| 10104 | |||
| 10105 | AC_CHECK_HEADERS([sys/diskio.h sys/dkio.h ] dnl | ||
| 10106 | diff --git a/configure.d/config_os_libs1 b/configure.d/config_os_libs1 | ||
| 10107 | index ce33d34..35f052a 100644 | ||
| 10108 | --- a/configure.d/config_os_libs1 | ||
| 10109 | +++ b/configure.d/config_os_libs1 | ||
| 10110 | @@ -84,3 +84,12 @@ netsnmp_save_LIBS="$LIBS" | ||
| 10111 | LIBS="$LAGENTLIBS $LMIBLIBS $LIBS" | ||
| 10112 | AC_CHECK_FUNCS([kvm_openfiles kvm_getprocs kvm_getproc2 kvm_getswapinfo]) | ||
| 10113 | LIBS="$netsnmp_save_LIBS" | ||
| 10114 | + | ||
| 10115 | +# | ||
| 10116 | +# dynamic module support | ||
| 10117 | +# | ||
| 10118 | +NETSNMP_SEARCH_LIBS([dlopen], [dl],,, [$LAGENTLIBS $LSNMPLIBS], [LMIBLIBS]) | ||
| 10119 | +netsnmp_save_LIBS="$LIBS" | ||
| 10120 | +LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS" | ||
| 10121 | +AC_CHECK_FUNCS([dlopen]) | ||
| 10122 | +LIBS="$netsnmp_save_LIBS" | ||
| 10123 | diff --git a/configure.d/config_os_libs2 b/configure.d/config_os_libs2 | ||
| 10124 | index 22ab764..fa846c8 100644 | ||
| 10125 | --- a/configure.d/config_os_libs2 | ||
| 10126 | +++ b/configure.d/config_os_libs2 | ||
| 10127 | @@ -158,15 +158,6 @@ NETSNMP_SEARCH_LIBS(kstat_lookup, kstat, | ||
| 10128 | LNETSNMPLIBS) | ||
| 10129 | |||
| 10130 | |||
| 10131 | -# dynamic module support | ||
| 10132 | -# | ||
| 10133 | -NETSNMP_SEARCH_LIBS(dlopen, dl,,,,LMIBLIBS) | ||
| 10134 | -netsnmp_save_LIBS="$LIBS" | ||
| 10135 | -LIBS="$LMIBLIBS $LIBS" | ||
| 10136 | -AC_CHECK_FUNCS([dlopen]) | ||
| 10137 | -LIBS="$netsnmp_save_LIBS" | ||
| 10138 | - | ||
| 10139 | - | ||
| 10140 | ## | ||
| 10141 | # MIB-module-specific checks | ||
| 10142 | ## | ||
| 10143 | @@ -277,6 +268,12 @@ if test "x$tryopenssl" != "xno" -a "x$tryopenssl" != "xinternal"; then | ||
| 10144 | AC_CHECK_LIB(${CRYPTO}, AES_cfb128_encrypt, | ||
| 10145 | AC_DEFINE(HAVE_AES_CFB128_ENCRYPT, 1, | ||
| 10146 | [Define to 1 if you have the `AES_cfb128_encrypt' function.])) | ||
| 10147 | + | ||
| 10148 | + AC_CHECK_LIB(${CRYPTO}, EVP_MD_CTX_create, | ||
| 10149 | + AC_DEFINE([HAVE_EVP_MD_CTX_CREATE], [], | ||
| 10150 | + [Define to 1 if you have the `EVP_MD_CTX_create' function.]) | ||
| 10151 | + AC_DEFINE([HAVE_EVP_MD_CTX_DESTROY], [], | ||
| 10152 | + [Define to 1 if you have the `EVP_MD_CTX_destroy' function.])) | ||
| 10153 | fi | ||
| 10154 | if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then | ||
| 10155 | AC_CHECK_LIB(ssl, DTLSv1_method, | ||
| 10156 | @@ -408,12 +405,11 @@ if test "$with_libwrap" != "no"; then | ||
| 10157 | LIBS="$LIBS -lwrap" | ||
| 10158 | AC_MSG_CHECKING([for TCP wrappers library -lwrap]) | ||
| 10159 | # XXX: should check for hosts_ctl | ||
| 10160 | - AC_TRY_LINK( | ||
| 10161 | - [#include <sys/types.h> | ||
| 10162 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> | ||
| 10163 | #include <tcpd.h> | ||
| 10164 | int allow_severity = 0; | ||
| 10165 | - int deny_severity = 0;], | ||
| 10166 | - [hosts_access((void *)0)], | ||
| 10167 | + int deny_severity = 0;]], | ||
| 10168 | + [[hosts_access((void *)0)]])], | ||
| 10169 | [AC_MSG_RESULT([yes]) | ||
| 10170 | AC_DEFINE(NETSNMP_USE_LIBWRAP) | ||
| 10171 | test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib" | ||
| 10172 | @@ -423,12 +419,11 @@ if test "$with_libwrap" != "no"; then | ||
| 10173 | AC_CHECK_FUNC(yp_get_default_domain, , | ||
| 10174 | AC_CHECK_LIB(nsl, yp_get_default_domain)) | ||
| 10175 | AC_MSG_CHECKING([for TCP wrappers library -lwrap linked with -lnsl]) | ||
| 10176 | - AC_TRY_LINK( | ||
| 10177 | - [#include <sys/types.h> | ||
| 10178 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> | ||
| 10179 | #include <tcpd.h> | ||
| 10180 | int allow_severity = 0; | ||
| 10181 | - int deny_severity = 0;], | ||
| 10182 | - [hosts_access((void *)0)], | ||
| 10183 | + int deny_severity = 0;]], | ||
| 10184 | + [[hosts_access((void *)0)]])], | ||
| 10185 | [AC_MSG_RESULT(yes) | ||
| 10186 | AC_DEFINE(NETSNMP_USE_LIBWRAP) | ||
| 10187 | test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib" | ||
| 10188 | @@ -454,6 +449,17 @@ if test "x$with_mysql" = "xyes" ; then | ||
| 10189 | fi | ||
| 10190 | MYSQL_LIBS=`$MYSQLCONFIG --libs` | ||
| 10191 | MYSQL_INCLUDES=`$MYSQLCONFIG --cflags` | ||
| 10192 | + AC_MSG_CHECKING([whether MY_INIT() works]) | ||
| 10193 | + _libs="${LIBS}" | ||
| 10194 | + _cppflags="${CPPFLAGS}" | ||
| 10195 | + LIBS="${LIBS} ${MYSQL_LIBS}" | ||
| 10196 | + CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}" | ||
| 10197 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mysql/my_global.h> | ||
| 10198 | + #include <mysql/my_sys.h>]], [[MY_INIT("my_init_test")]])],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no) | ||
| 10199 | + AC_DEFINE([HAVE_BROKEN_LIBMYSQLCLIENT], 1, | ||
| 10200 | + [Define if using MY_INIT() causes a linker error])]) | ||
| 10201 | + CPPFLAGS="${_cppflags}" | ||
| 10202 | + LIBS="${_libs}" | ||
| 10203 | AC_MSG_CACHE_ADD(MYSQL Trap Logging: enabled) | ||
| 10204 | else | ||
| 10205 | AC_MSG_CACHE_ADD(MYSQL Trap Logging: unavailable) | ||
| 10206 | diff --git a/configure.d/config_os_struct_members b/configure.d/config_os_struct_members | ||
| 10207 | index 17bb489..9f015ac 100644 | ||
| 10208 | --- a/configure.d/config_os_struct_members | ||
| 10209 | +++ b/configure.d/config_os_struct_members | ||
| 10210 | @@ -57,6 +57,18 @@ AC_CHECK_MEMBERS([struct dirent.d_type],,,[ | ||
| 10211 | #endif | ||
| 10212 | ]]) | ||
| 10213 | |||
| 10214 | +# struct ethtool_cmd | ||
| 10215 | +# | ||
| 10216 | +if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then | ||
| 10217 | +AC_CHECK_MEMBERS([struct ethtool_cmd.speed_hi],,,[ | ||
| 10218 | + AC_INCLUDES_DEFAULT() | ||
| 10219 | + [ | ||
| 10220 | +#ifdef HAVE_LINUX_ETHTOOL_H | ||
| 10221 | +#include <linux/ethtool.h> | ||
| 10222 | +#endif | ||
| 10223 | + ]]) | ||
| 10224 | +fi | ||
| 10225 | + | ||
| 10226 | # struct ipstat | ||
| 10227 | # Agent: | ||
| 10228 | # | ||
| 10229 | @@ -310,6 +322,28 @@ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[ | ||
| 10230 | #endif | ||
| 10231 | ]]) | ||
| 10232 | |||
| 10233 | +# extern timezone | ||
| 10234 | +AC_MSG_CHECKING([extern timezone]) | ||
| 10235 | +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ | ||
| 10236 | +#if TIME_WITH_SYS_TIME | ||
| 10237 | +# include <sys/time.h> | ||
| 10238 | +# include <time.h> | ||
| 10239 | +#else | ||
| 10240 | +# if HAVE_SYS_TIME_H | ||
| 10241 | +# include <sys/time.h> | ||
| 10242 | +# else | ||
| 10243 | +# include <time.h> | ||
| 10244 | +# endif | ||
| 10245 | +#endif | ||
| 10246 | +]], [[ | ||
| 10247 | + return timezone; | ||
| 10248 | +]])], [ | ||
| 10249 | +AC_MSG_RESULT([yes]) | ||
| 10250 | +AC_DEFINE([HAVE_TIMEZONE_VARIABLE], [1], [Define if a timezone variable is declared in <sys/time.h>]) | ||
| 10251 | +], [ | ||
| 10252 | +AC_MSG_RESULT([no]) | ||
| 10253 | +]) | ||
| 10254 | + | ||
| 10255 | # struct timezone | ||
| 10256 | # Library: | ||
| 10257 | # | ||
| 10258 | diff --git a/configure.d/config_project_with_enable b/configure.d/config_project_with_enable | ||
| 10259 | index 732742b..2cf7aec 100644 | ||
| 10260 | --- a/configure.d/config_project_with_enable | ||
| 10261 | +++ b/configure.d/config_project_with_enable | ||
| 10262 | @@ -93,7 +93,12 @@ NETSNMP_ARG_WITH(openssl, | ||
| 10263 | elif test "x$withval" = "xno"; then | ||
| 10264 | tryopenssl=no | ||
| 10265 | elif test -d "$withval"; then | ||
| 10266 | - AC_ADD_SEARCH_PATH($withval) | ||
| 10267 | + if test -d "$withval/lib/MinGW"; then | ||
| 10268 | + LDFLAGS="-L$withval/lib/MinGW $LDFLAGS" | ||
| 10269 | + CPPFLAGS="-I$withval/include $CPPFLAGS" | ||
| 10270 | + else | ||
| 10271 | + AC_ADD_SEARCH_PATH($withval) | ||
| 10272 | + fi | ||
| 10273 | tryopenssl=yes | ||
| 10274 | askedopenssl=yes | ||
| 10275 | fi, | ||
| 10276 | diff --git a/dist/extractnews b/dist/extractnews | ||
| 10277 | index 848909a..bce94c9 100755 | ||
| 10278 | --- a/dist/extractnews | ||
| 10279 | +++ b/dist/extractnews | ||
| 10280 | @@ -19,12 +19,13 @@ LocalGetOptions(\%opts, | ||
| 10281 | "", | ||
| 10282 | ['c|changes-file=s','A file to save CHANGES entries to'], | ||
| 10283 | ['n|news-file=s','A file to save NEWS entries to'], | ||
| 10284 | + ['d|debug-line=s', 'Debugging output for lines matching STRING'], | ||
| 10285 | "", | ||
| 10286 | ['GUI:otherargs_text','Input files to parse'], | ||
| 10287 | ); | ||
| 10288 | |||
| 10289 | my $maybecontinue = 0; | ||
| 10290 | -my $lasttext = 0; | ||
| 10291 | +my $lasttext = ""; | ||
| 10292 | my $lastfile; | ||
| 10293 | my $lastcomponent; | ||
| 10294 | |||
| 10295 | @@ -41,32 +42,51 @@ foreach my $argv (@ARGV) { | ||
| 10296 | |||
| 10297 | last if ($opts{'e'} && /$opts{e}/o); | ||
| 10298 | |||
| 10299 | + print STDERR "here: $_" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10300 | + | ||
| 10301 | # don't use this: | ||
| 10302 | # FILE: BUGS: 123,456: text | ||
| 10303 | ($file, $patbug, $nums, $text) = | ||
| 10304 | /(NEWS|CHANGES):\s*-*\s*\[*(BUG|PATCH)(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/; | ||
| 10305 | |||
| 10306 | + print STDERR " 1:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10307 | + | ||
| 10308 | # or this: | ||
| 10309 | # FILE: component - text | ||
| 10310 | ($file, $component, $text) = | ||
| 10311 | /(NEWS|CHANGES):\s*(\w+)\s*-+\s*(.*)/ if (!$file); | ||
| 10312 | |||
| 10313 | + print STDERR " 2:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10314 | + | ||
| 10315 | # what you should use: | ||
| 10316 | - # FILE: component: text | ||
| 10317 | - # or | ||
| 10318 | # FILE: component: BUGS: 123,456: text | ||
| 10319 | # | ||
| 10320 | # or | ||
| 10321 | # FILE: component: PATCH: 123,456: from someone text | ||
| 10322 | # FILE: component: PATCH: 123,456: from "someone long" text | ||
| 10323 | ($file, $component, $patbug, $nums, $text) = | ||
| 10324 | - /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file); | ||
| 10325 | + /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)(?:ES|S):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file); | ||
| 10326 | + | ||
| 10327 | + print STDERR " 3:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10328 | + | ||
| 10329 | + # or at least: | ||
| 10330 | + # FILE: component: text | ||
| 10331 | + ($file, $component, $text) = | ||
| 10332 | + /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*(.*)/ if (!$file); | ||
| 10333 | + | ||
| 10334 | + print STDERR " 4:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10335 | |||
| 10336 | # component left out | ||
| 10337 | # FILE: [BUGS: 123,456]: text | ||
| 10338 | ($file, $patbug, $nums, $text) = | ||
| 10339 | /(NEWS|CHANGES):\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/ if (!$file); | ||
| 10340 | |||
| 10341 | + print STDERR " 5:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10342 | + | ||
| 10343 | + if ($opts{'d'} && /$opts{'d'}/o) { | ||
| 10344 | + my $bogus = 1; # breakable point | ||
| 10345 | + } | ||
| 10346 | + | ||
| 10347 | if (!$file && $maybecontinue) { | ||
| 10348 | if (/^\s*(.+)$/) { | ||
| 10349 | $text = $1; | ||
| 10350 | @@ -94,7 +114,8 @@ foreach my $argv (@ARGV) { | ||
| 10351 | } else { | ||
| 10352 | $lasttext .= " $text"; | ||
| 10353 | } | ||
| 10354 | - $lasttext =~ s/^ //; | ||
| 10355 | + $lasttext =~ s/^ //; # get rid of leading spaces | ||
| 10356 | + $lasttext =~ s/^([a-z])/uc($1)/e; # capitalize the first letter | ||
| 10357 | $text = wrap(" - "," ","$lasttext") . "\n"; | ||
| 10358 | |||
| 10359 | # | ||
| 10360 | @@ -108,6 +129,7 @@ foreach my $argv (@ARGV) { | ||
| 10361 | $component =~ s/^snmp/0snmp/; | ||
| 10362 | $component =~ s/^agent/0snmpd/; # Merge "agent" into "snmpd" | ||
| 10363 | $component =~ s/^([A-Z])/zz\1/; | ||
| 10364 | + print STDERR " t:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o); | ||
| 10365 | push @{$output{$opts{'c'}}{$component}}, $text; | ||
| 10366 | push @{$output{$opts{'n'}}{$component}}, $text if ($file eq 'NEWS'); | ||
| 10367 | $lastfile = $file; | ||
| 10368 | diff --git a/dist/makerelease.xml b/dist/makerelease.xml | ||
| 10369 | index 1d65e2c..758e889 100644 | ||
| 10370 | --- a/dist/makerelease.xml | ||
| 10371 | +++ b/dist/makerelease.xml | ||
| 10372 | @@ -33,6 +33,15 @@ | ||
| 10373 | should be labeled ".rcN" like 5.4.1.rc1. | ||
| 10374 | </text> | ||
| 10375 | </step> | ||
| 10376 | + <step type="prompt" prompt="Enter the last version number:" | ||
| 10377 | + title="Enter the last version number" | ||
| 10378 | + parameter="LASTVERSION"> | ||
| 10379 | + <text> | ||
| 10380 | + Please enter the last version number that the changelog should be | ||
| 10381 | + generated from. This should be easy for a new release on a branch, | ||
| 10382 | + but may be more tricky for a main release. | ||
| 10383 | + </text> | ||
| 10384 | + </step> | ||
| 10385 | <step type="perl" title="Defining a second internal version string" | ||
| 10386 | mandatory="1"> | ||
| 10387 | <perl> | ||
| 10388 | @@ -41,6 +50,9 @@ | ||
| 10389 | $self->{'parameters'}{'VERSIONTAGNAME'} = | ||
| 10390 | "v" . $self->{'parameters'}{'VERSION'}; | ||
| 10391 | |||
| 10392 | + $self->{'parameters'}{'LASTVERSIONTAGNAME'} = | ||
| 10393 | + "v" . $self->{'parameters'}{'LASTVERSION'}; | ||
| 10394 | + | ||
| 10395 | # target version number (without preN/rcN) | ||
| 10396 | $self->{'parameters'}{'VERSIONTARGET'} = | ||
| 10397 | $self->{'parameters'}{'VERSION'}; | ||
| 10398 | @@ -361,22 +373,19 @@ | ||
| 10399 | <command>git commit -m "make depend for {VERSION}" `find . -name Makefile.depend`</command> | ||
| 10400 | </commands> | ||
| 10401 | </step> | ||
| 10402 | - <step type="system" stepname="changelog:svn2cl" title="changelog:svn2cl"> | ||
| 10403 | + <step type="system" stepname="changelog:create" title="Creating a changelog update"> | ||
| 10404 | <text>We need to extract the portions of the change logs | ||
| 10405 | committed to the repository.</text> | ||
| 10406 | - <!-- XXX: git2cl needs to be truncated quite a bit rather than searching the whole history --> | ||
| 10407 | - <!-- XXX: following branches properly may prove to be interesting --> | ||
| 10408 | <commands> | ||
| 10409 | - <command>git2cl | head -10000 > ChangeLog.add</command> | ||
| 10410 | - <command>perl dist/changelogfix < ChangeLog.add > ChangeLog.reallyadd</command> | ||
| 10411 | + <command>git log --no-merges {LASTVERSIONTAGNAME}..HEAD > ChangeLog.add</command> | ||
| 10412 | </commands> | ||
| 10413 | </step> | ||
| 10414 | <step type="informational" pause="true" stepname="changelog:manualedit" title="changelog:manualedit"> | ||
| 10415 | <text> | ||
| 10416 | You need to manually insert the *relevent* portions of | ||
| 10417 | - 'ChangeLog.reallyadd' into the ChangeLog file. | ||
| 10418 | + 'ChangeLog.add' into the ChangeLog file. | ||
| 10419 | |||
| 10420 | - I also suggest truncating ChangeLog.reallyadd to only contain | ||
| 10421 | + I also suggest truncating ChangeLog.add to only contain | ||
| 10422 | the *relevent* portions for this release, as this will make | ||
| 10423 | CHANGES.new2 and NEWS.new2 more accurate later on. | ||
| 10424 | |||
| 10425 | @@ -396,7 +405,7 @@ | ||
| 10426 | </step> | ||
| 10427 | <step type="system" stepname="docs:newnews" title="docs:newnews"> | ||
| 10428 | <commands> | ||
| 10429 | - <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.reallyadd</command> | ||
| 10430 | + <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.add</command> | ||
| 10431 | </commands> | ||
| 10432 | </step> | ||
| 10433 | <step type="informational" pause="true" stepname="docs:README-and-NEWS" title="docs:README"> | ||
| 10434 | diff --git a/dist/release b/dist/release | ||
| 10435 | index 9e02b5c..52b45b1 100644 | ||
| 10436 | --- a/dist/release | ||
| 10437 | +++ b/dist/release | ||
| 10438 | @@ -4,4 +4,4 @@ | ||
| 10439 | # a branch name followed by 'rc' when the branch is in rc phase of a release. | ||
| 10440 | # | ||
| 10441 | #master rc | ||
| 10442 | -V5-7-patches rc | ||
| 10443 | +#V5-7-patches rc | ||
| 10444 | diff --git a/doxygen.conf b/doxygen.conf | ||
| 10445 | index 6b5eb58..20e457d 100644 | ||
| 10446 | --- a/doxygen.conf | ||
| 10447 | +++ b/doxygen.conf | ||
| 10448 | @@ -280,7 +280,7 @@ WARNINGS = YES | ||
| 10449 | # for undocumented members. If EXTRACT_ALL is set to YES then this flag will | ||
| 10450 | # automatically be disabled. | ||
| 10451 | |||
| 10452 | -WARN_IF_UNDOCUMENTED = YES | ||
| 10453 | +WARN_IF_UNDOCUMENTED = NO | ||
| 10454 | |||
| 10455 | # The WARN_FORMAT tag determines the format of the warning messages that | ||
| 10456 | # doxygen can produce. The string should contain the $file, $line, and $text | ||
| 10457 | diff --git a/include/net-snmp/agent/auto_nlist.h b/include/net-snmp/agent/auto_nlist.h | ||
| 10458 | index c7cd872..21b6b8c 100644 | ||
| 10459 | --- a/include/net-snmp/agent/auto_nlist.h | ||
| 10460 | +++ b/include/net-snmp/agent/auto_nlist.h | ||
| 10461 | @@ -12,9 +12,9 @@ extern "C" { | ||
| 10462 | #endif | ||
| 10463 | |||
| 10464 | #ifdef NETSNMP_CAN_USE_NLIST | ||
| 10465 | -int auto_nlist(const char *, char *, int); | ||
| 10466 | +int auto_nlist(const char *, char *, size_t); | ||
| 10467 | long auto_nlist_value(const char *); | ||
| 10468 | -int KNLookup(struct nlist *, int, char *, int); | ||
| 10469 | +int KNLookup(struct nlist *, int, char *, size_t); | ||
| 10470 | #else | ||
| 10471 | int auto_nlist_noop(void); | ||
| 10472 | # define auto_nlist(x,y,z) auto_nlist_noop() | ||
| 10473 | diff --git a/include/net-snmp/agent/hardware/cpu.h b/include/net-snmp/agent/hardware/cpu.h | ||
| 10474 | index bc6f75b..f6e43e5 100644 | ||
| 10475 | --- a/include/net-snmp/agent/hardware/cpu.h | ||
| 10476 | +++ b/include/net-snmp/agent/hardware/cpu.h | ||
| 10477 | @@ -3,18 +3,18 @@ extern int cpu_num; | ||
| 10478 | |||
| 10479 | /* For rolling averages */ | ||
| 10480 | struct netsnmp_cpu_history { | ||
| 10481 | - long user_hist; | ||
| 10482 | - long sys_hist; | ||
| 10483 | - long idle_hist; | ||
| 10484 | - long nice_hist; | ||
| 10485 | - long total_hist; | ||
| 10486 | + unsigned long long user_hist; | ||
| 10487 | + unsigned long long sys_hist; | ||
| 10488 | + unsigned long long idle_hist; | ||
| 10489 | + unsigned long long nice_hist; | ||
| 10490 | + unsigned long long total_hist; | ||
| 10491 | |||
| 10492 | - long ctx_hist; | ||
| 10493 | - long intr_hist; | ||
| 10494 | - long swpi_hist; | ||
| 10495 | - long swpo_hist; | ||
| 10496 | - long pagei_hist; | ||
| 10497 | - long pageo_hist; | ||
| 10498 | + unsigned long long ctx_hist; | ||
| 10499 | + unsigned long long intr_hist; | ||
| 10500 | + unsigned long long swpi_hist; | ||
| 10501 | + unsigned long long swpo_hist; | ||
| 10502 | + unsigned long long pagei_hist; | ||
| 10503 | + unsigned long long pageo_hist; | ||
| 10504 | }; | ||
| 10505 | |||
| 10506 | struct netsnmp_cpu_info_s { | ||
| 10507 | @@ -25,30 +25,30 @@ struct netsnmp_cpu_info_s { | ||
| 10508 | int status; | ||
| 10509 | |||
| 10510 | /* For UCD cpu stats */ | ||
| 10511 | - long user_ticks; | ||
| 10512 | - long nice_ticks; | ||
| 10513 | - long sys_ticks; | ||
| 10514 | - long idle_ticks; | ||
| 10515 | - long wait_ticks; | ||
| 10516 | - long kern_ticks; | ||
| 10517 | - long intrpt_ticks; | ||
| 10518 | - long sirq_ticks; | ||
| 10519 | - long steal_ticks; | ||
| 10520 | - long guest_ticks; | ||
| 10521 | - long guestnice_ticks; | ||
| 10522 | + unsigned long long user_ticks; | ||
| 10523 | + unsigned long long nice_ticks; | ||
| 10524 | + unsigned long long sys_ticks; | ||
| 10525 | + unsigned long long idle_ticks; | ||
| 10526 | + unsigned long long wait_ticks; | ||
| 10527 | + unsigned long long kern_ticks; | ||
| 10528 | + unsigned long long intrpt_ticks; | ||
| 10529 | + unsigned long long sirq_ticks; | ||
| 10530 | + unsigned long long steal_ticks; | ||
| 10531 | + unsigned long long guest_ticks; | ||
| 10532 | + unsigned long long guestnice_ticks; | ||
| 10533 | |||
| 10534 | - long total_ticks; | ||
| 10535 | - long sys2_ticks; /* For non-atomic system counts */ | ||
| 10536 | + unsigned long long total_ticks; | ||
| 10537 | + unsigned long long sys2_ticks; /* For non-atomic system counts */ | ||
| 10538 | |||
| 10539 | /* For paging-related UCD stats */ | ||
| 10540 | /* XXX - Do these belong elsewhere ?? */ | ||
| 10541 | /* XXX - Do Not Use - Subject to Change */ | ||
| 10542 | - long pageIn; | ||
| 10543 | - long pageOut; | ||
| 10544 | - long swapIn; | ||
| 10545 | - long swapOut; | ||
| 10546 | - long nInterrupts; | ||
| 10547 | - long nCtxSwitches; | ||
| 10548 | + unsigned long long pageIn; | ||
| 10549 | + unsigned long long pageOut; | ||
| 10550 | + unsigned long long swapIn; | ||
| 10551 | + unsigned long long swapOut; | ||
| 10552 | + unsigned long long nInterrupts; | ||
| 10553 | + unsigned long long nCtxSwitches; | ||
| 10554 | |||
| 10555 | struct netsnmp_cpu_history *history; | ||
| 10556 | |||
| 10557 | diff --git a/include/net-snmp/agent/snmp_agent.h b/include/net-snmp/agent/snmp_agent.h | ||
| 10558 | index 240ca94..aad8837 100644 | ||
| 10559 | --- a/include/net-snmp/agent/snmp_agent.h | ||
| 10560 | +++ b/include/net-snmp/agent/snmp_agent.h | ||
| 10561 | @@ -271,6 +271,7 @@ extern "C" { | ||
| 10562 | u_long netsnmp_marker_uptime(marker_t pm); | ||
| 10563 | u_long netsnmp_timeval_uptime(struct timeval *tv); | ||
| 10564 | const_marker_t netsnmp_get_agent_starttime(void); | ||
| 10565 | + uint64_t netsnmp_get_agent_runtime(void); | ||
| 10566 | void netsnmp_set_agent_starttime(marker_t s); | ||
| 10567 | u_long netsnmp_get_agent_uptime(void); | ||
| 10568 | void netsnmp_set_agent_uptime(u_long hsec); | ||
| 10569 | diff --git a/include/net-snmp/library/default_store.h b/include/net-snmp/library/default_store.h | ||
| 10570 | index e1b2e24..3c3c519 100644 | ||
| 10571 | --- a/include/net-snmp/library/default_store.h | ||
| 10572 | +++ b/include/net-snmp/library/default_store.h | ||
| 10573 | @@ -37,7 +37,8 @@ extern "C" { | ||
| 10574 | * begin storage definitions | ||
| 10575 | */ | ||
| 10576 | /** | ||
| 10577 | - * @def NETSNMP_DS_LIBRARY_ID These definitions correspond with the "storid" argument to the API | ||
| 10578 | + * @def NETSNMP_DS_LIBRARY_ID | ||
| 10579 | + * These definitions correspond with the "storid" argument to the API. | ||
| 10580 | */ | ||
| 10581 | #define NETSNMP_DS_LIBRARY_ID 0 | ||
| 10582 | #define NETSNMP_DS_APPLICATION_ID 1 | ||
| 10583 | diff --git a/include/net-snmp/library/large_fd_set.h b/include/net-snmp/library/large_fd_set.h | ||
| 10584 | index 67a473c..9b547cd 100644 | ||
| 10585 | --- a/include/net-snmp/library/large_fd_set.h | ||
| 10586 | +++ b/include/net-snmp/library/large_fd_set.h | ||
| 10587 | @@ -16,7 +16,7 @@ | ||
| 10588 | #include <sys/select.h> | ||
| 10589 | #endif | ||
| 10590 | |||
| 10591 | -#if defined(HAVE_WINSOCK_H) && ! defined(_WINSOCKAPI_) && ! defined(_WINSOCK_H) | ||
| 10592 | +#if defined(HAVE_WINSOCK_H) && !defined(_WINSOCKAPI_) && !defined(_WINSOCK_H) | ||
| 10593 | #error <winsock.h> or <winsock2.h> must have been included before this file. | ||
| 10594 | #endif | ||
| 10595 | |||
| 10596 | @@ -44,15 +44,19 @@ extern "C" { | ||
| 10597 | |||
| 10598 | /** | ||
| 10599 | * Test whether set *fdset contains socket fd. | ||
| 10600 | - * Do nothing if fd >= fdset->lfs_setsize. | ||
| 10601 | + * Evaluates to zero (false) if fd >= fdset->lfs_setsize. | ||
| 10602 | */ | ||
| 10603 | #define NETSNMP_LARGE_FD_ISSET(fd, fdset) \ | ||
| 10604 | netsnmp_large_fd_is_set(fd, fdset) | ||
| 10605 | |||
| 10606 | -#if ! defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 10607 | +#if !defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 10608 | |||
| 10609 | -/** Number of bytes needed to store setsize file descriptors. */ | ||
| 10610 | -#define NETSNMP_FD_SET_BYTES(setsize) (sizeof(fd_set) + sizeof(SOCKET) * (setsize - FD_SETSIZE)) | ||
| 10611 | +/** | ||
| 10612 | + * Number of bytes needed to store a number of file descriptors as a | ||
| 10613 | + * struct fd_set. | ||
| 10614 | + */ | ||
| 10615 | +#define NETSNMP_FD_SET_BYTES(setsize) \ | ||
| 10616 | + (sizeof(fd_set) + ((setsize) - FD_SETSIZE) * sizeof(SOCKET)) | ||
| 10617 | |||
| 10618 | /** Remove all sockets from the set *fdset. */ | ||
| 10619 | #define NETSNMP_LARGE_FD_ZERO(fdset) \ | ||
| 10620 | @@ -74,28 +78,29 @@ int netsnmp_large_fd_is_set(SOCKET fd, netsnmp_large_fd_set *fdset); | ||
| 10621 | * According to SUSv2, this array must have the name fds_bits. See also | ||
| 10622 | * <a href="http://www.opengroup.org/onlinepubs/007908775/xsh/systime.h.html">The Single UNIX Specification, Version 2, <sys/time.h></a>. | ||
| 10623 | */ | ||
| 10624 | -#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits) | ||
| 10625 | +#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits[0]) | ||
| 10626 | |||
| 10627 | -/** Number of bits in one element of the fd_set::fds_bits array. */ | ||
| 10628 | +/** Number of bits in one element of the fd_set.fds_bits array. */ | ||
| 10629 | #define NETSNMP_BITS_PER_FD_MASK (8 * NETSNMP_FD_MASK_SIZE) | ||
| 10630 | |||
| 10631 | /** Number of elements needed for the fds_bits array. */ | ||
| 10632 | #define NETSNMP_FD_SET_ELEM_COUNT(setsize) \ | ||
| 10633 | (setsize + NETSNMP_BITS_PER_FD_MASK - 1) / NETSNMP_BITS_PER_FD_MASK | ||
| 10634 | |||
| 10635 | -/** Number of bytes needed to store setsize file descriptors. */ | ||
| 10636 | -#define NETSNMP_FD_SET_BYTES(setsize) \ | ||
| 10637 | - (NETSNMP_FD_SET_ELEM_COUNT(setsize) * NETSNMP_FD_MASK_SIZE) | ||
| 10638 | +/** | ||
| 10639 | + * Number of bytes needed to store a number of file descriptors as a | ||
| 10640 | + * struct fd_set. | ||
| 10641 | + */ | ||
| 10642 | +#define NETSNMP_FD_SET_BYTES(setsize) \ | ||
| 10643 | + (sizeof(fd_set) + NETSNMP_FD_SET_ELEM_COUNT((setsize) - FD_SETSIZE) \ | ||
| 10644 | + * NETSNMP_FD_MASK_SIZE) | ||
| 10645 | |||
| 10646 | /** Remove all file descriptors from the set *fdset. */ | ||
| 10647 | -#define NETSNMP_LARGE_FD_ZERO(fdset) \ | ||
| 10648 | - do { \ | ||
| 10649 | - int __i; \ | ||
| 10650 | - fd_set *__arr = &(fdset)->lfs_set; \ | ||
| 10651 | - __i = NETSNMP_FD_SET_ELEM_COUNT((fdset)->lfs_setsize); \ | ||
| 10652 | - for ( ; __i > 0; __i--) \ | ||
| 10653 | - __arr->fds_bits[__i - 1] = 0; \ | ||
| 10654 | - } while (0) | ||
| 10655 | +#define NETSNMP_LARGE_FD_ZERO(fdset) \ | ||
| 10656 | + do { \ | ||
| 10657 | + memset((fdset)->lfs_setptr, 0, \ | ||
| 10658 | + NETSNMP_FD_SET_BYTES((fdset)->lfs_setsize)); \ | ||
| 10659 | + } while (0) | ||
| 10660 | |||
| 10661 | |||
| 10662 | void netsnmp_large_fd_setfd( int fd, netsnmp_large_fd_set *fdset); | ||
| 10663 | @@ -118,8 +123,10 @@ void netsnmp_large_fd_set_init( netsnmp_large_fd_set *fdset, int setsize); | ||
| 10664 | /** | ||
| 10665 | * Modify the size of a file descriptor set and preserve the first | ||
| 10666 | * min(fdset->lfs_setsize, setsize) file descriptors. | ||
| 10667 | + * | ||
| 10668 | + * Returns 1 upon success or 0 if memory allocation failed. | ||
| 10669 | */ | ||
| 10670 | -void netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize); | ||
| 10671 | +int netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize); | ||
| 10672 | |||
| 10673 | /** | ||
| 10674 | * Synchronous I/O multiplexing for large file descriptor sets. | ||
| 10675 | diff --git a/include/net-snmp/library/oid.h b/include/net-snmp/library/oid.h | ||
| 10676 | index 5468713..e7adf41 100644 | ||
| 10677 | --- a/include/net-snmp/library/oid.h | ||
| 10678 | +++ b/include/net-snmp/library/oid.h | ||
| 10679 | @@ -7,7 +7,7 @@ | ||
| 10680 | |||
| 10681 | #ifndef EIGHTBIT_SUBIDS | ||
| 10682 | typedef u_long oid; | ||
| 10683 | -#define MAX_SUBID 0xFFFFFFFF | ||
| 10684 | +#define MAX_SUBID 0xFFFFFFFFUL | ||
| 10685 | #define NETSNMP_PRIo "l" | ||
| 10686 | #else | ||
| 10687 | typedef uint8_t oid; | ||
| 10688 | diff --git a/include/net-snmp/library/snmp_alarm.h b/include/net-snmp/library/snmp_alarm.h | ||
| 10689 | index 0fe2cf1..8437c1d 100644 | ||
| 10690 | --- a/include/net-snmp/library/snmp_alarm.h | ||
| 10691 | +++ b/include/net-snmp/library/snmp_alarm.h | ||
| 10692 | @@ -55,6 +55,8 @@ extern "C" { | ||
| 10693 | NETSNMP_IMPORT void run_alarms(void); | ||
| 10694 | RETSIGTYPE alarm_handler(int a); | ||
| 10695 | void set_an_alarm(void); | ||
| 10696 | + int netsnmp_get_next_alarm_time(struct timeval *alarm_tm, | ||
| 10697 | + const struct timeval *now); | ||
| 10698 | int get_next_alarm_delay_time(struct timeval *delta); | ||
| 10699 | |||
| 10700 | |||
| 10701 | diff --git a/include/net-snmp/library/snmp_api.h b/include/net-snmp/library/snmp_api.h | ||
| 10702 | index e32d62b..f57b678 100644 | ||
| 10703 | --- a/include/net-snmp/library/snmp_api.h | ||
| 10704 | +++ b/include/net-snmp/library/snmp_api.h | ||
| 10705 | @@ -418,7 +418,6 @@ typedef struct request_list { | ||
| 10706 | #endif | ||
| 10707 | |||
| 10708 | int create_user_from_session(netsnmp_session * session); | ||
| 10709 | - int snmp_get_fd_for_session(struct snmp_session *sessp); | ||
| 10710 | int snmpv3_probe_contextEngineID_rfc5343(void *slp, | ||
| 10711 | netsnmp_session *session); | ||
| 10712 | |||
| 10713 | diff --git a/include/net-snmp/library/snmp_enum.h b/include/net-snmp/library/snmp_enum.h | ||
| 10714 | index 3ab470e..237891d 100644 | ||
| 10715 | --- a/include/net-snmp/library/snmp_enum.h | ||
| 10716 | +++ b/include/net-snmp/library/snmp_enum.h | ||
| 10717 | @@ -94,10 +94,11 @@ extern "C" { | ||
| 10718 | * Persistent enumeration lists | ||
| 10719 | */ | ||
| 10720 | void se_store_enum_list(struct snmp_enum_list *new_list, | ||
| 10721 | - const char *token, char *type); | ||
| 10722 | - void se_store_list(unsigned int major, unsigned int minor, char *type); | ||
| 10723 | + const char *token, const char *type); | ||
| 10724 | + void se_store_list(unsigned int major, unsigned int minor, | ||
| 10725 | + const char *type); | ||
| 10726 | void se_clear_slist(const char *listname); | ||
| 10727 | - void se_store_slist(const char *listname, char *type); | ||
| 10728 | + void se_store_slist(const char *listname, const char *type); | ||
| 10729 | int se_store_slist_callback(int majorID, int minorID, | ||
| 10730 | void *serverargs, void *clientargs); | ||
| 10731 | void se_read_conf(const char *word, char *cptr); | ||
| 10732 | diff --git a/include/net-snmp/library/snmp_parse_args.h b/include/net-snmp/library/snmp_parse_args.h | ||
| 10733 | index 384aff0..1ad63e0 100644 | ||
| 10734 | --- a/include/net-snmp/library/snmp_parse_args.h | ||
| 10735 | +++ b/include/net-snmp/library/snmp_parse_args.h | ||
| 10736 | @@ -1,8 +1,5 @@ | ||
| 10737 | #ifndef SNMP_PARSE_ARGS_H | ||
| 10738 | #define SNMP_PARSE_ARGS_H | ||
| 10739 | -#ifdef __cplusplus | ||
| 10740 | -extern "C" { | ||
| 10741 | -#endif | ||
| 10742 | |||
| 10743 | /** | ||
| 10744 | * @file snmp_parse_args.h | ||
| 10745 | @@ -11,6 +8,10 @@ extern "C" { | ||
| 10746 | * line arguments | ||
| 10747 | */ | ||
| 10748 | |||
| 10749 | +#ifdef __cplusplus | ||
| 10750 | +extern "C" { | ||
| 10751 | +#endif | ||
| 10752 | + | ||
| 10753 | /** Don't enable any logging even if there is no -L argument */ | ||
| 10754 | #define NETSNMP_PARSE_ARGS_NOLOGGING 0x0001 | ||
| 10755 | /** Don't zero out sensitive arguments as they are not on the command line | ||
| 10756 | @@ -47,11 +48,12 @@ extern "C" { | ||
| 10757 | * from it. | ||
| 10758 | * @param argc Number of elements in argv | ||
| 10759 | * @param argv string array of at least argc elements | ||
| 10760 | + * @param session | ||
| 10761 | * @param localOpts Additional option characters to accept | ||
| 10762 | * @param proc function pointer used to process any unhandled arguments | ||
| 10763 | * @param flags flags directing how to handle the string | ||
| 10764 | * | ||
| 10765 | - * @reval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success | ||
| 10766 | + * @retval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success | ||
| 10767 | * @retval #NETSNMP_PARSE_ARGS_SUCCESS_EXIT when the application is expected | ||
| 10768 | * to exit with zero exit code (e.g. '-V' option was found) | ||
| 10769 | * @retval #NETSNMP_PARSE_ARGS_ERROR_USAGE when the function failed to parse | ||
| 10770 | diff --git a/include/net-snmp/library/system.h b/include/net-snmp/library/system.h | ||
| 10771 | index 9ae1067..5c58e4a 100644 | ||
| 10772 | --- a/include/net-snmp/library/system.h | ||
| 10773 | +++ b/include/net-snmp/library/system.h | ||
| 10774 | @@ -194,6 +194,11 @@ SOFTWARE. | ||
| 10775 | NETSNMP_IMPORT | ||
| 10776 | size_t strlcpy(char *, const char *, size_t); | ||
| 10777 | #endif | ||
| 10778 | +#ifndef HAVE_STRLCAT | ||
| 10779 | + NETSNMP_IMPORT | ||
| 10780 | + size_t strlcat(char * __restrict, const char * __restrict, | ||
| 10781 | + size_t); | ||
| 10782 | +#endif | ||
| 10783 | |||
| 10784 | int netsnmp_os_prematch(const char *ospmname, | ||
| 10785 | const char *ospmrelprefix); | ||
| 10786 | diff --git a/include/net-snmp/library/testing.h b/include/net-snmp/library/testing.h | ||
| 10787 | index aabe52f..ec6135a 100644 | ||
| 10788 | --- a/include/net-snmp/library/testing.h | ||
| 10789 | +++ b/include/net-snmp/library/testing.h | ||
| 10790 | @@ -7,10 +7,10 @@ | ||
| 10791 | static int __test_counter = 0; | ||
| 10792 | static int __did_plan = 0; | ||
| 10793 | |||
| 10794 | -#define OK(isok, description) { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); } | ||
| 10795 | +#define OK(isok, description) do { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); } while (0) | ||
| 10796 | |||
| 10797 | -#define OKF(isok, description) { printf("%s %d - \n", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); } | ||
| 10798 | +#define OKF(isok, description) do { printf("%s %d - ", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); } while (0) | ||
| 10799 | |||
| 10800 | -#define PLAN(number) { printf("1..%d\n", number); __did_plan = 1;} | ||
| 10801 | +#define PLAN(number) do { printf("1..%d\n", number); __did_plan = 1; } while (0) | ||
| 10802 | |||
| 10803 | #endif /* NETSNMP_LIBRARY_TESTING_H */ | ||
| 10804 | diff --git a/include/net-snmp/library/tools.h b/include/net-snmp/library/tools.h | ||
| 10805 | index d3514b7..66415da 100644 | ||
| 10806 | --- a/include/net-snmp/library/tools.h | ||
| 10807 | +++ b/include/net-snmp/library/tools.h | ||
| 10808 | @@ -113,7 +113,7 @@ extern "C" { | ||
| 10809 | * Expands to string with value of the s. | ||
| 10810 | * If s is macro, the resulting string is value of the macro. | ||
| 10811 | * Example: | ||
| 10812 | - * #define TEST 1234 | ||
| 10813 | + * \#define TEST 1234 | ||
| 10814 | * SNMP_MACRO_VAL_TO_STR(TEST) expands to "1234" | ||
| 10815 | * SNMP_MACRO_VAL_TO_STR(TEST+1) expands to "1234+1" | ||
| 10816 | */ | ||
| 10817 | @@ -286,8 +286,8 @@ extern "C" { | ||
| 10818 | NETSNMP_IMPORT | ||
| 10819 | u_long uatime_hdiff(const_marker_t first, const_marker_t second); /* 1/100th sec */ | ||
| 10820 | NETSNMP_IMPORT | ||
| 10821 | - int atime_ready(const_marker_t pm, int deltaT); | ||
| 10822 | - int uatime_ready(const_marker_t pm, unsigned int deltaT); | ||
| 10823 | + int atime_ready(const_marker_t pm, int delta_ms); | ||
| 10824 | + int uatime_ready(const_marker_t pm, unsigned int delta_ms); | ||
| 10825 | |||
| 10826 | int marker_tticks(const_marker_t pm); | ||
| 10827 | int timeval_tticks(const struct timeval *tv); | ||
| 10828 | diff --git a/include/net-snmp/net-snmp-config.h.in b/include/net-snmp/net-snmp-config.h.in | ||
| 10829 | index d9b9d15..d6ef3ab 100644 | ||
| 10830 | --- a/include/net-snmp/net-snmp-config.h.in | ||
| 10831 | +++ b/include/net-snmp/net-snmp-config.h.in | ||
| 10832 | @@ -96,6 +96,9 @@ | ||
| 10833 | /* Define to 1 if you have the <asm/types.h> header file. */ | ||
| 10834 | #undef HAVE_ASM_TYPES_H | ||
| 10835 | |||
| 10836 | +/* Define if using MY_INIT() causes a linker error */ | ||
| 10837 | +#undef HAVE_BROKEN_LIBMYSQLCLIENT | ||
| 10838 | + | ||
| 10839 | /* Define to 1 if you have the `cgetnext' function. */ | ||
| 10840 | #undef HAVE_CGETNEXT | ||
| 10841 | |||
| 10842 | @@ -140,6 +143,12 @@ | ||
| 10843 | /* Define to 1 if you have the `eval_pv' function. */ | ||
| 10844 | #undef HAVE_EVAL_PV | ||
| 10845 | |||
| 10846 | +/* Define to 1 if you have the `EVP_MD_CTX_create' function. */ | ||
| 10847 | +#undef HAVE_EVP_MD_CTX_CREATE | ||
| 10848 | + | ||
| 10849 | +/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */ | ||
| 10850 | +#undef HAVE_EVP_MD_CTX_DESTROY | ||
| 10851 | + | ||
| 10852 | /* Define if you have EVP_sha224/256 in openssl */ | ||
| 10853 | #undef HAVE_EVP_SHA224 | ||
| 10854 | |||
| 10855 | @@ -152,12 +161,21 @@ | ||
| 10856 | /* Define to 1 if you have the <fcntl.h> header file. */ | ||
| 10857 | #undef HAVE_FCNTL_H | ||
| 10858 | |||
| 10859 | +/* Define to 1 if you have the `fgetc_unlocked' function. */ | ||
| 10860 | +#undef HAVE_FGETC_UNLOCKED | ||
| 10861 | + | ||
| 10862 | +/* Define to 1 if you have the `flockfile' function. */ | ||
| 10863 | +#undef HAVE_FLOCKFILE | ||
| 10864 | + | ||
| 10865 | /* Define to 1 if you have the `fork' function. */ | ||
| 10866 | #undef HAVE_FORK | ||
| 10867 | |||
| 10868 | /* Define to 1 if you have the <fstab.h> header file. */ | ||
| 10869 | #undef HAVE_FSTAB_H | ||
| 10870 | |||
| 10871 | +/* Define to 1 if you have the `funlockfile' function. */ | ||
| 10872 | +#undef HAVE_FUNLOCKFILE | ||
| 10873 | + | ||
| 10874 | /* Define to 1 if you have the `gai_strerror' function. */ | ||
| 10875 | #undef HAVE_GAI_STRERROR | ||
| 10876 | |||
| 10877 | @@ -746,6 +764,9 @@ | ||
| 10878 | /* Define to 1 if you have the <string.h> header file. */ | ||
| 10879 | #undef HAVE_STRING_H | ||
| 10880 | |||
| 10881 | +/* Define to 1 if you have the `strlcat' function. */ | ||
| 10882 | +#undef HAVE_STRLCAT | ||
| 10883 | + | ||
| 10884 | /* Define to 1 if you have the `strlcpy' function. */ | ||
| 10885 | #undef HAVE_STRLCPY | ||
| 10886 | |||
| 10887 | @@ -773,6 +794,9 @@ | ||
| 10888 | /* Define to 1 if `d_type' is a member of `struct dirent'. */ | ||
| 10889 | #undef HAVE_STRUCT_DIRENT_D_TYPE | ||
| 10890 | |||
| 10891 | +/* Define to 1 if `speed_hi' is a member of `struct ethtool_cmd'. */ | ||
| 10892 | +#undef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI | ||
| 10893 | + | ||
| 10894 | /* Define to 1 if `ifa_next' is a member of `struct ifaddr'. */ | ||
| 10895 | #undef HAVE_STRUCT_IFADDR_IFA_NEXT | ||
| 10896 | |||
| 10897 | @@ -1166,6 +1190,9 @@ | ||
| 10898 | /* Define to 1 if you have the `times' function. */ | ||
| 10899 | #undef HAVE_TIMES | ||
| 10900 | |||
| 10901 | +/* Define if a timezone variable is declared in <sys/time.h> */ | ||
| 10902 | +#undef HAVE_TIMEZONE_VARIABLE | ||
| 10903 | + | ||
| 10904 | /* Define to 1 if you have the <ufs/ffs/fs.h> header file. */ | ||
| 10905 | #undef HAVE_UFS_FFS_FS_H | ||
| 10906 | |||
| 10907 | diff --git a/include/net-snmp/session_api.h b/include/net-snmp/session_api.h | ||
| 10908 | index 9721fc4..88dbc41 100644 | ||
| 10909 | --- a/include/net-snmp/session_api.h | ||
| 10910 | +++ b/include/net-snmp/session_api.h | ||
| 10911 | @@ -147,12 +147,6 @@ extern "C" { | ||
| 10912 | int snmp_select_info2(int *, netsnmp_large_fd_set *, | ||
| 10913 | struct timeval *, int *); | ||
| 10914 | |||
| 10915 | - /* | ||
| 10916 | - * snmp_sess_select_info_flags() and | ||
| 10917 | - * snmp_sess_select_info2_flags() is similar to | ||
| 10918 | - * snmp_sess_select_info() and snmp_sess_select_info2(), but | ||
| 10919 | - * accepts a list of flags to control aspects of its behavior. | ||
| 10920 | - */ | ||
| 10921 | #define NETSNMP_SELECT_NOFLAGS 0x00 | ||
| 10922 | #define NETSNMP_SELECT_NOALARMS 0x01 | ||
| 10923 | NETSNMP_IMPORT | ||
| 10924 | diff --git a/include/net-snmp/system/netbsd.h b/include/net-snmp/system/netbsd.h | ||
| 10925 | index c67260d..1f22a44 100644 | ||
| 10926 | --- a/include/net-snmp/system/netbsd.h | ||
| 10927 | +++ b/include/net-snmp/system/netbsd.h | ||
| 10928 | @@ -34,8 +34,36 @@ | ||
| 10929 | |||
| 10930 | #define UDP_ADDRESSES_IN_HOST_ORDER 1 | ||
| 10931 | |||
| 10932 | +#ifdef netbsdelf6 | ||
| 10933 | +#define netbsd6 | ||
| 10934 | +#define netbsdelf5 | ||
| 10935 | +#endif | ||
| 10936 | +#ifdef netbsdelf5 | ||
| 10937 | +#define netbsd5 | ||
| 10938 | +#define netbsdelf4 | ||
| 10939 | +#endif | ||
| 10940 | +#ifdef netbsdelf4 | ||
| 10941 | +#define netbsd4 | ||
| 10942 | +#define netbsdelf3 | ||
| 10943 | +#endif | ||
| 10944 | +#ifdef netbsdelf3 | ||
| 10945 | +#define netbsd3 | ||
| 10946 | +#endif | ||
| 10947 | + | ||
| 10948 | +#if defined(netbsd6) && !defined(netbsd5) | ||
| 10949 | +#define netbsd5 netbsd5 | ||
| 10950 | +#endif | ||
| 10951 | +#if defined(netbsd5) && !defined(netbsd4) | ||
| 10952 | +#define netbsd4 netbsd4 | ||
| 10953 | +#endif | ||
| 10954 | +#if defined(netbsd4) && !defined(netbsd3) | ||
| 10955 | +#define netbsd3 netbsd3 | ||
| 10956 | +#endif | ||
| 10957 | +#if defined(netbsd3) && !defined(netbsd2) | ||
| 10958 | +#define netbsd2 netbsd2 | ||
| 10959 | +#endif | ||
| 10960 | #ifndef netbsd1 | ||
| 10961 | -# define netbsd1 netbsd1 | ||
| 10962 | +#define netbsd1 netbsd1 | ||
| 10963 | #endif | ||
| 10964 | |||
| 10965 | #if __NetBSD_Version__ >= 499005800 | ||
| 10966 | diff --git a/local/mib2c.container.conf b/local/mib2c.container.conf | ||
| 10967 | index c051b4c..e76621f 100644 | ||
| 10968 | --- a/local/mib2c.container.conf | ||
| 10969 | +++ b/local/mib2c.container.conf | ||
| 10970 | @@ -174,6 +174,7 @@ initialize_table_$i(void) | ||
| 10971 | */ | ||
| 10972 | if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) { | ||
| 10973 | snmp_log(LOG_ERR,"error registering table handler for $i\n"); | ||
| 10974 | + reg = NULL; /* it was freed inside netsnmp_register_table */ | ||
| 10975 | goto bail; | ||
| 10976 | } | ||
| 10977 | |||
| 10978 | diff --git a/local/mib2c.notify.conf b/local/mib2c.notify.conf | ||
| 10979 | index a8ee7e3..77f3330 100644 | ||
| 10980 | --- a/local/mib2c.notify.conf | ||
| 10981 | +++ b/local/mib2c.notify.conf | ||
| 10982 | @@ -30,7 +30,7 @@ int send_${i}_trap(void); | ||
| 10983 | #include <net-snmp/agent/net-snmp-agent-includes.h> | ||
| 10984 | #include "${name}.h" | ||
| 10985 | |||
| 10986 | -extern const oid snmptrap_oid; | ||
| 10987 | +extern const oid snmptrap_oid[]; | ||
| 10988 | extern const size_t snmptrap_oid_len; | ||
| 10989 | |||
| 10990 | @foreach $i notifications@ | ||
| 10991 | diff --git a/local/mib2c.table_data.conf b/local/mib2c.table_data.conf | ||
| 10992 | index d263914..2cc665c 100644 | ||
| 10993 | --- a/local/mib2c.table_data.conf | ||
| 10994 | +++ b/local/mib2c.table_data.conf | ||
| 10995 | @@ -348,6 +348,9 @@ ${i}_handler( | ||
| 10996 | */ | ||
| 10997 | case MODE_GET: | ||
| 10998 | for (request=requests; request; request=request->next) { | ||
| 10999 | + if (request->processed) | ||
| 11000 | + continue; | ||
| 11001 | + | ||
| 11002 | table_entry = (struct ${i}_entry *) | ||
| 11003 | netsnmp_tdata_extract_entry(request); | ||
| 11004 | table_info = netsnmp_extract_table_info( request); | ||
| 11005 | @@ -386,6 +389,9 @@ ${i}_handler( | ||
| 11006 | */ | ||
| 11007 | case MODE_SET_RESERVE1: | ||
| 11008 | for (request=requests; request; request=request->next) { | ||
| 11009 | + if (request->processed) | ||
| 11010 | + continue; | ||
| 11011 | + | ||
| 11012 | table_entry = (struct ${i}_entry *) | ||
| 11013 | netsnmp_tdata_extract_entry(request); | ||
| 11014 | table_info = netsnmp_extract_table_info( request); | ||
| 11015 | @@ -425,6 +431,9 @@ ${i}_handler( | ||
| 11016 | case MODE_SET_RESERVE2: | ||
| 11017 | @if $i.creatable@ | ||
| 11018 | for (request=requests; request; request=request->next) { | ||
| 11019 | + if (request->processed) | ||
| 11020 | + continue; | ||
| 11021 | + | ||
| 11022 | table_row = netsnmp_tdata_extract_row( request); | ||
| 11023 | table_data = netsnmp_tdata_extract_table(request); | ||
| 11024 | table_info = netsnmp_extract_table_info( request); | ||
| 11025 | @@ -492,6 +501,9 @@ ${i}_handler( | ||
| 11026 | case MODE_SET_FREE: | ||
| 11027 | @if $i.creatable@ | ||
| 11028 | for (request=requests; request; request=request->next) { | ||
| 11029 | + if (request->processed) | ||
| 11030 | + continue; | ||
| 11031 | + | ||
| 11032 | table_entry = (struct ${i}_entry *) | ||
| 11033 | netsnmp_tdata_extract_entry(request); | ||
| 11034 | table_row = netsnmp_tdata_extract_row( request); | ||
| 11035 | @@ -530,6 +542,9 @@ ${i}_handler( | ||
| 11036 | |||
| 11037 | case MODE_SET_ACTION: | ||
| 11038 | for (request=requests; request; request=request->next) { | ||
| 11039 | + if (request->processed) | ||
| 11040 | + continue; | ||
| 11041 | + | ||
| 11042 | table_entry = (struct ${i}_entry *) | ||
| 11043 | netsnmp_tdata_extract_entry(request); | ||
| 11044 | table_info = netsnmp_extract_table_info( request); | ||
| 11045 | @@ -591,6 +606,9 @@ ${i}_handler( | ||
| 11046 | |||
| 11047 | case MODE_SET_UNDO: | ||
| 11048 | for (request=requests; request; request=request->next) { | ||
| 11049 | + if (request->processed) | ||
| 11050 | + continue; | ||
| 11051 | + | ||
| 11052 | table_entry = (struct ${i}_entry *) | ||
| 11053 | netsnmp_tdata_extract_entry(request); | ||
| 11054 | table_row = netsnmp_tdata_extract_row( request); | ||
| 11055 | @@ -667,6 +685,9 @@ ${i}_handler( | ||
| 11056 | case MODE_SET_COMMIT: | ||
| 11057 | @if $i.creatable@ | ||
| 11058 | for (request=requests; request; request=request->next) { | ||
| 11059 | + if (request->processed) | ||
| 11060 | + continue; | ||
| 11061 | + | ||
| 11062 | table_entry = (struct ${i}_entry *) | ||
| 11063 | netsnmp_tdata_extract_entry(request); | ||
| 11064 | @if $i.rowstatus@ | ||
| 11065 | diff --git a/local/pass_persisttest b/local/pass_persisttest | ||
| 11066 | index 4f37c11..f4045cc 100755 | ||
| 11067 | --- a/local/pass_persisttest | ||
| 11068 | +++ b/local/pass_persisttest | ||
| 11069 | @@ -5,17 +5,23 @@ | ||
| 11070 | # put the following in your snmpd.conf file to call this script: | ||
| 11071 | # | ||
| 11072 | # Unix systems and Cygwin: | ||
| 11073 | -# pass_persist .1.3.6.1.4.1.2021.255 /path/to/pass_persisttest | ||
| 11074 | +# pass_persist .1.3.6.1.4.1.8072.2.255 /path/to/pass_persisttest | ||
| 11075 | # Windows systems except Cygwin: | ||
| 11076 | -# pass_persist .1.3.6.1.4.1.2021.255 perl /path/to/pass_persisttest | ||
| 11077 | +# pass_persist .1.3.6.1.4.1.8072.2.255 perl /path/to/pass_persisttest | ||
| 11078 | |||
| 11079 | # Forces a buffer flush after every print | ||
| 11080 | $|=1; | ||
| 11081 | |||
| 11082 | +# Save my PID, to help kill this instance. | ||
| 11083 | +$PIDFILE=$ENV{'PASS_PERSIST_PIDFILE'} || "/tmp/pass_persist.pid"; | ||
| 11084 | +open(PIDFILE, ">$PIDFILE"); | ||
| 11085 | +print PIDFILE "$$\n"; | ||
| 11086 | +close(PIDFILE); | ||
| 11087 | + | ||
| 11088 | use strict; | ||
| 11089 | |||
| 11090 | my $counter = 0; | ||
| 11091 | -my $place = ".1.3.6.1.4.1.2021.255"; | ||
| 11092 | +my $place = ".1.3.6.1.4.1.8072.2.255"; | ||
| 11093 | |||
| 11094 | while (<>){ | ||
| 11095 | if (m!^PING!){ | ||
| 11096 | @@ -30,21 +36,33 @@ while (<>){ | ||
| 11097 | chomp($req); | ||
| 11098 | |||
| 11099 | if ( $cmd eq "getnext" ) { | ||
| 11100 | - if ($req eq $place) { | ||
| 11101 | - $ret = "$place.1"; | ||
| 11102 | - } elsif ($req eq "$place.1") { | ||
| 11103 | - $ret = "$place.2.1"; | ||
| 11104 | - } elsif ($req eq "$place.2.1") { | ||
| 11105 | - $ret = "$place.2.2"; | ||
| 11106 | - } elsif ($req eq "$place.2.2") { | ||
| 11107 | - $ret = "$place.3"; | ||
| 11108 | - } elsif ($req eq "$place.3") { | ||
| 11109 | - $ret = "$place.4"; | ||
| 11110 | - } elsif ($req eq "$place.4") { | ||
| 11111 | - $ret = "$place.5"; | ||
| 11112 | - } elsif ($req eq "$place.5") { | ||
| 11113 | - $ret = "$place.6"; | ||
| 11114 | - } else { | ||
| 11115 | + if (($req eq "$place") || | ||
| 11116 | + ($req eq "$place.0") || | ||
| 11117 | + ($req =~ m/$place\.0\..*/) || | ||
| 11118 | + ($req eq "$place.1")) { $ret = "$place.1.0";} # netSnmpPassString.0 | ||
| 11119 | + elsif (($req =~ m/$place\.1\..*/) || | ||
| 11120 | + ($req eq "$place.2") || | ||
| 11121 | + ($req eq "$place.2.0") || | ||
| 11122 | + ($req =~ m/$place\.2\.0\..*/) || | ||
| 11123 | + ($req eq "$place.2.1") || | ||
| 11124 | + ($req eq "$place.2.1.0") || | ||
| 11125 | + ($req =~ m/$place\.2\.1\.0\..*/) || | ||
| 11126 | + ($req eq "$place.2.1.1") || | ||
| 11127 | + ($req =~ m/$place\.2\.1\.1\..*/) || | ||
| 11128 | + ($req eq "$place.2.1.2") || | ||
| 11129 | + ($req eq "$place.2.1.2.0")) { $ret = "$place.2.1.2.1";} # netSnmpPassInteger.1 | ||
| 11130 | + elsif (($req =~ m/$place\.2\.1\.2\..*/) || | ||
| 11131 | + ($req eq "$place.2.1.3") || | ||
| 11132 | + ($req eq "$place.2.1.3.0")) { $ret = "$place.2.1.3.1";} # netSnmpPassOID.1 | ||
| 11133 | + elsif (($req =~ m/$place\.2\..*/) || | ||
| 11134 | + ($req eq "$place.3")) { $ret = "$place.3.0";} # netSnmpPassTimeTicks.0 | ||
| 11135 | + elsif (($req =~ m/$place\.3\..*/) || | ||
| 11136 | + ($req eq "$place.4")) { $ret = "$place.4.0";} # netSnmpPassIpAddress.0 | ||
| 11137 | + elsif (($req =~ m/$place\.4\..*/) || | ||
| 11138 | + ($req eq "$place.5")) { $ret = "$place.5.0";} # netSnmpPassCounter.0 | ||
| 11139 | + elsif (($req =~ m/$place\.5\..*/) || | ||
| 11140 | + ($req eq "$place.6")) { $ret = "$place.6.0";} # netSnmpPassGauge.0 | ||
| 11141 | + else { | ||
| 11142 | print "NONE\n"; | ||
| 11143 | next; | ||
| 11144 | } | ||
| 11145 | @@ -59,20 +77,20 @@ while (<>){ | ||
| 11146 | |||
| 11147 | print "$ret\n"; | ||
| 11148 | |||
| 11149 | - if ($ret eq "$place.1") { | ||
| 11150 | - print "string\nlife the universe and everything\n"; | ||
| 11151 | - } elsif ($ret eq "$place.2.1") { | ||
| 11152 | - print "integer\n423\n"; | ||
| 11153 | - } elsif ($ret eq "$place.2.2") { | ||
| 11154 | - print "objectid\n.1.3.6.1.4.42.42.42\n"; | ||
| 11155 | - } elsif ($ret eq "$place.3") { | ||
| 11156 | + if ($ret eq "$place.1.0") { | ||
| 11157 | + print "string\nLife, the Universe, and Everything\n"; | ||
| 11158 | + } elsif ($ret eq "$place.2.1.2.1") { | ||
| 11159 | + print "integer\n42\n"; | ||
| 11160 | + } elsif ($ret eq "$place.2.1.3.1") { | ||
| 11161 | + print "objectid\n$place.99\n"; | ||
| 11162 | + } elsif ($ret eq "$place.3.0") { | ||
| 11163 | print "timeticks\n363136200\n"; | ||
| 11164 | - } elsif ($ret eq "$place.4") { | ||
| 11165 | + } elsif ($ret eq "$place.4.0") { | ||
| 11166 | print "ipaddress\n127.0.0.1\n"; | ||
| 11167 | - } elsif ($ret eq "$place.5") { | ||
| 11168 | + } elsif ($ret eq "$place.5.0") { | ||
| 11169 | $counter++; | ||
| 11170 | print "counter\n$counter\n"; | ||
| 11171 | - } elsif ($ret eq "$place.6") { | ||
| 11172 | + } elsif ($ret eq "$place.6.0") { | ||
| 11173 | print "gauge\n42\n"; | ||
| 11174 | } else { | ||
| 11175 | print "string\nack... $ret $req\n"; | ||
| 11176 | diff --git a/local/passtest b/local/passtest | ||
| 11177 | index dc5735c..40209c9 100755 | ||
| 11178 | --- a/local/passtest | ||
| 11179 | +++ b/local/passtest | ||
| 11180 | @@ -1,7 +1,5 @@ | ||
| 11181 | #!/bin/sh -f | ||
| 11182 | |||
| 11183 | -PATH=$path:/bin:/usr/bin:/usr/ucb | ||
| 11184 | - | ||
| 11185 | PLACE=".1.3.6.1.4.1.8072.2.255" # NET-SNMP-PASS-MIB::netSnmpPassExamples | ||
| 11186 | REQ="$2" # Requested OID | ||
| 11187 | |||
| 11188 | @@ -20,34 +18,34 @@ fi | ||
| 11189 | # | ||
| 11190 | if [ "$1" = "-n" ]; then | ||
| 11191 | case "$REQ" in | ||
| 11192 | - $PLACE| | ||
| 11193 | - $PLACE.0| | ||
| 11194 | - $PLACE.0.*| | ||
| 11195 | + $PLACE| \ | ||
| 11196 | + $PLACE.0| \ | ||
| 11197 | + $PLACE.0.*| \ | ||
| 11198 | $PLACE.1) RET=$PLACE.1.0 ;; # netSnmpPassString.0 | ||
| 11199 | |||
| 11200 | - $PLACE.1.*| | ||
| 11201 | - $PLACE.2| | ||
| 11202 | - $PLACE.2.0| | ||
| 11203 | - $PLACE.2.0.*| | ||
| 11204 | - $PLACE.2.1| | ||
| 11205 | - $PLACE.2.1.0| | ||
| 11206 | - $PLACE.2.1.0.*| | ||
| 11207 | - $PLACE.2.1.1| | ||
| 11208 | - $PLACE.2.1.1.*| | ||
| 11209 | - $PLACE.2.1.2| | ||
| 11210 | + $PLACE.1.*| \ | ||
| 11211 | + $PLACE.2| \ | ||
| 11212 | + $PLACE.2.0| \ | ||
| 11213 | + $PLACE.2.0.*| \ | ||
| 11214 | + $PLACE.2.1| \ | ||
| 11215 | + $PLACE.2.1.0| \ | ||
| 11216 | + $PLACE.2.1.0.*| \ | ||
| 11217 | + $PLACE.2.1.1| \ | ||
| 11218 | + $PLACE.2.1.1.*| \ | ||
| 11219 | + $PLACE.2.1.2| \ | ||
| 11220 | $PLACE.2.1.2.0) RET=$PLACE.2.1.2.1 ;; # netSnmpPassInteger.1 | ||
| 11221 | |||
| 11222 | - $PLACE.2.1.2.*| | ||
| 11223 | - $PLACE.2.1.3| | ||
| 11224 | + $PLACE.2.1.2.*| \ | ||
| 11225 | + $PLACE.2.1.3| \ | ||
| 11226 | $PLACE.2.1.3.0) RET=$PLACE.2.1.3.1 ;; # netSnmpPassOID.1 | ||
| 11227 | |||
| 11228 | - $PLACE.2.*| | ||
| 11229 | + $PLACE.2.*| \ | ||
| 11230 | $PLACE.3) RET=$PLACE.3.0 ;; # netSnmpPassTimeTicks.0 | ||
| 11231 | - $PLACE.3.*| | ||
| 11232 | + $PLACE.3.*| \ | ||
| 11233 | $PLACE.4) RET=$PLACE.4.0 ;; # netSnmpPassIpAddress.0 | ||
| 11234 | - $PLACE.4.*| | ||
| 11235 | + $PLACE.4.*| \ | ||
| 11236 | $PLACE.5) RET=$PLACE.5.0 ;; # netSnmpPassCounter.0 | ||
| 11237 | - $PLACE.5.*| | ||
| 11238 | + $PLACE.5.*| \ | ||
| 11239 | $PLACE.6) RET=$PLACE.6.0 ;; # netSnmpPassGauge.0 | ||
| 11240 | |||
| 11241 | *) exit 0 ;; | ||
| 11242 | @@ -57,12 +55,12 @@ else | ||
| 11243 | # GET requests - check for valid instance | ||
| 11244 | # | ||
| 11245 | case "$REQ" in | ||
| 11246 | - $PLACE.1.0| | ||
| 11247 | - $PLACE.2.1.2.1| | ||
| 11248 | - $PLACE.2.1.3.1| | ||
| 11249 | - $PLACE.3.0| | ||
| 11250 | - $PLACE.4.0| | ||
| 11251 | - $PLACE.5.0| | ||
| 11252 | + $PLACE.1.0| \ | ||
| 11253 | + $PLACE.2.1.2.1| \ | ||
| 11254 | + $PLACE.2.1.3.1| \ | ||
| 11255 | + $PLACE.3.0| \ | ||
| 11256 | + $PLACE.4.0| \ | ||
| 11257 | + $PLACE.5.0| \ | ||
| 11258 | $PLACE.6.0) RET=$REQ ;; | ||
| 11259 | *) exit 0 ;; | ||
| 11260 | esac | ||
| 11261 | diff --git a/local/passtest.pl b/local/passtest.pl | ||
| 11262 | index 049cf45..c87fe18 100755 | ||
| 11263 | --- a/local/passtest.pl | ||
| 11264 | +++ b/local/passtest.pl | ||
| 11265 | @@ -66,7 +66,7 @@ else { | ||
| 11266 | print "$ret\n"; | ||
| 11267 | if ($ret eq "$place.1.0") { print "string\nLife, the Universe, and Everything\n"; exit 0;} | ||
| 11268 | elsif ($ret eq "$place.2.1.2.1") { print "integer\n42\n"; exit 0;} | ||
| 11269 | -elsif ($ret eq "$place.2.1.3.1") { print "objectid\n.1.3.6.1.4.42.42.42\n"; exit 0;} | ||
| 11270 | +elsif ($ret eq "$place.2.1.3.1") { print "objectid\n$place.99\n"; exit 0;} | ||
| 11271 | elsif ($ret eq "$place.3.0") { print "timeticks\n363136200\n"; exit 0;} | ||
| 11272 | elsif ($ret eq "$place.4.0") { print "ipaddress\n127.0.0.1\n"; exit 0;} | ||
| 11273 | elsif ($ret eq "$place.5.0") { print "counter\n42\n"; exit 0;} | ||
| 11274 | diff --git a/local/snmp-bridge-mib b/local/snmp-bridge-mib | ||
| 11275 | index a4c2c80..4a9415e 100644 | ||
| 11276 | --- a/local/snmp-bridge-mib | ||
| 11277 | +++ b/local/snmp-bridge-mib | ||
| 11278 | @@ -1004,7 +1004,7 @@ sub readindexes() | ||
| 11279 | next if $if eq ".."; | ||
| 11280 | |||
| 11281 | my $port=hex(readfile($brifdir.$if."/port_no", 0)); | ||
| 11282 | - my $index=readfile($netdir.$if."/ifindex", STP_PROP_HEX); | ||
| 11283 | + my $index=readfile($netdir.$if."/ifindex", 0); | ||
| 11284 | |||
| 11285 | $indexes{$bridge}{$port}=$index; | ||
| 11286 | $interfaces{$bridge}{$port}=$if; | ||
| 11287 | @@ -1063,17 +1063,16 @@ sub tracevlan{ | ||
| 11288 | my $pif=$1; | ||
| 11289 | $brifdir=$netdir.$pif."/brport/bridge/brif/"; | ||
| 11290 | $port=hex(readfile($brifdir.$pif."/port_no", 0)); | ||
| 11291 | - $index=readfile($netdir.$pif."/ifindex", STP_PROP_HEX); | ||
| 11292 | + $index=readfile($netdir.$pif."/ifindex", 0); | ||
| 11293 | #$indexes{$bridge}{$port}=$index; | ||
| 11294 | #$interfaces{$bridge}{$port}=$if; | ||
| 11295 | $tagged{$vlan}{$port}=1; | ||
| 11296 | }else{ | ||
| 11297 | - my $brid=readfile($netdir.$if."/brport/bridge/ifindex", | ||
| 11298 | - STP_PROP_HEX); | ||
| 11299 | + my $brid=readfile($netdir.$if."/brport/bridge/ifindex", 0); | ||
| 11300 | $brifdir=$netdir.$if."/brport/bridge/brif/"; | ||
| 11301 | $port=hex(readfile($brifdir.$if."/port_no", 0)); | ||
| 11302 | $port=$brid*1000+$port; #create a unique port number | ||
| 11303 | - $index=readfile($netdir.$if."/ifindex", STP_PROP_HEX); | ||
| 11304 | + $index=readfile($netdir.$if."/ifindex", 0); | ||
| 11305 | $indexes{$bridge}{$port}=$index; | ||
| 11306 | $interfaces{$bridge}{$port}=$if; | ||
| 11307 | $tagged{$vlan}{$port}=0; | ||
| 11308 | @@ -1083,8 +1082,7 @@ sub tracevlan{ | ||
| 11309 | } | ||
| 11310 | close(DIR); | ||
| 11311 | |||
| 11312 | - my $brid=readfile($netdir.$interface."/brport/bridge/ifindex", | ||
| 11313 | - STP_PROP_HEX); | ||
| 11314 | + my $brid=readfile($netdir.$interface."/brport/bridge/ifindex", 0); | ||
| 11315 | my $fdb=$netdir.$interface."/brport/bridge/brforward"; | ||
| 11316 | |||
| 11317 | my $vbridge=$bridge."_vlan".$vlan; | ||
| 11318 | diff --git a/man/Makefile.in b/man/Makefile.in | ||
| 11319 | index bfe8279..5627cc0 100644 | ||
| 11320 | --- a/man/Makefile.in | ||
| 11321 | +++ b/man/Makefile.in | ||
| 11322 | @@ -26,6 +26,8 @@ MAN1G = $(AGENTXTRAP) snmpbulkget.1 snmpcmd.1 snmpget.1 snmpset.1 snmpwalk.1 \ | ||
| 11323 | net-snmp-config.1 mib2c-update.1 tkmib.1 traptoemail.1 \ | ||
| 11324 | net-snmp-create-v3-user.1 | ||
| 11325 | |||
| 11326 | +# If MAN3 is populated again, then remember to re-enable the corresponding | ||
| 11327 | +# action line within the 'maninstall' target | ||
| 11328 | MAN3 = | ||
| 11329 | MAN3_API = netsnmp_mib_api.3 netsnmp_config_api.3 snmp_alarm.3 \ | ||
| 11330 | netsnmp_session_api.3 netsnmp_sess_api.3 netsnmp_trap_api.3 netsnmp_varbind_api.3 netsnmp_pdu_api.3 | ||
| 11331 | @@ -241,7 +243,7 @@ maninstall: maninstalldirs $(MAN1) $(MAN1G) $(MAN3) $(MAN5G) $(MAN8) $(MANALIAS | ||
| 11332 | @for i in $(MAN1) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man1dir) ; echo "install: installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done | ||
| 11333 | @$(INSTALL_DATA) $(MAN1G) $(INSTALL_PREFIX)$(man1dir) | ||
| 11334 | @for i in $(MAN1G) ; do echo "install: installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done | ||
| 11335 | - @for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install: installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done | ||
| 11336 | + #EMPTY LIST#@for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install: installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done | ||
| 11337 | @$(INSTALL_DATA) $(MAN3G) $(INSTALL_PREFIX)$(man3dir) | ||
| 11338 | @for i in $(MAN3G) ; do echo "install: installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done | ||
| 11339 | @$(INSTALL_DATA) $(MANALIASES) $(INSTALL_PREFIX)$(man3dir) | ||
| 11340 | diff --git a/mibs/IANA-RTPROTO-MIB.txt b/mibs/IANA-RTPROTO-MIB.txt | ||
| 11341 | index 6f04143..f50992e 100644 | ||
| 11342 | --- a/mibs/IANA-RTPROTO-MIB.txt | ||
| 11343 | +++ b/mibs/IANA-RTPROTO-MIB.txt | ||
| 11344 | @@ -5,7 +5,7 @@ IMPORTS | ||
| 11345 | TEXTUAL-CONVENTION FROM SNMPv2-TC; | ||
| 11346 | |||
| 11347 | ianaRtProtoMIB MODULE-IDENTITY | ||
| 11348 | - LAST-UPDATED "200009260000Z" -- September 26, 2000 | ||
| 11349 | + LAST-UPDATED "201107220000Z" -- July 22, 2011 | ||
| 11350 | ORGANIZATION "IANA" | ||
| 11351 | CONTACT-INFO | ||
| 11352 | " Internet Assigned Numbers Authority | ||
| 11353 | @@ -28,6 +28,9 @@ ianaRtProtoMIB MODULE-IDENTITY | ||
| 11354 | will be selected by the IESG Area Director(s) of the Routing | ||
| 11355 | Area." | ||
| 11356 | |||
| 11357 | + REVISION "201107220000Z" -- July 22, 2011 | ||
| 11358 | + DESCRIPTION "Added rpl(18) ." | ||
| 11359 | + | ||
| 11360 | REVISION "200009260000Z" -- September 26, 2000 | ||
| 11361 | DESCRIPTION "Original version, published in coordination | ||
| 11362 | with RFC 2932." | ||
| 11363 | @@ -60,7 +63,8 @@ IANAipRouteProtocol ::= TEXTUAL-CONVENTION | ||
| 11364 | bgp (14), -- Border Gateway Protocol | ||
| 11365 | idpr (15), -- InterDomain Policy Routing | ||
| 11366 | ciscoEigrp (16), -- Cisco EIGRP | ||
| 11367 | - dvmrp (17) -- DVMRP | ||
| 11368 | + dvmrp (17), -- DVMRP | ||
| 11369 | + rpl (18) -- RPL [RFC-ietf-roll-rpl-19] | ||
| 11370 | } | ||
| 11371 | |||
| 11372 | IANAipMRouteProtocol ::= TEXTUAL-CONVENTION | ||
| 11373 | diff --git a/mibs/IANAifType-MIB.txt b/mibs/IANAifType-MIB.txt | ||
| 11374 | index 856156a..896adc8 100644 | ||
| 11375 | --- a/mibs/IANAifType-MIB.txt | ||
| 11376 | +++ b/mibs/IANAifType-MIB.txt | ||
| 11377 | @@ -5,7 +5,7 @@ | ||
| 11378 | TEXTUAL-CONVENTION FROM SNMPv2-TC; | ||
| 11379 | |||
| 11380 | ianaifType MODULE-IDENTITY | ||
| 11381 | - LAST-UPDATED "201002110000Z" -- February 11, 2010 | ||
| 11382 | + LAST-UPDATED "201110260000Z" -- October 26, 2011 | ||
| 11383 | ORGANIZATION "IANA" | ||
| 11384 | CONTACT-INFO " Internet Assigned Numbers Authority | ||
| 11385 | |||
| 11386 | @@ -19,6 +19,24 @@ | ||
| 11387 | Convention, and thus the enumerated values of | ||
| 11388 | the ifType object defined in MIB-II's ifTable." | ||
| 11389 | |||
| 11390 | + REVISION "201110260000Z" -- October 26, 2011 | ||
| 11391 | + DESCRIPTION "Registration of new IANAifType 262." | ||
| 11392 | + | ||
| 11393 | + REVISION "201109070000Z" -- September 7, 2011 | ||
| 11394 | + DESCRIPTION "Registration of new IANAifTypes 260 and 261." | ||
| 11395 | + | ||
| 11396 | + REVISION "201107220000Z" -- July 22, 2011 | ||
| 11397 | + DESCRIPTION "Registration of new IANAifType 259." | ||
| 11398 | + | ||
| 11399 | + REVISION "201106030000Z" -- June 03, 2011 | ||
| 11400 | + DESCRIPTION "Registration of new IANAifType 258." | ||
| 11401 | + | ||
| 11402 | + REVISION "201009210000Z" -- September 21, 2010 | ||
| 11403 | + DESCRIPTION "Registration of new IANAifTypes 256 and 257." | ||
| 11404 | + | ||
| 11405 | + REVISION "201007210000Z" -- July 21, 2010 | ||
| 11406 | + DESCRIPTION "Registration of new IANAifType 255." | ||
| 11407 | + | ||
| 11408 | REVISION "201002110000Z" -- February 11, 2010 | ||
| 11409 | DESCRIPTION "Registration of new IANAifType 254." | ||
| 11410 | |||
| 11411 | @@ -334,7 +352,7 @@ | ||
| 11412 | ieee80212(55), -- 100BaseVG | ||
| 11413 | fibreChannel(56), -- Fibre Channel | ||
| 11414 | hippiInterface(57), -- HIPPI interfaces | ||
| 11415 | - frameRelayInterconnect(58), -- Obsolete use either | ||
| 11416 | + frameRelayInterconnect(58), -- Obsolete, use either | ||
| 11417 | -- frameRelay(32) or | ||
| 11418 | -- frameRelayService(44). | ||
| 11419 | aflane8023(59), -- ATM Emulated LAN for 802.3 | ||
| 11420 | @@ -541,7 +559,15 @@ | ||
| 11421 | vdsl2 (251), -- Very high speed digital subscriber line Version 2 (as per ITU-T Recommendation G.993.2) | ||
| 11422 | capwapDot11Profile (252), -- WLAN Profile Interface | ||
| 11423 | capwapDot11Bss (253), -- WLAN BSS Interface | ||
| 11424 | - capwapWtpVirtualRadio (254) -- WTP Virtual Radio Interface | ||
| 11425 | + capwapWtpVirtualRadio (254), -- WTP Virtual Radio Interface | ||
| 11426 | + bits (255), -- bitsport | ||
| 11427 | + docsCableUpstreamRfPort (256), -- DOCSIS CATV Upstream RF Port | ||
| 11428 | + cableDownstreamRfPort (257), -- CATV downstream RF port | ||
| 11429 | + vmwareVirtualNic (258), -- VMware Virtual Network Interface | ||
| 11430 | + ieee802154 (259), -- IEEE 802.15.4 WPAN interface | ||
| 11431 | + otnOdu (260), -- OTN Optical Data Unit | ||
| 11432 | + otnOtu (261), -- OTN Optical channel Transport Unit | ||
| 11433 | + ifVfiType (262) -- VPLS Forwarding Instance Interface Type | ||
| 11434 | } | ||
| 11435 | |||
| 11436 | IANAtunnelType ::= TEXTUAL-CONVENTION | ||
| 11437 | diff --git a/mibs/rfclist b/mibs/rfclist | ||
| 11438 | index 7f84150..35f301e 100644 | ||
| 11439 | --- a/mibs/rfclist | ||
| 11440 | +++ b/mibs/rfclist | ||
| 11441 | @@ -1,4 +1,4 @@ | ||
| 11442 | -# updated 2011-03-14 | ||
| 11443 | +# updated 2011-11-16 | ||
| 11444 | 1155 RFC1155-SMI | ||
| 11445 | 1213 RFC1213-MIB | ||
| 11446 | 1227 SMUX-MIB | ||
| 11447 | @@ -254,6 +254,9 @@ | ||
| 11448 | 5833 CAPWAP-BASE-MIB | ||
| 11449 | 5834 CAPWAP-DOT11-MIB | ||
| 11450 | 5907 NTPv4-MIB | ||
| 11451 | -5953 SNMP-TLS-TM-MIB | ||
| 11452 | 6065 SNMP-VACM-AAA-MIB | ||
| 11453 | 6173 IFCP-MGMT-MIB | ||
| 11454 | +6240 PW-CEP-STD-MIB | ||
| 11455 | +6340 FLOAT-TC-MIB | ||
| 11456 | +6353 SNMP-TLS-TM-MIB | ||
| 11457 | +6445 MPLS-FRR-GENERAL-STD-MIB:MPLS-FRR-ONE2ONE-STD-MIB:MPLS-FRR-FACILITY-STD-MIB | ||
| 11458 | diff --git a/net-snmp-config.in b/net-snmp-config.in | ||
| 11459 | index 303cdda..3ba60e3 100644 | ||
| 11460 | --- a/net-snmp-config.in | ||
| 11461 | +++ b/net-snmp-config.in | ||
| 11462 | @@ -194,7 +194,7 @@ else | ||
| 11463 | echo $NSC_LIBDIR $NSC_BASE_SNMP_LIBS | ||
| 11464 | ;; | ||
| 11465 | --external-libs) | ||
| 11466 | - echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS | ||
| 11467 | + echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS @PERLLDOPTS_FOR_APPS@ | ||
| 11468 | ;; | ||
| 11469 | #################################################### agent lib | ||
| 11470 | --base-agent-libs) | ||
| 11471 | diff --git a/perl/ASN/ASN.pm b/perl/ASN/ASN.pm | ||
| 11472 | index 3961bd5..4195573 100644 | ||
| 11473 | --- a/perl/ASN/ASN.pm | ||
| 11474 | +++ b/perl/ASN/ASN.pm | ||
| 11475 | @@ -77,7 +77,7 @@ sub AUTOLOAD { | ||
| 11476 | ($constname = $AUTOLOAD) =~ s/.*:://; | ||
| 11477 | croak "& not defined" if $constname eq 'constant'; | ||
| 11478 | my $val; | ||
| 11479 | - ($!, $val) = constant($constname, @_ ? $_[0] : 0); | ||
| 11480 | + ($!, $val) = constant($constname); | ||
| 11481 | if ($! != 0) { | ||
| 11482 | if ($! =~ /Invalid/ || $!{EINVAL}) { | ||
| 11483 | $AutoLoader::AUTOLOAD = $AUTOLOAD; | ||
| 11484 | diff --git a/perl/ASN/ASN.xs b/perl/ASN/ASN.xs | ||
| 11485 | index bbfa69b..e3f6181 100644 | ||
| 11486 | --- a/perl/ASN/ASN.xs | ||
| 11487 | +++ b/perl/ASN/ASN.xs | ||
| 11488 | @@ -78,9 +78,11 @@ static int constant_ASN_U(double *value, const char *name, const int len) | ||
| 11489 | case '\0': | ||
| 11490 | TEST_CONSTANT(value, name, ASN_UNSIGNED); | ||
| 11491 | break; | ||
| 11492 | +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | ||
| 11493 | case '6': | ||
| 11494 | TEST_CONSTANT(value, name, ASN_UNSIGNED64); | ||
| 11495 | break; | ||
| 11496 | +#endif | ||
| 11497 | } | ||
| 11498 | return EINVAL; | ||
| 11499 | } | ||
| 11500 | @@ -91,9 +93,11 @@ static int constant_ASN_IN(double *value, const char *name, const int len) | ||
| 11501 | case '\0': | ||
| 11502 | TEST_CONSTANT(value, name, ASN_INTEGER); | ||
| 11503 | break; | ||
| 11504 | +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | ||
| 11505 | case '6': | ||
| 11506 | TEST_CONSTANT(value, name, ASN_INTEGER64); | ||
| 11507 | break; | ||
| 11508 | +#endif | ||
| 11509 | } | ||
| 11510 | return EINVAL; | ||
| 11511 | } | ||
| 11512 | @@ -123,12 +127,14 @@ static int constant(double *value, const char *const name, const int len) | ||
| 11513 | return constant_ASN_B(value, name, len); | ||
| 11514 | case 'C': | ||
| 11515 | return constant_ASN_C(value, name, len); | ||
| 11516 | +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | ||
| 11517 | case 'D': | ||
| 11518 | TEST_CONSTANT(value, name, ASN_DOUBLE); | ||
| 11519 | break; | ||
| 11520 | case 'F': | ||
| 11521 | TEST_CONSTANT(value, name, ASN_FLOAT); | ||
| 11522 | break; | ||
| 11523 | +#endif | ||
| 11524 | case 'G': | ||
| 11525 | TEST_CONSTANT(value, name, ASN_GAUGE); | ||
| 11526 | break; | ||
| 11527 | @@ -155,13 +161,12 @@ MODULE = NetSNMP::ASN PACKAGE = NetSNMP::ASN | ||
| 11528 | |||
| 11529 | |||
| 11530 | void | ||
| 11531 | -constant(sv,arg) | ||
| 11532 | +constant(sv) | ||
| 11533 | PREINIT: | ||
| 11534 | STRLEN len; | ||
| 11535 | INPUT: | ||
| 11536 | SV * sv | ||
| 11537 | char * s = SvPV(sv, len); | ||
| 11538 | - int arg | ||
| 11539 | INIT: | ||
| 11540 | int status; | ||
| 11541 | double value; | ||
| 11542 | diff --git a/perl/OID/OID.pm b/perl/OID/OID.pm | ||
| 11543 | index 3ab12aa..a9d9369 100644 | ||
| 11544 | --- a/perl/OID/OID.pm | ||
| 11545 | +++ b/perl/OID/OID.pm | ||
| 11546 | @@ -153,7 +153,7 @@ sub AUTOLOAD { | ||
| 11547 | ($constname = $AUTOLOAD) =~ s/.*:://; | ||
| 11548 | croak "& not defined" if $constname eq 'constant'; | ||
| 11549 | my $val; | ||
| 11550 | - ($!, $val) = constant($constname, @_ ? $_[0] : 0); | ||
| 11551 | + ($!, $val) = constant($constname); | ||
| 11552 | if ($! != 0) { | ||
| 11553 | if ($! =~ /Invalid/ || $!{EINVAL}) { | ||
| 11554 | $AutoLoader::AUTOLOAD = $AUTOLOAD; | ||
| 11555 | diff --git a/perl/OID/OID.xs b/perl/OID/OID.xs | ||
| 11556 | index ff3693e..10485f9 100644 | ||
| 11557 | --- a/perl/OID/OID.xs | ||
| 11558 | +++ b/perl/OID/OID.xs | ||
| 11559 | @@ -125,7 +125,7 @@ int flag; | ||
| 11560 | break; | ||
| 11561 | |||
| 11562 | case ASN_BIT_STR: | ||
| 11563 | - snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL); | ||
| 11564 | + snprint_bitstring(buf, buf_len, var, NULL, NULL, NULL); | ||
| 11565 | len = strlen(buf); | ||
| 11566 | break; | ||
| 11567 | |||
| 11568 | @@ -173,13 +173,12 @@ nso_newptr(initstring) | ||
| 11569 | RETVAL | ||
| 11570 | |||
| 11571 | void | ||
| 11572 | -constant(sv,arg) | ||
| 11573 | +constant(sv) | ||
| 11574 | PREINIT: | ||
| 11575 | STRLEN len; | ||
| 11576 | INPUT: | ||
| 11577 | SV * sv | ||
| 11578 | char * s = SvPV(sv, len); | ||
| 11579 | - int arg | ||
| 11580 | INIT: | ||
| 11581 | int status; | ||
| 11582 | double value; | ||
| 11583 | diff --git a/perl/SNMP/SNMP.pm b/perl/SNMP/SNMP.pm | ||
| 11584 | index d1b39c3..a7f6faa 100644 | ||
| 11585 | --- a/perl/SNMP/SNMP.pm | ||
| 11586 | +++ b/perl/SNMP/SNMP.pm | ||
| 11587 | @@ -135,6 +135,12 @@ $replace_newer = 0; # determine whether or not to tell the parser to replace | ||
| 11588 | # older MIB modules with newer ones when loading MIBs. | ||
| 11589 | # WARNING: This can cause an incorrect hierarchy. | ||
| 11590 | |||
| 11591 | +sub register_debug_tokens { | ||
| 11592 | + my $tokens = shift; | ||
| 11593 | + | ||
| 11594 | + SNMP::_register_debug_tokens($tokens); | ||
| 11595 | +} | ||
| 11596 | + | ||
| 11597 | sub getenv { | ||
| 11598 | my $name = shift; | ||
| 11599 | |||
| 11600 | @@ -161,10 +167,10 @@ sub setMib { | ||
| 11601 | } | ||
| 11602 | |||
| 11603 | sub initMib { | ||
| 11604 | -# eqivalent to calling the snmp library init_mib if Mib is NULL | ||
| 11605 | +# equivalent to calling the snmp library init_mib if Mib is NULL | ||
| 11606 | # if Mib is already loaded this function does nothing | ||
| 11607 | -# Pass a zero valued argument to get minimal mib tree initialzation | ||
| 11608 | -# If non zero agrgument or no argument then full mib initialization | ||
| 11609 | +# Pass a zero valued argument to get minimal mib tree initialization | ||
| 11610 | +# If non zero argument or no argument then full mib initialization | ||
| 11611 | |||
| 11612 | SNMP::init_snmp("perl"); | ||
| 11613 | return; | ||
| 11614 | @@ -1529,7 +1535,7 @@ init_snmp properly, which means it will read configuration files and | ||
| 11615 | use those defaults where appropriate automatically parse MIB files, | ||
| 11616 | etc. This will likely affect your perl applications if you have, for | ||
| 11617 | instance, default values set up in your snmp.conf file (as the perl | ||
| 11618 | -module will now make use of those defaults). The docmuentation, | ||
| 11619 | +module will now make use of those defaults). The documentation, | ||
| 11620 | however, has sadly not been updated yet (aside from this note), nor is | ||
| 11621 | the read_config default usage implementation fully complete. | ||
| 11622 | |||
| 11623 | @@ -1540,7 +1546,7 @@ aspects of a connection between the management application and the | ||
| 11624 | managed agent. Internally the class is implemented as a blessed hash | ||
| 11625 | reference. This class supplies 'get', 'getnext', 'set', 'fget', and | ||
| 11626 | 'fgetnext' method calls. The methods take a variety of input argument | ||
| 11627 | -formats and support both syncronous and asyncronous operation through | ||
| 11628 | +formats and support both synchronous and asynchronous operation through | ||
| 11629 | a polymorphic API (i.e., method behaviour varies dependent on args | ||
| 11630 | passed - see below). | ||
| 11631 | |||
| 11632 | @@ -1835,7 +1841,7 @@ do SNMP GET, multiple <vars> formats accepted. | ||
| 11633 | for syncronous operation <vars> will be updated | ||
| 11634 | with value(s) and type(s) and will also return | ||
| 11635 | retrieved value(s). If <callback> supplied method | ||
| 11636 | -will operate asyncronously | ||
| 11637 | +will operate asynchronously | ||
| 11638 | |||
| 11639 | =item $sess->fget(E<lt>varsE<gt> [,E<lt>callbackE<gt>]) | ||
| 11640 | |||
| 11641 | @@ -1852,7 +1858,7 @@ and <type> | ||
| 11642 | |||
| 11643 | Note: simple string <vars>,(e.g., 'sysDescr.0') | ||
| 11644 | form is not updated. If <callback> supplied method | ||
| 11645 | -will operate asyncronously | ||
| 11646 | +will operate asynchronously | ||
| 11647 | |||
| 11648 | =item $sess->fgetnext(E<lt>varsE<gt> [,E<lt>callbackE<gt>]) | ||
| 11649 | |||
| 11650 | @@ -1868,7 +1874,7 @@ format (i.e., well known format) to ensure unambiguous | ||
| 11651 | translation to SNMP MIB data value (see discussion of | ||
| 11652 | canonical value format <vars> description section), | ||
| 11653 | returns snmp_errno. If <callback> supplied method | ||
| 11654 | -will operate asyncronously | ||
| 11655 | +will operate asynchronously | ||
| 11656 | |||
| 11657 | =item $sess->getbulk(E<lt>non-repeatersE<gt>, E<lt>max-repeatersE<gt>, E<lt>varsE<gt>) | ||
| 11658 | |||
| 11659 | @@ -1985,7 +1991,7 @@ collect all the columns defined in the MIB table. | ||
| 11660 | Specifies a GETBULK repeat I<COUNT>. IE, it will request this many | ||
| 11661 | varbinds back per column when using the GETBULK operation. Shortening | ||
| 11662 | this will mean smaller packets which may help going through some | ||
| 11663 | -systems. By default, this value is calculated and attepmts to guess | ||
| 11664 | +systems. By default, this value is calculated and attempts to guess | ||
| 11665 | at what will fit all the results into 1000 bytes. This calculation is | ||
| 11666 | fairly safe, hopefully, but you can either raise or lower the number | ||
| 11667 | using this option if desired. In lossy networks, you want to make | ||
| 11668 | @@ -1997,7 +2003,7 @@ one way to help that. | ||
| 11669 | Force the use of GETNEXT rather than GETBULK. (always true for | ||
| 11670 | SNMPv1, as it doesn't have GETBULK anyway). Some agents are great | ||
| 11671 | implementers of GETBULK and this allows you to force the use of | ||
| 11672 | -GETNEXT oprations instead. | ||
| 11673 | +GETNEXT operations instead. | ||
| 11674 | |||
| 11675 | =item callback => \&subroutine | ||
| 11676 | |||
| 11677 | @@ -2023,7 +2029,7 @@ versions prior to 5.04 and 5.04 and up, the following should work: | ||
| 11678 | $no_mainloop = 1; | ||
| 11679 | } | ||
| 11680 | |||
| 11681 | -Deciding on whether to use SNMP::MainLoop is left as an excersize to | ||
| 11682 | +Deciding on whether to use SNMP::MainLoop is left as an exercise to | ||
| 11683 | the reader since it depends on whether your code uses other callbacks | ||
| 11684 | as well. | ||
| 11685 | |||
| 11686 | @@ -2238,9 +2244,9 @@ will be undef. | ||
| 11687 | to be used with async SNMP::Session | ||
| 11688 | calls. MainLoop must be called after initial async calls | ||
| 11689 | so return packets from the agent will not be processed. | ||
| 11690 | -If no args suplied this function enters an infinite loop | ||
| 11691 | +If no args supplied this function enters an infinite loop | ||
| 11692 | so program must be exited in a callback or externally | ||
| 11693 | -interupted. If <timeout(sic) | ||
| 11694 | +interrupted. If <timeout(sic) | ||
| 11695 | |||
| 11696 | =item &SNMP::finish() | ||
| 11697 | |||
| 11698 | @@ -2322,7 +2328,7 @@ initialization | ||
| 11699 | |||
| 11700 | =item $SNMP::debugging | ||
| 11701 | |||
| 11702 | -default '0', controlls debugging output level | ||
| 11703 | +default '0', controls debugging output level | ||
| 11704 | within SNMP module and libsnmp | ||
| 11705 | |||
| 11706 | =over | ||
| 11707 | @@ -2346,6 +2352,12 @@ level 2 plus snmp_set_dump_packet(1) | ||
| 11708 | default '0', set [non-]zero to independently set | ||
| 11709 | snmp_set_dump_packet() | ||
| 11710 | |||
| 11711 | +=item SNMP::register_debug_tokens() | ||
| 11712 | + | ||
| 11713 | +Allows to register one or more debug tokens, just like the -D option of snmpd. | ||
| 11714 | +Each debug token enables a group of debug statements. An example: | ||
| 11715 | +SNMP::register_debug_tokens("tdomain,netsnmp_unix"); | ||
| 11716 | + | ||
| 11717 | =back | ||
| 11718 | |||
| 11719 | =head1 %SNMP::MIB | ||
| 11720 | @@ -2459,7 +2471,7 @@ returns true if the last object in the INDEX is IMPLIED | ||
| 11721 | =item &SNMP::setMib(<file>) | ||
| 11722 | |||
| 11723 | allows dynamic parsing of the mib and explicit | ||
| 11724 | -specification of mib file independent of enviroment | ||
| 11725 | +specification of mib file independent of environment | ||
| 11726 | variables. called with no args acts like initMib, | ||
| 11727 | loading MIBs indicated by environment variables (see | ||
| 11728 | Net-SNMP mib_api docs). passing non-zero second arg | ||
| 11729 | diff --git a/perl/SNMP/SNMP.xs b/perl/SNMP/SNMP.xs | ||
| 11730 | index a0cfe69..ff84919 100644 | ||
| 11731 | --- a/perl/SNMP/SNMP.xs | ||
| 11732 | +++ b/perl/SNMP/SNMP.xs | ||
| 11733 | @@ -1,4 +1,4 @@ | ||
| 11734 | -/* -*- C -*- | ||
| 11735 | +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- | ||
| 11736 | SNMP.xs -- Perl 5 interface to the Net-SNMP toolkit | ||
| 11737 | |||
| 11738 | written by G. S. Marzot (marz@users.sourceforge.net) | ||
| 11739 | @@ -221,7 +221,15 @@ __snprint_oid(const oid *objid, size_t objidlen) { | ||
| 11740 | #else /* DEBUGGING */ | ||
| 11741 | #define DBDCL(x) | ||
| 11742 | #define DBOUT | ||
| 11743 | -#define DBPRT(severity, otherargs) /* Ignore */ | ||
| 11744 | +/* Do nothing but in such a way that the compiler sees "otherargs". */ | ||
| 11745 | +#define DBPRT(severity, otherargs) \ | ||
| 11746 | + do { if (0) printf otherargs; } while(0) | ||
| 11747 | + | ||
| 11748 | +static char * | ||
| 11749 | +__snprint_oid(const oid *objid, size_t objidlen) | ||
| 11750 | +{ | ||
| 11751 | + return "(debugging is disabled)"; | ||
| 11752 | +} | ||
| 11753 | |||
| 11754 | #endif /* DEBUGGING */ | ||
| 11755 | |||
| 11756 | @@ -451,8 +459,7 @@ int flag; | ||
| 11757 | if (flag == USE_ENUMS) { | ||
| 11758 | for(ep = tp->enums; ep; ep = ep->next) { | ||
| 11759 | if (ep->value == *var->val.integer) { | ||
| 11760 | - strncpy(buf, ep->label, buf_len); | ||
| 11761 | - buf[buf_len-1] = '\0'; | ||
| 11762 | + strlcpy(buf, ep->label, buf_len); | ||
| 11763 | len = strlen(buf); | ||
| 11764 | break; | ||
| 11765 | } | ||
| 11766 | @@ -929,19 +936,22 @@ oid *doid_arr; | ||
| 11767 | size_t *doid_arr_len; | ||
| 11768 | char * soid_str; | ||
| 11769 | { | ||
| 11770 | - char soid_buf[STR_BUF_SIZE]; | ||
| 11771 | + char *soid_buf; | ||
| 11772 | char *cp; | ||
| 11773 | char *st; | ||
| 11774 | |||
| 11775 | if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */ | ||
| 11776 | if (*soid_str == '.') soid_str++; | ||
| 11777 | - strcpy(soid_buf, soid_str); | ||
| 11778 | + soid_buf = strdup(soid_str); | ||
| 11779 | + if (!soid_buf) | ||
| 11780 | + return FAILURE; | ||
| 11781 | cp = strtok_r(soid_buf,".",&st); | ||
| 11782 | while (cp) { | ||
| 11783 | sscanf(cp, "%" NETSNMP_PRIo "u", &(doid_arr[(*doid_arr_len)++])); | ||
| 11784 | /* doid_arr[(*doid_arr_len)++] = atoi(cp); */ | ||
| 11785 | cp = strtok_r(NULL,".",&st); | ||
| 11786 | } | ||
| 11787 | + free(soid_buf); | ||
| 11788 | return(SUCCESS); | ||
| 11789 | } | ||
| 11790 | |||
| 11791 | @@ -1040,7 +1050,7 @@ OCT: | ||
| 11792 | vars->type = ASN_IPADDRESS; | ||
| 11793 | vars->val.integer = netsnmp_malloc(sizeof(in_addr_t)); | ||
| 11794 | if (val) | ||
| 11795 | - *(vars->val.integer) = inet_addr(val); | ||
| 11796 | + *((in_addr_t *)vars->val.integer) = inet_addr(val); | ||
| 11797 | else { | ||
| 11798 | ret = FAILURE; | ||
| 11799 | *(vars->val.integer) = 0; | ||
| 11800 | @@ -1584,7 +1594,7 @@ _bulkwalk_done(walk_context *context) | ||
| 11801 | ** walks still in progress. | ||
| 11802 | */ | ||
| 11803 | DBPRT(1, (DBOUT "Ignoring %s request oid %s\n", | ||
| 11804 | - bt_entry->norepeat? "nonrepeater" : "completed", | ||
| 11805 | + bt_entry->norepeat ? "nonrepeater" : "completed", | ||
| 11806 | __snprint_oid(bt_entry->req_oid, bt_entry->req_len))); | ||
| 11807 | |||
| 11808 | /* Ignore this OID in any further packets. */ | ||
| 11809 | @@ -1894,7 +1904,7 @@ _bulkwalk_recv_pdu(walk_context *context, netsnmp_pdu *pdu) | ||
| 11810 | int i; | ||
| 11811 | AV *varbind; | ||
| 11812 | SV *rv; | ||
| 11813 | - DBDCL(SV**sess_ptr_sv=hv_fetch((HV*)SvRV(context->sess_ref),"SessPtr",7,1);) | ||
| 11814 | + SV **sess_ptr_sv = hv_fetch((HV*)SvRV(context->sess_ref), "SessPtr", 7, 1); | ||
| 11815 | SV **err_str_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorStr", 8, 1); | ||
| 11816 | SV **err_num_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorNum", 8, 1); | ||
| 11817 | SV **err_ind_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorInd", 8, 1); | ||
| 11818 | @@ -2930,6 +2940,8 @@ snmp_add_mib_dir(mib_dir,force=0) | ||
| 11819 | int result = 0; /* Avoid use of uninitialized variable below. */ | ||
| 11820 | int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04)); | ||
| 11821 | |||
| 11822 | + DBPRT(999, (DBOUT "force=%d\n", force)); | ||
| 11823 | + | ||
| 11824 | if (mib_dir && *mib_dir) { | ||
| 11825 | result = add_mibdir(mib_dir); | ||
| 11826 | } | ||
| 11827 | @@ -2979,6 +2991,8 @@ snmp_read_mib(mib_file, force=0) | ||
| 11828 | { | ||
| 11829 | int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04)); | ||
| 11830 | |||
| 11831 | + DBPRT(999, (DBOUT "force=%d\n", force)); | ||
| 11832 | + | ||
| 11833 | if ((mib_file == NULL) || (*mib_file == '\0')) { | ||
| 11834 | if (get_tree_head() == NULL) { | ||
| 11835 | if (verbose) warn("snmp_read_mib: initializing MIB\n"); | ||
| 11836 | @@ -3541,11 +3555,11 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback) | ||
| 11837 | varbind = (AV*) SvRV(*varbind_ref); | ||
| 11838 | |||
| 11839 | /* If the varbind includes the module prefix, capture it for use later */ | ||
| 11840 | - strncpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE); | ||
| 11841 | + strlcpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE); | ||
| 11842 | tmp_prefix_ptr = strstr(tmp_buf_prefix,"::"); | ||
| 11843 | if (tmp_prefix_ptr) { | ||
| 11844 | tmp_prefix_ptr = strtok_r(tmp_buf_prefix, "::", &st); | ||
| 11845 | - strncpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE); | ||
| 11846 | + strlcpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE); | ||
| 11847 | } | ||
| 11848 | else { | ||
| 11849 | *str_buf_prefix = '\0'; | ||
| 11850 | @@ -3657,9 +3671,9 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback) | ||
| 11851 | |||
| 11852 | /* Prepend the module prefix to the next OID if needed */ | ||
| 11853 | if (*str_buf_prefix) { | ||
| 11854 | - strncat(str_buf_prefix, "::", STR_BUF_SIZE - strlen(str_buf_prefix) - 2); | ||
| 11855 | - strncat(str_buf_prefix, str_buf, STR_BUF_SIZE - strlen(str_buf_prefix)); | ||
| 11856 | - strncpy(str_buf, str_buf_prefix, STR_BUF_SIZE); | ||
| 11857 | + strlcat(str_buf_prefix, "::", STR_BUF_SIZE); | ||
| 11858 | + strlcat(str_buf_prefix, str_buf, STR_BUF_SIZE); | ||
| 11859 | + strlcpy(str_buf, str_buf_prefix, STR_BUF_SIZE); | ||
| 11860 | } | ||
| 11861 | |||
| 11862 | if (__is_leaf(tp)) { | ||
| 11863 | @@ -4242,15 +4256,16 @@ snmp_bulkwalk(sess_ref, nonrepeaters, maxrepetitions, varlist_ref,perl_callback) | ||
| 11864 | |||
| 11865 | /* Handle error cases and clean up after ourselves. */ | ||
| 11866 | err: | ||
| 11867 | - if (context->req_oids && context->nreq_oids) { | ||
| 11868 | - bt_entry = context->req_oids; | ||
| 11869 | - for (i = 0; i < context->nreq_oids; i++, bt_entry++) | ||
| 11870 | - av_clear(bt_entry->vars); | ||
| 11871 | - } | ||
| 11872 | - if (context->req_oids) | ||
| 11873 | - Safefree(context->req_oids); | ||
| 11874 | - if (context) | ||
| 11875 | + if (context) { | ||
| 11876 | + if (context->req_oids && context->nreq_oids) { | ||
| 11877 | + bt_entry = context->req_oids; | ||
| 11878 | + for (i = 0; i < context->nreq_oids; i++, bt_entry++) | ||
| 11879 | + av_clear(bt_entry->vars); | ||
| 11880 | + } | ||
| 11881 | + if (context->req_oids) | ||
| 11882 | + Safefree(context->req_oids); | ||
| 11883 | Safefree(context); | ||
| 11884 | + } | ||
| 11885 | if (pdu) | ||
| 11886 | snmp_free_pdu(pdu); | ||
| 11887 | |||
| 11888 | @@ -4437,7 +4452,7 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref) | ||
| 11889 | |||
| 11890 | New (0, oid_arr, MAX_OID_LEN, oid); | ||
| 11891 | |||
| 11892 | - if (oid_arr && SvROK(sess_ref) && SvROK(varlist_ref)) { | ||
| 11893 | + if (oid_arr && SvROK(sess_ref)) { | ||
| 11894 | |||
| 11895 | sess_ptr_sv = hv_fetch((HV*)SvRV(sess_ref), "SessPtr", 7, 1); | ||
| 11896 | ss = (SnmpSession *)SvIV((SV*)SvRV(*sess_ptr_sv)); | ||
| 11897 | @@ -4451,8 +4466,13 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref) | ||
| 11898 | |||
| 11899 | pdu = snmp_pdu_create(SNMP_MSG_TRAP2); | ||
| 11900 | |||
| 11901 | - varlist = (AV*) SvRV(varlist_ref); | ||
| 11902 | - varlist_len = av_len(varlist); | ||
| 11903 | + if (SvROK(varlist_ref)) { | ||
| 11904 | + varlist = (AV*) SvRV(varlist_ref); | ||
| 11905 | + varlist_len = av_len(varlist); | ||
| 11906 | + } else { | ||
| 11907 | + varlist = NULL; | ||
| 11908 | + varlist_len = -1; | ||
| 11909 | + } | ||
| 11910 | /************************************************/ | ||
| 11911 | res = __add_var_val_str(pdu, sysUpTime, SYS_UPTIME_OID_LEN, | ||
| 11912 | uptime, strlen(uptime), TYPE_TIMETICKS); | ||
| 11913 | @@ -4838,10 +4858,10 @@ snmp_translate_obj(var,mode,use_long,auto_init,best_guess,include_module_name) | ||
| 11914 | if (((status=__get_label_iid(str_buf_temp, | ||
| 11915 | &label, &iid, NO_FLAGS)) == SUCCESS) | ||
| 11916 | && label) { | ||
| 11917 | - strcpy(str_buf_temp, label); | ||
| 11918 | + strlcpy(str_buf_temp, label, sizeof(str_buf_temp)); | ||
| 11919 | if (iid && *iid) { | ||
| 11920 | - strcat(str_buf_temp, "."); | ||
| 11921 | - strcat(str_buf_temp, iid); | ||
| 11922 | + strlcat(str_buf_temp, ".", sizeof(str_buf_temp)); | ||
| 11923 | + strlcat(str_buf_temp, iid, sizeof(str_buf_temp)); | ||
| 11924 | } | ||
| 11925 | } | ||
| 11926 | } | ||
| 11927 | @@ -4902,6 +4922,15 @@ snmp_set_debugging(val) | ||
| 11928 | } | ||
| 11929 | |||
| 11930 | void | ||
| 11931 | +snmp_register_debug_tokens(tokens) | ||
| 11932 | + char *tokens | ||
| 11933 | + CODE: | ||
| 11934 | + { | ||
| 11935 | + debug_register_tokens(tokens); | ||
| 11936 | + snmp_set_do_debugging(1); | ||
| 11937 | + } | ||
| 11938 | + | ||
| 11939 | +void | ||
| 11940 | snmp_debug_internals(val) | ||
| 11941 | int val | ||
| 11942 | CODE: | ||
| 11943 | diff --git a/perl/SNMP/examples/pingmib.pl b/perl/SNMP/examples/pingmib.pl | ||
| 11944 | old mode 100644 | ||
| 11945 | new mode 100755 | ||
| 11946 | index 22dbe69..e6aa792 | ||
| 11947 | --- a/perl/SNMP/examples/pingmib.pl | ||
| 11948 | +++ b/perl/SNMP/examples/pingmib.pl | ||
| 11949 | @@ -1,3 +1,9 @@ | ||
| 11950 | +#!/usr/bin/env perl | ||
| 11951 | + | ||
| 11952 | +# Ping a host via the CISCO-PING-MIB. For more information about the | ||
| 11953 | +# CISCO-PING-MIB, see also | ||
| 11954 | +# http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-PING-MIB. | ||
| 11955 | + | ||
| 11956 | use strict; | ||
| 11957 | use SNMP; | ||
| 11958 | |||
| 11959 | @@ -13,8 +19,9 @@ my $community = shift || 'private'; | ||
| 11960 | my $dec = pack("C*",split /\./, $target); | ||
| 11961 | my $oid = ".1.3.6.1.4.1.9.9.16.1.1.1"; | ||
| 11962 | my $row = "300"; | ||
| 11963 | + my $res; | ||
| 11964 | |||
| 11965 | - $sess->set([ | ||
| 11966 | + $res = $sess->set([ | ||
| 11967 | ["$oid.16", $row, 6, "INTEGER"], | ||
| 11968 | ["$oid.16", $row, 5, "INTEGER"], | ||
| 11969 | ["$oid.15", $row, "MoNDS", "OCTETSTR"], | ||
| 11970 | @@ -22,8 +29,11 @@ my $community = shift || 'private'; | ||
| 11971 | ["$oid.4", $row, 20, "INTEGER"], | ||
| 11972 | ["$oid.5", $row, 150, "INTEGER"], | ||
| 11973 | ["$oid.3", $row, $dec, "OCTETSTR"]]); | ||
| 11974 | + defined($res) || die "row creation failed"; | ||
| 11975 | + | ||
| 11976 | + $res = $sess->set([["$oid.16", $row, 1, "INTEGER"]]); | ||
| 11977 | + defined($res) || die "row activation failed"; | ||
| 11978 | |||
| 11979 | - $sess->set([["$oid.16", $row, 1, "INTEGER"]]); | ||
| 11980 | sleep 30; | ||
| 11981 | my ($sent, $received, $low, $avg, $high, $completed) = $sess->get([ | ||
| 11982 | ["$oid.9", $row], ["$oid.10", $row], ["$oid.11", $row], | ||
| 11983 | diff --git a/perl/SNMP/t/async.t b/perl/SNMP/t/async.t | ||
| 11984 | index b1c86c6..f3fb38d 100644 | ||
| 11985 | --- a/perl/SNMP/t/async.t | ||
| 11986 | +++ b/perl/SNMP/t/async.t | ||
| 11987 | @@ -17,7 +17,7 @@ use SNMP; | ||
| 11988 | use vars qw($agent_port $comm $agent_host); | ||
| 11989 | |||
| 11990 | if ($^O =~ /win32/i) { | ||
| 11991 | - warn "Win32 detected - skipping async calls\n"; | ||
| 11992 | + warn "Win32/Win64 detected - skipping async calls\n"; | ||
| 11993 | exit; | ||
| 11994 | } | ||
| 11995 | |||
| 11996 | diff --git a/perl/SNMP/t/bulkwalk.t b/perl/SNMP/t/bulkwalk.t | ||
| 11997 | index 60f10b5..2d13e7b 100644 | ||
| 11998 | --- a/perl/SNMP/t/bulkwalk.t | ||
| 11999 | +++ b/perl/SNMP/t/bulkwalk.t | ||
| 12000 | @@ -326,7 +326,7 @@ $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters | ||
| 12001 | ['ifSpeed'], ['ifDescr']); # Repeated variables. | ||
| 12002 | |||
| 12003 | if ($^O =~ /win32/i) { | ||
| 12004 | - warn "Win32 detected - skipping async calls\n"; | ||
| 12005 | + warn "Win32/Win64 detected - skipping async calls\n"; | ||
| 12006 | } | ||
| 12007 | else { | ||
| 12008 | @list = $s1->bulkwalk(2, 16, $vars, [ \&async_cb1, $vars ] ); | ||
| 12009 | diff --git a/perl/SNMP/t/notify.t b/perl/SNMP/t/notify.t | ||
| 12010 | index 434237f..72600fa 100644 | ||
| 12011 | --- a/perl/SNMP/t/notify.t | ||
| 12012 | +++ b/perl/SNMP/t/notify.t | ||
| 12013 | @@ -10,7 +10,7 @@ BEGIN { | ||
| 12014 | $ENV{'MIBDIRS'} = '+' . abs_path("../../mibs"); | ||
| 12015 | } | ||
| 12016 | use Test; | ||
| 12017 | -BEGIN { $n = 10; plan tests => $n } | ||
| 12018 | +BEGIN { $n = 11; plan tests => $n } | ||
| 12019 | use SNMP; | ||
| 12020 | use vars qw($agent_port $comm $comm2 $trap_port $agent_host $sec_name $priv_pass $auth_pass $bad_name); | ||
| 12021 | require 't/startagent.pl'; | ||
| 12022 | @@ -21,20 +21,20 @@ my $enterprise = '.1.3.6.1.2.1.1.1.0'; | ||
| 12023 | my $generic = 'specific'; | ||
| 12024 | |||
| 12025 | # V1 trap testing | ||
| 12026 | -###################### 1 ############################# | ||
| 12027 | +######################## 1 ############################ | ||
| 12028 | # Fire up a trap session. | ||
| 12029 | my $s1 = | ||
| 12030 | new SNMP::Session (DestHost=>$agent_host,Version=>1,Community=>$comm,RemotePort=>$trap_port); | ||
| 12031 | ok(defined($s1)); | ||
| 12032 | |||
| 12033 | -########################## 2 #################################### | ||
| 12034 | +######################## 2 ############################ | ||
| 12035 | # test v1 trap | ||
| 12036 | if (defined($s1)) { | ||
| 12037 | $res = $s1->trap(enterprise => $enterprise, agent=>$agent_host, generic=>$generic,[[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] ); | ||
| 12038 | } | ||
| 12039 | ok($res =~ /^0 but true/); | ||
| 12040 | |||
| 12041 | -########################### 3 ############################# | ||
| 12042 | +######################## 3 ############################ | ||
| 12043 | # test with wrong varbind | ||
| 12044 | undef $res; | ||
| 12045 | if (defined($s1)) { | ||
| 12046 | @@ -45,12 +45,12 @@ ok(!defined($res)); | ||
| 12047 | ######################################################### | ||
| 12048 | |||
| 12049 | # V2 testing | ||
| 12050 | -########################## 4 ############################ | ||
| 12051 | +######################## 4 ############################ | ||
| 12052 | # Fire up a v2 trap session. | ||
| 12053 | my $s2 = | ||
| 12054 | new SNMP::Session (Version=>2, DestHost=>$agent_host,Community=>$comm2,RemotePort=>$trap_port); | ||
| 12055 | ok(defined($s2)); | ||
| 12056 | -######################### 5 ########################### | ||
| 12057 | +######################## 5 ############################ | ||
| 12058 | # test v2 trap | ||
| 12059 | undef $res; | ||
| 12060 | if (defined($s2)) { | ||
| 12061 | @@ -58,7 +58,7 @@ if (defined($s2)) { | ||
| 12062 | #print("res is $res\n"); | ||
| 12063 | } | ||
| 12064 | ok($res =~ /^0 but true/); | ||
| 12065 | -########################## 6 ########################## | ||
| 12066 | +######################## 6 ############################ | ||
| 12067 | # no trapoid and uptime given. Should take defaults... | ||
| 12068 | my $ret; | ||
| 12069 | if (defined($s2)) { | ||
| 12070 | @@ -66,27 +66,35 @@ if (defined($s2)) { | ||
| 12071 | #print("res is $ret\n"); | ||
| 12072 | } | ||
| 12073 | ok(defined($ret)); | ||
| 12074 | +######################## 7 ############################ | ||
| 12075 | +# no varbind list given. | ||
| 12076 | +undef $res; | ||
| 12077 | +if (defined($s2)) { | ||
| 12078 | + $res = $s2->trap(trapoid=>'coldStart'); | ||
| 12079 | + #print("res is $res\n"); | ||
| 12080 | +} | ||
| 12081 | +ok(defined($res) && $res =~ /^0 but true/); | ||
| 12082 | |||
| 12083 | ######################################################### | ||
| 12084 | |||
| 12085 | # v3 testing | ||
| 12086 | -######################## 7 ############################ | ||
| 12087 | +######################## 8 ############################ | ||
| 12088 | # Fire up a v3 trap session. | ||
| 12089 | my $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name); | ||
| 12090 | ok(defined($s3)); | ||
| 12091 | |||
| 12092 | -######################## 8 ########################### | ||
| 12093 | +######################## 9 ############################ | ||
| 12094 | if (defined($s3)) { | ||
| 12095 | $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] ); | ||
| 12096 | } | ||
| 12097 | ok($res =~ /^0 but true/); | ||
| 12098 | |||
| 12099 | -#################### 9 ##################### | ||
| 12100 | +######################## 10 ############################ | ||
| 12101 | # Fire up a v3 trap session. | ||
| 12102 | $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name, SecLevel => authPriv, AuthPass => $auth_pass, PrivPass => $priv_pass); | ||
| 12103 | ok(defined($s3)); | ||
| 12104 | |||
| 12105 | -######################## 10 ########################### | ||
| 12106 | +######################## 11 ############################ | ||
| 12107 | undef $res; | ||
| 12108 | if (defined($s3)) { | ||
| 12109 | $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] ); | ||
| 12110 | diff --git a/perl/agent/agent.pm b/perl/agent/agent.pm | ||
| 12111 | index 7a71a17..78421cb 100644 | ||
| 12112 | --- a/perl/agent/agent.pm | ||
| 12113 | +++ b/perl/agent/agent.pm | ||
| 12114 | @@ -98,7 +98,7 @@ sub AUTOLOAD { | ||
| 12115 | ($constname = $AUTOLOAD) =~ s/.*:://; | ||
| 12116 | croak "& not defined" if $constname eq 'constant'; | ||
| 12117 | my $val; | ||
| 12118 | - ($!, $val) = constant($constname, @_ ? $_[0] : 0); | ||
| 12119 | + ($!, $val) = constant($constname); | ||
| 12120 | if ($! != 0) { | ||
| 12121 | if ($! =~ /Invalid/ || $!{EINVAL}) { | ||
| 12122 | $AutoLoader::AUTOLOAD = $AUTOLOAD; | ||
| 12123 | @@ -199,6 +199,12 @@ sub agent_check_and_process { | ||
| 12124 | __agent_check_and_process($blocking || 0); | ||
| 12125 | } | ||
| 12126 | |||
| 12127 | +sub uptime { | ||
| 12128 | + my $self = shift; | ||
| 12129 | + $self->maybe_init_lib(); | ||
| 12130 | + return _uptime(); | ||
| 12131 | +} | ||
| 12132 | + | ||
| 12133 | bootstrap NetSNMP::agent $VERSION; | ||
| 12134 | |||
| 12135 | # Preloaded methods go here. | ||
| 12136 | diff --git a/perl/agent/agent.xs b/perl/agent/agent.xs | ||
| 12137 | index ee77d50..c7b5d9a 100644 | ||
| 12138 | --- a/perl/agent/agent.xs | ||
| 12139 | +++ b/perl/agent/agent.xs | ||
| 12140 | @@ -215,13 +215,12 @@ handler_wrapper(netsnmp_mib_handler *handler, | ||
| 12141 | MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent | ||
| 12142 | |||
| 12143 | void | ||
| 12144 | -constant(sv,arg) | ||
| 12145 | +constant(sv) | ||
| 12146 | PREINIT: | ||
| 12147 | STRLEN len; | ||
| 12148 | INPUT: | ||
| 12149 | SV * sv | ||
| 12150 | char * s = SvPV(sv, len); | ||
| 12151 | - int arg | ||
| 12152 | INIT: | ||
| 12153 | int status; | ||
| 12154 | double value; | ||
| 12155 | @@ -239,6 +238,13 @@ __agent_check_and_process(block = 1) | ||
| 12156 | OUTPUT: | ||
| 12157 | RETVAL | ||
| 12158 | |||
| 12159 | +int | ||
| 12160 | +_uptime() | ||
| 12161 | + CODE: | ||
| 12162 | + RETVAL = netsnmp_get_agent_uptime(); | ||
| 12163 | + OUTPUT: | ||
| 12164 | + RETVAL | ||
| 12165 | + | ||
| 12166 | void | ||
| 12167 | init_mib() | ||
| 12168 | CODE: | ||
| 12169 | @@ -272,6 +278,8 @@ na_shutdown(me) | ||
| 12170 | SV *me; | ||
| 12171 | CODE: | ||
| 12172 | { | ||
| 12173 | + if (0) | ||
| 12174 | + printf("me = %p\n", me); | ||
| 12175 | snmp_shutdown("perl"); | ||
| 12176 | } | ||
| 12177 | |||
| 12178 | @@ -284,6 +292,8 @@ na_errlog(me,value) | ||
| 12179 | char * stringptr; | ||
| 12180 | CODE: | ||
| 12181 | { | ||
| 12182 | + if (0) | ||
| 12183 | + printf("me = %p\n", me); | ||
| 12184 | stringptr = SvPV(value, stringlen); | ||
| 12185 | snmp_log(LOG_ERR, "%s", stringptr ); | ||
| 12186 | } | ||
| 12187 | @@ -340,13 +350,27 @@ nsahr_register(me) | ||
| 12188 | SV *me; | ||
| 12189 | PREINIT: | ||
| 12190 | netsnmp_handler_registration *reginfo; | ||
| 12191 | + handler_cb_data *cb_data = NULL; | ||
| 12192 | CODE: | ||
| 12193 | { | ||
| 12194 | reginfo = (netsnmp_handler_registration *) SvIV(SvRV(me)); | ||
| 12195 | + if (reginfo && reginfo->handler && reginfo->handler->myvoid) | ||
| 12196 | + cb_data = (handler_cb_data *) (reginfo->handler->myvoid); | ||
| 12197 | RETVAL = netsnmp_register_handler(reginfo); | ||
| 12198 | if (!RETVAL) { | ||
| 12199 | /* the agent now has a "reference" to this reg pointer */ | ||
| 12200 | SvREFCNT_inc(me); | ||
| 12201 | + } else { | ||
| 12202 | + /* | ||
| 12203 | + * The reginfo was freed by netsnmp_register_handler, | ||
| 12204 | + * don't touch it in nsahr_DESTROY! | ||
| 12205 | + */ | ||
| 12206 | + sv_setiv(SvRV(me), 0); | ||
| 12207 | + if (cb_data) { | ||
| 12208 | + /* And just free the callback. */ | ||
| 12209 | + SvREFCNT_dec(cb_data->perl_cb); | ||
| 12210 | + free(cb_data); | ||
| 12211 | + } | ||
| 12212 | } | ||
| 12213 | } | ||
| 12214 | OUTPUT: | ||
| 12215 | diff --git a/perl/agent/default_store/default_store.xs b/perl/agent/default_store/default_store.xs | ||
| 12216 | index 815f9fd..bff1485 100644 | ||
| 12217 | --- a/perl/agent/default_store/default_store.xs | ||
| 12218 | +++ b/perl/agent/default_store/default_store.xs | ||
| 12219 | @@ -622,7 +622,7 @@ constant(sv) | ||
| 12220 | #endif | ||
| 12221 | STRLEN len; | ||
| 12222 | int type; | ||
| 12223 | - IV iv; | ||
| 12224 | + IV iv = 0; | ||
| 12225 | /* NV nv; Uncomment this if you need to return NVs */ | ||
| 12226 | /* const char *pv; Uncomment this if you need to return PVs */ | ||
| 12227 | INPUT: | ||
| 12228 | diff --git a/perl/agent/test.pl b/perl/agent/test.pl | ||
| 12229 | index a7ac8f9..88cba56 100644 | ||
| 12230 | --- a/perl/agent/test.pl | ||
| 12231 | +++ b/perl/agent/test.pl | ||
| 12232 | @@ -9,7 +9,7 @@ | ||
| 12233 | BEGIN { $| = 1; | ||
| 12234 | $ENV{'SNMPCONFPATH'} = 'nopath'; | ||
| 12235 | $ENV{'MIBS'} = ''; | ||
| 12236 | - print "1..5\n"; | ||
| 12237 | + print "1..6\n"; | ||
| 12238 | } | ||
| 12239 | END {print "not ok 1\n" unless $loaded;} | ||
| 12240 | use NetSNMP::agent (':all'); | ||
| 12241 | @@ -76,6 +76,12 @@ $regitem = $agent->register("test_reg", ".1.3.6.1.8888", \&testsub); | ||
| 12242 | print it($regitem, 4); | ||
| 12243 | #print STDERR $regitem,":",ref($regitem),"\n"; | ||
| 12244 | print it(ref($regitem) eq "NetSNMP::agent::netsnmp_handler_registration", 5); | ||
| 12245 | + | ||
| 12246 | +my $uptime1 = $agent->uptime(); | ||
| 12247 | +my $uptime2 = $agent->uptime(666); | ||
| 12248 | +my $uptime3 = $agent->uptime(555, 444); | ||
| 12249 | +print it($uptime1 <= $uptime2 && $uptime2 <= $uptime3, 6); | ||
| 12250 | + | ||
| 12251 | exit; | ||
| 12252 | |||
| 12253 | while(1) { | ||
| 12254 | diff --git a/perl/default_store/default_store.xs b/perl/default_store/default_store.xs | ||
| 12255 | index e2b8a34..ca252fb 100644 | ||
| 12256 | --- a/perl/default_store/default_store.xs | ||
| 12257 | +++ b/perl/default_store/default_store.xs | ||
| 12258 | @@ -1261,7 +1261,7 @@ constant(sv) | ||
| 12259 | #endif | ||
| 12260 | STRLEN len; | ||
| 12261 | int type; | ||
| 12262 | - IV iv; | ||
| 12263 | + IV iv = 0; | ||
| 12264 | /* NV nv; Uncomment this if you need to return NVs */ | ||
| 12265 | /* const char *pv; Uncomment this if you need to return PVs */ | ||
| 12266 | INPUT: | ||
| 12267 | diff --git a/python/netsnmp/client_intf.c b/python/netsnmp/client_intf.c | ||
| 12268 | index f2abf0b..559a9c0 100644 | ||
| 12269 | --- a/python/netsnmp/client_intf.c | ||
| 12270 | +++ b/python/netsnmp/client_intf.c | ||
| 12271 | @@ -1,5 +1,11 @@ | ||
| 12272 | #include <Python.h> | ||
| 12273 | |||
| 12274 | +#if PY_VERSION_HEX < 0x02050000 | ||
| 12275 | +typedef int Py_ssize_t; | ||
| 12276 | +#define PY_SSIZE_T_MAX INT_MAX | ||
| 12277 | +#define PY_SSIZE_T_MIN INT_MIN | ||
| 12278 | +#endif | ||
| 12279 | + | ||
| 12280 | #include <net-snmp/net-snmp-config.h> | ||
| 12281 | #include <net-snmp/net-snmp-includes.h> | ||
| 12282 | #include <sys/types.h> | ||
| 12283 | @@ -67,8 +73,6 @@ | ||
| 12284 | |||
| 12285 | typedef netsnmp_session SnmpSession; | ||
| 12286 | typedef struct tree SnmpMibNode; | ||
| 12287 | -static void __recalc_timeout (struct timeval*,struct timeval*, | ||
| 12288 | - struct timeval*,struct timeval*, int* ); | ||
| 12289 | static int __is_numeric_oid (char*); | ||
| 12290 | static int __is_leaf (struct tree*); | ||
| 12291 | static int __translate_appl_type (char*); | ||
| 12292 | @@ -80,10 +84,6 @@ static int __sprint_num_objid (char *, oid *, int); | ||
| 12293 | static int __scan_num_objid (char *, oid *, size_t *); | ||
| 12294 | static int __get_type_str (int, char *); | ||
| 12295 | static int __get_label_iid (char *, char **, char **, int); | ||
| 12296 | -static int __oid_cmp (oid *, int, oid *, int); | ||
| 12297 | -static int __tp_sprint_num_objid (char*,SnmpMibNode *); | ||
| 12298 | -static SnmpMibNode * __get_next_mib_node (SnmpMibNode *); | ||
| 12299 | -static struct tree * __oid2tp (oid*, int, struct tree *, int*); | ||
| 12300 | static struct tree * __tag2oid (char *, char *, oid *, int *, int *, int); | ||
| 12301 | static int __concat_oid_str (oid *, int *, char *); | ||
| 12302 | static int __add_var_val_str (netsnmp_pdu *, oid *, int, char *, | ||
| 12303 | @@ -129,46 +129,6 @@ __libraries_init(char *appname) | ||
| 12304 | NETSNMP_OID_OUTPUT_SUFFIX); | ||
| 12305 | } | ||
| 12306 | |||
| 12307 | -static void | ||
| 12308 | -__recalc_timeout (tvp, ctvp, ltvp, itvp, block) | ||
| 12309 | -struct timeval* tvp; | ||
| 12310 | -struct timeval* ctvp; | ||
| 12311 | -struct timeval* ltvp; | ||
| 12312 | -struct timeval* itvp; | ||
| 12313 | -int *block; | ||
| 12314 | -{ | ||
| 12315 | - struct timeval now; | ||
| 12316 | - | ||
| 12317 | - if (!timerisset(itvp)) return; /* interval zero means loop forever */ | ||
| 12318 | - *block = 0; | ||
| 12319 | - gettimeofday(&now,(struct timezone *)0); | ||
| 12320 | - | ||
| 12321 | - if (ctvp->tv_sec < 0) { /* first time or callback just fired */ | ||
| 12322 | - timersub(&now,ltvp,ctvp); | ||
| 12323 | - timersub(ctvp,itvp,ctvp); | ||
| 12324 | - timersub(itvp,ctvp,ctvp); | ||
| 12325 | - timeradd(ltvp,itvp,ltvp); | ||
| 12326 | - } else { | ||
| 12327 | - timersub(&now,ltvp,ctvp); | ||
| 12328 | - timersub(itvp,ctvp,ctvp); | ||
| 12329 | - } | ||
| 12330 | - | ||
| 12331 | - /* flag is set for callback but still hasnt fired so set to something | ||
| 12332 | - * small and we will service packets first if there are any ready | ||
| 12333 | - * (also guard against negative timeout - should never happen?) | ||
| 12334 | - */ | ||
| 12335 | - if (!timerisset(ctvp) || ctvp->tv_sec < 0 || ctvp->tv_usec < 0) { | ||
| 12336 | - ctvp->tv_sec = 0; | ||
| 12337 | - ctvp->tv_usec = 10; | ||
| 12338 | - } | ||
| 12339 | - | ||
| 12340 | - /* if snmp timeout > callback timeout or no more requests to process */ | ||
| 12341 | - if (timercmp(tvp, ctvp, >) || !timerisset(tvp)) { | ||
| 12342 | - *tvp = *ctvp; /* use the smaller non-zero timeout */ | ||
| 12343 | - timerclear(ctvp); /* used as a flag to let callback fire on timeout */ | ||
| 12344 | - } | ||
| 12345 | -} | ||
| 12346 | - | ||
| 12347 | static int | ||
| 12348 | __is_numeric_oid (oidstr) | ||
| 12349 | char* oidstr; | ||
| 12350 | @@ -189,21 +149,6 @@ struct tree* tp; | ||
| 12351 | (tp->parent && __get_type_str(tp->parent->type,buf) ))); | ||
| 12352 | } | ||
| 12353 | |||
| 12354 | -static SnmpMibNode* | ||
| 12355 | -__get_next_mib_node (tp) | ||
| 12356 | -SnmpMibNode* tp; | ||
| 12357 | -{ | ||
| 12358 | - /* printf("tp = %lX, parent = %lX, peer = %lX, child = %lX\n", | ||
| 12359 | - tp, tp->parent, tp->next_peer, tp->child_list); */ | ||
| 12360 | - if (tp->child_list) return(tp->child_list); | ||
| 12361 | - if (tp->next_peer) return(tp->next_peer); | ||
| 12362 | - if (!tp->parent) return(NULL); | ||
| 12363 | - for (tp = tp->parent; !tp->next_peer; tp = tp->parent) { | ||
| 12364 | - if (!tp->parent) return(NULL); | ||
| 12365 | - } | ||
| 12366 | - return(tp->next_peer); | ||
| 12367 | -} | ||
| 12368 | - | ||
| 12369 | static int | ||
| 12370 | __translate_appl_type(typestr) | ||
| 12371 | char* typestr; | ||
| 12372 | @@ -261,50 +206,36 @@ int type; | ||
| 12373 | switch (type) { | ||
| 12374 | case ASN_INTEGER: | ||
| 12375 | return(TYPE_INTEGER); | ||
| 12376 | - break; | ||
| 12377 | case ASN_OCTET_STR: | ||
| 12378 | return(TYPE_OCTETSTR); | ||
| 12379 | - break; | ||
| 12380 | case ASN_OPAQUE: | ||
| 12381 | return(TYPE_OPAQUE); | ||
| 12382 | - break; | ||
| 12383 | case ASN_OBJECT_ID: | ||
| 12384 | return(TYPE_OBJID); | ||
| 12385 | - break; | ||
| 12386 | case ASN_TIMETICKS: | ||
| 12387 | return(TYPE_TIMETICKS); | ||
| 12388 | - break; | ||
| 12389 | case ASN_GAUGE: | ||
| 12390 | return(TYPE_GAUGE); | ||
| 12391 | - break; | ||
| 12392 | case ASN_COUNTER: | ||
| 12393 | return(TYPE_COUNTER); | ||
| 12394 | - break; | ||
| 12395 | case ASN_IPADDRESS: | ||
| 12396 | return(TYPE_IPADDR); | ||
| 12397 | - break; | ||
| 12398 | case ASN_BIT_STR: | ||
| 12399 | return(TYPE_BITSTRING); | ||
| 12400 | - break; | ||
| 12401 | case ASN_NULL: | ||
| 12402 | return(TYPE_NULL); | ||
| 12403 | - break; | ||
| 12404 | /* no translation for these exception type values */ | ||
| 12405 | case SNMP_ENDOFMIBVIEW: | ||
| 12406 | case SNMP_NOSUCHOBJECT: | ||
| 12407 | case SNMP_NOSUCHINSTANCE: | ||
| 12408 | return(type); | ||
| 12409 | - break; | ||
| 12410 | case ASN_UINTEGER: | ||
| 12411 | return(TYPE_UINTEGER); | ||
| 12412 | - break; | ||
| 12413 | case ASN_COUNTER64: | ||
| 12414 | return(TYPE_COUNTER64); | ||
| 12415 | - break; | ||
| 12416 | default: | ||
| 12417 | - return(TYPE_OTHER); | ||
| 12418 | fprintf(stderr, "translate_asn_type: unhandled asn type (%d)\n",type); | ||
| 12419 | - break; | ||
| 12420 | + return(TYPE_OTHER); | ||
| 12421 | } | ||
| 12422 | } | ||
| 12423 | |||
| 12424 | @@ -335,8 +266,7 @@ int flag; | ||
| 12425 | if (flag == USE_ENUMS) { | ||
| 12426 | for(ep = tp->enums; ep; ep = ep->next) { | ||
| 12427 | if (ep->value == *var->val.integer) { | ||
| 12428 | - strncpy(buf, ep->label, buf_len); | ||
| 12429 | - buf[buf_len -1] = 0; | ||
| 12430 | + strlcpy(buf, ep->label, buf_len); | ||
| 12431 | len = STRLEN(buf); | ||
| 12432 | break; | ||
| 12433 | } | ||
| 12434 | @@ -445,21 +375,6 @@ int len; | ||
| 12435 | } | ||
| 12436 | |||
| 12437 | static int | ||
| 12438 | -__tp_sprint_num_objid (buf, tp) | ||
| 12439 | -char *buf; | ||
| 12440 | -SnmpMibNode *tp; | ||
| 12441 | -{ | ||
| 12442 | - oid newname[MAX_OID_LEN], *op; | ||
| 12443 | - /* code taken from get_node in snmp_client.c */ | ||
| 12444 | - for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) { | ||
| 12445 | - *op = tp->subid; | ||
| 12446 | - tp = tp->parent; | ||
| 12447 | - if (tp == NULL) break; | ||
| 12448 | - } | ||
| 12449 | - return __sprint_num_objid(buf, op, newname + MAX_OID_LEN - op); | ||
| 12450 | -} | ||
| 12451 | - | ||
| 12452 | -static int | ||
| 12453 | __scan_num_objid (buf, objid, len) | ||
| 12454 | char *buf; | ||
| 12455 | oid *objid; | ||
| 12456 | @@ -674,24 +589,6 @@ int flag; | ||
| 12457 | return(SUCCESS); | ||
| 12458 | } | ||
| 12459 | |||
| 12460 | - | ||
| 12461 | -static int | ||
| 12462 | -__oid_cmp(oida_arr, oida_arr_len, oidb_arr, oidb_arr_len) | ||
| 12463 | -oid *oida_arr; | ||
| 12464 | -int oida_arr_len; | ||
| 12465 | -oid *oidb_arr; | ||
| 12466 | -int oidb_arr_len; | ||
| 12467 | -{ | ||
| 12468 | - for (;oida_arr_len && oidb_arr_len; | ||
| 12469 | - oida_arr++, oida_arr_len--, oidb_arr++, oidb_arr_len--) { | ||
| 12470 | - if (*oida_arr == *oidb_arr) continue; | ||
| 12471 | - return(*oida_arr > *oidb_arr ? 1 : -1); | ||
| 12472 | - } | ||
| 12473 | - if (oida_arr_len == oidb_arr_len) return(0); | ||
| 12474 | - return(oida_arr_len > oidb_arr_len ? 1 : -1); | ||
| 12475 | -} | ||
| 12476 | - | ||
| 12477 | - | ||
| 12478 | /* Convert a tag (string) to an OID array */ | ||
| 12479 | /* Tag can be either a symbolic name, or an OID string */ | ||
| 12480 | static struct tree * | ||
| 12481 | @@ -708,9 +605,6 @@ int best_guess; | ||
| 12482 | oid newname[MAX_OID_LEN], *op; | ||
| 12483 | size_t newname_len = 0; | ||
| 12484 | |||
| 12485 | - char str_buf[STR_BUF_SIZE]; | ||
| 12486 | - str_buf[0] = '\0'; | ||
| 12487 | - | ||
| 12488 | if (type) *type = TYPE_UNKNOWN; | ||
| 12489 | if (oid_arr_len) *oid_arr_len = 0; | ||
| 12490 | if (!tag) goto done; | ||
| 12491 | @@ -796,43 +690,10 @@ int best_guess; | ||
| 12492 | } | ||
| 12493 | } | ||
| 12494 | done: | ||
| 12495 | - if (iid && *iid) __concat_oid_str(oid_arr, oid_arr_len, iid); | ||
| 12496 | + if (iid && *iid && oid_arr_len) | ||
| 12497 | + __concat_oid_str(oid_arr, oid_arr_len, iid); | ||
| 12498 | return(rtp); | ||
| 12499 | } | ||
| 12500 | -/* searches down the mib tree for the given oid | ||
| 12501 | - returns the last found tp and its index in lastind | ||
| 12502 | - */ | ||
| 12503 | -static struct tree * | ||
| 12504 | -__oid2tp (oidp, len, subtree, lastind) | ||
| 12505 | -oid* oidp; | ||
| 12506 | -int len; | ||
| 12507 | -struct tree * subtree; | ||
| 12508 | -int* lastind; | ||
| 12509 | -{ | ||
| 12510 | - struct tree *return_tree = NULL; | ||
| 12511 | - | ||
| 12512 | - | ||
| 12513 | - for (; subtree; subtree = subtree->next_peer) { | ||
| 12514 | - if (*oidp == subtree->subid){ | ||
| 12515 | - goto found; | ||
| 12516 | - } | ||
| 12517 | - } | ||
| 12518 | - *lastind=0; | ||
| 12519 | - return NULL; | ||
| 12520 | - | ||
| 12521 | -found: | ||
| 12522 | - if (len > 1){ | ||
| 12523 | - return_tree = | ||
| 12524 | - __oid2tp(oidp + 1, len - 1, subtree->child_list, lastind); | ||
| 12525 | - (*lastind)++; | ||
| 12526 | - } else { | ||
| 12527 | - *lastind=1; | ||
| 12528 | - } | ||
| 12529 | - if (return_tree) | ||
| 12530 | - return return_tree; | ||
| 12531 | - else | ||
| 12532 | - return subtree; | ||
| 12533 | -} | ||
| 12534 | |||
| 12535 | /* function: __concat_oid_str | ||
| 12536 | * | ||
| 12537 | @@ -848,19 +709,22 @@ oid *doid_arr; | ||
| 12538 | int *doid_arr_len; | ||
| 12539 | char * soid_str; | ||
| 12540 | { | ||
| 12541 | - char soid_buf[STR_BUF_SIZE]; | ||
| 12542 | + char *soid_buf; | ||
| 12543 | char *cp; | ||
| 12544 | char *st; | ||
| 12545 | |||
| 12546 | if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */ | ||
| 12547 | if (*soid_str == '.') soid_str++; | ||
| 12548 | - strcpy(soid_buf, soid_str); | ||
| 12549 | + soid_buf = strdup(soid_str); | ||
| 12550 | + if (!soid_buf) | ||
| 12551 | + return FAILURE; | ||
| 12552 | cp = strtok_r(soid_buf,".",&st); | ||
| 12553 | while (cp) { | ||
| 12554 | sscanf(cp, "%lu", &(doid_arr[(*doid_arr_len)++])); | ||
| 12555 | /* doid_arr[(*doid_arr_len)++] = atoi(cp); */ | ||
| 12556 | cp = strtok_r(NULL,".",&st); | ||
| 12557 | } | ||
| 12558 | + free(soid_buf); | ||
| 12559 | return(SUCCESS); | ||
| 12560 | } | ||
| 12561 | |||
| 12562 | @@ -1004,7 +868,7 @@ char *err_str; | ||
| 12563 | int *err_num; | ||
| 12564 | int *err_ind; | ||
| 12565 | { | ||
| 12566 | - int status; | ||
| 12567 | + int status = 0; | ||
| 12568 | long command = pdu->command; | ||
| 12569 | char *tmp_err_str; | ||
| 12570 | |||
| 12571 | @@ -1017,7 +881,7 @@ int *err_ind; | ||
| 12572 | if (ss == NULL) { | ||
| 12573 | *err_num = 0; | ||
| 12574 | *err_ind = SNMPERR_BAD_SESSION; | ||
| 12575 | - strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1); | ||
| 12576 | + strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE); | ||
| 12577 | goto done; | ||
| 12578 | } | ||
| 12579 | |||
| 12580 | @@ -1025,7 +889,7 @@ int *err_ind; | ||
| 12581 | if (tmp_err_str == NULL) { | ||
| 12582 | *err_num = errno; | ||
| 12583 | *err_ind = SNMPERR_MALLOC; | ||
| 12584 | - strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1); | ||
| 12585 | + strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE); | ||
| 12586 | goto done; | ||
| 12587 | } | ||
| 12588 | |||
| 12589 | @@ -1070,8 +934,8 @@ retry: | ||
| 12590 | /* in SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */ | ||
| 12591 | case SNMP_ERR_INCONSISTENTNAME: | ||
| 12592 | default: | ||
| 12593 | - strncpy(err_str, (char*)snmp_errstring((*response)->errstat), | ||
| 12594 | - STR_BUF_SIZE - 1); | ||
| 12595 | + strlcpy(err_str, (char*)snmp_errstring((*response)->errstat), | ||
| 12596 | + STR_BUF_SIZE); | ||
| 12597 | *err_num = (int)(*response)->errstat; | ||
| 12598 | *err_ind = (*response)->errindex; | ||
| 12599 | status = (*response)->errstat; | ||
| 12600 | @@ -1082,8 +946,7 @@ retry: | ||
| 12601 | case STAT_TIMEOUT: | ||
| 12602 | case STAT_ERROR: | ||
| 12603 | snmp_sess_error(ss, err_num, err_ind, &tmp_err_str); | ||
| 12604 | - strncpy(err_str, tmp_err_str, STR_BUF_SIZE - 1); | ||
| 12605 | - err_str[STR_BUF_SIZE - 1] = '\0'; | ||
| 12606 | + strlcpy(err_str, tmp_err_str, STR_BUF_SIZE); | ||
| 12607 | break; | ||
| 12608 | |||
| 12609 | default: | ||
| 12610 | @@ -1368,8 +1231,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args) | ||
| 12611 | USM_AUTH_PROTO_SHA_LEN); | ||
| 12612 | session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN; | ||
| 12613 | } else if (!strcmp(auth_proto, "DEFAULT")) { | ||
| 12614 | - session.securityAuthProto = | ||
| 12615 | - get_default_authtype(&session.securityAuthProtoLen); | ||
| 12616 | + const oid* a = get_default_authtype(&session.securityAuthProtoLen); | ||
| 12617 | + session.securityAuthProto | ||
| 12618 | + = snmp_duplicate_objid(a, session.securityAuthProtoLen); | ||
| 12619 | } else { | ||
| 12620 | if (verbose) | ||
| 12621 | printf("error:snmp_new_v3_session:Unsupported authentication protocol(%s)\n", auth_proto); | ||
| 12622 | @@ -1403,8 +1267,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args) | ||
| 12623 | USM_PRIV_PROTO_AES_LEN); | ||
| 12624 | session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN; | ||
| 12625 | } else if (!strcmp(priv_proto, "DEFAULT")) { | ||
| 12626 | - session.securityPrivProto = | ||
| 12627 | - get_default_privtype(&session.securityPrivProtoLen); | ||
| 12628 | + const oid *p = get_default_privtype(&session.securityPrivProtoLen); | ||
| 12629 | + session.securityPrivProto | ||
| 12630 | + = snmp_duplicate_objid(p, session.securityPrivProtoLen); | ||
| 12631 | } else { | ||
| 12632 | if (verbose) | ||
| 12633 | printf("error:snmp_new_v3_session:Unsupported privacy protocol(%s)\n", priv_proto); | ||
| 12634 | @@ -1448,7 +1313,6 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args) | ||
| 12635 | int timeout; | ||
| 12636 | char * sec_name; | ||
| 12637 | int sec_level; | ||
| 12638 | - char * sec_eng_id; | ||
| 12639 | char * context_eng_id; | ||
| 12640 | char * context; | ||
| 12641 | char * our_identity; | ||
| 12642 | @@ -1525,7 +1389,11 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args) | ||
| 12643 | |||
| 12644 | if (!ss) | ||
| 12645 | return NULL; | ||
| 12646 | - return Py_BuildValue("i", (int)ss); | ||
| 12647 | + /* | ||
| 12648 | + * Note: on a 64-bit system the statement below discards the upper 32 bits of | ||
| 12649 | + * "ss", which is most likely a bug. | ||
| 12650 | + */ | ||
| 12651 | + return Py_BuildValue("i", (int)(uintptr_t)ss); | ||
| 12652 | } | ||
| 12653 | |||
| 12654 | static PyObject * | ||
| 12655 | @@ -1563,7 +1431,6 @@ netsnmp_get(PyObject *self, PyObject *args) | ||
| 12656 | int oid_arr_len = MAX_OID_LEN; | ||
| 12657 | int type; | ||
| 12658 | char type_str[MAX_TYPE_NAME_LEN]; | ||
| 12659 | - int status; | ||
| 12660 | u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; | ||
| 12661 | size_t str_buf_len = sizeof(str_buf); | ||
| 12662 | size_t out_len = 0; | ||
| 12663 | @@ -1646,8 +1513,8 @@ netsnmp_get(PyObject *self, PyObject *args) | ||
| 12664 | } | ||
| 12665 | } | ||
| 12666 | |||
| 12667 | - status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, | ||
| 12668 | - err_str, &err_num, &err_ind); | ||
| 12669 | + __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num, | ||
| 12670 | + &err_ind); | ||
| 12671 | __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind); | ||
| 12672 | |||
| 12673 | /* | ||
| 12674 | @@ -1698,8 +1565,8 @@ netsnmp_get(PyObject *self, PyObject *args) | ||
| 12675 | &out_len, 0, &buf_over, | ||
| 12676 | vars->name,vars->name_length); | ||
| 12677 | if (_debug_level) | ||
| 12678 | - printf("netsnmp_get:str_bufp:%s:%d:%d\n", | ||
| 12679 | - str_bufp,str_buf_len,out_len); | ||
| 12680 | + printf("netsnmp_get:str_bufp:%s:%d:%d\n", str_bufp, | ||
| 12681 | + (int)str_buf_len, (int)out_len); | ||
| 12682 | |||
| 12683 | str_buf[sizeof(str_buf)-1] = '\0'; | ||
| 12684 | |||
| 12685 | @@ -1715,20 +1582,19 @@ netsnmp_get(PyObject *self, PyObject *args) | ||
| 12686 | |||
| 12687 | if (_debug_level) printf("netsnmp_get:str_buf:%s\n",str_buf); | ||
| 12688 | |||
| 12689 | - __get_label_iid(str_buf, &tag, &iid, getlabel_flag); | ||
| 12690 | + __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag); | ||
| 12691 | |||
| 12692 | py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag)); | ||
| 12693 | py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid)); | ||
| 12694 | |||
| 12695 | __get_type_str(type, type_str); | ||
| 12696 | |||
| 12697 | - py_netsnmp_attr_set_string(varbind, "type", type_str, | ||
| 12698 | - STRLEN(type_str)); | ||
| 12699 | + py_netsnmp_attr_set_string(varbind, "type", type_str, strlen(type_str)); | ||
| 12700 | |||
| 12701 | - len = __snprint_value(str_buf,sizeof(str_buf), | ||
| 12702 | - vars,tp,type,sprintval_flag); | ||
| 12703 | + len = __snprint_value((char *) str_buf, sizeof(str_buf), | ||
| 12704 | + vars, tp, type, sprintval_flag); | ||
| 12705 | str_buf[len] = '\0'; | ||
| 12706 | - py_netsnmp_attr_set_string(varbind, "val", str_buf, len); | ||
| 12707 | + py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len); | ||
| 12708 | |||
| 12709 | /* save in return tuple as well */ | ||
| 12710 | PyTuple_SetItem(val_tuple, varlist_ind, | ||
| 12711 | @@ -1772,13 +1638,12 @@ netsnmp_getnext(PyObject *self, PyObject *args) | ||
| 12712 | int oid_arr_len = MAX_OID_LEN; | ||
| 12713 | int type; | ||
| 12714 | char type_str[MAX_TYPE_NAME_LEN]; | ||
| 12715 | - int status; | ||
| 12716 | u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; | ||
| 12717 | size_t str_buf_len = sizeof(str_buf); | ||
| 12718 | size_t out_len = 0; | ||
| 12719 | int buf_over = 0; | ||
| 12720 | char *tag; | ||
| 12721 | - char *iid; | ||
| 12722 | + char *iid = NULL; | ||
| 12723 | int getlabel_flag = NO_FLAGS; | ||
| 12724 | int sprintval_flag = USE_BASIC; | ||
| 12725 | int verbose = py_netsnmp_verbose(); | ||
| 12726 | @@ -1862,8 +1727,8 @@ netsnmp_getnext(PyObject *self, PyObject *args) | ||
| 12727 | } | ||
| 12728 | } | ||
| 12729 | |||
| 12730 | - status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, | ||
| 12731 | - err_str, &err_num, &err_ind); | ||
| 12732 | + __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num, | ||
| 12733 | + &err_ind); | ||
| 12734 | __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind); | ||
| 12735 | |||
| 12736 | /* | ||
| 12737 | @@ -1924,7 +1789,7 @@ netsnmp_getnext(PyObject *self, PyObject *args) | ||
| 12738 | type = __translate_asn_type(vars->type); | ||
| 12739 | } | ||
| 12740 | |||
| 12741 | - __get_label_iid(str_buf, &tag, &iid, getlabel_flag); | ||
| 12742 | + __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag); | ||
| 12743 | |||
| 12744 | if (_debug_level) | ||
| 12745 | printf("netsnmp_getnext: filling response: %s:%s\n", tag, iid); | ||
| 12746 | @@ -1935,13 +1800,13 @@ netsnmp_getnext(PyObject *self, PyObject *args) | ||
| 12747 | __get_type_str(type, type_str); | ||
| 12748 | |||
| 12749 | py_netsnmp_attr_set_string(varbind, "type", type_str, | ||
| 12750 | - STRLEN(type_str)); | ||
| 12751 | + strlen(type_str)); | ||
| 12752 | |||
| 12753 | - len = __snprint_value(str_buf,sizeof(str_buf), | ||
| 12754 | - vars,tp,type,sprintval_flag); | ||
| 12755 | + len = __snprint_value((char *) str_buf, sizeof(str_buf), | ||
| 12756 | + vars, tp, type, sprintval_flag); | ||
| 12757 | str_buf[len] = '\0'; | ||
| 12758 | |||
| 12759 | - py_netsnmp_attr_set_string(varbind, "val", str_buf, len); | ||
| 12760 | + py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len); | ||
| 12761 | |||
| 12762 | /* save in return tuple as well */ | ||
| 12763 | PyTuple_SetItem(val_tuple, varlist_ind, | ||
| 12764 | @@ -1984,10 +1849,10 @@ netsnmp_walk(PyObject *self, PyObject *args) | ||
| 12765 | netsnmp_variable_list *vars, *oldvars; | ||
| 12766 | struct tree *tp; | ||
| 12767 | int len; | ||
| 12768 | - oid **oid_arr; | ||
| 12769 | - int *oid_arr_len; | ||
| 12770 | - oid **oid_arr_broken_check; | ||
| 12771 | - int *oid_arr_broken_check_len; | ||
| 12772 | + oid **oid_arr = NULL; | ||
| 12773 | + int *oid_arr_len = NULL; | ||
| 12774 | + oid **oid_arr_broken_check = NULL; | ||
| 12775 | + int *oid_arr_broken_check_len = NULL; | ||
| 12776 | int type; | ||
| 12777 | char type_str[MAX_TYPE_NAME_LEN]; | ||
| 12778 | int status; | ||
| 12779 | @@ -1996,7 +1861,7 @@ netsnmp_walk(PyObject *self, PyObject *args) | ||
| 12780 | size_t out_len = 0; | ||
| 12781 | int buf_over = 0; | ||
| 12782 | char *tag; | ||
| 12783 | - char *iid; | ||
| 12784 | + char *iid = NULL; | ||
| 12785 | int getlabel_flag = NO_FLAGS; | ||
| 12786 | int sprintval_flag = USE_BASIC; | ||
| 12787 | int verbose = py_netsnmp_verbose(); | ||
| 12788 | @@ -2102,7 +1967,8 @@ netsnmp_walk(PyObject *self, PyObject *args) | ||
| 12789 | varlist_ind++; | ||
| 12790 | } | ||
| 12791 | |||
| 12792 | - Py_DECREF(varlist_iter); | ||
| 12793 | + if (varlist_iter) | ||
| 12794 | + Py_DECREF(varlist_iter); | ||
| 12795 | |||
| 12796 | if (PyErr_Occurred()) { | ||
| 12797 | /* propagate error */ | ||
| 12798 | @@ -2246,7 +2112,7 @@ netsnmp_walk(PyObject *self, PyObject *args) | ||
| 12799 | type = __translate_asn_type(vars->type); | ||
| 12800 | } | ||
| 12801 | |||
| 12802 | - __get_label_iid(str_buf, &tag, &iid, getlabel_flag); | ||
| 12803 | + __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag); | ||
| 12804 | |||
| 12805 | if (_debug_level) printf("netsnmp_walk: filling response: %s:%s\n", tag, iid); | ||
| 12806 | |||
| 12807 | @@ -2256,13 +2122,14 @@ netsnmp_walk(PyObject *self, PyObject *args) | ||
| 12808 | __get_type_str(type, type_str); | ||
| 12809 | |||
| 12810 | py_netsnmp_attr_set_string(varbind, "type", type_str, | ||
| 12811 | - STRLEN(type_str)); | ||
| 12812 | + strlen(type_str)); | ||
| 12813 | |||
| 12814 | - len = __snprint_value(str_buf,sizeof(str_buf), | ||
| 12815 | + len = __snprint_value((char *) str_buf,sizeof(str_buf), | ||
| 12816 | vars,tp,type,sprintval_flag); | ||
| 12817 | str_buf[len] = '\0'; | ||
| 12818 | |||
| 12819 | - py_netsnmp_attr_set_string(varbind, "val", str_buf, len); | ||
| 12820 | + py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, | ||
| 12821 | + len); | ||
| 12822 | |||
| 12823 | /* push the varbind onto the return varbinds */ | ||
| 12824 | PyList_Append(varbinds, varbind); | ||
| 12825 | @@ -2345,7 +2212,6 @@ netsnmp_getbulk(PyObject *self, PyObject *args) | ||
| 12826 | int oid_arr_len = MAX_OID_LEN; | ||
| 12827 | int type; | ||
| 12828 | char type_str[MAX_TYPE_NAME_LEN]; | ||
| 12829 | - int status; | ||
| 12830 | u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; | ||
| 12831 | size_t str_buf_len = sizeof(str_buf); | ||
| 12832 | size_t out_len = 0; | ||
| 12833 | @@ -2434,8 +2300,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args) | ||
| 12834 | goto done; | ||
| 12835 | } | ||
| 12836 | |||
| 12837 | - status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, | ||
| 12838 | - err_str, &err_num, &err_ind); | ||
| 12839 | + __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num, | ||
| 12840 | + &err_ind); | ||
| 12841 | __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind); | ||
| 12842 | |||
| 12843 | /* | ||
| 12844 | @@ -2505,7 +2371,7 @@ netsnmp_getbulk(PyObject *self, PyObject *args) | ||
| 12845 | type = __translate_asn_type(vars->type); | ||
| 12846 | } | ||
| 12847 | |||
| 12848 | - __get_label_iid(str_buf, &tag, &iid, getlabel_flag); | ||
| 12849 | + __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag); | ||
| 12850 | |||
| 12851 | py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag)); | ||
| 12852 | py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid)); | ||
| 12853 | @@ -2513,13 +2379,13 @@ netsnmp_getbulk(PyObject *self, PyObject *args) | ||
| 12854 | __get_type_str(type, type_str); | ||
| 12855 | |||
| 12856 | py_netsnmp_attr_set_string(varbind, "type", type_str, | ||
| 12857 | - STRLEN(type_str)); | ||
| 12858 | + strlen(type_str)); | ||
| 12859 | |||
| 12860 | - len = __snprint_value(str_buf,sizeof(str_buf), | ||
| 12861 | - vars,tp,type,sprintval_flag); | ||
| 12862 | + len = __snprint_value((char *) str_buf, sizeof(str_buf), | ||
| 12863 | + vars, tp, type, sprintval_flag); | ||
| 12864 | str_buf[len] = '\0'; | ||
| 12865 | |||
| 12866 | - py_netsnmp_attr_set_string(varbind, "val", str_buf, len); | ||
| 12867 | + py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len); | ||
| 12868 | |||
| 12869 | /* push varbind onto varbinds */ | ||
| 12870 | PyList_Append(varbinds, varbind); | ||
| 12871 | @@ -2556,7 +2422,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args) | ||
| 12872 | /* propagate error */ | ||
| 12873 | if (verbose) | ||
| 12874 | printf("error: getbulk response processing: unknown python error"); | ||
| 12875 | - Py_DECREF(val_tuple); | ||
| 12876 | + if (val_tuple) | ||
| 12877 | + Py_DECREF(val_tuple); | ||
| 12878 | val_tuple = NULL; | ||
| 12879 | } | ||
| 12880 | } | ||
| 12881 | @@ -2663,14 +2530,15 @@ netsnmp_set(PyObject *self, PyObject *args) | ||
| 12882 | if (type==TYPE_INTEGER && use_enums && tp && tp->enums) { | ||
| 12883 | for(ep = tp->enums; ep; ep = ep->next) { | ||
| 12884 | if (val && !strcmp(ep->label, val)) { | ||
| 12885 | - strcpy(tmp_val_str, ep->value); | ||
| 12886 | + snprintf((char *) tmp_val_str, sizeof(tmp_val_str), "%d", | ||
| 12887 | + ep->value); | ||
| 12888 | break; | ||
| 12889 | } | ||
| 12890 | } | ||
| 12891 | } | ||
| 12892 | len = (int)tmplen; | ||
| 12893 | status = __add_var_val_str(pdu, oid_arr, oid_arr_len, | ||
| 12894 | - tmp_val_str, len, type); | ||
| 12895 | + (char *) tmp_val_str, len, type); | ||
| 12896 | |||
| 12897 | if (verbose && status == FAILURE) | ||
| 12898 | printf("error: set: adding variable/value to PDU"); | ||
| 12899 | diff --git a/snmplib/Makefile.in b/snmplib/Makefile.in | ||
| 12900 | index 48beb38..506b8d4 100644 | ||
| 12901 | --- a/snmplib/Makefile.in | ||
| 12902 | +++ b/snmplib/Makefile.in | ||
| 12903 | @@ -243,7 +243,3 @@ libsnmp.$(LIB_EXTENSION)$(LIB_VERSION): $(TOBJS) | ||
| 12904 | parse: mib.o parse.c | ||
| 12905 | $(CC) $(CFLAGS) -DTEST parse.c -o $@ \ | ||
| 12906 | `$(top_srcdir)/net-snmp-config --libs` | ||
| 12907 | - | ||
| 12908 | -test_binary_array: test_binary_array.c | ||
| 12909 | - $(CC) $(CFLAGS) test_binary_array.c -o $@ \ | ||
| 12910 | - `$(top_srcdir)/net-snmp-config --libs` | ||
| 12911 | diff --git a/snmplib/asn1.c b/snmplib/asn1.c | ||
| 12912 | index 030fa63..e4da6be 100644 | ||
| 12913 | --- a/snmplib/asn1.c | ||
| 12914 | +++ b/snmplib/asn1.c | ||
| 12915 | @@ -1371,7 +1371,7 @@ asn_parse_objid(u_char * data, | ||
| 12916 | } | ||
| 12917 | } | ||
| 12918 | #if defined(EIGHTBIT_SUBIDS) || (SIZEOF_LONG != 4) | ||
| 12919 | - if (subidentifier > (u_long) MAX_SUBID) { | ||
| 12920 | + if (subidentifier > MAX_SUBID) { | ||
| 12921 | ERROR_MSG("subidentifier too large"); | ||
| 12922 | return NULL; | ||
| 12923 | } | ||
| 12924 | @@ -1540,13 +1540,8 @@ asn_build_objid(u_char * data, | ||
| 12925 | */ | ||
| 12926 | for (i = 1, objid_val = first_objid_val, op = objid + 2; | ||
| 12927 | i < (int) objidlength; i++) { | ||
| 12928 | - if (i != 1) { | ||
| 12929 | - objid_val = *op++; | ||
| 12930 | -#if SIZEOF_LONG != 4 | ||
| 12931 | - if (objid_val > 0xffffffff) /* already logged warning above */ | ||
| 12932 | - objid_val &= 0xffffffff; | ||
| 12933 | -#endif | ||
| 12934 | - } | ||
| 12935 | + if (i != 1) | ||
| 12936 | + objid_val = (uint32_t)(*op++); /* already logged warning above */ | ||
| 12937 | switch (objid_size[i]) { | ||
| 12938 | case 1: | ||
| 12939 | *data++ = (u_char) objid_val; | ||
| 12940 | diff --git a/snmplib/callback.c b/snmplib/callback.c | ||
| 12941 | index 16026e9..dfe537a 100644 | ||
| 12942 | --- a/snmplib/callback.c | ||
| 12943 | +++ b/snmplib/callback.c | ||
| 12944 | @@ -249,7 +249,7 @@ snmp_register_callback(int major, int minor, SNMPCallback * new_callback, | ||
| 12945 | * @param minor Minor callback event type. | ||
| 12946 | * @param new_callback Callback function being registered. | ||
| 12947 | * @param arg Argument that will be passed to the callback function. | ||
| 12948 | - * @priority Handler invocation priority. When multiple handlers have | ||
| 12949 | + * @param priority Handler invocation priority. When multiple handlers have | ||
| 12950 | * been registered for the same (major, minor) callback event type, handlers | ||
| 12951 | * with the numerically lowest priority will be invoked first. Handlers with | ||
| 12952 | * identical priority are invoked in the order they have been registered. | ||
| 12953 | diff --git a/snmplib/cert_util.c b/snmplib/cert_util.c | ||
| 12954 | index 6d9efe5..246a6c9 100644 | ||
| 12955 | --- a/snmplib/cert_util.c | ||
| 12956 | +++ b/snmplib/cert_util.c | ||
| 12957 | @@ -751,7 +751,6 @@ _certindex_add( const char *dirname, int i ) | ||
| 12958 | if (SE_OK != rc) { | ||
| 12959 | snmp_log(LOG_ERR, "adding certindex dirname failed; " | ||
| 12960 | "%d (%s) not added\n", i, dirname); | ||
| 12961 | - free(dirname_copy); | ||
| 12962 | return -1; | ||
| 12963 | } | ||
| 12964 | |||
| 12965 | @@ -791,7 +790,7 @@ _certindexes_load( void ) | ||
| 12966 | * Create a list of which directory each file refers to | ||
| 12967 | */ | ||
| 12968 | while ((file = readdir( dir ))) { | ||
| 12969 | - if ( !isdigit(file->d_name[0])) | ||
| 12970 | + if ( !isdigit(0xFF & file->d_name[0])) | ||
| 12971 | continue; | ||
| 12972 | i = atoi( file->d_name ); | ||
| 12973 | |||
| 12974 | @@ -801,7 +800,6 @@ _certindexes_load( void ) | ||
| 12975 | fp = fopen( filename, "r" ); | ||
| 12976 | if ( !fp ) { | ||
| 12977 | DEBUGMSGT(("cert:index:load", "error opening index (%d)\n", i)); | ||
| 12978 | - fclose(fp); | ||
| 12979 | continue; | ||
| 12980 | } | ||
| 12981 | cp = fgets( line, sizeof(line), fp ); | ||
| 12982 | @@ -1179,12 +1177,6 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key) | ||
| 12983 | return; | ||
| 12984 | } | ||
| 12985 | |||
| 12986 | - snprintf(filename, sizeof(filename), "%s", key->info.filename); | ||
| 12987 | - pos = strrchr(filename, '.'); | ||
| 12988 | - if (NULL == pos) | ||
| 12989 | - return; | ||
| 12990 | - *pos = 0; | ||
| 12991 | - | ||
| 12992 | if(key) { | ||
| 12993 | if (key->cert) { | ||
| 12994 | DEBUGMSGT(("cert:partner", "key already has partner\n")); | ||
| 12995 | @@ -1192,6 +1184,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key) | ||
| 12996 | } | ||
| 12997 | DEBUGMSGT(("9:cert:partner", "%s looking for partner near %s\n", | ||
| 12998 | key->info.filename, key->info.dir)); | ||
| 12999 | + snprintf(filename, sizeof(filename), "%s", key->info.filename); | ||
| 13000 | + pos = strrchr(filename, '.'); | ||
| 13001 | + if (NULL == pos) | ||
| 13002 | + return; | ||
| 13003 | + *pos = 0; | ||
| 13004 | |||
| 13005 | matching = _cert_find_subset_fn( filename, key->info.dir ); | ||
| 13006 | if (!matching) | ||
| 13007 | @@ -1220,6 +1217,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key) | ||
| 13008 | } | ||
| 13009 | DEBUGMSGT(("9:cert:partner", "%s looking for partner\n", | ||
| 13010 | cert->info.filename)); | ||
| 13011 | + snprintf(filename, sizeof(filename), "%s", cert->info.filename); | ||
| 13012 | + pos = strrchr(filename, '.'); | ||
| 13013 | + if (NULL == pos) | ||
| 13014 | + return; | ||
| 13015 | + *pos = 0; | ||
| 13016 | |||
| 13017 | matching = _key_find_subset(filename); | ||
| 13018 | if (!matching) | ||
| 13019 | @@ -1714,7 +1716,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp) | ||
| 13020 | break; | ||
| 13021 | } | ||
| 13022 | else | ||
| 13023 | - *pos = isalpha(*pos) ? tolower(*pos) : *pos; | ||
| 13024 | + *pos = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos; | ||
| 13025 | } | ||
| 13026 | if (!*pos) | ||
| 13027 | return; | ||
| 13028 | @@ -1723,7 +1725,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp) | ||
| 13029 | for (++pos; *pos; ++pos) { | ||
| 13030 | if (':' == *pos) | ||
| 13031 | continue; | ||
| 13032 | - *dest++ = isalpha(*pos) ? tolower(*pos) : *pos; | ||
| 13033 | + *dest++ = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos; | ||
| 13034 | } | ||
| 13035 | *dest = *pos; /* nul termination */ | ||
| 13036 | } | ||
| 13037 | @@ -2011,7 +2013,8 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert) | ||
| 13038 | { | ||
| 13039 | X509_STORE *certstore; | ||
| 13040 | X509 *cert; | ||
| 13041 | - | ||
| 13042 | + char *fingerprint; | ||
| 13043 | + | ||
| 13044 | /* ensure all needed pieces are present */ | ||
| 13045 | netsnmp_assert_or_msgreturn(NULL != thiscert, "NULL certificate passed in", | ||
| 13046 | SNMPERR_GENERR); | ||
| 13047 | @@ -2033,10 +2036,11 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert) | ||
| 13048 | SNMPERR_GENERR); | ||
| 13049 | |||
| 13050 | /* Put the certificate into the store */ | ||
| 13051 | + fingerprint = netsnmp_openssl_cert_get_fingerprint(cert, -1); | ||
| 13052 | DEBUGMSGTL(("cert:trust", | ||
| 13053 | "putting trusted cert %p = %s in certstore %p\n", cert, | ||
| 13054 | - netsnmp_openssl_cert_get_fingerprint(cert, -1), | ||
| 13055 | - certstore)); | ||
| 13056 | + fingerprint, certstore)); | ||
| 13057 | + SNMP_FREE(fingerprint); | ||
| 13058 | X509_STORE_add_cert(certstore, cert); | ||
| 13059 | |||
| 13060 | return SNMPERR_SUCCESS; | ||
| 13061 | @@ -2132,7 +2136,7 @@ _cert_find_fp(const char *fingerprint) | ||
| 13062 | if (NULL == fingerprint) | ||
| 13063 | return NULL; | ||
| 13064 | |||
| 13065 | - strncpy(fp, fingerprint, sizeof(fp)); | ||
| 13066 | + strlcpy(fp, fingerprint, sizeof(fp)); | ||
| 13067 | netsnmp_fp_lowercase_and_strip_colon(fp); | ||
| 13068 | |||
| 13069 | /** clear search key */ | ||
| 13070 | @@ -2222,7 +2226,7 @@ _reduce_subset_dir(netsnmp_void_array *matching, const char *directory) | ||
| 13071 | * | ||
| 13072 | * so we want to backup up on directory for compares.. | ||
| 13073 | */ | ||
| 13074 | - strncpy(dir,directory,sizeof(dir)); | ||
| 13075 | + strlcpy(dir, directory, sizeof(dir)); | ||
| 13076 | pos = strrchr(dir, '/'); | ||
| 13077 | if (NULL == pos) { | ||
| 13078 | DEBUGMSGTL(("cert:subset:dir", "no '/' in directory %s\n", directory)); | ||
| 13079 | @@ -2690,7 +2694,7 @@ netsnmp_certToTSN_parse_common(char **line) | ||
| 13080 | tmp = buf; | ||
| 13081 | *line = read_config_read_octet_string(*line, (u_char **)&tmp, &len); | ||
| 13082 | tmp[len] = 0; | ||
| 13083 | - if (!isdigit(tmp[0])) { | ||
| 13084 | + if (!isdigit(0xFF & tmp[0])) { | ||
| 13085 | netsnmp_config_error("could not parse priority"); | ||
| 13086 | return NULL; | ||
| 13087 | } | ||
| 13088 | @@ -3050,8 +3054,8 @@ netsnmp_tlstmParams_add(snmpTlstmParams *stp) | ||
| 13089 | stp->name)); | ||
| 13090 | |||
| 13091 | if (CONTAINER_INSERT(_tlstmParams, stp) != 0) { | ||
| 13092 | - netsnmp_tlstmParams_free(stp); | ||
| 13093 | snmp_log(LOG_ERR, "error inserting tlstmParams %s", stp->name); | ||
| 13094 | + netsnmp_tlstmParams_free(stp); | ||
| 13095 | return -1; | ||
| 13096 | } | ||
| 13097 | |||
| 13098 | @@ -3260,8 +3264,8 @@ netsnmp_tlstmAddr_add(snmpTlstmAddr *entry) | ||
| 13099 | DEBUGMSGTL(("tlstmAddr:add", "adding entry 0x%lx %s %s\n", | ||
| 13100 | (u_long)entry, entry->name, entry->fingerprint)); | ||
| 13101 | if (CONTAINER_INSERT(_tlstmAddr, entry) != 0) { | ||
| 13102 | - netsnmp_tlstmAddr_free(entry); | ||
| 13103 | snmp_log(LOG_ERR, "could not insert addr %s", entry->name); | ||
| 13104 | + netsnmp_tlstmAddr_free(entry); | ||
| 13105 | return -1; | ||
| 13106 | } | ||
| 13107 | |||
| 13108 | @@ -3314,10 +3318,7 @@ _parse_addr(const char *token, char *line) | ||
| 13109 | if (id_len) | ||
| 13110 | entry->identity = strdup(id); | ||
| 13111 | |||
| 13112 | - if (netsnmp_tlstmAddr_add(entry) != 0) | ||
| 13113 | - netsnmp_tlstmAddr_free(entry); | ||
| 13114 | - | ||
| 13115 | - return; | ||
| 13116 | + netsnmp_tlstmAddr_add(entry); | ||
| 13117 | } | ||
| 13118 | |||
| 13119 | static char * | ||
| 13120 | diff --git a/snmplib/container_binary_array.c b/snmplib/container_binary_array.c | ||
| 13121 | index 41f1d24..249a3a9 100644 | ||
| 13122 | --- a/snmplib/container_binary_array.c | ||
| 13123 | +++ b/snmplib/container_binary_array.c | ||
| 13124 | @@ -487,7 +487,7 @@ binary_search_for_start(netsnmp_index *val, netsnmp_container *c) | ||
| 13125 | void ** | ||
| 13126 | netsnmp_binary_array_get_subset(netsnmp_container *c, void *key, int *len) | ||
| 13127 | { | ||
| 13128 | - binary_array_table *t = (binary_array_table*)c->container_data; | ||
| 13129 | + binary_array_table *t; | ||
| 13130 | void **subset; | ||
| 13131 | int start, end; | ||
| 13132 | size_t i; | ||
| 13133 | diff --git a/snmplib/data_list.c b/snmplib/data_list.c | ||
| 13134 | index 15f2de2..505d4fc 100644 | ||
| 13135 | --- a/snmplib/data_list.c | ||
| 13136 | +++ b/snmplib/data_list.c | ||
| 13137 | @@ -240,9 +240,14 @@ netsnmp_register_save_list(netsnmp_data_list **datalist, | ||
| 13138 | const char *type, const char *token, | ||
| 13139 | Netsnmp_Save_List_Data *data_list_save_ptr, | ||
| 13140 | Netsnmp_Read_List_Data *data_list_read_ptr, | ||
| 13141 | - Netsnmp_Free_List_Data *data_list_free_ptr) { | ||
| 13142 | - netsnmp_data_list_saveinfo *info = | ||
| 13143 | - SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo); | ||
| 13144 | + Netsnmp_Free_List_Data *data_list_free_ptr) | ||
| 13145 | +{ | ||
| 13146 | + netsnmp_data_list_saveinfo *info; | ||
| 13147 | + | ||
| 13148 | + if (!data_list_save_ptr && !data_list_read_ptr) | ||
| 13149 | + return; | ||
| 13150 | + | ||
| 13151 | + info = SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo); | ||
| 13152 | |||
| 13153 | if (!info) { | ||
| 13154 | snmp_log(LOG_ERR, "couldn't malloc a netsnmp_data_list_saveinfo typedef"); | ||
| 13155 | diff --git a/snmplib/dir_utils.c b/snmplib/dir_utils.c | ||
| 13156 | index 89bba6b..cbb6d00 100644 | ||
| 13157 | --- a/snmplib/dir_utils.c | ||
| 13158 | +++ b/snmplib/dir_utils.c | ||
| 13159 | @@ -122,7 +122,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container, | ||
| 13160 | dirname_len = 0; | ||
| 13161 | else { | ||
| 13162 | dirname_len = strlen(dirname); | ||
| 13163 | - strncpy(path, dirname, sizeof(path)); | ||
| 13164 | + strlcpy(path, dirname, sizeof(path)); | ||
| 13165 | if ((dirname_len + 2) > sizeof(path)) { | ||
| 13166 | /** not enough room for files */ | ||
| 13167 | closedir(dir); | ||
| 13168 | @@ -131,7 +131,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container, | ||
| 13169 | return NULL; | ||
| 13170 | } | ||
| 13171 | path[dirname_len] = '/'; | ||
| 13172 | - path[++dirname_len] = 0; | ||
| 13173 | + path[++dirname_len] = '\0'; | ||
| 13174 | } | ||
| 13175 | |||
| 13176 | /** iterate over dir */ | ||
| 13177 | @@ -146,7 +146,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container, | ||
| 13178 | ((file->d_name[1] == '.') && ((file->d_name[2] == 0))))) | ||
| 13179 | continue; | ||
| 13180 | |||
| 13181 | - strncpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len); | ||
| 13182 | + strlcpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len); | ||
| 13183 | if (NULL != filter) { | ||
| 13184 | if (flags & NETSNMP_DIR_NSFILE_STATS) { | ||
| 13185 | /** use local vars for now */ | ||
| 13186 | diff --git a/snmplib/int64.c b/snmplib/int64.c | ||
| 13187 | index 5db2375..2c71b17 100644 | ||
| 13188 | --- a/snmplib/int64.c | ||
| 13189 | +++ b/snmplib/int64.c | ||
| 13190 | @@ -1,9 +1,10 @@ | ||
| 13191 | -/** file: test.c - test of 64-bit integer stuff | ||
| 13192 | -* | ||
| 13193 | -* | ||
| 13194 | -* 21-jan-1998: David Perkins <dperkins@dsperkins.com> | ||
| 13195 | -* | ||
| 13196 | -*/ | ||
| 13197 | +/** | ||
| 13198 | + * @file int64.c | ||
| 13199 | + * | ||
| 13200 | + * @brief Functions for 64-bit integer computations. | ||
| 13201 | + * | ||
| 13202 | + * 21-jan-1998: David Perkins <dperkins@dsperkins.com> | ||
| 13203 | + */ | ||
| 13204 | |||
| 13205 | #include <net-snmp/net-snmp-config.h> | ||
| 13206 | #include <sys/types.h> | ||
| 13207 | @@ -24,17 +25,13 @@ | ||
| 13208 | |||
| 13209 | #include <net-snmp/net-snmp-features.h> | ||
| 13210 | |||
| 13211 | -#define TRUE 1 | ||
| 13212 | -#define FALSE 0 | ||
| 13213 | - | ||
| 13214 | -/** divBy10 - divide an unsigned 64-bit integer by 10 | ||
| 13215 | -* | ||
| 13216 | -* call with: | ||
| 13217 | -* u64 - number to be divided | ||
| 13218 | -* pu64Q - location to store quotient | ||
| 13219 | -* puR - location to store remainder | ||
| 13220 | -* | ||
| 13221 | -*/ | ||
| 13222 | +/** | ||
| 13223 | + * Divide an unsigned 64-bit integer by 10. | ||
| 13224 | + * | ||
| 13225 | + * @param[in] u64 Number to be divided. | ||
| 13226 | + * @param[out] pu64Q Quotient. | ||
| 13227 | + * @param[out] puR Remainder. | ||
| 13228 | + */ | ||
| 13229 | void | ||
| 13230 | divBy10(U64 u64, U64 * pu64Q, unsigned int *puR) | ||
| 13231 | { | ||
| 13232 | @@ -42,7 +39,6 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR) | ||
| 13233 | unsigned long ulQ; | ||
| 13234 | unsigned long ulR; | ||
| 13235 | |||
| 13236 | - | ||
| 13237 | /* | ||
| 13238 | * top 16 bits | ||
| 13239 | */ | ||
| 13240 | @@ -78,18 +74,14 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR) | ||
| 13241 | pu64Q->low = pu64Q->low | ulQ; | ||
| 13242 | |||
| 13243 | *puR = (unsigned int) (ulR); | ||
| 13244 | +} | ||
| 13245 | |||
| 13246 | - | ||
| 13247 | -} /* divBy10 */ | ||
| 13248 | - | ||
| 13249 | - | ||
| 13250 | -/** multBy10 - multiply an unsigned 64-bit integer by 10 | ||
| 13251 | -* | ||
| 13252 | -* call with: | ||
| 13253 | -* u64 - number to be multiplied | ||
| 13254 | -* pu64P - location to store product | ||
| 13255 | -* | ||
| 13256 | -*/ | ||
| 13257 | +/** | ||
| 13258 | + * Multiply an unsigned 64-bit integer by 10. | ||
| 13259 | + * | ||
| 13260 | + * @param[in] u64 Number to be multiplied. | ||
| 13261 | + * @param[out] pu64P Product. | ||
| 13262 | + */ | ||
| 13263 | void | ||
| 13264 | multBy10(U64 u64, U64 * pu64P) | ||
| 13265 | { | ||
| 13266 | @@ -97,7 +89,6 @@ multBy10(U64 u64, U64 * pu64P) | ||
| 13267 | unsigned long ulP; | ||
| 13268 | unsigned long ulK; | ||
| 13269 | |||
| 13270 | - | ||
| 13271 | /* | ||
| 13272 | * lower 16 bits | ||
| 13273 | */ | ||
| 13274 | @@ -129,159 +120,122 @@ multBy10(U64 u64, U64 * pu64P) | ||
| 13275 | ulP = (ulT * 10) + ulK; | ||
| 13276 | ulK = ulP >> 16; | ||
| 13277 | pu64P->high = (ulP & 0x0ffff) << 16 | pu64P->high; | ||
| 13278 | +} | ||
| 13279 | |||
| 13280 | - | ||
| 13281 | -} /* multBy10 */ | ||
| 13282 | - | ||
| 13283 | - | ||
| 13284 | -/** incrByU16 - add an unsigned 16-bit int to an unsigned 64-bit integer | ||
| 13285 | -* | ||
| 13286 | -* call with: | ||
| 13287 | -* pu64 - number to be incremented | ||
| 13288 | -* u16 - amount to add | ||
| 13289 | -* | ||
| 13290 | -*/ | ||
| 13291 | +/** | ||
| 13292 | + * Add an unsigned 16-bit int to an unsigned 64-bit integer. | ||
| 13293 | + * | ||
| 13294 | + * @param[in,out] pu64 Number to be incremented. | ||
| 13295 | + * @param[in] u16 Amount to add. | ||
| 13296 | + * | ||
| 13297 | + */ | ||
| 13298 | void | ||
| 13299 | incrByU16(U64 * pu64, unsigned int u16) | ||
| 13300 | { | ||
| 13301 | - unsigned long ulT1; | ||
| 13302 | - unsigned long ulT2; | ||
| 13303 | - unsigned long ulR; | ||
| 13304 | - unsigned long ulK; | ||
| 13305 | - | ||
| 13306 | - | ||
| 13307 | - /* | ||
| 13308 | - * lower 16 bits | ||
| 13309 | - */ | ||
| 13310 | - ulT1 = pu64->low; | ||
| 13311 | - ulT2 = ulT1 & 0x0ffff; | ||
| 13312 | - ulR = ulT2 + u16; | ||
| 13313 | - ulK = ulR >> 16; | ||
| 13314 | - if (ulK == 0) { | ||
| 13315 | - pu64->low = ulT1 + u16; | ||
| 13316 | - return; | ||
| 13317 | - } | ||
| 13318 | - | ||
| 13319 | - /* | ||
| 13320 | - * next 16 bits | ||
| 13321 | - */ | ||
| 13322 | - ulT2 = (ulT1 >> 16) & 0x0ffff; | ||
| 13323 | - ulR = ulT2 + 1; | ||
| 13324 | - ulK = ulR >> 16; | ||
| 13325 | - if (ulK == 0) { | ||
| 13326 | - pu64->low = ulT1 + u16; | ||
| 13327 | - return; | ||
| 13328 | - } | ||
| 13329 | - | ||
| 13330 | - /* | ||
| 13331 | - * next 32 - ignore any overflow | ||
| 13332 | - */ | ||
| 13333 | - pu64->low = (ulT1 + u16) & 0x0FFFFFFFFL; | ||
| 13334 | - pu64->high++; | ||
| 13335 | -#if SIZEOF_LONG != 4 | ||
| 13336 | - pu64->high &= 0xffffffff; | ||
| 13337 | -#endif | ||
| 13338 | -} /* incrByV16 */ | ||
| 13339 | + incrByU32(pu64, u16); | ||
| 13340 | +} | ||
| 13341 | |||
| 13342 | +/** | ||
| 13343 | + * Add an unsigned 32-bit int to an unsigned 64-bit integer. | ||
| 13344 | + * | ||
| 13345 | + * @param[in,out] pu64 Number to be incremented. | ||
| 13346 | + * @param[in] u32 Amount to add. | ||
| 13347 | + * | ||
| 13348 | + */ | ||
| 13349 | void | ||
| 13350 | incrByU32(U64 * pu64, unsigned int u32) | ||
| 13351 | { | ||
| 13352 | - unsigned int tmp; | ||
| 13353 | + uint32_t tmp; | ||
| 13354 | + | ||
| 13355 | tmp = pu64->low; | ||
| 13356 | - pu64->low += u32; | ||
| 13357 | -#if SIZEOF_LONG != 4 | ||
| 13358 | - pu64->low &= 0xffffffff; | ||
| 13359 | -#endif | ||
| 13360 | - if (pu64->low < tmp) { | ||
| 13361 | - pu64->high++; | ||
| 13362 | -#if SIZEOF_LONG != 4 | ||
| 13363 | - pu64->high &= 0xffffffff; | ||
| 13364 | -#endif | ||
| 13365 | - } | ||
| 13366 | + pu64->low = (uint32_t)(tmp + u32); | ||
| 13367 | + if (pu64->low < tmp) | ||
| 13368 | + pu64->high = (uint32_t)(pu64->high + 1); | ||
| 13369 | } | ||
| 13370 | |||
| 13371 | /** | ||
| 13372 | - * pu64out = pu64one - pu64two | ||
| 13373 | + * Subtract two 64-bit numbers. | ||
| 13374 | + * | ||
| 13375 | + * @param[in] pu64one Number to start from. | ||
| 13376 | + * @param[in] pu64two Amount to subtract. | ||
| 13377 | + * @param[out] pu64out pu64one - pu64two. | ||
| 13378 | */ | ||
| 13379 | void | ||
| 13380 | u64Subtract(const U64 * pu64one, const U64 * pu64two, U64 * pu64out) | ||
| 13381 | { | ||
| 13382 | - if (pu64one->low < pu64two->low) { | ||
| 13383 | - pu64out->low = 0xffffffff - pu64two->low + pu64one->low + 1; | ||
| 13384 | - pu64out->high = pu64one->high - pu64two->high - 1; | ||
| 13385 | - } else { | ||
| 13386 | - pu64out->low = pu64one->low - pu64two->low; | ||
| 13387 | - pu64out->high = pu64one->high - pu64two->high; | ||
| 13388 | - } | ||
| 13389 | + int carry; | ||
| 13390 | + | ||
| 13391 | + carry = pu64one->low < pu64two->low; | ||
| 13392 | + pu64out->low = (uint32_t)(pu64one->low - pu64two->low); | ||
| 13393 | + pu64out->high = (uint32_t)(pu64one->high - pu64two->high - carry); | ||
| 13394 | } | ||
| 13395 | |||
| 13396 | /** | ||
| 13397 | - * pu64out += pu64one | ||
| 13398 | + * Add two 64-bit numbers. | ||
| 13399 | + * | ||
| 13400 | + * @param[in] pu64one Amount to add. | ||
| 13401 | + * @param[in,out] pu64out pu64out += pu64one. | ||
| 13402 | */ | ||
| 13403 | void | ||
| 13404 | u64Incr(U64 * pu64out, const U64 * pu64one) | ||
| 13405 | { | ||
| 13406 | - pu64out->high += pu64one->high; | ||
| 13407 | -#if SIZEOF_LONG != 4 | ||
| 13408 | - pu64out->high &= 0xffffffff; | ||
| 13409 | -#endif | ||
| 13410 | + pu64out->high = (uint32_t)(pu64out->high + pu64one->high); | ||
| 13411 | incrByU32(pu64out, pu64one->low); | ||
| 13412 | } | ||
| 13413 | |||
| 13414 | /** | ||
| 13415 | - * pu64out += (pu64one - pu64two) | ||
| 13416 | + * Add the difference of two 64-bit numbers to a 64-bit counter. | ||
| 13417 | + * | ||
| 13418 | + * @param[in] pu64one | ||
| 13419 | + * @param[in] pu64two | ||
| 13420 | + * @param[out] pu64out pu64out += (pu64one - pu64two) | ||
| 13421 | */ | ||
| 13422 | void | ||
| 13423 | u64UpdateCounter(U64 * pu64out, const U64 * pu64one, const U64 * pu64two) | ||
| 13424 | { | ||
| 13425 | U64 tmp; | ||
| 13426 | + | ||
| 13427 | u64Subtract(pu64one, pu64two, &tmp); | ||
| 13428 | u64Incr(pu64out, &tmp); | ||
| 13429 | } | ||
| 13430 | |||
| 13431 | -/** | ||
| 13432 | - * pu64one = pu64two | ||
| 13433 | - */ | ||
| 13434 | netsnmp_feature_child_of(u64copy, netsnmp_unused) | ||
| 13435 | #ifndef NETSNMP_FEATURE_REMOVE_U64COPY | ||
| 13436 | +/** | ||
| 13437 | + * Copy a 64-bit number. | ||
| 13438 | + * | ||
| 13439 | + * @param[in] pu64two Number to be copied. | ||
| 13440 | + * @param[out] pu64one Where to store the copy - *pu64one = *pu64two. | ||
| 13441 | + */ | ||
| 13442 | void | ||
| 13443 | u64Copy(U64 * pu64one, const U64 * pu64two) | ||
| 13444 | { | ||
| 13445 | - pu64one->high = pu64two->high; | ||
| 13446 | - pu64one->low = pu64two->low; | ||
| 13447 | + *pu64one = *pu64two; | ||
| 13448 | } | ||
| 13449 | #endif /* NETSNMP_FEATURE_REMOVE_U64COPY */ | ||
| 13450 | |||
| 13451 | -/** zeroU64 - set an unsigned 64-bit number to zero | ||
| 13452 | -* | ||
| 13453 | -* call with: | ||
| 13454 | -* pu64 - number to be zero'ed | ||
| 13455 | -* | ||
| 13456 | -*/ | ||
| 13457 | +/** | ||
| 13458 | + * Set an unsigned 64-bit number to zero. | ||
| 13459 | + * | ||
| 13460 | + * @param[in] pu64 Number to be zeroed. | ||
| 13461 | + */ | ||
| 13462 | void | ||
| 13463 | zeroU64(U64 * pu64) | ||
| 13464 | { | ||
| 13465 | pu64->low = 0; | ||
| 13466 | pu64->high = 0; | ||
| 13467 | -} /* zeroU64 */ | ||
| 13468 | - | ||
| 13469 | +} | ||
| 13470 | |||
| 13471 | -/** isZeroU64 - check if an unsigned 64-bit number is | ||
| 13472 | -* | ||
| 13473 | -* call with: | ||
| 13474 | -* pu64 - number to be zero'ed | ||
| 13475 | -* | ||
| 13476 | -*/ | ||
| 13477 | +/** | ||
| 13478 | + * Check if an unsigned 64-bit number is zero. | ||
| 13479 | + * | ||
| 13480 | + * @param[in] pu64 Number to be checked. | ||
| 13481 | + */ | ||
| 13482 | int | ||
| 13483 | isZeroU64(const U64 * pu64) | ||
| 13484 | { | ||
| 13485 | - | ||
| 13486 | - if ((pu64->low == 0) && (pu64->high == 0)) | ||
| 13487 | - return (TRUE); | ||
| 13488 | - else | ||
| 13489 | - return (FALSE); | ||
| 13490 | - | ||
| 13491 | -} /* isZeroU64 */ | ||
| 13492 | + return pu64->low == 0 && pu64->high == 0; | ||
| 13493 | +} | ||
| 13494 | |||
| 13495 | /** | ||
| 13496 | * check the old and new values of a counter64 for 32bit wrapping | ||
| 13497 | @@ -292,7 +246,7 @@ isZeroU64(const U64 * pu64) | ||
| 13498 | * @param old_val | ||
| 13499 | * @param new_val | ||
| 13500 | * | ||
| 13501 | - *@Note: | ||
| 13502 | + * @note | ||
| 13503 | * The old and new values must be be from within a time period | ||
| 13504 | * which would only allow the 32bit portion of the counter to | ||
| 13505 | * wrap once. i.e. if the 32bit portion of the counter could | ||
| 13506 | @@ -331,16 +285,11 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val, | ||
| 13507 | */ | ||
| 13508 | if (new_val->high == old_val->high) { | ||
| 13509 | DEBUGMSGTL(("c64:check_wrap", "32 bit wrap\n")); | ||
| 13510 | - if (adjust) { | ||
| 13511 | - ++new_val->high; | ||
| 13512 | -#if SIZEOF_LONG != 4 | ||
| 13513 | - new_val->high &= 0xffffffff; | ||
| 13514 | -#endif | ||
| 13515 | - } | ||
| 13516 | + if (adjust) | ||
| 13517 | + new_val->high = (uint32_t)(new_val->high + 1); | ||
| 13518 | return 32; | ||
| 13519 | } | ||
| 13520 | - else if ((new_val->high == (old_val->high + 1)) || | ||
| 13521 | - ((0 == new_val->high) && (0xffffffff == old_val->high))) { | ||
| 13522 | + else if (new_val->high == (uint32_t)(old_val->high + 1)) { | ||
| 13523 | DEBUGMSGTL(("c64:check_wrap", "64 bit wrap\n")); | ||
| 13524 | return 64; | ||
| 13525 | } | ||
| 13526 | @@ -357,7 +306,7 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val, | ||
| 13527 | * @param need_wrap_check: pointer to integer indicating if wrap check is needed | ||
| 13528 | * flag may be cleared if 64 bit counter is detected | ||
| 13529 | * | ||
| 13530 | - *@Note: | ||
| 13531 | + * @note | ||
| 13532 | * The old_prev_val and new_val values must be be from within a time | ||
| 13533 | * period which would only allow the 32bit portion of the counter to | ||
| 13534 | * wrap once. i.e. if the 32bit portion of the counter could | ||
| 13535 | @@ -438,9 +387,11 @@ netsnmp_c64_check32_and_update(struct counter64 *prev_val, struct counter64 *new | ||
| 13536 | return 0; | ||
| 13537 | } | ||
| 13538 | |||
| 13539 | +/** Convert an unsigned 64-bit number to ASCII. */ | ||
| 13540 | void | ||
| 13541 | -printU64(char *buf, /* char [I64CHARSZ+1]; */ | ||
| 13542 | - const U64 * pu64) { | ||
| 13543 | +printU64(char *buf, /* char [I64CHARSZ+1]; */ | ||
| 13544 | + const U64 * pu64) | ||
| 13545 | +{ | ||
| 13546 | U64 u64a; | ||
| 13547 | U64 u64b; | ||
| 13548 | |||
| 13549 | @@ -448,57 +399,37 @@ printU64(char *buf, /* char [I64CHARSZ+1]; */ | ||
| 13550 | unsigned int u; | ||
| 13551 | int j; | ||
| 13552 | |||
| 13553 | - u64a.high = pu64->high; | ||
| 13554 | - u64a.low = pu64->low; | ||
| 13555 | + u64a = *pu64; | ||
| 13556 | aRes[I64CHARSZ] = 0; | ||
| 13557 | for (j = 0; j < I64CHARSZ; j++) { | ||
| 13558 | divBy10(u64a, &u64b, &u); | ||
| 13559 | aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u); | ||
| 13560 | - u64a.high = u64b.high; | ||
| 13561 | - u64a.low = u64b.low; | ||
| 13562 | + u64a = u64b; | ||
| 13563 | if (isZeroU64(&u64a)) | ||
| 13564 | break; | ||
| 13565 | } | ||
| 13566 | strcpy(buf, &aRes[(I64CHARSZ - 1) - j]); | ||
| 13567 | } | ||
| 13568 | |||
| 13569 | +/** Convert a signed 64-bit number to ASCII. */ | ||
| 13570 | void | ||
| 13571 | -printI64(char *buf, /* char [I64CHARSZ+1]; */ | ||
| 13572 | - const U64 * pu64) { | ||
| 13573 | +printI64(char *buf, /* char [I64CHARSZ+1]; */ | ||
| 13574 | + const U64 * pu64) | ||
| 13575 | +{ | ||
| 13576 | U64 u64a; | ||
| 13577 | - U64 u64b; | ||
| 13578 | - | ||
| 13579 | - char aRes[I64CHARSZ + 1]; | ||
| 13580 | - unsigned int u; | ||
| 13581 | - int j, sign = 0; | ||
| 13582 | |||
| 13583 | if (pu64->high & 0x80000000) { | ||
| 13584 | - u64a.high = ~pu64->high; | ||
| 13585 | - u64a.low = ~pu64->low; | ||
| 13586 | - sign = 1; | ||
| 13587 | + u64a.high = (uint32_t) ~pu64->high; | ||
| 13588 | + u64a.low = (uint32_t) ~pu64->low; | ||
| 13589 | incrByU32(&u64a, 1); /* bit invert and incr by 1 to print 2s complement */ | ||
| 13590 | + buf[0] = '-'; | ||
| 13591 | + printU64(buf + 1, &u64a); | ||
| 13592 | } else { | ||
| 13593 | - u64a.high = pu64->high; | ||
| 13594 | - u64a.low = pu64->low; | ||
| 13595 | - } | ||
| 13596 | - | ||
| 13597 | - aRes[I64CHARSZ] = 0; | ||
| 13598 | - for (j = 0; j < I64CHARSZ; j++) { | ||
| 13599 | - divBy10(u64a, &u64b, &u); | ||
| 13600 | - aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u); | ||
| 13601 | - u64a.high = u64b.high; | ||
| 13602 | - u64a.low = u64b.low; | ||
| 13603 | - if (isZeroU64(&u64a)) | ||
| 13604 | - break; | ||
| 13605 | - } | ||
| 13606 | - if (sign == 1) { | ||
| 13607 | - aRes[(I64CHARSZ - 1) - j - 1] = '-'; | ||
| 13608 | - strcpy(buf, &aRes[(I64CHARSZ - 1) - j - 1]); | ||
| 13609 | - return; | ||
| 13610 | + printU64(buf, pu64); | ||
| 13611 | } | ||
| 13612 | - strcpy(buf, &aRes[(I64CHARSZ - 1) - j]); | ||
| 13613 | } | ||
| 13614 | |||
| 13615 | +/** Convert a signed 64-bit integer from ASCII to U64. */ | ||
| 13616 | int | ||
| 13617 | read64(U64 * i64, const char *str) | ||
| 13618 | { | ||
| 13619 | @@ -517,75 +448,14 @@ read64(U64 * i64, const char *str) | ||
| 13620 | ok = 1; | ||
| 13621 | u = *str - '0'; | ||
| 13622 | multBy10(*i64, &i64p); | ||
| 13623 | - memcpy(i64, &i64p, sizeof(i64p)); | ||
| 13624 | + *i64 = i64p; | ||
| 13625 | incrByU16(i64, u); | ||
| 13626 | str++; | ||
| 13627 | } | ||
| 13628 | if (sign) { | ||
| 13629 | - i64->high = ~i64->high; | ||
| 13630 | - i64->low = ~i64->low; | ||
| 13631 | + i64->high = (uint32_t) ~i64->high; | ||
| 13632 | + i64->low = (uint32_t) ~i64->low; | ||
| 13633 | incrByU16(i64, 1); | ||
| 13634 | } | ||
| 13635 | return ok; | ||
| 13636 | } | ||
| 13637 | - | ||
| 13638 | - | ||
| 13639 | - | ||
| 13640 | - | ||
| 13641 | -#ifdef TESTING | ||
| 13642 | -void | ||
| 13643 | -main(int argc, char *argv[]) | ||
| 13644 | -{ | ||
| 13645 | - int i; | ||
| 13646 | - int j; | ||
| 13647 | - int l; | ||
| 13648 | - unsigned int u; | ||
| 13649 | - U64 u64a; | ||
| 13650 | - U64 u64b; | ||
| 13651 | -#define MXSZ 20 | ||
| 13652 | - char aRes[MXSZ + 1]; | ||
| 13653 | - | ||
| 13654 | - | ||
| 13655 | - if (argc < 2) { | ||
| 13656 | - printf("This program takes numbers from the command line\n" | ||
| 13657 | - "and prints them out.\n" "Usage: test <unsignedInt>...\n"); | ||
| 13658 | - exit(1); | ||
| 13659 | - } | ||
| 13660 | - | ||
| 13661 | - aRes[MXSZ] = 0; | ||
| 13662 | - | ||
| 13663 | - for (i = 1; i < argc; i++) { | ||
| 13664 | - l = strlen(argv[i]); | ||
| 13665 | - zeroU64(&u64a); | ||
| 13666 | - for (j = 0; j < l; j++) { | ||
| 13667 | - if (!isdigit(argv[i][j])) { | ||
| 13668 | - printf("Argument is not a number \"%s\"\n", argv[i]); | ||
| 13669 | - exit(1); | ||
| 13670 | - } | ||
| 13671 | - u = argv[i][j] - '0'; | ||
| 13672 | - multBy10(u64a, &u64b); | ||
| 13673 | - u64a = u64b; | ||
| 13674 | - incrByU16(&u64a, u); | ||
| 13675 | - } | ||
| 13676 | - | ||
| 13677 | - printf("number \"%s\" in hex is '%08x%08x'h\n", | ||
| 13678 | - argv[i], u64a.high, u64a.low); | ||
| 13679 | - | ||
| 13680 | - printf("number is \"%s\"\n", printU64(&u64a)); | ||
| 13681 | - for (j = 0; j < MXSZ; j++) { | ||
| 13682 | - divBy10(u64a, &u64b, &u); | ||
| 13683 | - aRes[(MXSZ - 1) - j] = (char) ('0' + u); | ||
| 13684 | - u64a = u64b; | ||
| 13685 | - if (isZeroU64(&u64a)) | ||
| 13686 | - break; | ||
| 13687 | - } | ||
| 13688 | - | ||
| 13689 | - printf("number is \"%s\"\n", &aRes[(MXSZ - 1) - j]); | ||
| 13690 | - } | ||
| 13691 | - exit(0); | ||
| 13692 | -} /* main */ | ||
| 13693 | -#endif /* TESTING */ | ||
| 13694 | - | ||
| 13695 | -/* | ||
| 13696 | - * file: test.c | ||
| 13697 | - */ | ||
| 13698 | diff --git a/snmplib/keytools.c b/snmplib/keytools.c | ||
| 13699 | index 810a063..0faa0de 100644 | ||
| 13700 | --- a/snmplib/keytools.c | ||
| 13701 | +++ b/snmplib/keytools.c | ||
| 13702 | @@ -118,13 +118,11 @@ generate_Ku(const oid * hashtype, u_int hashtype_len, | ||
| 13703 | u_char buf[USM_LENGTH_KU_HASHBLOCK], *bufp; | ||
| 13704 | |||
| 13705 | #ifdef NETSNMP_USE_OPENSSL | ||
| 13706 | - EVP_MD_CTX *ctx = (EVP_MD_CTX *)malloc(sizeof(EVP_MD_CTX)); | ||
| 13707 | - unsigned int tmp_len; | ||
| 13708 | + EVP_MD_CTX *ctx = NULL; | ||
| 13709 | #elif NETSNMP_USE_INTERNAL_CRYPTO | ||
| 13710 | SHA_CTX csha1; | ||
| 13711 | MD5_CTX cmd5; | ||
| 13712 | char cryptotype = 0; | ||
| 13713 | - unsigned int tmp_len; | ||
| 13714 | #define TYPE_MD5 1 | ||
| 13715 | #define TYPE_SHA1 2 | ||
| 13716 | #else | ||
| 13717 | @@ -151,6 +149,12 @@ generate_Ku(const oid * hashtype, u_int hashtype_len, | ||
| 13718 | */ | ||
| 13719 | #ifdef NETSNMP_USE_OPENSSL | ||
| 13720 | |||
| 13721 | +#ifdef HAVE_EVP_MD_CTX_CREATE | ||
| 13722 | + ctx = EVP_MD_CTX_create(); | ||
| 13723 | +#else | ||
| 13724 | + ctx = malloc(sizeof(*ctx)); | ||
| 13725 | + EVP_MD_CTX_init(ctx); | ||
| 13726 | +#endif | ||
| 13727 | #ifndef NETSNMP_DISABLE_MD5 | ||
| 13728 | if (ISTRANSFORM(hashtype, HMACMD5Auth)) | ||
| 13729 | EVP_DigestInit(ctx, EVP_md5()); | ||
| 13730 | @@ -158,10 +162,8 @@ generate_Ku(const oid * hashtype, u_int hashtype_len, | ||
| 13731 | #endif | ||
| 13732 | if (ISTRANSFORM(hashtype, HMACSHA1Auth)) | ||
| 13733 | EVP_DigestInit(ctx, EVP_sha1()); | ||
| 13734 | - else { | ||
| 13735 | - free(ctx); | ||
| 13736 | - return (SNMPERR_GENERR); | ||
| 13737 | - } | ||
| 13738 | + else | ||
| 13739 | + QUITFUN(SNMPERR_GENERR, generate_Ku_quit); | ||
| 13740 | #elif NETSNMP_USE_INTERNAL_CRYPTO | ||
| 13741 | #ifndef NETSNMP_DISABLE_MD5 | ||
| 13742 | if (ISTRANSFORM(hashtype, HMACMD5Auth)) { | ||
| 13743 | @@ -205,14 +207,17 @@ generate_Ku(const oid * hashtype, u_int hashtype_len, | ||
| 13744 | } | ||
| 13745 | |||
| 13746 | #ifdef NETSNMP_USE_OPENSSL | ||
| 13747 | + { | ||
| 13748 | + unsigned int tmp_len; | ||
| 13749 | + | ||
| 13750 | tmp_len = *kulen; | ||
| 13751 | EVP_DigestFinal(ctx, (unsigned char *) Ku, &tmp_len); | ||
| 13752 | *kulen = tmp_len; | ||
| 13753 | /* | ||
| 13754 | * what about free() | ||
| 13755 | */ | ||
| 13756 | + } | ||
| 13757 | #elif NETSNMP_USE_INTERNAL_CRYPTO | ||
| 13758 | - tmp_len = *kulen; | ||
| 13759 | if (TYPE_SHA1 == cryptotype) { | ||
| 13760 | SHA1_Final(Ku, &csha1); | ||
| 13761 | } else { | ||
| 13762 | @@ -248,7 +253,14 @@ generate_Ku(const oid * hashtype, u_int hashtype_len, | ||
| 13763 | generate_Ku_quit: | ||
| 13764 | memset(buf, 0, sizeof(buf)); | ||
| 13765 | #ifdef NETSNMP_USE_OPENSSL | ||
| 13766 | - free(ctx); | ||
| 13767 | + if (ctx) { | ||
| 13768 | +#ifdef HAVE_EVP_MD_CTX_DESTROY | ||
| 13769 | + EVP_MD_CTX_destroy(ctx); | ||
| 13770 | +#else | ||
| 13771 | + EVP_MD_CTX_cleanup(ctx); | ||
| 13772 | + free(ctx); | ||
| 13773 | +#endif | ||
| 13774 | + } | ||
| 13775 | #endif | ||
| 13776 | return rval; | ||
| 13777 | |||
| 13778 | @@ -638,7 +650,8 @@ decode_keychange(const oid * hashtype, u_int hashtype_len, | ||
| 13779 | |||
| 13780 | decode_keychange_quit: | ||
| 13781 | if (rval != SNMPERR_SUCCESS) { | ||
| 13782 | - memset(newkey, 0, properlength); | ||
| 13783 | + if (newkey) | ||
| 13784 | + memset(newkey, 0, properlength); | ||
| 13785 | } | ||
| 13786 | memset(tmp_buf, 0, SNMP_MAXBUF); | ||
| 13787 | SNMP_FREE(tmpbuf); | ||
| 13788 | diff --git a/snmplib/large_fd_set.c b/snmplib/large_fd_set.c | ||
| 13789 | index 1176a5b..32f57b3 100644 | ||
| 13790 | --- a/snmplib/large_fd_set.c | ||
| 13791 | +++ b/snmplib/large_fd_set.c | ||
| 13792 | @@ -19,7 +19,7 @@ | ||
| 13793 | #include <net-snmp/library/large_fd_set.h> | ||
| 13794 | |||
| 13795 | |||
| 13796 | -#if ! defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 13797 | +#if !defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 13798 | |||
| 13799 | void | ||
| 13800 | netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset) | ||
| 13801 | @@ -39,7 +39,7 @@ netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset) | ||
| 13802 | if (i == fdset->lfs_set.fd_count | ||
| 13803 | && fdset->lfs_set.fd_count < fdset->lfs_setsize) { | ||
| 13804 | fdset->lfs_set.fd_count++; | ||
| 13805 | - fdset->lfs_set.fd_array[i] = (fd); | ||
| 13806 | + fdset->lfs_set.fd_array[i] = fd; | ||
| 13807 | } | ||
| 13808 | } | ||
| 13809 | |||
| 13810 | @@ -51,7 +51,7 @@ netsnmp_large_fd_clr(SOCKET fd, netsnmp_large_fd_set * fdset) | ||
| 13811 | netsnmp_assert(fd != INVALID_SOCKET); | ||
| 13812 | |||
| 13813 | for (i = 0; i < fdset->lfs_set.fd_count; i++) { | ||
| 13814 | - if (fdset->lfs_set.fd_array[i] == (fd)) { | ||
| 13815 | + if (fdset->lfs_set.fd_array[i] == fd) { | ||
| 13816 | while (i < fdset->lfs_set.fd_count - 1) { | ||
| 13817 | fdset->lfs_set.fd_array[i] = | ||
| 13818 | fdset->lfs_set.fd_array[i + 1]; | ||
| 13819 | @@ -95,7 +95,7 @@ netsnmp_large_fd_clr(int fd, netsnmp_large_fd_set * fdset) | ||
| 13820 | { | ||
| 13821 | netsnmp_assert(fd >= 0); | ||
| 13822 | |||
| 13823 | - if (fd < (int)fdset->lfs_setsize) | ||
| 13824 | + if ((unsigned)fd < fdset->lfs_setsize) | ||
| 13825 | FD_CLR(fd, fdset->lfs_setptr); | ||
| 13826 | } | ||
| 13827 | |||
| 13828 | @@ -104,7 +104,7 @@ netsnmp_large_fd_is_set(int fd, netsnmp_large_fd_set * fdset) | ||
| 13829 | { | ||
| 13830 | netsnmp_assert(fd >= 0); | ||
| 13831 | |||
| 13832 | - return fd < (int)fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr); | ||
| 13833 | + return (unsigned)fd < fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr); | ||
| 13834 | } | ||
| 13835 | |||
| 13836 | #endif | ||
| 13837 | @@ -114,6 +114,9 @@ netsnmp_large_fd_set_init(netsnmp_large_fd_set * fdset, int setsize) | ||
| 13838 | { | ||
| 13839 | fdset->lfs_setsize = 0; | ||
| 13840 | fdset->lfs_setptr = NULL; | ||
| 13841 | +#if !defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 13842 | + fdset->lfs_set.fd_count = 0; | ||
| 13843 | +#endif | ||
| 13844 | netsnmp_large_fd_set_resize(fdset, setsize); | ||
| 13845 | } | ||
| 13846 | |||
| 13847 | @@ -135,25 +138,32 @@ netsnmp_large_fd_set_select(int numfds, netsnmp_large_fd_set *readfds, | ||
| 13848 | /* Array representation: no resizing is necessary. */ | ||
| 13849 | #endif | ||
| 13850 | |||
| 13851 | - return select(numfds, readfds->lfs_setptr, writefds->lfs_setptr, | ||
| 13852 | - exceptfds->lfs_setptr, timeout); | ||
| 13853 | + return select(numfds, | ||
| 13854 | + readfds ? readfds->lfs_setptr : NULL, | ||
| 13855 | + writefds ? writefds->lfs_setptr : NULL, | ||
| 13856 | + exceptfds ? exceptfds->lfs_setptr : NULL, | ||
| 13857 | + timeout); | ||
| 13858 | } | ||
| 13859 | |||
| 13860 | -void | ||
| 13861 | +int | ||
| 13862 | netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize) | ||
| 13863 | { | ||
| 13864 | int fd_set_bytes; | ||
| 13865 | |||
| 13866 | if (fdset->lfs_setsize == setsize) | ||
| 13867 | - return; | ||
| 13868 | + goto success; | ||
| 13869 | |||
| 13870 | if (setsize > FD_SETSIZE) { | ||
| 13871 | fd_set_bytes = NETSNMP_FD_SET_BYTES(setsize); | ||
| 13872 | - if (fdset->lfs_setsize > FD_SETSIZE) | ||
| 13873 | - fdset->lfs_setptr = (fd_set *)realloc(fdset->lfs_setptr, fd_set_bytes); | ||
| 13874 | - else { | ||
| 13875 | - fdset->lfs_setptr = (fd_set *)malloc(fd_set_bytes); | ||
| 13876 | - *fdset->lfs_setptr = fdset->lfs_set; | ||
| 13877 | + if (fdset->lfs_setsize > FD_SETSIZE) { | ||
| 13878 | + fdset->lfs_setptr = realloc(fdset->lfs_setptr, fd_set_bytes); | ||
| 13879 | + if (!fdset->lfs_setptr) | ||
| 13880 | + goto out_of_mem; | ||
| 13881 | + } else { | ||
| 13882 | + fdset->lfs_setptr = malloc(fd_set_bytes); | ||
| 13883 | + if (!fdset->lfs_setptr) | ||
| 13884 | + goto out_of_mem; | ||
| 13885 | + *fdset->lfs_setptr = fdset->lfs_set; | ||
| 13886 | } | ||
| 13887 | } else { | ||
| 13888 | if (fdset->lfs_setsize > FD_SETSIZE) { | ||
| 13889 | @@ -163,20 +173,33 @@ netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize) | ||
| 13890 | fdset->lfs_setptr = &fdset->lfs_set; | ||
| 13891 | } | ||
| 13892 | |||
| 13893 | -#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H)) | ||
| 13894 | +#if defined(cygwin) || !defined(HAVE_WINSOCK_H) | ||
| 13895 | { | ||
| 13896 | int i; | ||
| 13897 | |||
| 13898 | - /* | ||
| 13899 | - * Unix: clear the file descriptors defined in the resized *fdset | ||
| 13900 | - * but that were not defined in the original *fdset. | ||
| 13901 | - */ | ||
| 13902 | - for (i = fdset->lfs_setsize; i < setsize; i++) | ||
| 13903 | - FD_CLR(i, fdset->lfs_setptr); | ||
| 13904 | + /* | ||
| 13905 | + * Unix: when enlarging, clear the file descriptors defined in the | ||
| 13906 | + * resized *fdset but that were not defined in the original *fdset. | ||
| 13907 | + */ | ||
| 13908 | + for (i = fdset->lfs_setsize; i < setsize; i++) | ||
| 13909 | + FD_CLR(i, fdset->lfs_setptr); | ||
| 13910 | } | ||
| 13911 | #endif | ||
| 13912 | |||
| 13913 | fdset->lfs_setsize = setsize; | ||
| 13914 | +#if !defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 13915 | + if (setsize < fdset->lfs_set.fd_count) | ||
| 13916 | + fdset->lfs_set.fd_count = setsize; | ||
| 13917 | +#endif | ||
| 13918 | +success: | ||
| 13919 | + return 1; | ||
| 13920 | + | ||
| 13921 | +out_of_mem: | ||
| 13922 | + fdset->lfs_setsize = 0; | ||
| 13923 | +#if !defined(cygwin) && defined(HAVE_WINSOCK_H) | ||
| 13924 | + fdset->lfs_set.fd_count = 0; | ||
| 13925 | +#endif | ||
| 13926 | + return 0; | ||
| 13927 | } | ||
| 13928 | |||
| 13929 | void | ||
| 13930 | @@ -207,13 +230,13 @@ netsnmp_copy_large_fd_set_to_fd_set(fd_set * dst, | ||
| 13931 | |||
| 13932 | *dst = *src->lfs_setptr; | ||
| 13933 | |||
| 13934 | -#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H)) | ||
| 13935 | +#if !(!defined(cygwin) && defined(HAVE_WINSOCK_H)) | ||
| 13936 | { | ||
| 13937 | int i; | ||
| 13938 | |||
| 13939 | - /* Unix: clear any file descriptors defined in *dst but not in *src. */ | ||
| 13940 | - for (i = src->lfs_setsize; i < FD_SETSIZE; ++i) | ||
| 13941 | - FD_CLR(i, dst); | ||
| 13942 | + /* Unix: clear any file descriptors defined in *dst but not in *src. */ | ||
| 13943 | + for (i = src->lfs_setsize; i < FD_SETSIZE; ++i) | ||
| 13944 | + FD_CLR(i, dst); | ||
| 13945 | } | ||
| 13946 | #endif | ||
| 13947 | |||
| 13948 | diff --git a/snmplib/mib.c b/snmplib/mib.c | ||
| 13949 | index 7c8af9c..549d206 100644 | ||
| 13950 | --- a/snmplib/mib.c | ||
| 13951 | +++ b/snmplib/mib.c | ||
| 13952 | @@ -462,7 +462,7 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len, | ||
| 13953 | const char *saved_hint = hint; | ||
| 13954 | int hex = 0, x = 0; | ||
| 13955 | u_char *cp; | ||
| 13956 | - int output_format, len_needed; | ||
| 13957 | + int output_format, cnt; | ||
| 13958 | |||
| 13959 | if ((var->type != ASN_OCTET_STR) && | ||
| 13960 | (!netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICKE_PRINT))) { | ||
| 13961 | @@ -571,18 +571,11 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len, | ||
| 13962 | break; | ||
| 13963 | case 't': /* new in rfc 3411 */ | ||
| 13964 | case 'a': | ||
| 13965 | - /* A string hint gives the max size - we may not need this much */ | ||
| 13966 | - len_needed = SNMP_MIN( width, ecp-cp ); | ||
| 13967 | - while ((*out_len + len_needed + 1) >= *buf_len) { | ||
| 13968 | - if (!(allow_realloc && snmp_realloc(buf, buf_len))) { | ||
| 13969 | - return 0; | ||
| 13970 | - } | ||
| 13971 | - } | ||
| 13972 | - for (x = 0; x < width && cp < ecp; x++) { | ||
| 13973 | - *(*buf + *out_len) = *cp++; | ||
| 13974 | - (*out_len)++; | ||
| 13975 | - } | ||
| 13976 | - *(*buf + *out_len) = '\0'; | ||
| 13977 | + cnt = SNMP_MIN(width, ecp - cp); | ||
| 13978 | + if (!sprint_realloc_asciistring(buf, buf_len, out_len, | ||
| 13979 | + allow_realloc, cp, cnt)) | ||
| 13980 | + return 0; | ||
| 13981 | + cp += cnt; | ||
| 13982 | break; | ||
| 13983 | default: | ||
| 13984 | *out_len = saved_out_len; | ||
| 13985 | @@ -2800,6 +2793,8 @@ netsnmp_mibindex_load( void ) | ||
| 13986 | get_persistent_directory(), i ); | ||
| 13987 | tmpbuf[sizeof(tmpbuf)-1] = 0; | ||
| 13988 | fp = fopen( tmpbuf, "r" ); | ||
| 13989 | + if (!fp) | ||
| 13990 | + continue; | ||
| 13991 | cp = fgets( tmpbuf2, sizeof(tmpbuf2), fp ); | ||
| 13992 | if ( !cp ) { | ||
| 13993 | DEBUGMSGTL(("mibindex", "Empty MIB index (%d)\n", i)); | ||
| 13994 | @@ -3057,14 +3052,11 @@ read_objid(const char *input, oid * output, size_t * out_len) | ||
| 13995 | * get past leading '.', append '.' to Prefix. | ||
| 13996 | */ | ||
| 13997 | if (*Prefix == '.') | ||
| 13998 | - strncpy(buf, Prefix + 1, sizeof(buf)-1); | ||
| 13999 | + strlcpy(buf, Prefix + 1, sizeof(buf)); | ||
| 14000 | else | ||
| 14001 | - strncpy(buf, Prefix, sizeof(buf)-1); | ||
| 14002 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 14003 | - strcat(buf, "."); | ||
| 14004 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 14005 | - strncat(buf, input, sizeof(buf)-strlen(buf)); | ||
| 14006 | - buf[ sizeof(buf)-1 ] = 0; | ||
| 14007 | + strlcpy(buf, Prefix, sizeof(buf)); | ||
| 14008 | + strlcat(buf, ".", sizeof(buf)); | ||
| 14009 | + strlcat(buf, input, sizeof(buf)); | ||
| 14010 | input = buf; | ||
| 14011 | } | ||
| 14012 | #endif /* NETSNMP_DISABLE_MIB_LOADING */ | ||
| 14013 | @@ -5106,8 +5098,7 @@ print_tree_node(u_char ** buf, size_t * buf_len, | ||
| 14014 | else | ||
| 14015 | if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc, ", ")) | ||
| 14016 | return 0; | ||
| 14017 | - snprintf(str, sizeof(str), "%s", vp->vblabel); | ||
| 14018 | - str[ sizeof(str)-1 ] = 0; | ||
| 14019 | + strlcpy(str, vp->vblabel, sizeof(str)); | ||
| 14020 | len = strlen(str); | ||
| 14021 | if (pos + len + 2 > width) { | ||
| 14022 | if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc, | ||
| 14023 | @@ -5720,8 +5711,7 @@ get_node(const char *name, oid * objid, size_t * objidlen) | ||
| 14024 | module = (char *) malloc((size_t) (cp - name + 1)); | ||
| 14025 | if (!module) | ||
| 14026 | return SNMPERR_GENERR; | ||
| 14027 | - memcpy(module, name, (size_t) (cp - name)); | ||
| 14028 | - module[cp - name] = 0; | ||
| 14029 | + sprintf(module, "%.*s", (int) (cp - name), name); | ||
| 14030 | cp++; /* cp now point to the subidentifier */ | ||
| 14031 | if (*cp == ':') | ||
| 14032 | cp++; | ||
| 14033 | diff --git a/snmplib/oid_stash.c b/snmplib/oid_stash.c | ||
| 14034 | index 02c53a9..8a79897 100644 | ||
| 14035 | --- a/snmplib/oid_stash.c | ||
| 14036 | +++ b/snmplib/oid_stash.c | ||
| 14037 | @@ -305,6 +305,8 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root, | ||
| 14038 | } | ||
| 14039 | #endif /* NETSNMP_FEATURE_REMOVE_OID_STASH_GET_DATA */ | ||
| 14040 | |||
| 14041 | +netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all) | ||
| 14042 | +#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL | ||
| 14043 | /** a wrapper around netsnmp_oid_stash_store for use with a snmp_alarm. | ||
| 14044 | * when calling snmp_alarm, you can list this as a callback. The | ||
| 14045 | * clientarg should be a pointer to a netsnmp_oid_stash_save_info | ||
| 14046 | @@ -316,8 +318,6 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root, | ||
| 14047 | * @param serverarg | ||
| 14048 | * @param clientarg A pointer to a netsnmp_oid_stash_save_info structure. | ||
| 14049 | */ | ||
| 14050 | -netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all) | ||
| 14051 | -#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL | ||
| 14052 | int | ||
| 14053 | netsnmp_oid_stash_store_all(int majorID, int minorID, | ||
| 14054 | void *serverarg, void *clientarg) { | ||
| 14055 | diff --git a/snmplib/openssl/openssl_cfb128.c b/snmplib/openssl/openssl_cfb128.c | ||
| 14056 | index 7e78905..5e0bc1e 100644 | ||
| 14057 | --- a/snmplib/openssl/openssl_cfb128.c | ||
| 14058 | +++ b/snmplib/openssl/openssl_cfb128.c | ||
| 14059 | @@ -98,7 +98,7 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, | ||
| 14060 | (*block)(ivec, ivec, key); | ||
| 14061 | for (n=0; n<16; n+=sizeof(size_t)) { | ||
| 14062 | *(size_t*)(out+n) = | ||
| 14063 | - *(size_t*)(ivec+n) ^= *(size_t*)(in+n); | ||
| 14064 | + *(size_t*)(ivec+n) ^= *(const size_t*)(in+n); | ||
| 14065 | } | ||
| 14066 | len -= 16; | ||
| 14067 | out += 16; | ||
| 14068 | @@ -142,8 +142,8 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out, | ||
| 14069 | while (len>=16) { | ||
| 14070 | (*block)(ivec, ivec, key); | ||
| 14071 | for (n=0; n<16; n+=sizeof(size_t)) { | ||
| 14072 | - size_t t = *(size_t*)(in+n); | ||
| 14073 | - *(size_t*)(out+n) = *(size_t*)(ivec+n) ^ t; | ||
| 14074 | + size_t t = *(const size_t*)(in+n); | ||
| 14075 | + *(size_t*)(out+n) = *(const size_t*)(ivec+n) ^ t; | ||
| 14076 | *(size_t*)(ivec+n) = t; | ||
| 14077 | } | ||
| 14078 | len -= 16; | ||
| 14079 | diff --git a/snmplib/parse.c b/snmplib/parse.c | ||
| 14080 | index bfe5cad..1114586 100644 | ||
| 14081 | --- a/snmplib/parse.c | ||
| 14082 | +++ b/snmplib/parse.c | ||
| 14083 | @@ -2021,11 +2021,19 @@ parse_objectid(FILE * fp, char *name) | ||
| 14084 | * The name for this node is the label for this entry | ||
| 14085 | */ | ||
| 14086 | np->label = strdup(name); | ||
| 14087 | + if (np->label == NULL) { | ||
| 14088 | + SNMP_FREE(np->parent); | ||
| 14089 | + SNMP_FREE(np); | ||
| 14090 | + return (NULL); | ||
| 14091 | + } | ||
| 14092 | } else { | ||
| 14093 | if (!nop->label) { | ||
| 14094 | nop->label = (char *) malloc(20 + ANON_LEN); | ||
| 14095 | - if (nop->label == NULL) | ||
| 14096 | + if (nop->label == NULL) { | ||
| 14097 | + SNMP_FREE(np->parent); | ||
| 14098 | + SNMP_FREE(np); | ||
| 14099 | return (NULL); | ||
| 14100 | + } | ||
| 14101 | sprintf(nop->label, "%s%d", ANON, anonymous++); | ||
| 14102 | } | ||
| 14103 | np->label = strdup(nop->label); | ||
| 14104 | @@ -2694,29 +2702,12 @@ parse_objecttype(FILE * fp, char *name) | ||
| 14105 | break; | ||
| 14106 | else if (type == LEFTBRACKET) | ||
| 14107 | level++; | ||
| 14108 | - if (type == QUOTESTRING) { | ||
| 14109 | - if (strlen(defbuf)+2 < sizeof(defbuf)) { | ||
| 14110 | - defbuf[ strlen(defbuf)+2 ] = 0; | ||
| 14111 | - defbuf[ strlen(defbuf)+1 ] = '"'; | ||
| 14112 | - defbuf[ strlen(defbuf) ] = '\\'; | ||
| 14113 | - } | ||
| 14114 | - defbuf[ sizeof(defbuf)-1 ] = 0; | ||
| 14115 | - } | ||
| 14116 | - strncat(defbuf, quoted_string_buffer, | ||
| 14117 | - sizeof(defbuf)-strlen(defbuf)-1); | ||
| 14118 | - defbuf[ sizeof(defbuf)-1 ] = 0; | ||
| 14119 | - if (type == QUOTESTRING) { | ||
| 14120 | - if (strlen(defbuf)+2 < sizeof(defbuf)) { | ||
| 14121 | - defbuf[ strlen(defbuf)+2 ] = 0; | ||
| 14122 | - defbuf[ strlen(defbuf)+1 ] = '"'; | ||
| 14123 | - defbuf[ strlen(defbuf) ] = '\\'; | ||
| 14124 | - } | ||
| 14125 | - defbuf[ sizeof(defbuf)-1 ] = 0; | ||
| 14126 | - } | ||
| 14127 | - if (strlen(defbuf)+1 < sizeof(defbuf)) { | ||
| 14128 | - defbuf[ strlen(defbuf)+1 ] = 0; | ||
| 14129 | - defbuf[ strlen(defbuf) ] = ' '; | ||
| 14130 | - } | ||
| 14131 | + if (type == QUOTESTRING) | ||
| 14132 | + strlcat(defbuf, "\\\"", sizeof(defbuf)); | ||
| 14133 | + strlcat(defbuf, quoted_string_buffer, sizeof(defbuf)); | ||
| 14134 | + if (type == QUOTESTRING) | ||
| 14135 | + strlcat(defbuf, "\\\"", sizeof(defbuf)); | ||
| 14136 | + strlcat(defbuf, " ", sizeof(defbuf)); | ||
| 14137 | } | ||
| 14138 | |||
| 14139 | if (type != RIGHTBRACKET) { | ||
| 14140 | @@ -3910,6 +3901,9 @@ read_module_internal(const char *name) | ||
| 14141 | snmp_log_perror(mp->file); | ||
| 14142 | return rval; | ||
| 14143 | } | ||
| 14144 | +#ifdef HAVE_FLOCKFILE | ||
| 14145 | + flockfile(fp); | ||
| 14146 | +#endif | ||
| 14147 | mp->no_imports = 0; /* Note that we've read the file */ | ||
| 14148 | File = mp->file; | ||
| 14149 | mibLine = 1; | ||
| 14150 | @@ -3918,6 +3912,9 @@ read_module_internal(const char *name) | ||
| 14151 | * Parse the file | ||
| 14152 | */ | ||
| 14153 | np = parse(fp, NULL); | ||
| 14154 | +#ifdef HAVE_FUNLOCKFILE | ||
| 14155 | + funlockfile(fp); | ||
| 14156 | +#endif | ||
| 14157 | fclose(fp); | ||
| 14158 | File = oldFile; | ||
| 14159 | mibLine = oldLine; | ||
| 14160 | @@ -4400,8 +4397,7 @@ parse(FILE * fp, struct node *root) | ||
| 14161 | case ENDOFFILE: | ||
| 14162 | continue; | ||
| 14163 | default: | ||
| 14164 | - strncpy(name, token, sizeof(name)); | ||
| 14165 | - name[sizeof(name)-1] = '\0'; | ||
| 14166 | + strlcpy(name, token, sizeof(name)); | ||
| 14167 | type = get_token(fp, token, MAXTOKEN); | ||
| 14168 | nnp = NULL; | ||
| 14169 | if (type == MACRO) { | ||
| 14170 | @@ -4419,8 +4415,7 @@ parse(FILE * fp, struct node *root) | ||
| 14171 | print_error(name, "is a reserved word", lasttype); | ||
| 14172 | continue; /* see if we can parse the rest of the file */ | ||
| 14173 | } | ||
| 14174 | - strncpy(name, token, sizeof(name)); | ||
| 14175 | - name[sizeof(name)-1] = '\0'; | ||
| 14176 | + strlcpy(name, token, sizeof(name)); | ||
| 14177 | type = get_token(fp, token, MAXTOKEN); | ||
| 14178 | nnp = NULL; | ||
| 14179 | |||
| 14180 | @@ -4610,6 +4605,21 @@ is_labelchar(int ich) | ||
| 14181 | return 0; | ||
| 14182 | } | ||
| 14183 | |||
| 14184 | +/** | ||
| 14185 | + * Read a single character from a file. Assumes that the caller has invoked | ||
| 14186 | + * flockfile(). Uses fgetc_unlocked() instead of getc() since the former is | ||
| 14187 | + * implemented as an inline function in glibc. See also bug 3447196 | ||
| 14188 | + * (http://sourceforge.net/tracker/?func=detail&aid=3447196&group_id=12694&atid=112694). | ||
| 14189 | + */ | ||
| 14190 | +static int netsnmp_getc(FILE *stream) | ||
| 14191 | +{ | ||
| 14192 | +#ifdef HAVE_FGETC_UNLOCKED | ||
| 14193 | + return fgetc_unlocked(stream); | ||
| 14194 | +#else | ||
| 14195 | + return getc(stream); | ||
| 14196 | +#endif | ||
| 14197 | +} | ||
| 14198 | + | ||
| 14199 | /* | ||
| 14200 | * Parses a token from the file. The type of the token parsed is returned, | ||
| 14201 | * and the text is placed in the string pointed to by token. | ||
| 14202 | @@ -4629,7 +4639,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14203 | * skip all white space | ||
| 14204 | */ | ||
| 14205 | do { | ||
| 14206 | - ch = getc(fp); | ||
| 14207 | + ch = netsnmp_getc(fp); | ||
| 14208 | if (ch == '\n') | ||
| 14209 | mibLine++; | ||
| 14210 | } | ||
| 14211 | @@ -4643,7 +4653,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14212 | return parseQuoteString(fp, token, maxtlen); | ||
| 14213 | case '\'': /* binary or hex constant */ | ||
| 14214 | seenSymbols = bdigits; | ||
| 14215 | - while ((ch = getc(fp)) != EOF && ch != '\'') { | ||
| 14216 | + while ((ch = netsnmp_getc(fp)) != EOF && ch != '\'') { | ||
| 14217 | switch (seenSymbols) { | ||
| 14218 | case bdigits: | ||
| 14219 | if (ch == '0' || ch == '1') | ||
| 14220 | @@ -4662,7 +4672,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14221 | if (ch == '\'') { | ||
| 14222 | unsigned long val = 0; | ||
| 14223 | char *run = token + 1; | ||
| 14224 | - ch = getc(fp); | ||
| 14225 | + ch = netsnmp_getc(fp); | ||
| 14226 | switch (ch) { | ||
| 14227 | case EOF: | ||
| 14228 | return ENDOFFILE; | ||
| 14229 | @@ -4721,25 +4731,25 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14230 | case '|': | ||
| 14231 | return BAR; | ||
| 14232 | case '.': | ||
| 14233 | - ch_next = getc(fp); | ||
| 14234 | + ch_next = netsnmp_getc(fp); | ||
| 14235 | if (ch_next == '.') | ||
| 14236 | return RANGE; | ||
| 14237 | ungetc(ch_next, fp); | ||
| 14238 | return LABEL; | ||
| 14239 | case ':': | ||
| 14240 | - ch_next = getc(fp); | ||
| 14241 | + ch_next = netsnmp_getc(fp); | ||
| 14242 | if (ch_next != ':') { | ||
| 14243 | ungetc(ch_next, fp); | ||
| 14244 | return LABEL; | ||
| 14245 | } | ||
| 14246 | - ch_next = getc(fp); | ||
| 14247 | + ch_next = netsnmp_getc(fp); | ||
| 14248 | if (ch_next != '=') { | ||
| 14249 | ungetc(ch_next, fp); | ||
| 14250 | return LABEL; | ||
| 14251 | } | ||
| 14252 | return EQUALS; | ||
| 14253 | case '-': | ||
| 14254 | - ch_next = getc(fp); | ||
| 14255 | + ch_next = netsnmp_getc(fp); | ||
| 14256 | if (ch_next == '-') { | ||
| 14257 | if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, | ||
| 14258 | NETSNMP_DS_LIB_MIB_COMMENT_TERM)) { | ||
| 14259 | @@ -4747,7 +4757,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14260 | * Treat the rest of this line as a comment. | ||
| 14261 | */ | ||
| 14262 | while ((ch_next != EOF) && (ch_next != '\n')) | ||
| 14263 | - ch_next = getc(fp); | ||
| 14264 | + ch_next = netsnmp_getc(fp); | ||
| 14265 | } else { | ||
| 14266 | /* | ||
| 14267 | * Treat the rest of the line or until another '--' as a comment | ||
| 14268 | @@ -4756,11 +4766,11 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14269 | * (this is the "technically" correct way to parse comments) | ||
| 14270 | */ | ||
| 14271 | ch = ' '; | ||
| 14272 | - ch_next = getc(fp); | ||
| 14273 | + ch_next = netsnmp_getc(fp); | ||
| 14274 | while (ch_next != EOF && ch_next != '\n' && | ||
| 14275 | (ch != '-' || ch_next != '-')) { | ||
| 14276 | ch = ch_next; | ||
| 14277 | - ch_next = getc(fp); | ||
| 14278 | + ch_next = netsnmp_getc(fp); | ||
| 14279 | } | ||
| 14280 | } | ||
| 14281 | if (ch_next == EOF) | ||
| 14282 | @@ -4770,6 +4780,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14283 | return get_token(fp, token, maxtlen); | ||
| 14284 | } | ||
| 14285 | ungetc(ch_next, fp); | ||
| 14286 | + /* fallthrough */ | ||
| 14287 | default: | ||
| 14288 | /* | ||
| 14289 | * Accumulate characters until end of token is found. Then attempt to | ||
| 14290 | @@ -4780,7 +4791,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14291 | return LABEL; | ||
| 14292 | hash += tolower(ch); | ||
| 14293 | more: | ||
| 14294 | - while (is_labelchar(ch_next = getc(fp))) { | ||
| 14295 | + while (is_labelchar(ch_next = netsnmp_getc(fp))) { | ||
| 14296 | hash += tolower(ch_next); | ||
| 14297 | if (cp - token < maxtlen - 1) | ||
| 14298 | *cp++ = ch_next; | ||
| 14299 | @@ -4799,7 +4810,7 @@ get_token(FILE * fp, char *token, int maxtlen) | ||
| 14300 | if (tp) { | ||
| 14301 | if (tp->token != CONTINUE) | ||
| 14302 | return (tp->token); | ||
| 14303 | - while (isspace((ch_next = getc(fp)))) | ||
| 14304 | + while (isspace((ch_next = netsnmp_getc(fp)))) | ||
| 14305 | if (ch_next == '\n') | ||
| 14306 | mibLine++; | ||
| 14307 | if (ch_next == EOF) | ||
| 14308 | @@ -4846,7 +4857,10 @@ add_mibfile(const char* tmpstr, const char* d_name, FILE *ip ) | ||
| 14309 | tmpstr)); | ||
| 14310 | mibLine = 1; | ||
| 14311 | File = tmpstr; | ||
| 14312 | - get_token(fp, token, MAXTOKEN); | ||
| 14313 | + if (get_token(fp, token, MAXTOKEN) != LABEL) { | ||
| 14314 | + fclose(fp); | ||
| 14315 | + return 1; | ||
| 14316 | + } | ||
| 14317 | /* | ||
| 14318 | * simple test for this being a MIB | ||
| 14319 | */ | ||
| 14320 | @@ -4984,7 +4998,11 @@ read_mib(const char *filename) | ||
| 14321 | mibLine = 1; | ||
| 14322 | File = filename; | ||
| 14323 | DEBUGMSGTL(("parse-mibs", "Parsing file: %s...\n", filename)); | ||
| 14324 | - get_token(fp, token, MAXTOKEN); | ||
| 14325 | + if (get_token(fp, token, MAXTOKEN) != LABEL) { | ||
| 14326 | + snmp_log(LOG_ERR, "Failed to parse MIB file %s\n", filename); | ||
| 14327 | + fclose(fp); | ||
| 14328 | + return NULL; | ||
| 14329 | + } | ||
| 14330 | fclose(fp); | ||
| 14331 | new_module(token, filename); | ||
| 14332 | (void) netsnmp_read_module(token); | ||
| 14333 | @@ -5055,7 +5073,7 @@ parseQuoteString(FILE * fp, char *token, int maxtlen) | ||
| 14334 | int too_long = 0; | ||
| 14335 | char *token_start = token; | ||
| 14336 | |||
| 14337 | - for (ch = getc(fp); ch != EOF; ch = getc(fp)) { | ||
| 14338 | + for (ch = netsnmp_getc(fp); ch != EOF; ch = netsnmp_getc(fp)) { | ||
| 14339 | if (ch == '\r') | ||
| 14340 | continue; | ||
| 14341 | if (ch == '\n') { | ||
| 14342 | diff --git a/snmplib/read_config.c b/snmplib/read_config.c | ||
| 14343 | index 5c5268b..2443230 100644 | ||
| 14344 | --- a/snmplib/read_config.c | ||
| 14345 | +++ b/snmplib/read_config.c | ||
| 14346 | @@ -180,8 +180,8 @@ internal_register_config_handler(const char *type_param, | ||
| 14347 | struct config_line *ltmp2 = NULL; | ||
| 14348 | char buf[STRINGMAX]; | ||
| 14349 | char *cptr = buf; | ||
| 14350 | - strncpy(buf, type, STRINGMAX - 1); | ||
| 14351 | - buf[STRINGMAX - 1] = '\0'; | ||
| 14352 | + | ||
| 14353 | + strlcpy(buf, type, STRINGMAX); | ||
| 14354 | while (cptr) { | ||
| 14355 | char* c = cptr; | ||
| 14356 | cptr = strchr(cptr, ':'); | ||
| 14357 | @@ -366,8 +366,8 @@ unregister_config_handler(const char *type_param, const char *token) | ||
| 14358 | if (strchr(type, ':')) { | ||
| 14359 | char buf[STRINGMAX]; | ||
| 14360 | char *cptr = buf; | ||
| 14361 | - strncpy(buf, type, STRINGMAX - 1); | ||
| 14362 | - buf[STRINGMAX - 1] = '\0'; | ||
| 14363 | + | ||
| 14364 | + strlcpy(buf, type, STRINGMAX); | ||
| 14365 | while (cptr) { | ||
| 14366 | char* c = cptr; | ||
| 14367 | cptr = strchr(cptr, ':'); | ||
| 14368 | @@ -582,10 +582,13 @@ snmp_config_when(char *line, int when) | ||
| 14369 | return SNMPERR_GENERR; | ||
| 14370 | } | ||
| 14371 | |||
| 14372 | - strncpy(buf, line, STRINGMAX); | ||
| 14373 | - buf[STRINGMAX - 1] = '\0'; | ||
| 14374 | + strlcpy(buf, line, STRINGMAX); | ||
| 14375 | cptr = strtok_r(buf, SNMP_CONFIG_DELIMETERS, &st); | ||
| 14376 | - if (cptr && cptr[0] == '[') { | ||
| 14377 | + if (!cptr) { | ||
| 14378 | + netsnmp_config_warn("Wrong format: %s", line); | ||
| 14379 | + return SNMPERR_GENERR; | ||
| 14380 | + } | ||
| 14381 | + if (cptr[0] == '[') { | ||
| 14382 | if (cptr[strlen(cptr) - 1] != ']') { | ||
| 14383 | netsnmp_config_error("no matching ']' for type %s.", cptr + 1); | ||
| 14384 | return SNMPERR_GENERR; | ||
| 14385 | @@ -887,15 +890,15 @@ read_config(const char *filename, | ||
| 14386 | continue; | ||
| 14387 | } | ||
| 14388 | if ( cptr[0] == '/' ) { | ||
| 14389 | - strncpy(fname, cptr, SNMP_MAXPATH); | ||
| 14390 | - fname[SNMP_MAXPATH-1]='\0'; | ||
| 14391 | + strlcpy(fname, cptr, SNMP_MAXPATH); | ||
| 14392 | } else { | ||
| 14393 | - strncpy(fname, filename, SNMP_MAXPATH); | ||
| 14394 | - fname[SNMP_MAXPATH-1]='\0'; | ||
| 14395 | + strlcpy(fname, filename, SNMP_MAXPATH); | ||
| 14396 | cp = strrchr(fname, '/'); | ||
| 14397 | - *(++cp) = '\0'; | ||
| 14398 | - strncat(fname, cptr, SNMP_MAXPATH-strlen(fname)); | ||
| 14399 | - fname[SNMP_MAXPATH-1]='\0'; | ||
| 14400 | + if (!cp) | ||
| 14401 | + fname[0] = '\0'; | ||
| 14402 | + else | ||
| 14403 | + *(++cp) = '\0'; | ||
| 14404 | + strlcat(fname, cptr, SNMP_MAXPATH); | ||
| 14405 | } | ||
| 14406 | prev_filename = curfilename; | ||
| 14407 | prev_linecount = linecount; | ||
| 14408 | @@ -2320,210 +2323,3 @@ read_config_store_data_prefix(char prefix, int type, char *storeto, | ||
| 14409 | } | ||
| 14410 | |||
| 14411 | /** @} */ | ||
| 14412 | - | ||
| 14413 | -#ifdef READ_CONFIG_UNIT_TEST | ||
| 14414 | - | ||
| 14415 | -#define NETSNMP_USE_ASSERT 1 | ||
| 14416 | -#include <net-snmp/libary/snmp_assert.h> | ||
| 14417 | - | ||
| 14418 | -int | ||
| 14419 | -read64(U64 * i64, const char *str) | ||
| 14420 | -{ | ||
| 14421 | - netsnmp_assert(0); | ||
| 14422 | -} | ||
| 14423 | - | ||
| 14424 | -int | ||
| 14425 | -snmp_get_do_debugging(void) | ||
| 14426 | -{ | ||
| 14427 | - return 0; | ||
| 14428 | -} | ||
| 14429 | - | ||
| 14430 | -int | ||
| 14431 | -debug_is_token_registered(const char *token) | ||
| 14432 | -{ | ||
| 14433 | - netsnmp_assert(0); | ||
| 14434 | -} | ||
| 14435 | - | ||
| 14436 | -void | ||
| 14437 | -debugmsg(const char *token, const char *format, ...) | ||
| 14438 | -{ | ||
| 14439 | - netsnmp_assert(0); | ||
| 14440 | -} | ||
| 14441 | - | ||
| 14442 | -void | ||
| 14443 | -debugmsgtoken(const char *token, const char *format, ...) | ||
| 14444 | -{ | ||
| 14445 | - netsnmp_assert(0); | ||
| 14446 | -} | ||
| 14447 | - | ||
| 14448 | -int | ||
| 14449 | -snmp_log(int priority, const char *format, ...) | ||
| 14450 | -{ | ||
| 14451 | -#if 0 | ||
| 14452 | - va_list ap; | ||
| 14453 | - | ||
| 14454 | - va_start(ap, format); | ||
| 14455 | - vprintf(format, ap); | ||
| 14456 | - va_end(ap); | ||
| 14457 | -#endif | ||
| 14458 | - return 0; | ||
| 14459 | -} | ||
| 14460 | - | ||
| 14461 | -void | ||
| 14462 | -snmp_log_perror(const char *s) | ||
| 14463 | -{ | ||
| 14464 | - netsnmp_assert(0); | ||
| 14465 | -} | ||
| 14466 | - | ||
| 14467 | -int | ||
| 14468 | -snmp_vlog(int priority, const char *format, va_list ap) | ||
| 14469 | -{ | ||
| 14470 | - netsnmp_assert(0); | ||
| 14471 | -} | ||
| 14472 | - | ||
| 14473 | -int | ||
| 14474 | -netsnmp_ds_set_boolean(int storeid, int which, int value) | ||
| 14475 | -{ | ||
| 14476 | - netsnmp_assert(0); | ||
| 14477 | -} | ||
| 14478 | - | ||
| 14479 | -int | ||
| 14480 | -netsnmp_ds_get_boolean(int storeid, int which) | ||
| 14481 | -{ | ||
| 14482 | - netsnmp_assert(0); | ||
| 14483 | -} | ||
| 14484 | - | ||
| 14485 | -int | ||
| 14486 | -netsnmp_ds_set_string(int storeid, int which, const char *value) | ||
| 14487 | -{ | ||
| 14488 | - netsnmp_assert(0); | ||
| 14489 | -} | ||
| 14490 | - | ||
| 14491 | -char * | ||
| 14492 | -netsnmp_ds_get_string(int storeid, int which) | ||
| 14493 | -{ | ||
| 14494 | - netsnmp_assert(0); | ||
| 14495 | -} | ||
| 14496 | - | ||
| 14497 | -char * | ||
| 14498 | -netsnmp_getenv(const char *name) | ||
| 14499 | -{ | ||
| 14500 | - netsnmp_assert(0); | ||
| 14501 | -} | ||
| 14502 | - | ||
| 14503 | -int | ||
| 14504 | -snmp_call_callbacks(int major, int minor, void *caller_arg) | ||
| 14505 | -{ | ||
| 14506 | - netsnmp_assert(0); | ||
| 14507 | -} | ||
| 14508 | - | ||
| 14509 | -int | ||
| 14510 | -mkdirhier(const char *pathname, mode_t mode, int skiplast) | ||
| 14511 | -{ | ||
| 14512 | - netsnmp_assert(0); | ||
| 14513 | -} | ||
| 14514 | - | ||
| 14515 | -int | ||
| 14516 | -read_objid(const char *input, oid * output, size_t * out_len) | ||
| 14517 | -{ | ||
| 14518 | - netsnmp_assert(0); | ||
| 14519 | -} | ||
| 14520 | - | ||
| 14521 | -struct read_config_testcase { | ||
| 14522 | - /* | ||
| 14523 | - * inputs | ||
| 14524 | - */ | ||
| 14525 | - const char *(*pf) (const char * readfrom, u_char ** str, | ||
| 14526 | - size_t * len); | ||
| 14527 | - const char *readfrom; | ||
| 14528 | - size_t obuf_len; | ||
| 14529 | - | ||
| 14530 | - /* | ||
| 14531 | - * expected outputs | ||
| 14532 | - */ | ||
| 14533 | - size_t expected_offset; | ||
| 14534 | - const u_char *expected_output; | ||
| 14535 | - size_t expected_len; | ||
| 14536 | -}; | ||
| 14537 | - | ||
| 14538 | -static const u_char obuf1[] = { 1, 0, 2 }; | ||
| 14539 | -static const u_char obuf2[] = { 'a', 'b', 'c', 0 }; | ||
| 14540 | -static const u_char obuf3[] = { 1, 3, 2 }; | ||
| 14541 | - | ||
| 14542 | -static const struct read_config_testcase test_input[] = { | ||
| 14543 | - { &read_config_read_octet_string_const, "", 1, -1, NULL, 0 }, | ||
| 14544 | - { &read_config_read_octet_string_const, "0x0", 1, -1, NULL, 1 }, | ||
| 14545 | - { &read_config_read_octet_string_const, "0x0 0", 1, -1, NULL, 1 }, | ||
| 14546 | - | ||
| 14547 | - { &read_config_read_octet_string_const, "0x010002", 1, -1, NULL, 0 }, | ||
| 14548 | - { &read_config_read_octet_string_const, "0x010002", 2, -1, NULL, 0 }, | ||
| 14549 | - { &read_config_read_octet_string_const, "0x010002", 3, -1, obuf1, 0 }, | ||
| 14550 | - { &read_config_read_octet_string_const, "0x010002", 4, -1, obuf1, 3 }, | ||
| 14551 | - { &read_config_read_octet_string_const, "0x010002 0", 4, 9, obuf1, 3 }, | ||
| 14552 | - { &read_config_read_octet_string_const, "0x010002", 0, -1, obuf1, 3 }, | ||
| 14553 | - | ||
| 14554 | - { &read_config_read_octet_string_const, "abc", 1, -1, NULL, 0 }, | ||
| 14555 | - { &read_config_read_octet_string_const, "abc z", 1, 4, NULL, 0 }, | ||
| 14556 | - { &read_config_read_octet_string_const, "abc", 2, -1, NULL, 1 }, | ||
| 14557 | - { &read_config_read_octet_string_const, "abc", 3, -1, obuf2, 2 }, | ||
| 14558 | - { &read_config_read_octet_string_const, "abc", 4, -1, obuf2, 3 }, | ||
| 14559 | - { &read_config_read_octet_string_const, "abc z", 4, 4, obuf2, 3 }, | ||
| 14560 | - { &read_config_read_octet_string_const, "abc", 0, -1, obuf2, 3 }, | ||
| 14561 | -}; | ||
| 14562 | - | ||
| 14563 | -int | ||
| 14564 | -main(int argc, char **argv) | ||
| 14565 | -{ | ||
| 14566 | - int failure_count = 0; | ||
| 14567 | - unsigned int i, j; | ||
| 14568 | - | ||
| 14569 | - printf("Start of unit test.\n"); | ||
| 14570 | - for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { | ||
| 14571 | - const struct read_config_testcase *const p = &test_input[i]; | ||
| 14572 | - size_t len = p->obuf_len; | ||
| 14573 | - u_char *str = len > 0 ? malloc(len) : NULL; | ||
| 14574 | - const char *result; | ||
| 14575 | - size_t offset; | ||
| 14576 | - | ||
| 14577 | - printf("Test %d ...\n", i); | ||
| 14578 | - fflush(stdout); | ||
| 14579 | - result = (p->pf) (p->readfrom, &str, &len); | ||
| 14580 | - offset = result ? result - p->readfrom : -1; | ||
| 14581 | - if (offset != p->expected_offset) { | ||
| 14582 | - failure_count++; | ||
| 14583 | - printf("test %d: expected offset %zd, got offset %" NETSNMP_PRIz "d\n", | ||
| 14584 | - i, p->expected_offset, offset); | ||
| 14585 | - } else if (len != p->expected_len) { | ||
| 14586 | - failure_count++; | ||
| 14587 | - printf("test %d: expected length %d, got length %d\n", | ||
| 14588 | - i, p->expected_len, len); | ||
| 14589 | - } else if (len >= 0 && p->expected_output | ||
| 14590 | - && memcmp(str, p->expected_output, len) != 0 | ||
| 14591 | - && p->expected_output[len] == 0) { | ||
| 14592 | - failure_count++; | ||
| 14593 | - printf("test %d: output buffer mismatch\n", i); | ||
| 14594 | - printf("Expected: "); | ||
| 14595 | - for (j = 0; j < p->expected_len; ++j) | ||
| 14596 | - printf("%02x ", p->expected_output[j]); | ||
| 14597 | - printf("\nActual: "); | ||
| 14598 | - for (j = 0; j < len; ++j) | ||
| 14599 | - printf("%02x ", str[j]); | ||
| 14600 | - printf("\n"); | ||
| 14601 | - } | ||
| 14602 | - | ||
| 14603 | - if (str) | ||
| 14604 | - free(str); | ||
| 14605 | - } | ||
| 14606 | - if (failure_count == 0) | ||
| 14607 | - printf("All %d tests passed.\n", i); | ||
| 14608 | - return 0; | ||
| 14609 | -} | ||
| 14610 | -#endif /* READ_CONFIG_UNIT_TEST */ | ||
| 14611 | - | ||
| 14612 | -/* | ||
| 14613 | - * Local variables: | ||
| 14614 | - * c-basic-offset: 4 | ||
| 14615 | - * indent-tabs-mode: nil | ||
| 14616 | - * 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" | ||
| 14617 | - * End: | ||
| 14618 | - */ | ||
| 14619 | diff --git a/snmplib/scapi.c b/snmplib/scapi.c | ||
| 14620 | index a397344..fdd33ff 100644 | ||
| 14621 | --- a/snmplib/scapi.c | ||
| 14622 | +++ b/snmplib/scapi.c | ||
| 14623 | @@ -116,12 +116,12 @@ netsnmp_feature_child_of(usm_scapi, usm_support) | ||
| 14624 | |||
| 14625 | #ifdef NETSNMP_USE_INTERNAL_CRYPTO | ||
| 14626 | static | ||
| 14627 | -int SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14628 | - u_char * secret, size_t secretlen); | ||
| 14629 | +int SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14630 | + const u_char * secret, size_t secretlen); | ||
| 14631 | |||
| 14632 | static | ||
| 14633 | -int MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14634 | - u_char * secret, size_t secretlen); | ||
| 14635 | +int MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14636 | + const u_char * secret, size_t secretlen); | ||
| 14637 | #endif | ||
| 14638 | |||
| 14639 | /* | ||
| 14640 | @@ -454,7 +454,7 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf, | ||
| 14641 | |||
| 14642 | #ifdef NETSNMP_USE_OPENSSL | ||
| 14643 | const EVP_MD *hashfn; | ||
| 14644 | - EVP_MD_CTX ctx, *cptr; | ||
| 14645 | + EVP_MD_CTX *cptr; | ||
| 14646 | #endif | ||
| 14647 | #ifdef NETSNMP_USE_INTERNAL_CRYPTO | ||
| 14648 | MD5_CTX cmd5; | ||
| 14649 | @@ -485,42 +485,32 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf, | ||
| 14650 | } | ||
| 14651 | |||
| 14652 | /** initialize the pointer */ | ||
| 14653 | - memset(&ctx, 0, sizeof(ctx)); | ||
| 14654 | - cptr = &ctx; | ||
| 14655 | +#ifdef HAVE_EVP_MD_CTX_CREATE | ||
| 14656 | + cptr = EVP_MD_CTX_create(); | ||
| 14657 | +#else | ||
| 14658 | + cptr = malloc(sizeof(*cptr)); | ||
| 14659 | #if defined(OLD_DES) | ||
| 14660 | - EVP_DigestInit(cptr, hashfn); | ||
| 14661 | -#else /* !OLD_DES */ | ||
| 14662 | - /* this is needed if the runtime library is different than the compiled | ||
| 14663 | - library since the openssl versions are very different. */ | ||
| 14664 | - if (SSLeay() < 0x907000) { | ||
| 14665 | - /* the old version of the struct was bigger and thus more | ||
| 14666 | - memory is needed. should be 152, but we use 256 for safety. */ | ||
| 14667 | - cptr = (EVP_MD_CTX *)malloc(256); | ||
| 14668 | - EVP_DigestInit(cptr, hashfn); | ||
| 14669 | - } else { | ||
| 14670 | - EVP_MD_CTX_init(cptr); | ||
| 14671 | - EVP_DigestInit(cptr, hashfn); | ||
| 14672 | - } | ||
| 14673 | + memset(cptr, 0, sizeof(*cptr)); | ||
| 14674 | +#else | ||
| 14675 | + EVP_MD_CTX_init(cptr); | ||
| 14676 | +#endif | ||
| 14677 | #endif | ||
| 14678 | + EVP_DigestInit(cptr, hashfn); | ||
| 14679 | |||
| 14680 | /** pass the data */ | ||
| 14681 | EVP_DigestUpdate(cptr, buf, buf_len); | ||
| 14682 | |||
| 14683 | /** do the final pass */ | ||
| 14684 | -#if defined(OLD_DES) | ||
| 14685 | EVP_DigestFinal(cptr, MAC, &tmp_len); | ||
| 14686 | *MAC_len = tmp_len; | ||
| 14687 | -#else /* !OLD_DES */ | ||
| 14688 | - if (SSLeay() < 0x907000) { | ||
| 14689 | - EVP_DigestFinal(cptr, MAC, &tmp_len); | ||
| 14690 | - *MAC_len = tmp_len; | ||
| 14691 | - free(cptr); | ||
| 14692 | - } else { | ||
| 14693 | - EVP_DigestFinal_ex(cptr, MAC, &tmp_len); | ||
| 14694 | - *MAC_len = tmp_len; | ||
| 14695 | - EVP_MD_CTX_cleanup(cptr); | ||
| 14696 | - } | ||
| 14697 | -#endif /* OLD_DES */ | ||
| 14698 | +#ifdef HAVE_EVP_MD_CTX_DESTROY | ||
| 14699 | + EVP_MD_CTX_destroy(cptr); | ||
| 14700 | +#else | ||
| 14701 | +#if !defined(OLD_DES) | ||
| 14702 | + EVP_MD_CTX_cleanup(cptr); | ||
| 14703 | +#endif | ||
| 14704 | + free(cptr); | ||
| 14705 | +#endif | ||
| 14706 | return (rval); | ||
| 14707 | |||
| 14708 | #elif NETSNMP_USE_INTERNAL_CRYPTO | ||
| 14709 | @@ -1171,8 +1161,8 @@ sc_decrypt(const oid * privtype, size_t privtypelen, | ||
| 14710 | * of data, and prepended with a secret in the standard fashion | ||
| 14711 | */ | ||
| 14712 | static int | ||
| 14713 | -MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14714 | - u_char * secret, size_t secretlen) | ||
| 14715 | +MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14716 | + const u_char * secret, size_t secretlen) | ||
| 14717 | { | ||
| 14718 | #define MD5_HASHKEYLEN 64 | ||
| 14719 | #define MD5_SECRETKEYLEN 16 | ||
| 14720 | @@ -1183,7 +1173,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14721 | u_char extendedAuthKey[MD5_HASHKEYLEN]; | ||
| 14722 | u_char buf[MD5_HASHKEYLEN]; | ||
| 14723 | size_t i; | ||
| 14724 | - u_char *cp, *newdata = NULL; | ||
| 14725 | + const u_char *cp; | ||
| 14726 | + u_char *newdata = NULL; | ||
| 14727 | int rc = 0; | ||
| 14728 | |||
| 14729 | /* | ||
| 14730 | @@ -1268,8 +1259,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14731 | } | ||
| 14732 | |||
| 14733 | static int | ||
| 14734 | -SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14735 | - u_char * secret, size_t secretlen) | ||
| 14736 | +SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14737 | + const u_char * secret, size_t secretlen) | ||
| 14738 | { | ||
| 14739 | #define SHA1_HASHKEYLEN 64 | ||
| 14740 | #define SHA1_SECRETKEYLEN 20 | ||
| 14741 | @@ -1280,7 +1271,8 @@ SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen, | ||
| 14742 | u_char extendedAuthKey[SHA1_HASHKEYLEN]; | ||
| 14743 | u_char buf[SHA1_HASHKEYLEN]; | ||
| 14744 | size_t i; | ||
| 14745 | - u_char *cp, *newdata = NULL; | ||
| 14746 | + const u_char *cp; | ||
| 14747 | + u_char *newdata = NULL; | ||
| 14748 | int rc = 0; | ||
| 14749 | |||
| 14750 | /* | ||
| 14751 | diff --git a/snmplib/snmp-tc.c b/snmplib/snmp-tc.c | ||
| 14752 | index 3b73da2..891c3a0 100644 | ||
| 14753 | --- a/snmplib/snmp-tc.c | ||
| 14754 | +++ b/snmplib/snmp-tc.c | ||
| 14755 | @@ -163,7 +163,7 @@ date_n_time(const time_t * when, size_t * length) | ||
| 14756 | string[7] = 0; | ||
| 14757 | *length = 8; | ||
| 14758 | |||
| 14759 | -#ifndef cygwin | ||
| 14760 | +#if defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_TIMEZONE_VARIABLE) | ||
| 14761 | /* | ||
| 14762 | * Timezone offset | ||
| 14763 | */ | ||
| 14764 | diff --git a/snmplib/snmp_alarm.c b/snmplib/snmp_alarm.c | ||
| 14765 | index adfa93d..dc498cc 100644 | ||
| 14766 | --- a/snmplib/snmp_alarm.c | ||
| 14767 | +++ b/snmplib/snmp_alarm.c | ||
| 14768 | @@ -82,23 +82,22 @@ init_snmp_alarm(void) | ||
| 14769 | void | ||
| 14770 | sa_update_entry(struct snmp_alarm *a) | ||
| 14771 | { | ||
| 14772 | - if (a->t_last.tv_sec == 0 && a->t_last.tv_usec == 0) { | ||
| 14773 | + if (!timerisset(&a->t_last)) { | ||
| 14774 | struct timeval t_now; | ||
| 14775 | /* | ||
| 14776 | * Never been called yet, call time `t' from now. | ||
| 14777 | */ | ||
| 14778 | gettimeofday(&t_now, NULL); | ||
| 14779 | |||
| 14780 | - a->t_last.tv_sec = t_now.tv_sec; | ||
| 14781 | - a->t_last.tv_usec = t_now.tv_usec; | ||
| 14782 | + a->t_last = t_now; | ||
| 14783 | |||
| 14784 | NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next); | ||
| 14785 | - } else if (a->t_next.tv_sec == 0 && a->t_next.tv_usec == 0) { | ||
| 14786 | + } else if (!timerisset(&a->t_next)) { | ||
| 14787 | /* | ||
| 14788 | * We've been called but not reset for the next call. | ||
| 14789 | */ | ||
| 14790 | if (a->flags & SA_REPEAT) { | ||
| 14791 | - if (a->t.tv_sec == 0 && a->t.tv_usec == 0) { | ||
| 14792 | + if (!timerisset(&a->t)) { | ||
| 14793 | DEBUGMSGTL(("snmp_alarm", | ||
| 14794 | "update_entry: illegal interval specified\n")); | ||
| 14795 | snmp_alarm_unregister(a->clientreg); | ||
| 14796 | @@ -144,7 +143,7 @@ snmp_alarm_unregister(unsigned int clientreg) | ||
| 14797 | DEBUGMSGTL(("snmp_alarm", "unregistered alarm %d\n", | ||
| 14798 | sa_ptr->clientreg)); | ||
| 14799 | /* | ||
| 14800 | - * Note: do not free the clientarg, its the clients responsibility | ||
| 14801 | + * Note: do not free the clientarg, it's the client's responsibility | ||
| 14802 | */ | ||
| 14803 | free(sa_ptr); | ||
| 14804 | } else { | ||
| 14805 | @@ -185,22 +184,13 @@ sa_find_next(void) | ||
| 14806 | for (a = thealarms; a != NULL; a = a->next) { | ||
| 14807 | if (!(a->flags & SA_FIRED)) { | ||
| 14808 | /* check for time delta skew */ | ||
| 14809 | - if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec) | ||
| 14810 | - { | ||
| 14811 | + if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec) { | ||
| 14812 | DEBUGMSGTL(("time_skew", "Time delta too big (%ld seconds), should be %ld seconds - fixing\n", | ||
| 14813 | (long)(a->t_next.tv_sec - t_now.tv_sec), (long)a->t.tv_sec)); | ||
| 14814 | - a->t_next.tv_sec = t_now.tv_sec + a->t.tv_sec; | ||
| 14815 | - a->t_next.tv_usec = t_now.tv_usec + a->t.tv_usec; | ||
| 14816 | - } | ||
| 14817 | - if (lowest == NULL) { | ||
| 14818 | - lowest = a; | ||
| 14819 | - } else if (a->t_next.tv_sec == lowest->t_next.tv_sec) { | ||
| 14820 | - if (a->t_next.tv_usec < lowest->t_next.tv_usec) { | ||
| 14821 | - lowest = a; | ||
| 14822 | - } | ||
| 14823 | - } else if (a->t_next.tv_sec < lowest->t_next.tv_sec) { | ||
| 14824 | - lowest = a; | ||
| 14825 | - } | ||
| 14826 | + NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next); | ||
| 14827 | + } | ||
| 14828 | + if (lowest == NULL || timercmp(&a->t_next, &lowest->t_next, <)) | ||
| 14829 | + lowest = a; | ||
| 14830 | } | ||
| 14831 | } | ||
| 14832 | return lowest; | ||
| 14833 | @@ -247,10 +237,8 @@ run_alarms(void) | ||
| 14834 | DEBUGMSGTL(("snmp_alarm", "alarm %d completed\n", clientreg)); | ||
| 14835 | |||
| 14836 | if ((a = sa_find_specific(clientreg)) != NULL) { | ||
| 14837 | - a->t_last.tv_sec = t_now.tv_sec; | ||
| 14838 | - a->t_last.tv_usec = t_now.tv_usec; | ||
| 14839 | - a->t_next.tv_sec = 0; | ||
| 14840 | - a->t_next.tv_usec = 0; | ||
| 14841 | + a->t_last = t_now; | ||
| 14842 | + timerclear(&a->t_next); | ||
| 14843 | a->flags &= ~SA_FIRED; | ||
| 14844 | sa_update_entry(a); | ||
| 14845 | } else { | ||
| 14846 | @@ -274,39 +262,56 @@ alarm_handler(int a) | ||
| 14847 | |||
| 14848 | |||
| 14849 | |||
| 14850 | +/** | ||
| 14851 | + * Look up the time at which the next alarm will fire. | ||
| 14852 | + * | ||
| 14853 | + * @param[out] alarm_tm Time at which the next alarm will fire. | ||
| 14854 | + * @param[in] now Earliest time that should be written into *alarm_tm. | ||
| 14855 | + * | ||
| 14856 | + * @return Zero if no alarms are scheduled; non-zero 'clientreg' value | ||
| 14857 | + * identifying the first alarm that will fire if one or more alarms are | ||
| 14858 | + * scheduled. | ||
| 14859 | + */ | ||
| 14860 | int | ||
| 14861 | -get_next_alarm_delay_time(struct timeval *delta) | ||
| 14862 | +netsnmp_get_next_alarm_time(struct timeval *alarm_tm, const struct timeval *now) | ||
| 14863 | { | ||
| 14864 | struct snmp_alarm *sa_ptr; | ||
| 14865 | - struct timeval t_now; | ||
| 14866 | |||
| 14867 | sa_ptr = sa_find_next(); | ||
| 14868 | |||
| 14869 | if (sa_ptr) { | ||
| 14870 | - gettimeofday(&t_now, NULL); | ||
| 14871 | - | ||
| 14872 | - if (timercmp(&t_now, &sa_ptr->t_next, >)) { | ||
| 14873 | - /* | ||
| 14874 | - * Time has already passed. Return the smallest possible amount of | ||
| 14875 | - * time. | ||
| 14876 | - */ | ||
| 14877 | - delta->tv_sec = 0; | ||
| 14878 | - delta->tv_usec = 1; | ||
| 14879 | - return sa_ptr->clientreg; | ||
| 14880 | - } else { | ||
| 14881 | - /* | ||
| 14882 | - * Time is still in the future. | ||
| 14883 | - */ | ||
| 14884 | - NETSNMP_TIMERSUB(&sa_ptr->t_next, &t_now, delta); | ||
| 14885 | - | ||
| 14886 | - return sa_ptr->clientreg; | ||
| 14887 | - } | ||
| 14888 | + netsnmp_assert(alarm_tm); | ||
| 14889 | + netsnmp_assert(timerisset(&sa_ptr->t_next)); | ||
| 14890 | + if (timercmp(&sa_ptr->t_next, now, >)) | ||
| 14891 | + *alarm_tm = sa_ptr->t_next; | ||
| 14892 | + else | ||
| 14893 | + *alarm_tm = *now; | ||
| 14894 | + return sa_ptr->clientreg; | ||
| 14895 | + } else { | ||
| 14896 | + return 0; | ||
| 14897 | } | ||
| 14898 | +} | ||
| 14899 | |||
| 14900 | - /* | ||
| 14901 | - * Nothing Left. | ||
| 14902 | - */ | ||
| 14903 | - return 0; | ||
| 14904 | +/** | ||
| 14905 | + * Get the time until the next alarm will fire. | ||
| 14906 | + * | ||
| 14907 | + * @param[out] delta Time until the next alarm. | ||
| 14908 | + * | ||
| 14909 | + * @return Zero if no alarms are scheduled; non-zero 'clientreg' value | ||
| 14910 | + * identifying the first alarm that will fire if one or more alarms are | ||
| 14911 | + * scheduled. | ||
| 14912 | + */ | ||
| 14913 | +int | ||
| 14914 | +get_next_alarm_delay_time(struct timeval *delta) | ||
| 14915 | +{ | ||
| 14916 | + struct timeval t_now, alarm_tm; | ||
| 14917 | + int res; | ||
| 14918 | + | ||
| 14919 | + gettimeofday(&t_now, NULL); | ||
| 14920 | + res = netsnmp_get_next_alarm_time(&alarm_tm, &t_now); | ||
| 14921 | + if (res) | ||
| 14922 | + NETSNMP_TIMERSUB(&alarm_tm, &t_now, delta); | ||
| 14923 | + return res; | ||
| 14924 | } | ||
| 14925 | |||
| 14926 | |||
| 14927 | @@ -328,10 +333,8 @@ set_an_alarm(void) | ||
| 14928 | # ifdef HAVE_SETITIMER | ||
| 14929 | struct itimerval it; | ||
| 14930 | |||
| 14931 | - it.it_value.tv_sec = delta.tv_sec; | ||
| 14932 | - it.it_value.tv_usec = delta.tv_usec; | ||
| 14933 | - it.it_interval.tv_sec = 0; | ||
| 14934 | - it.it_interval.tv_usec = 0; | ||
| 14935 | + it.it_value = delta; | ||
| 14936 | + timerclear(&it.it_interval); | ||
| 14937 | |||
| 14938 | signal(SIGALRM, alarm_handler); | ||
| 14939 | setitimer(ITIMER_REAL, &it, NULL); | ||
| 14940 | @@ -452,8 +455,7 @@ snmp_alarm_register_hr(struct timeval t, unsigned int flags, | ||
| 14941 | return 0; | ||
| 14942 | } | ||
| 14943 | |||
| 14944 | - (*s)->t.tv_sec = t.tv_sec; | ||
| 14945 | - (*s)->t.tv_usec = t.tv_usec; | ||
| 14946 | + (*s)->t = t; | ||
| 14947 | (*s)->flags = flags; | ||
| 14948 | (*s)->clientarg = cd; | ||
| 14949 | (*s)->thecallback = cb; | ||
| 14950 | diff --git a/snmplib/snmp_api.c b/snmplib/snmp_api.c | ||
| 14951 | index df0dc1c..4fca5bf 100644 | ||
| 14952 | --- a/snmplib/snmp_api.c | ||
| 14953 | +++ b/snmplib/snmp_api.c | ||
| 14954 | @@ -506,8 +506,7 @@ void | ||
| 14955 | snmp_set_detail(const char *detail_string) | ||
| 14956 | { | ||
| 14957 | if (detail_string != NULL) { | ||
| 14958 | - strncpy((char *) snmp_detail, detail_string, sizeof(snmp_detail)); | ||
| 14959 | - snmp_detail[sizeof(snmp_detail) - 1] = '\0'; | ||
| 14960 | + strlcpy((char *) snmp_detail, detail_string, sizeof(snmp_detail)); | ||
| 14961 | snmp_detail_f = 1; | ||
| 14962 | } | ||
| 14963 | } | ||
| 14964 | @@ -523,20 +522,22 @@ snmp_api_errstring(int snmp_errnumber) | ||
| 14965 | { | ||
| 14966 | const char *msg = ""; | ||
| 14967 | static char msg_buf[SPRINT_MAX_LEN]; | ||
| 14968 | + | ||
| 14969 | if (snmp_errnumber >= SNMPERR_MAX && snmp_errnumber <= SNMPERR_GENERR) { | ||
| 14970 | msg = api_errors[-snmp_errnumber]; | ||
| 14971 | } else if (snmp_errnumber != SNMPERR_SUCCESS) { | ||
| 14972 | msg = NULL; | ||
| 14973 | } | ||
| 14974 | - if (!msg) | ||
| 14975 | + if (!msg) { | ||
| 14976 | snprintf(msg_buf, sizeof(msg_buf), "Unknown error: %d", snmp_errnumber); | ||
| 14977 | - else if (snmp_detail_f) { | ||
| 14978 | + msg_buf[sizeof(msg_buf)-1] = '\0'; | ||
| 14979 | + } else if (snmp_detail_f) { | ||
| 14980 | snprintf(msg_buf, sizeof(msg_buf), "%s (%s)", msg, snmp_detail); | ||
| 14981 | + msg_buf[sizeof(msg_buf)-1] = '\0'; | ||
| 14982 | snmp_detail_f = 0; | ||
| 14983 | } else { | ||
| 14984 | - strncpy(msg_buf, msg, sizeof(msg_buf)); | ||
| 14985 | + strlcpy(msg_buf, msg, sizeof(msg_buf)); | ||
| 14986 | } | ||
| 14987 | - msg_buf[sizeof(msg_buf)-1] = '\0'; | ||
| 14988 | |||
| 14989 | return (msg_buf); | ||
| 14990 | } | ||
| 14991 | @@ -566,15 +567,17 @@ snmp_error(netsnmp_session * psess, | ||
| 14992 | if (snmp_detail_f) { | ||
| 14993 | snprintf(buf, sizeof(buf), "%s (%s)", api_errors[-snmp_errnumber], | ||
| 14994 | snmp_detail); | ||
| 14995 | + buf[sizeof(buf)-1] = '\0'; | ||
| 14996 | snmp_detail_f = 0; | ||
| 14997 | } | ||
| 14998 | else | ||
| 14999 | - strncpy(buf, api_errors[-snmp_errnumber], sizeof(buf)); | ||
| 15000 | + strlcpy(buf, api_errors[-snmp_errnumber], sizeof(buf)); | ||
| 15001 | } else { | ||
| 15002 | - if (snmp_errnumber) | ||
| 15003 | + if (snmp_errnumber) { | ||
| 15004 | snprintf(buf, sizeof(buf), "Unknown Error %d", snmp_errnumber); | ||
| 15005 | + buf[sizeof(buf)-1] = '\0'; | ||
| 15006 | + } | ||
| 15007 | } | ||
| 15008 | - buf[sizeof(buf)-1] = '\0'; | ||
| 15009 | |||
| 15010 | /* | ||
| 15011 | * append a useful system errno interpretation. | ||
| 15012 | @@ -704,6 +707,8 @@ _init_snmp(void) | ||
| 15013 | |||
| 15014 | netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, | ||
| 15015 | NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH, 16); | ||
| 15016 | + netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RETRIES, | ||
| 15017 | + DEFAULT_RETRIES); | ||
| 15018 | |||
| 15019 | #ifdef NETSNMP_USE_REVERSE_ASNENCODING | ||
| 15020 | netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, | ||
| 15021 | @@ -1280,6 +1285,7 @@ snmpv3_probe_contextEngineID_rfc5343(void *slp, netsnmp_session *session) { | ||
| 15022 | if (memdup(&pdu->contextEngineID, probeEngineID, probeEngineID_len) != | ||
| 15023 | SNMPERR_SUCCESS) { | ||
| 15024 | snmp_log(LOG_ERR, "failed to clone memory for rfc5343 probe\n"); | ||
| 15025 | + snmp_free_pdu(pdu); | ||
| 15026 | return SNMP_ERR_GENERR; | ||
| 15027 | } | ||
| 15028 | pdu->contextEngineIDLen = probeEngineID_len; | ||
| 15029 | @@ -1390,7 +1396,7 @@ snmpv3_engineID_probe(struct session_list *slp, | ||
| 15030 | } | ||
| 15031 | |||
| 15032 | /* see if there was any hooks to call after the engineID probing */ | ||
| 15033 | - if (sptr->post_probe_engineid) { | ||
| 15034 | + if (sptr && sptr->post_probe_engineid) { | ||
| 15035 | status = (*sptr->post_probe_engineid)(slp, in_session); | ||
| 15036 | if (status != SNMPERR_SUCCESS) | ||
| 15037 | return 0; | ||
| 15038 | @@ -5341,8 +5347,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp, | ||
| 15039 | if (sp->securityEngineID == NULL) { | ||
| 15040 | /* | ||
| 15041 | * TODO FIX: recover after message callback *? | ||
| 15042 | - * return -1; | ||
| 15043 | - */ | ||
| 15044 | + */ | ||
| 15045 | + return -1; | ||
| 15046 | } | ||
| 15047 | memcpy(sp->securityEngineID, pdu->securityEngineID, | ||
| 15048 | pdu->securityEngineIDLen); | ||
| 15049 | @@ -5354,8 +5360,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp, | ||
| 15050 | if (sp->contextEngineID == NULL) { | ||
| 15051 | /* | ||
| 15052 | * TODO FIX: recover after message callback *? | ||
| 15053 | - * return -1; | ||
| 15054 | */ | ||
| 15055 | + return -1; | ||
| 15056 | } | ||
| 15057 | memcpy(sp->contextEngineID, | ||
| 15058 | pdu->securityEngineID, | ||
| 15059 | @@ -5868,7 +5874,7 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset) | ||
| 15060 | } | ||
| 15061 | |||
| 15062 | |||
| 15063 | -/* | ||
| 15064 | +/** | ||
| 15065 | * Returns info about what snmp requires from a select statement. | ||
| 15066 | * numfds is the number of fds in the list that are significant. | ||
| 15067 | * All file descriptors opened for SNMP are OR'd into the fdset. | ||
| 15068 | @@ -5889,54 +5895,43 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset) | ||
| 15069 | * | ||
| 15070 | * snmp_select_info returns the number of open sockets. (i.e. The number of | ||
| 15071 | * sessions open) | ||
| 15072 | + * | ||
| 15073 | + * @see See also snmp_sess_select_info2_flags(). | ||
| 15074 | */ | ||
| 15075 | - | ||
| 15076 | int | ||
| 15077 | -snmp_select_info(int *numfds, | ||
| 15078 | - fd_set * fdset, struct timeval *timeout, int *block) | ||
| 15079 | - /* | ||
| 15080 | - * input: set to 1 if input timeout value is undefined | ||
| 15081 | - * set to 0 if input timeout value is defined | ||
| 15082 | - * output: set to 1 if output timeout value is undefined | ||
| 15083 | - * set to 0 if output rimeout vlaue id defined | ||
| 15084 | - */ | ||
| 15085 | +snmp_select_info(int *numfds, fd_set *fdset, struct timeval *timeout, | ||
| 15086 | + int *block) | ||
| 15087 | { | ||
| 15088 | - return snmp_sess_select_info((void *) 0, numfds, fdset, timeout, | ||
| 15089 | - block); | ||
| 15090 | + return snmp_sess_select_info(NULL, numfds, fdset, timeout, block); | ||
| 15091 | } | ||
| 15092 | |||
| 15093 | +/** | ||
| 15094 | + * @see See also snmp_sess_select_info2_flags(). | ||
| 15095 | + */ | ||
| 15096 | int | ||
| 15097 | -snmp_select_info2(int *numfds, | ||
| 15098 | - netsnmp_large_fd_set * fdset, | ||
| 15099 | +snmp_select_info2(int *numfds, netsnmp_large_fd_set *fdset, | ||
| 15100 | struct timeval *timeout, int *block) | ||
| 15101 | - /* | ||
| 15102 | - * input: set to 1 if input timeout value is undefined | ||
| 15103 | - * set to 0 if input timeout value is defined | ||
| 15104 | - * output: set to 1 if output timeout value is undefined | ||
| 15105 | - * set to 0 if output rimeout vlaue id defined | ||
| 15106 | - */ | ||
| 15107 | { | ||
| 15108 | - return snmp_sess_select_info2((void *) 0, numfds, fdset, timeout, | ||
| 15109 | - block); | ||
| 15110 | + return snmp_sess_select_info2(NULL, numfds, fdset, timeout, block); | ||
| 15111 | } | ||
| 15112 | |||
| 15113 | -/* | ||
| 15114 | - * Same as snmp_select_info, but works just one session. | ||
| 15115 | +/** | ||
| 15116 | + * @see See also snmp_sess_select_info2_flags(). | ||
| 15117 | */ | ||
| 15118 | int | ||
| 15119 | -snmp_sess_select_info(void *sessp, | ||
| 15120 | - int *numfds, | ||
| 15121 | - fd_set * fdset, struct timeval *timeout, int *block) | ||
| 15122 | +snmp_sess_select_info(void *sessp, int *numfds, fd_set *fdset, | ||
| 15123 | + struct timeval *timeout, int *block) | ||
| 15124 | { | ||
| 15125 | return snmp_sess_select_info_flags(sessp, numfds, fdset, timeout, block, | ||
| 15126 | NETSNMP_SELECT_NOFLAGS); | ||
| 15127 | } | ||
| 15128 | |||
| 15129 | +/** | ||
| 15130 | + * @see See also snmp_sess_select_info2_flags(). | ||
| 15131 | + */ | ||
| 15132 | int | ||
| 15133 | -snmp_sess_select_info_flags(void *sessp, | ||
| 15134 | - int *numfds, | ||
| 15135 | - fd_set * fdset, struct timeval *timeout, int *block, | ||
| 15136 | - int flags) | ||
| 15137 | +snmp_sess_select_info_flags(void *sessp, int *numfds, fd_set *fdset, | ||
| 15138 | + struct timeval *timeout, int *block, int flags) | ||
| 15139 | { | ||
| 15140 | int rc; | ||
| 15141 | netsnmp_large_fd_set lfdset; | ||
| 15142 | @@ -5954,47 +5949,67 @@ snmp_sess_select_info_flags(void *sessp, | ||
| 15143 | return rc; | ||
| 15144 | } | ||
| 15145 | |||
| 15146 | +/** | ||
| 15147 | + * @see See also snmp_sess_select_info2_flags(). | ||
| 15148 | + */ | ||
| 15149 | int | ||
| 15150 | -snmp_sess_select_info2(void *sessp, | ||
| 15151 | - int *numfds, | ||
| 15152 | - netsnmp_large_fd_set * fdset, | ||
| 15153 | +snmp_sess_select_info2(void *sessp, int *numfds, netsnmp_large_fd_set *fdset, | ||
| 15154 | struct timeval *timeout, int *block) | ||
| 15155 | { | ||
| 15156 | return snmp_sess_select_info2_flags(sessp, numfds, fdset, timeout, block, | ||
| 15157 | NETSNMP_SELECT_NOFLAGS); | ||
| 15158 | } | ||
| 15159 | |||
| 15160 | +/** | ||
| 15161 | + * Compute/update the arguments to be passed to select(). | ||
| 15162 | + * | ||
| 15163 | + * @param[in] sessp Which sessions to process: either a pointer to a | ||
| 15164 | + * specific session or NULL which means to process all sessions. | ||
| 15165 | + * @param[in,out] numfds On POSIX systems one more than the the largest file | ||
| 15166 | + * descriptor that is present in *fdset. On systems that use Winsock (MinGW | ||
| 15167 | + * and MSVC), do not use the value written into *numfds. | ||
| 15168 | + * @param[in,out] fdset A large file descriptor set to which all file | ||
| 15169 | + * descriptors will be added that are associated with one of the examined | ||
| 15170 | + * sessions. | ||
| 15171 | + * @param[in,out] timeout On input, if *block = 1, the maximum time the caller | ||
| 15172 | + * will block while waiting for Net-SNMP activity. On output, if this function | ||
| 15173 | + * has set *block to 0, the maximum time the caller is allowed to wait before | ||
| 15174 | + * invoking the Net-SNMP processing functions (snmp_read(), snmp_timeout() | ||
| 15175 | + * and run_alarms()). If this function has set *block to 1, *timeout won't | ||
| 15176 | + * have been modified and no alarms are active. | ||
| 15177 | + * @param[in,out] block On input, whether the caller prefers to block forever | ||
| 15178 | + * when no alarms are active. On output, 0 means that no alarms are active | ||
| 15179 | + * nor that there is a timeout pending for any of the processed sessions. | ||
| 15180 | + * @param[in] flags Either 0 or NETSNMP_SELECT_NOALARMS. | ||
| 15181 | + * | ||
| 15182 | + * @return Number of sessions processed by this function. | ||
| 15183 | + * | ||
| 15184 | + * @see See also agent_check_and_process() for an example of how to use this | ||
| 15185 | + * function. | ||
| 15186 | + */ | ||
| 15187 | int | ||
| 15188 | -snmp_sess_select_info2_flags(void *sessp, | ||
| 15189 | - int *numfds, | ||
| 15190 | - netsnmp_large_fd_set * fdset, | ||
| 15191 | - struct timeval *timeout, int *block, int flags) | ||
| 15192 | +snmp_sess_select_info2_flags(void *sessp, int *numfds, | ||
| 15193 | + netsnmp_large_fd_set * fdset, | ||
| 15194 | + struct timeval *timeout, int *block, int flags) | ||
| 15195 | { | ||
| 15196 | - struct session_list *slptest = (struct session_list *) sessp; | ||
| 15197 | struct session_list *slp, *next = NULL; | ||
| 15198 | netsnmp_request_list *rp; | ||
| 15199 | - struct timeval now, earliest, delta; | ||
| 15200 | + struct timeval now, earliest, alarm_tm; | ||
| 15201 | int active = 0, requests = 0; | ||
| 15202 | int next_alarm = 0; | ||
| 15203 | |||
| 15204 | timerclear(&earliest); | ||
| 15205 | |||
| 15206 | /* | ||
| 15207 | - * For each request outstanding, add its socket to the fdset, | ||
| 15208 | + * For each session examined, add its socket to the fdset, | ||
| 15209 | * and if it is the earliest timeout to expire, mark it as lowest. | ||
| 15210 | * If a single session is specified, do just for that session. | ||
| 15211 | */ | ||
| 15212 | |||
| 15213 | - if (sessp) { | ||
| 15214 | - slp = slptest; | ||
| 15215 | - } else { | ||
| 15216 | - slp = Sessions; | ||
| 15217 | - } | ||
| 15218 | - | ||
| 15219 | DEBUGMSGTL(("sess_select", "for %s session%s: ", | ||
| 15220 | sessp ? "single" : "all", sessp ? "" : "s")); | ||
| 15221 | |||
| 15222 | - for (; slp; slp = next) { | ||
| 15223 | + for (slp = sessp ? sessp : Sessions; slp; slp = next) { | ||
| 15224 | next = slp->next; | ||
| 15225 | |||
| 15226 | if (slp->transport == NULL) { | ||
| 15227 | @@ -6032,8 +6047,9 @@ snmp_sess_select_info2_flags(void *sessp, | ||
| 15228 | */ | ||
| 15229 | requests++; | ||
| 15230 | for (rp = slp->internal->requests; rp; rp = rp->next_request) { | ||
| 15231 | - if ((!timerisset(&earliest) | ||
| 15232 | - || (timercmp(&rp->expire, &earliest, <)))) { | ||
| 15233 | + if (!timerisset(&earliest) | ||
| 15234 | + || (timerisset(&rp->expire) | ||
| 15235 | + && timercmp(&rp->expire, &earliest, <))) { | ||
| 15236 | earliest = rp->expire; | ||
| 15237 | DEBUGMSG(("verbose:sess_select","(to in %d.%06d sec) ", | ||
| 15238 | (int)earliest.tv_sec, (int)earliest.tv_usec)); | ||
| 15239 | @@ -6051,12 +6067,15 @@ snmp_sess_select_info2_flags(void *sessp, | ||
| 15240 | } | ||
| 15241 | DEBUGMSG(("sess_select", "\n")); | ||
| 15242 | |||
| 15243 | + gettimeofday(&now, NULL); | ||
| 15244 | + | ||
| 15245 | if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, | ||
| 15246 | NETSNMP_DS_LIB_ALARM_DONT_USE_SIG) && | ||
| 15247 | !(flags & NETSNMP_SELECT_NOALARMS)) { | ||
| 15248 | - next_alarm = get_next_alarm_delay_time(&delta); | ||
| 15249 | - DEBUGMSGT(("sess_select","next alarm %d.%06d sec\n", | ||
| 15250 | - (int)delta.tv_sec, (int)delta.tv_usec)); | ||
| 15251 | + next_alarm = netsnmp_get_next_alarm_time(&alarm_tm, &now); | ||
| 15252 | + if (next_alarm) | ||
| 15253 | + DEBUGMSGT(("sess_select","next alarm at %ld.%06ld sec\n", | ||
| 15254 | + (long)alarm_tm.tv_sec, (long)alarm_tm.tv_usec)); | ||
| 15255 | } | ||
| 15256 | if (next_alarm == 0 && requests == 0) { | ||
| 15257 | /* | ||
| 15258 | @@ -6067,51 +6086,18 @@ snmp_sess_select_info2_flags(void *sessp, | ||
| 15259 | return active; | ||
| 15260 | } | ||
| 15261 | |||
| 15262 | - /* | ||
| 15263 | - * * Now find out how much time until the earliest timeout. This | ||
| 15264 | - * * transforms earliest from an absolute time into a delta time, the | ||
| 15265 | - * * time left until the select should timeout. | ||
| 15266 | - */ | ||
| 15267 | - gettimeofday(&now, (struct timezone *) 0); | ||
| 15268 | - /* | ||
| 15269 | - * Now = now; | ||
| 15270 | - */ | ||
| 15271 | + if (next_alarm && | ||
| 15272 | + (!timerisset(&earliest) || timercmp(&alarm_tm, &earliest, <))) | ||
| 15273 | + earliest = alarm_tm; | ||
| 15274 | |||
| 15275 | - if (next_alarm) { | ||
| 15276 | - delta.tv_sec += now.tv_sec; | ||
| 15277 | - delta.tv_usec += now.tv_usec; | ||
| 15278 | - while (delta.tv_usec >= 1000000) { | ||
| 15279 | - delta.tv_usec -= 1000000; | ||
| 15280 | - delta.tv_sec += 1; | ||
| 15281 | - } | ||
| 15282 | - if (!timerisset(&earliest) || | ||
| 15283 | - ((earliest.tv_sec > delta.tv_sec) || | ||
| 15284 | - ((earliest.tv_sec == delta.tv_sec) && | ||
| 15285 | - (earliest.tv_usec > delta.tv_usec)))) { | ||
| 15286 | - earliest.tv_sec = delta.tv_sec; | ||
| 15287 | - earliest.tv_usec = delta.tv_usec; | ||
| 15288 | - } | ||
| 15289 | - } | ||
| 15290 | - | ||
| 15291 | - if (earliest.tv_sec < now.tv_sec) { | ||
| 15292 | - DEBUGMSGT(("verbose:sess_select","timer overdue\n")); | ||
| 15293 | - earliest.tv_sec = 0; | ||
| 15294 | - earliest.tv_usec = 0; | ||
| 15295 | - } else if (earliest.tv_sec == now.tv_sec) { | ||
| 15296 | - earliest.tv_sec = 0; | ||
| 15297 | - earliest.tv_usec = (earliest.tv_usec - now.tv_usec); | ||
| 15298 | - if (earliest.tv_usec < 0) { | ||
| 15299 | - earliest.tv_usec = 100; | ||
| 15300 | - } | ||
| 15301 | - DEBUGMSGT(("verbose:sess_select","timer due *real* soon. %d usec\n", | ||
| 15302 | - (int)earliest.tv_usec)); | ||
| 15303 | + NETSNMP_TIMERSUB(&earliest, &now, &earliest); | ||
| 15304 | + if (earliest.tv_sec < 0) { | ||
| 15305 | + time_t overdue_ms = -(earliest.tv_sec * 1000 + earliest.tv_usec / 1000); | ||
| 15306 | + if (overdue_ms >= 10) | ||
| 15307 | + DEBUGMSGT(("verbose:sess_select","timer overdue by %ld ms\n", | ||
| 15308 | + overdue_ms)); | ||
| 15309 | + timerclear(&earliest); | ||
| 15310 | } else { | ||
| 15311 | - earliest.tv_sec = (earliest.tv_sec - now.tv_sec); | ||
| 15312 | - earliest.tv_usec = (earliest.tv_usec - now.tv_usec); | ||
| 15313 | - if (earliest.tv_usec < 0) { | ||
| 15314 | - earliest.tv_sec--; | ||
| 15315 | - earliest.tv_usec = (1000000L + earliest.tv_usec); | ||
| 15316 | - } | ||
| 15317 | DEBUGMSGT(("verbose:sess_select","timer due in %d.%06d sec\n", | ||
| 15318 | (int)earliest.tv_sec, (int)earliest.tv_usec)); | ||
| 15319 | } | ||
| 15320 | diff --git a/snmplib/snmp_client.c b/snmplib/snmp_client.c | ||
| 15321 | index ae57613..c1aa9c4 100644 | ||
| 15322 | --- a/snmplib/snmp_client.c | ||
| 15323 | +++ b/snmplib/snmp_client.c | ||
| 15324 | @@ -804,6 +804,11 @@ snmp_set_var_value(netsnmp_variable_list * vars, | ||
| 15325 | vars->val.string = NULL; | ||
| 15326 | vars->val_len = 0; | ||
| 15327 | |||
| 15328 | + if (value == NULL && len > 0) { | ||
| 15329 | + snmp_log(LOG_ERR, "bad size for NULL value\n"); | ||
| 15330 | + return 1; | ||
| 15331 | + } | ||
| 15332 | + | ||
| 15333 | /* | ||
| 15334 | * use built-in storage for smaller values | ||
| 15335 | */ | ||
| 15336 | @@ -823,84 +828,82 @@ snmp_set_var_value(netsnmp_variable_list * vars, | ||
| 15337 | case ASN_UNSIGNED: | ||
| 15338 | case ASN_TIMETICKS: | ||
| 15339 | case ASN_COUNTER: | ||
| 15340 | - if (value) { | ||
| 15341 | - if (vars->val_len == sizeof(int)) { | ||
| 15342 | - if (ASN_INTEGER == vars->type) { | ||
| 15343 | - const int *val_int | ||
| 15344 | - = (const int *) value; | ||
| 15345 | - *(vars->val.integer) = (long) *val_int; | ||
| 15346 | - } else { | ||
| 15347 | - const u_int *val_uint | ||
| 15348 | - = (const u_int *) value; | ||
| 15349 | - *(vars->val.integer) = (unsigned long) *val_uint; | ||
| 15350 | - } | ||
| 15351 | + case ASN_UINTEGER: | ||
| 15352 | + if (vars->val_len == sizeof(int)) { | ||
| 15353 | + if (ASN_INTEGER == vars->type) { | ||
| 15354 | + const int *val_int | ||
| 15355 | + = (const int *) value; | ||
| 15356 | + *(vars->val.integer) = (long) *val_int; | ||
| 15357 | + } else { | ||
| 15358 | + const u_int *val_uint | ||
| 15359 | + = (const u_int *) value; | ||
| 15360 | + *(vars->val.integer) = (unsigned long) *val_uint; | ||
| 15361 | } | ||
| 15362 | + } | ||
| 15363 | #if SIZEOF_LONG != SIZEOF_INT | ||
| 15364 | - else if (vars->val_len == sizeof(long)){ | ||
| 15365 | - const u_long *val_ulong | ||
| 15366 | - = (const u_long *) value; | ||
| 15367 | - *(vars->val.integer) = *val_ulong; | ||
| 15368 | - if (*(vars->val.integer) > 0xffffffff) { | ||
| 15369 | - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15370 | - *(vars->val.integer) &= 0xffffffff; | ||
| 15371 | - } | ||
| 15372 | + else if (vars->val_len == sizeof(long)){ | ||
| 15373 | + const u_long *val_ulong | ||
| 15374 | + = (const u_long *) value; | ||
| 15375 | + *(vars->val.integer) = *val_ulong; | ||
| 15376 | + if (*(vars->val.integer) > 0xffffffff) { | ||
| 15377 | + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15378 | + *(vars->val.integer) &= 0xffffffff; | ||
| 15379 | } | ||
| 15380 | + } | ||
| 15381 | #endif | ||
| 15382 | #if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG != SIZEOF_LONG_LONG) | ||
| 15383 | #if !defined(SIZEOF_INTMAX_T) || (SIZEOF_LONG_LONG != SIZEOF_INTMAX_T) | ||
| 15384 | - else if (vars->val_len == sizeof(long long)){ | ||
| 15385 | - const unsigned long long *val_ullong | ||
| 15386 | - = (const unsigned long long *) value; | ||
| 15387 | - *(vars->val.integer) = (long) *val_ullong; | ||
| 15388 | - if (*(vars->val.integer) > 0xffffffff) { | ||
| 15389 | - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15390 | - *(vars->val.integer) &= 0xffffffff; | ||
| 15391 | - } | ||
| 15392 | + else if (vars->val_len == sizeof(long long)){ | ||
| 15393 | + const unsigned long long *val_ullong | ||
| 15394 | + = (const unsigned long long *) value; | ||
| 15395 | + *(vars->val.integer) = (long) *val_ullong; | ||
| 15396 | + if (*(vars->val.integer) > 0xffffffff) { | ||
| 15397 | + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15398 | + *(vars->val.integer) &= 0xffffffff; | ||
| 15399 | } | ||
| 15400 | + } | ||
| 15401 | #endif | ||
| 15402 | #endif | ||
| 15403 | #if defined(SIZEOF_INTMAX_T) && (SIZEOF_LONG != SIZEOF_INTMAX_T) | ||
| 15404 | - else if (vars->val_len == sizeof(intmax_t)){ | ||
| 15405 | - const uintmax_t *val_uintmax_t | ||
| 15406 | - = (const uintmax_t *) value; | ||
| 15407 | - *(vars->val.integer) = (long) *val_uintmax_t; | ||
| 15408 | - if (*(vars->val.integer) > 0xffffffff) { | ||
| 15409 | - snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15410 | - *(vars->val.integer) &= 0xffffffff; | ||
| 15411 | - } | ||
| 15412 | + else if (vars->val_len == sizeof(intmax_t)){ | ||
| 15413 | + const uintmax_t *val_uintmax_t | ||
| 15414 | + = (const uintmax_t *) value; | ||
| 15415 | + *(vars->val.integer) = (long) *val_uintmax_t; | ||
| 15416 | + if (*(vars->val.integer) > 0xffffffff) { | ||
| 15417 | + snmp_log(LOG_ERR,"truncating integer value > 32 bits\n"); | ||
| 15418 | + *(vars->val.integer) &= 0xffffffff; | ||
| 15419 | } | ||
| 15420 | + } | ||
| 15421 | #endif | ||
| 15422 | #if SIZEOF_SHORT != SIZEOF_INT | ||
| 15423 | - else if (vars->val_len == sizeof(short)) { | ||
| 15424 | - if (ASN_INTEGER == vars->type) { | ||
| 15425 | - const short *val_short | ||
| 15426 | - = (const short *) value; | ||
| 15427 | - *(vars->val.integer) = (long) *val_short; | ||
| 15428 | - } else { | ||
| 15429 | - const u_short *val_ushort | ||
| 15430 | - = (const u_short *) value; | ||
| 15431 | - *(vars->val.integer) = (unsigned long) *val_ushort; | ||
| 15432 | - } | ||
| 15433 | + else if (vars->val_len == sizeof(short)) { | ||
| 15434 | + if (ASN_INTEGER == vars->type) { | ||
| 15435 | + const short *val_short | ||
| 15436 | + = (const short *) value; | ||
| 15437 | + *(vars->val.integer) = (long) *val_short; | ||
| 15438 | + } else { | ||
| 15439 | + const u_short *val_ushort | ||
| 15440 | + = (const u_short *) value; | ||
| 15441 | + *(vars->val.integer) = (unsigned long) *val_ushort; | ||
| 15442 | } | ||
| 15443 | + } | ||
| 15444 | #endif | ||
| 15445 | - else if (vars->val_len == sizeof(char)) { | ||
| 15446 | - if (ASN_INTEGER == vars->type) { | ||
| 15447 | - const char *val_char | ||
| 15448 | - = (const char *) value; | ||
| 15449 | - *(vars->val.integer) = (long) *val_char; | ||
| 15450 | - } else { | ||
| 15451 | + else if (vars->val_len == sizeof(char)) { | ||
| 15452 | + if (ASN_INTEGER == vars->type) { | ||
| 15453 | + const char *val_char | ||
| 15454 | + = (const char *) value; | ||
| 15455 | + *(vars->val.integer) = (long) *val_char; | ||
| 15456 | + } else { | ||
| 15457 | const u_char *val_uchar | ||
| 15458 | - = (const u_char *) value; | ||
| 15459 | - *(vars->val.integer) = (unsigned long) *val_uchar; | ||
| 15460 | - } | ||
| 15461 | - } | ||
| 15462 | - else { | ||
| 15463 | - snmp_log(LOG_ERR,"bad size for integer-like type (%d)\n", | ||
| 15464 | - (int)vars->val_len); | ||
| 15465 | - return (1); | ||
| 15466 | + = (const u_char *) value; | ||
| 15467 | + *(vars->val.integer) = (unsigned long) *val_uchar; | ||
| 15468 | } | ||
| 15469 | - } else | ||
| 15470 | - *(vars->val.integer) = 0; | ||
| 15471 | + } | ||
| 15472 | + else { | ||
| 15473 | + snmp_log(LOG_ERR,"bad size for integer-like type (%d)\n", | ||
| 15474 | + (int)vars->val_len); | ||
| 15475 | + return (1); | ||
| 15476 | + } | ||
| 15477 | vars->val_len = sizeof(long); | ||
| 15478 | break; | ||
| 15479 | |||
| 15480 | diff --git a/snmplib/snmp_enum.c b/snmplib/snmp_enum.c | ||
| 15481 | index cac0ed3..8a6bd38 100644 | ||
| 15482 | --- a/snmplib/snmp_enum.c | ||
| 15483 | +++ b/snmplib/snmp_enum.c | ||
| 15484 | @@ -156,12 +156,12 @@ se_read_conf(const char *word, char *cptr) | ||
| 15485 | |||
| 15486 | void | ||
| 15487 | se_store_enum_list(struct snmp_enum_list *new_list, | ||
| 15488 | - const char *token, char *type) | ||
| 15489 | + const char *token, const char *type) | ||
| 15490 | { | ||
| 15491 | struct snmp_enum_list *listp = new_list; | ||
| 15492 | char line[2048]; | ||
| 15493 | char buf[512]; | ||
| 15494 | - int len = 0; | ||
| 15495 | + int len; | ||
| 15496 | |||
| 15497 | snprintf(line, sizeof(line), "enum %s", token); | ||
| 15498 | while (listp) { | ||
| 15499 | @@ -175,26 +175,19 @@ se_store_enum_list(struct snmp_enum_list *new_list, | ||
| 15500 | if ((int)strlen(buf) > len) { | ||
| 15501 | read_config_store(type, line); | ||
| 15502 | snprintf(line, sizeof(line), "enum %s", token); | ||
| 15503 | - len = sizeof(line); | ||
| 15504 | + len = sizeof(line) - strlen(line); | ||
| 15505 | } | ||
| 15506 | |||
| 15507 | strncat(line, buf, len); | ||
| 15508 | listp = listp->next; | ||
| 15509 | } | ||
| 15510 | |||
| 15511 | - /* | ||
| 15512 | - * If there's anything left, then save that. | ||
| 15513 | - * But don't bother saving an empty 'overflow' line. | ||
| 15514 | - */ | ||
| 15515 | - if (len != sizeof(line)) | ||
| 15516 | - read_config_store(type, line); | ||
| 15517 | - | ||
| 15518 | - return; | ||
| 15519 | + read_config_store(type, line); | ||
| 15520 | } | ||
| 15521 | |||
| 15522 | #ifndef NETSNMP_FEATURE_REMOVE_SNMP_ENUM_STORE_LIST | ||
| 15523 | void | ||
| 15524 | -se_store_list(unsigned int major, unsigned int minor, char *type) | ||
| 15525 | +se_store_list(unsigned int major, unsigned int minor, const char *type) | ||
| 15526 | { | ||
| 15527 | char token[32]; | ||
| 15528 | |||
| 15529 | @@ -297,8 +290,10 @@ se_add_pair_to_list(struct snmp_enum_list **list, char *label, int value) | ||
| 15530 | (*list) = SNMP_MALLOC_STRUCT(snmp_enum_list); | ||
| 15531 | lastnode = (*list); | ||
| 15532 | } | ||
| 15533 | - if (!lastnode) | ||
| 15534 | + if (!lastnode) { | ||
| 15535 | + free(label); | ||
| 15536 | return (SE_NOMEM); | ||
| 15537 | + } | ||
| 15538 | lastnode->label = label; | ||
| 15539 | lastnode->value = value; | ||
| 15540 | lastnode->next = NULL; | ||
| 15541 | @@ -445,7 +440,7 @@ se_clear_list(struct snmp_enum_list **list) | ||
| 15542 | |||
| 15543 | #ifndef NETSNMP_FEATURE_REMOVE_SNMP_ENUM_STORE_SLIST | ||
| 15544 | void | ||
| 15545 | -se_store_slist(const char *listname, char *type) | ||
| 15546 | +se_store_slist(const char *listname, const char *type) | ||
| 15547 | { | ||
| 15548 | struct snmp_enum_list *list = se_find_slist(listname); | ||
| 15549 | se_store_enum_list(list, listname, type); | ||
| 15550 | diff --git a/snmplib/snmp_logging.c b/snmplib/snmp_logging.c | ||
| 15551 | index 37d5948..a2cd55a 100644 | ||
| 15552 | --- a/snmplib/snmp_logging.c | ||
| 15553 | +++ b/snmplib/snmp_logging.c | ||
| 15554 | @@ -535,7 +535,7 @@ char * | ||
| 15555 | snmp_log_syslogname(const char *pstr) | ||
| 15556 | { | ||
| 15557 | if (pstr) | ||
| 15558 | - strncpy (syslogname, pstr, sizeof(syslogname)); | ||
| 15559 | + strlcpy (syslogname, pstr, sizeof(syslogname)); | ||
| 15560 | |||
| 15561 | return syslogname; | ||
| 15562 | } | ||
| 15563 | diff --git a/snmplib/snmp_openssl.c b/snmplib/snmp_openssl.c | ||
| 15564 | index da5c114..3b0eaa8 100644 | ||
| 15565 | --- a/snmplib/snmp_openssl.c | ||
| 15566 | +++ b/snmplib/snmp_openssl.c | ||
| 15567 | @@ -737,7 +737,7 @@ _cert_get_san_type(X509 *ocert, int mapType) | ||
| 15568 | if (lower) | ||
| 15569 | for ( ; *lower; ++lower ) | ||
| 15570 | if (isascii(*lower)) | ||
| 15571 | - *lower = tolower(*lower); | ||
| 15572 | + *lower = tolower(0xFF & *lower); | ||
| 15573 | DEBUGMSGT(("openssl:cert:extension:san", "#%d type %d: %s\n", i, | ||
| 15574 | oname ? oname->type : -1, buf ? buf : "NULL")); | ||
| 15575 | |||
| 15576 | diff --git a/snmplib/snmp_parse_args.c b/snmplib/snmp_parse_args.c | ||
| 15577 | index e47542e..c73b84c 100644 | ||
| 15578 | --- a/snmplib/snmp_parse_args.c | ||
| 15579 | +++ b/snmplib/snmp_parse_args.c | ||
| 15580 | @@ -209,8 +209,13 @@ netsnmp_parse_args(int argc, | ||
| 15581 | */ | ||
| 15582 | snmp_sess_init(session); | ||
| 15583 | 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:"); | ||
| 15584 | - if (localOpts) | ||
| 15585 | + if (localOpts) { | ||
| 15586 | + if (strlen(localOpts) + strlen(Opts) >= sizeof(Opts)) { | ||
| 15587 | + snmp_log(LOG_ERR, "Too many localOpts in snmp_parse_args()\n"); | ||
| 15588 | + return -1; | ||
| 15589 | + } | ||
| 15590 | strcat(Opts, localOpts); | ||
| 15591 | + } | ||
| 15592 | |||
| 15593 | /* | ||
| 15594 | * get the options | ||
| 15595 | @@ -364,10 +369,8 @@ netsnmp_parse_args(int argc, | ||
| 15596 | } | ||
| 15597 | |||
| 15598 | /* set the config */ | ||
| 15599 | - strncpy(leftside, tmpopt, sizeof(leftside)); | ||
| 15600 | - leftside[sizeof(leftside)-1] = '0'; | ||
| 15601 | - strncpy(rightside, tmpcp, sizeof(rightside)); | ||
| 15602 | - rightside[sizeof(rightside)-1] = '0'; | ||
| 15603 | + strlcpy(leftside, tmpopt, sizeof(leftside)); | ||
| 15604 | + strlcpy(rightside, tmpcp, sizeof(rightside)); | ||
| 15605 | |||
| 15606 | CONTAINER_INSERT(session->transport_configuration, | ||
| 15607 | netsnmp_transport_create_config(leftside, | ||
| 15608 | diff --git a/snmplib/snmp_service.c b/snmplib/snmp_service.c | ||
| 15609 | index 90af5e4..ce7e8be 100644 | ||
| 15610 | --- a/snmplib/snmp_service.c | ||
| 15611 | +++ b/snmplib/snmp_service.c | ||
| 15612 | @@ -227,6 +227,15 @@ struct netsnmp_lookup_target { | ||
| 15613 | |||
| 15614 | static struct netsnmp_lookup_target* targets = NULL; | ||
| 15615 | |||
| 15616 | +/** | ||
| 15617 | + * Add an (application, domain, target) triplet to the targets list if target | ||
| 15618 | + * != NULL. Remove an entry if target == NULL and the userTarget pointer for | ||
| 15619 | + * the entry found is also NULL. Keep at most one target per (application, | ||
| 15620 | + * domain) pair. | ||
| 15621 | + * | ||
| 15622 | + * @return 1 if an entry for (application, domain) was already present in the | ||
| 15623 | + * targets list or 0 if such an entry was not yet present in the targets list. | ||
| 15624 | + */ | ||
| 15625 | int | ||
| 15626 | netsnmp_register_default_target(const char* application, const char* domain, | ||
| 15627 | const char* target) | ||
| 15628 | @@ -271,6 +280,9 @@ netsnmp_register_default_target(const char* application, const char* domain, | ||
| 15629 | return res; | ||
| 15630 | } | ||
| 15631 | |||
| 15632 | +/** | ||
| 15633 | + * Clear the targets list. | ||
| 15634 | + */ | ||
| 15635 | void | ||
| 15636 | netsnmp_clear_default_target(void) | ||
| 15637 | { | ||
| 15638 | diff --git a/snmplib/snmp_transport.c b/snmplib/snmp_transport.c | ||
| 15639 | index ae2b3ee..85a4f35 100644 | ||
| 15640 | --- a/snmplib/snmp_transport.c | ||
| 15641 | +++ b/snmplib/snmp_transport.c | ||
| 15642 | @@ -127,11 +127,10 @@ netsnmp_transport_copy(netsnmp_transport *t) | ||
| 15643 | return NULL; | ||
| 15644 | } | ||
| 15645 | |||
| 15646 | - n = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 15647 | + n = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 15648 | if (n == NULL) { | ||
| 15649 | return NULL; | ||
| 15650 | } | ||
| 15651 | - memset(n, 0, sizeof(netsnmp_transport)); | ||
| 15652 | |||
| 15653 | if (t->domain != NULL) { | ||
| 15654 | n->domain = t->domain; | ||
| 15655 | @@ -551,7 +550,7 @@ netsnmp_tdomain_transport_full(const char *application, | ||
| 15656 | if (NULL != | ||
| 15657 | (newhost = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, | ||
| 15658 | NETSNMP_DS_LIB_HOSTNAME))) { | ||
| 15659 | - strncpy(buf, newhost, sizeof(buf)-1); | ||
| 15660 | + strlcpy(buf, newhost, sizeof(buf)); | ||
| 15661 | str = buf; | ||
| 15662 | } | ||
| 15663 | |||
| 15664 | diff --git a/snmplib/snmptsm.c b/snmplib/snmptsm.c | ||
| 15665 | index 778001e..bf4b612 100644 | ||
| 15666 | --- a/snmplib/snmptsm.c | ||
| 15667 | +++ b/snmplib/snmptsm.c | ||
| 15668 | @@ -193,6 +193,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15669 | size_t *wholeMsgLen = parms->wholeMsgLen; | ||
| 15670 | netsnmp_tsmSecurityReference *tsmSecRef; | ||
| 15671 | netsnmp_tmStateReference *tmStateRef; | ||
| 15672 | + int tmStateRefLocal = 0; | ||
| 15673 | |||
| 15674 | DEBUGMSGTL(("tsm", "Starting TSM processing\n")); | ||
| 15675 | |||
| 15676 | @@ -229,7 +230,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15677 | tmStateReference cache. */ | ||
| 15678 | tmStateRef = SNMP_MALLOC_TYPEDEF(netsnmp_tmStateReference); | ||
| 15679 | netsnmp_assert_or_return(NULL != tmStateRef, SNMPERR_GENERR); | ||
| 15680 | - | ||
| 15681 | + tmStateRefLocal = 1; | ||
| 15682 | + | ||
| 15683 | /* XXX: we don't actually use this really in our implementation */ | ||
| 15684 | /* 4.2, step 2: Set tmTransportDomain to the value of | ||
| 15685 | transportDomain, tmTransportAddress to the value of | ||
| 15686 | @@ -263,6 +265,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15687 | incremented, an error indication is returned to the | ||
| 15688 | calling module, and message processing stops. */ | ||
| 15689 | snmp_increment_statistic(STAT_TSM_SNMPTSMUNKNOWNPREFIXES); | ||
| 15690 | + SNMP_FREE(tmStateRef); | ||
| 15691 | return SNMPERR_GENERR; | ||
| 15692 | } | ||
| 15693 | |||
| 15694 | @@ -281,6 +284,7 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15695 | /* Note: since we're assiging the prefixes above the | ||
| 15696 | prefix lengths always meet the 1-4 criteria */ | ||
| 15697 | snmp_increment_statistic(STAT_TSM_SNMPTSMINVALIDPREFIXES); | ||
| 15698 | + SNMP_FREE(tmStateRef); | ||
| 15699 | return SNMPERR_GENERR; | ||
| 15700 | } | ||
| 15701 | |||
| 15702 | @@ -315,6 +319,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15703 | DEBUGINDENTLESS(); | ||
| 15704 | if (rc == 0) { | ||
| 15705 | DEBUGMSGTL(("tsm", "building msgSecurityParameters failed.\n")); | ||
| 15706 | + if (tmStateRefLocal) | ||
| 15707 | + SNMP_FREE(tmStateRef); | ||
| 15708 | return SNMPERR_TOO_LONG; | ||
| 15709 | } | ||
| 15710 | |||
| 15711 | @@ -324,6 +330,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15712 | while ((*wholeMsgLen - *offset) < parms->globalDataLen) { | ||
| 15713 | if (!asn_realloc(wholeMsg, wholeMsgLen)) { | ||
| 15714 | DEBUGMSGTL(("tsm", "building global data failed.\n")); | ||
| 15715 | + if (tmStateRefLocal) | ||
| 15716 | + SNMP_FREE(tmStateRef); | ||
| 15717 | return SNMPERR_TOO_LONG; | ||
| 15718 | } | ||
| 15719 | } | ||
| 15720 | @@ -347,6 +355,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15721 | ASN_CONSTRUCTOR), *offset); | ||
| 15722 | if (rc == 0) { | ||
| 15723 | DEBUGMSGTL(("tsm", "building master packet sequence failed.\n")); | ||
| 15724 | + if (tmStateRefLocal) | ||
| 15725 | + SNMP_FREE(tmStateRef); | ||
| 15726 | return SNMPERR_TOO_LONG; | ||
| 15727 | } | ||
| 15728 | |||
| 15729 | @@ -364,6 +374,8 @@ tsm_rgenerate_out_msg(struct snmp_secmod_outgoing_params *parms) | ||
| 15730 | } | ||
| 15731 | parms->pdu->transport_data_length = sizeof(*tmStateRef); | ||
| 15732 | |||
| 15733 | + if (tmStateRefLocal) | ||
| 15734 | + SNMP_FREE(tmStateRef); | ||
| 15735 | DEBUGMSGTL(("tsm", "TSM processing completed.\n")); | ||
| 15736 | return SNMPERR_SUCCESS; | ||
| 15737 | } | ||
| 15738 | diff --git a/snmplib/snmpusm.c b/snmplib/snmpusm.c | ||
| 15739 | index 8a673dc..d8d8932 100644 | ||
| 15740 | --- a/snmplib/snmpusm.c | ||
| 15741 | +++ b/snmplib/snmpusm.c | ||
| 15742 | @@ -2727,6 +2727,7 @@ usm_handle_report(void *sessp, | ||
| 15743 | } | ||
| 15744 | session->s_snmp_errno = res; | ||
| 15745 | } | ||
| 15746 | + /* fallthrough */ | ||
| 15747 | case SNMPERR_USM_UNKNOWNENGINEID: | ||
| 15748 | case SNMPERR_USM_UNKNOWNSECURITYNAME: | ||
| 15749 | case SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL: | ||
| 15750 | @@ -3150,6 +3151,7 @@ int usm_discover_engineid(void *slpv, netsnmp_session *session) { | ||
| 15751 | break; | ||
| 15752 | case STAT_TIMEOUT: | ||
| 15753 | session->s_snmp_errno = SNMPERR_TIMEOUT; | ||
| 15754 | + break; | ||
| 15755 | default: | ||
| 15756 | DEBUGMSGTL(("snmp_sess_open", | ||
| 15757 | "unable to connect with remote engine: %s (%d)\n", | ||
| 15758 | @@ -4160,8 +4162,8 @@ usm_set_password(const char *token, char *line) | ||
| 15759 | { | ||
| 15760 | char *cp; | ||
| 15761 | char nameBuf[SNMP_MAXBUF]; | ||
| 15762 | - u_char *engineID; | ||
| 15763 | - size_t engineIDLen; | ||
| 15764 | + u_char *engineID = NULL; | ||
| 15765 | + size_t engineIDLen = 0; | ||
| 15766 | struct usmUser *user; | ||
| 15767 | |||
| 15768 | cp = copy_nword(line, nameBuf, sizeof(nameBuf)); | ||
| 15769 | @@ -4185,15 +4187,18 @@ usm_set_password(const char *token, char *line) | ||
| 15770 | cp = read_config_read_octet_string(cp, &engineID, &engineIDLen); | ||
| 15771 | if (cp == NULL) { | ||
| 15772 | config_perror("invalid engineID specifier"); | ||
| 15773 | + SNMP_FREE(engineID); | ||
| 15774 | return; | ||
| 15775 | } | ||
| 15776 | |||
| 15777 | user = usm_get_user(engineID, engineIDLen, nameBuf); | ||
| 15778 | if (user == NULL) { | ||
| 15779 | config_perror("not a valid user/engineID pair"); | ||
| 15780 | + SNMP_FREE(engineID); | ||
| 15781 | return; | ||
| 15782 | } | ||
| 15783 | usm_set_user_password(user, token, cp); | ||
| 15784 | + SNMP_FREE(engineID); | ||
| 15785 | } | ||
| 15786 | } | ||
| 15787 | |||
| 15788 | diff --git a/snmplib/snmpv3.c b/snmplib/snmpv3.c | ||
| 15789 | index f8bd90b..3369fb6 100644 | ||
| 15790 | --- a/snmplib/snmpv3.c | ||
| 15791 | +++ b/snmplib/snmpv3.c | ||
| 15792 | @@ -1274,7 +1274,7 @@ getHwAddress(const char *networkDevice, /* e.g. "eth0", "eth1" */ | ||
| 15793 | /* | ||
| 15794 | * copy the name of the net device we want to find the HW address for | ||
| 15795 | */ | ||
| 15796 | - strncpy(request.ifr_name, networkDevice, IFNAMSIZ - 1); | ||
| 15797 | + strlcpy(request.ifr_name, networkDevice, IFNAMSIZ); | ||
| 15798 | /* | ||
| 15799 | * Get the HW address | ||
| 15800 | */ | ||
| 15801 | diff --git a/snmplib/strlcat.c b/snmplib/strlcat.c | ||
| 15802 | new file mode 100644 | ||
| 15803 | index 0000000..90713ca | ||
| 15804 | --- /dev/null | ||
| 15805 | +++ b/snmplib/strlcat.c | ||
| 15806 | @@ -0,0 +1,67 @@ | ||
| 15807 | +/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ | ||
| 15808 | + | ||
| 15809 | +/* | ||
| 15810 | + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> | ||
| 15811 | + * | ||
| 15812 | + * Permission to use, copy, modify, and distribute this software for any | ||
| 15813 | + * purpose with or without fee is hereby granted, provided that the above | ||
| 15814 | + * copyright notice and this permission notice appear in all copies. | ||
| 15815 | + * | ||
| 15816 | + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
| 15817 | + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
| 15818 | + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
| 15819 | + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| 15820 | + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
| 15821 | + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
| 15822 | + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| 15823 | + */ | ||
| 15824 | + | ||
| 15825 | +#include <net-snmp/net-snmp-config.h> | ||
| 15826 | + | ||
| 15827 | +#ifndef HAVE_STRLCAT | ||
| 15828 | + | ||
| 15829 | +#if HAVE_STRING_H | ||
| 15830 | +#include <string.h> | ||
| 15831 | +#else | ||
| 15832 | +#include <strings.h> | ||
| 15833 | +#endif | ||
| 15834 | +#include <sys/types.h> | ||
| 15835 | + | ||
| 15836 | +#include <net-snmp/library/system.h> | ||
| 15837 | + | ||
| 15838 | +/* | ||
| 15839 | + * Appends src to string dst of size siz (unlike strncat, siz is the | ||
| 15840 | + * full size of dst, not space left). At most siz-1 characters | ||
| 15841 | + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). | ||
| 15842 | + * Returns strlen(src) + MIN(siz, strlen(initial dst)). | ||
| 15843 | + * If retval >= siz, truncation occurred. | ||
| 15844 | + */ | ||
| 15845 | +size_t | ||
| 15846 | +strlcat(char * __restrict dst, const char * __restrict src, size_t siz) | ||
| 15847 | +{ | ||
| 15848 | + char *d = dst; | ||
| 15849 | + const char *s = src; | ||
| 15850 | + size_t n = siz; | ||
| 15851 | + size_t dlen; | ||
| 15852 | + | ||
| 15853 | + /* Find the end of dst and adjust bytes left but don't go past end */ | ||
| 15854 | + while (n-- != 0 && *d != '\0') | ||
| 15855 | + d++; | ||
| 15856 | + dlen = d - dst; | ||
| 15857 | + n = siz - dlen; | ||
| 15858 | + | ||
| 15859 | + if (n == 0) | ||
| 15860 | + return(dlen + strlen(s)); | ||
| 15861 | + while (*s != '\0') { | ||
| 15862 | + if (n != 1) { | ||
| 15863 | + *d++ = *s; | ||
| 15864 | + n--; | ||
| 15865 | + } | ||
| 15866 | + s++; | ||
| 15867 | + } | ||
| 15868 | + *d = '\0'; | ||
| 15869 | + | ||
| 15870 | + return(dlen + (s - src)); /* count does not include NUL */ | ||
| 15871 | +} | ||
| 15872 | + | ||
| 15873 | +#endif | ||
| 15874 | diff --git a/snmplib/strtoull.c b/snmplib/strtoull.c | ||
| 15875 | index be94f29..6c98fc4 100644 | ||
| 15876 | --- a/snmplib/strtoull.c | ||
| 15877 | +++ b/snmplib/strtoull.c | ||
| 15878 | @@ -49,13 +49,8 @@ | ||
| 15879 | #define ULLONG_MAX UINT64_C(0xffffffffffffffff) | ||
| 15880 | #endif | ||
| 15881 | |||
| 15882 | -#ifdef STRTOULL_UNIT_TEST | ||
| 15883 | -uint64_t | ||
| 15884 | -my_strtoull(const char *nptr, char **endptr, int base) | ||
| 15885 | -#else | ||
| 15886 | uint64_t | ||
| 15887 | strtoull(const char *nptr, char **endptr, int base) | ||
| 15888 | -#endif | ||
| 15889 | { | ||
| 15890 | uint64_t result = 0; | ||
| 15891 | const char *p; | ||
| 15892 | @@ -161,123 +156,3 @@ strtoull(const char *nptr, char **endptr, int base) | ||
| 15893 | *endptr = (char *) nptr; | ||
| 15894 | return 0; | ||
| 15895 | } | ||
| 15896 | - | ||
| 15897 | -#if defined(STRTOULL_UNIT_TEST) | ||
| 15898 | - | ||
| 15899 | -#include <stdio.h> | ||
| 15900 | -#include <stdlib.h> | ||
| 15901 | - | ||
| 15902 | -#ifndef PRIu64 | ||
| 15903 | -#ifdef _MSC_VER | ||
| 15904 | -#define PRIu64 "I64u" | ||
| 15905 | -#else | ||
| 15906 | -#define PRIu64 "llu" | ||
| 15907 | -#endif | ||
| 15908 | -#endif | ||
| 15909 | - | ||
| 15910 | -struct strtoull_testcase { | ||
| 15911 | - /* | ||
| 15912 | - * inputs | ||
| 15913 | - */ | ||
| 15914 | - const char *nptr; | ||
| 15915 | - int base; | ||
| 15916 | - /* | ||
| 15917 | - * expected outputs | ||
| 15918 | - */ | ||
| 15919 | - int expected_errno; | ||
| 15920 | - int expected_end; | ||
| 15921 | - uint64_t expected_result; | ||
| 15922 | -}; | ||
| 15923 | - | ||
| 15924 | -static const struct strtoull_testcase test_input[] = { | ||
| 15925 | - {"0x0", 0, 0, 3, 0}, | ||
| 15926 | - {"1", 0, 0, 1, 1}, | ||
| 15927 | - {"0x1", 0, 0, 3, 1}, | ||
| 15928 | - {" -0666", 0, 0, 7, -0666}, | ||
| 15929 | - {" -0x666", 0, 0, 8, -0x666}, | ||
| 15930 | - {"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)}, | ||
| 15931 | - {"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)}, | ||
| 15932 | - {"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)}, | ||
| 15933 | - {"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)}, | ||
| 15934 | - {"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)}, | ||
| 15935 | - {"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)}, | ||
| 15936 | - {"ff", 16, 0, 2, 255}, | ||
| 15937 | - {"0xff", 16, 0, 4, 255}, | ||
| 15938 | - {" ", 0, 0, 0, 0}, | ||
| 15939 | - {"0x", 0, 0, 1, 0}, | ||
| 15940 | - {"0x", 8, 0, 1, 0}, | ||
| 15941 | - {"0x", 16, 0, 1, 0}, | ||
| 15942 | - {"zyyy", 0, 0, 0, 0}, | ||
| 15943 | - {"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX}, | ||
| 15944 | - {"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX} | ||
| 15945 | -}; | ||
| 15946 | - | ||
| 15947 | -int | ||
| 15948 | -main(void) | ||
| 15949 | -{ | ||
| 15950 | - int failure_count = 0; | ||
| 15951 | - unsigned int i; | ||
| 15952 | - | ||
| 15953 | - for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { | ||
| 15954 | - const struct strtoull_testcase *const p = &test_input[i]; | ||
| 15955 | - char *endptr; | ||
| 15956 | - uint64_t result; | ||
| 15957 | - | ||
| 15958 | - errno = 0; | ||
| 15959 | - result = my_strtoull(p->nptr, &endptr, p->base); | ||
| 15960 | - if (errno != p->expected_errno) { | ||
| 15961 | - failure_count++; | ||
| 15962 | - printf("test %d failed (input \"%s\"): expected errno %d" | ||
| 15963 | - ", got errno %d\n", | ||
| 15964 | - i, p->nptr, p->expected_errno, errno); | ||
| 15965 | - } | ||
| 15966 | - if (result != p->expected_result) { | ||
| 15967 | - failure_count++; | ||
| 15968 | - printf("test %d failed (input \"%s\"): expected result %" PRIu64 | ||
| 15969 | - ", got result %" PRIu64 "\n", | ||
| 15970 | - i, p->nptr, p->expected_result, result); | ||
| 15971 | - } | ||
| 15972 | - if (endptr - p->nptr != p->expected_end) { | ||
| 15973 | - failure_count++; | ||
| 15974 | - printf("test %d failed (input \"%s\"): expected end %d," | ||
| 15975 | - " got end %d\n", | ||
| 15976 | - i, p->nptr, p->expected_end, (int) (endptr - p->nptr)); | ||
| 15977 | - } | ||
| 15978 | - | ||
| 15979 | -#if HAVE_STRTOULL | ||
| 15980 | - errno = 0; | ||
| 15981 | - result = strtoull(p->nptr, &endptr, p->base); | ||
| 15982 | - if (errno != p->expected_errno) { | ||
| 15983 | - failure_count++; | ||
| 15984 | - printf("test %d (input \"%s\"): expected errno %d" | ||
| 15985 | - ", libc strtoull() returned errno %d\n", | ||
| 15986 | - i, p->nptr, p->expected_errno, errno); | ||
| 15987 | - } | ||
| 15988 | - if (result != p->expected_result) { | ||
| 15989 | - failure_count++; | ||
| 15990 | - printf("test %d (input \"%s\"): expected result %" PRIu64 | ||
| 15991 | - ", libc strtoull() returned result %" PRIu64 "\n", | ||
| 15992 | - i, p->nptr, p->expected_result, result); | ||
| 15993 | - } | ||
| 15994 | - if (endptr - p->nptr != p->expected_end) { | ||
| 15995 | - failure_count++; | ||
| 15996 | - printf("test %d (input \"%s\"): expected end %d," | ||
| 15997 | - " libc strtoull() returned end %d\n", | ||
| 15998 | - i, p->nptr, p->expected_end, (int) (endptr - p->nptr)); | ||
| 15999 | - } | ||
| 16000 | -#endif | ||
| 16001 | - } | ||
| 16002 | - if (failure_count == 0) | ||
| 16003 | - printf("All %d tests passed.\n", i); | ||
| 16004 | - return 0; | ||
| 16005 | -} | ||
| 16006 | - | ||
| 16007 | -#endif /* defined(STRTOULL_UNIT_TEST) */ | ||
| 16008 | - | ||
| 16009 | -/* | ||
| 16010 | - * Local variables: | ||
| 16011 | - * c-basic-offset: 4 | ||
| 16012 | - * indent-tabs-mode: nil | ||
| 16013 | - * compile-command: "gcc -Wall -Werror -DSTRTOULL_UNIT_TEST=1 -I../include -g -o strtoull-unit-test strtoull.c && ./strtoull-unit-test" | ||
| 16014 | - * End: | ||
| 16015 | - */ | ||
| 16016 | diff --git a/snmplib/system.c b/snmplib/system.c | ||
| 16017 | index cec6c34..1070bbf 100644 | ||
| 16018 | --- a/snmplib/system.c | ||
| 16019 | +++ b/snmplib/system.c | ||
| 16020 | @@ -184,6 +184,8 @@ SOFTWARE. | ||
| 16021 | #include <net-snmp/library/snmp_api.h> | ||
| 16022 | #include <net-snmp/library/read_config.h> /* for get_temp_file_pattern() */ | ||
| 16023 | |||
| 16024 | +#include "inet_ntop.h" | ||
| 16025 | + | ||
| 16026 | /* NetSNMP and DNSSEC-Tools both define FREE. We'll not use either here. */ | ||
| 16027 | #undef FREE | ||
| 16028 | |||
| 16029 | @@ -637,25 +639,19 @@ get_boottime(void) | ||
| 16030 | } | ||
| 16031 | #endif | ||
| 16032 | |||
| 16033 | -/* | ||
| 16034 | - * Returns uptime in centiseconds(!). | ||
| 16035 | +/** | ||
| 16036 | + * Returns the system uptime in centiseconds. | ||
| 16037 | + * | ||
| 16038 | + * @note The value returned by this function is not identical to sysUpTime | ||
| 16039 | + * defined in RFC 1213. get_uptime() returns the system uptime while | ||
| 16040 | + * sysUpTime represents the time that has elapsed since the most recent | ||
| 16041 | + * restart of the network manager (snmpd). | ||
| 16042 | + * | ||
| 16043 | + * @see See also netsnmp_get_agent_uptime(). | ||
| 16044 | */ | ||
| 16045 | long | ||
| 16046 | get_uptime(void) | ||
| 16047 | { | ||
| 16048 | -#if !defined(solaris2) && !defined(linux) && !defined(cygwin) && !defined(aix4) && !defined(aix5) && !defined(aix6) && !defined(aix7) | ||
| 16049 | - struct timeval now; | ||
| 16050 | - long boottime_csecs, nowtime_csecs; | ||
| 16051 | - | ||
| 16052 | - boottime_csecs = get_boottime(); | ||
| 16053 | - if (boottime_csecs == 0) | ||
| 16054 | - return 0; | ||
| 16055 | - gettimeofday(&now, (struct timezone *) 0); | ||
| 16056 | - nowtime_csecs = (now.tv_sec * 100) + (now.tv_usec / 10000); | ||
| 16057 | - | ||
| 16058 | - return (nowtime_csecs - boottime_csecs); | ||
| 16059 | -#endif | ||
| 16060 | - | ||
| 16061 | #if defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) | ||
| 16062 | struct nlist nl; | ||
| 16063 | int kmem; | ||
| 16064 | @@ -668,9 +664,7 @@ get_uptime(void) | ||
| 16065 | read(kmem, &lbolt, sizeof(lbolt)); | ||
| 16066 | close(kmem); | ||
| 16067 | return(lbolt); | ||
| 16068 | -#endif | ||
| 16069 | - | ||
| 16070 | -#ifdef solaris2 | ||
| 16071 | +#elif defined(solaris2) | ||
| 16072 | kstat_ctl_t *ksc = kstat_open(); | ||
| 16073 | kstat_t *ks; | ||
| 16074 | kid_t kid; | ||
| 16075 | @@ -695,9 +689,7 @@ get_uptime(void) | ||
| 16076 | kstat_close(ksc); | ||
| 16077 | } | ||
| 16078 | return lbolt; | ||
| 16079 | -#endif /* solaris2 */ | ||
| 16080 | - | ||
| 16081 | -#ifdef linux | ||
| 16082 | +#elif defined(linux) || defined(cygwin) | ||
| 16083 | FILE *in = fopen("/proc/uptime", "r"); | ||
| 16084 | long uptim = 0, a, b; | ||
| 16085 | if (in) { | ||
| 16086 | @@ -706,10 +698,17 @@ get_uptime(void) | ||
| 16087 | fclose(in); | ||
| 16088 | } | ||
| 16089 | return uptim; | ||
| 16090 | -#endif /* linux */ | ||
| 16091 | +#else | ||
| 16092 | + struct timeval now; | ||
| 16093 | + long boottime_csecs, nowtime_csecs; | ||
| 16094 | |||
| 16095 | -#ifdef cygwin | ||
| 16096 | - return (0); /* not implemented */ | ||
| 16097 | + boottime_csecs = get_boottime(); | ||
| 16098 | + if (boottime_csecs == 0) | ||
| 16099 | + return 0; | ||
| 16100 | + gettimeofday(&now, (struct timezone *) 0); | ||
| 16101 | + nowtime_csecs = (now.tv_sec * 100) + (now.tv_usec / 10000); | ||
| 16102 | + | ||
| 16103 | + return (nowtime_csecs - boottime_csecs); | ||
| 16104 | #endif | ||
| 16105 | } | ||
| 16106 | |||
| 16107 | @@ -928,22 +927,33 @@ netsnmp_gethostbyname(const char *name) | ||
| 16108 | #endif /* HAVE_GETHOSTBYNAME */ | ||
| 16109 | } | ||
| 16110 | |||
| 16111 | +/** | ||
| 16112 | + * Look up the host name via DNS. | ||
| 16113 | + * | ||
| 16114 | + * @param[in] addr Pointer to the address to resolve. This argument points e.g. | ||
| 16115 | + * to a struct in_addr for AF_INET or to a struct in6_addr for AF_INET6. | ||
| 16116 | + * @param[in] len Length in bytes of *addr. | ||
| 16117 | + * @param[in] type Address family, e.g. AF_INET or AF_INET6. | ||
| 16118 | + * | ||
| 16119 | + * @return Pointer to a hostent structure if address lookup succeeded or NULL | ||
| 16120 | + * if the lookup failed. | ||
| 16121 | + * | ||
| 16122 | + * @see See also the gethostbyaddr() man page. | ||
| 16123 | + */ | ||
| 16124 | struct hostent * | ||
| 16125 | netsnmp_gethostbyaddr(const void *addr, socklen_t len, int type) | ||
| 16126 | { | ||
| 16127 | #if HAVE_GETHOSTBYADDR | ||
| 16128 | struct hostent *hp = NULL; | ||
| 16129 | - struct sockaddr_in *saddr_in = | ||
| 16130 | - NETSNMP_REMOVE_CONST(struct sockaddr_in *,addr); | ||
| 16131 | + char buf[64]; | ||
| 16132 | |||
| 16133 | - DEBUGMSGTL(("dns:gethostbyaddr", "resolving { AF_INET, %s:%hu }\n", | ||
| 16134 | - inet_ntoa(saddr_in->sin_addr), ntohs(saddr_in->sin_port))); | ||
| 16135 | + DEBUGMSGTL(("dns:gethostbyaddr", "resolving %s\n", | ||
| 16136 | + inet_ntop(type, addr, buf, sizeof(buf)))); | ||
| 16137 | |||
| 16138 | #ifdef DNSSEC_LOCAL_VALIDATION | ||
| 16139 | val_status_t val_status; | ||
| 16140 | - hp = val_gethostbyaddr(netsnmp_validator_context(), | ||
| 16141 | - (const void*)&saddr_in->sin_addr, | ||
| 16142 | - sizeof(struct in_addr), AF_INET, &val_status); | ||
| 16143 | + hp = val_gethostbyaddr(netsnmp_validator_context(), addr, len, type, | ||
| 16144 | + &val_status); | ||
| 16145 | DEBUGMSGTL(("dns:sec:val", "val_status %d / %s; trusted: %d\n", | ||
| 16146 | val_status, p_val_status(val_status), | ||
| 16147 | val_istrusted(val_status))); | ||
| 16148 | @@ -959,8 +969,7 @@ netsnmp_gethostbyaddr(const void *addr, socklen_t len, int type) | ||
| 16149 | else if (val_does_not_exist(val_status) && hp) | ||
| 16150 | hp = NULL; | ||
| 16151 | #else | ||
| 16152 | - hp = gethostbyaddr((const void*) &saddr_in->sin_addr, | ||
| 16153 | - sizeof(struct in_addr), AF_INET); | ||
| 16154 | + hp = gethostbyaddr(addr, len, type); | ||
| 16155 | #endif | ||
| 16156 | if (hp == NULL) { | ||
| 16157 | DEBUGMSGTL(("dns:gethostbyaddr", "couldn't resolve addr\n")); | ||
| 16158 | @@ -1069,44 +1078,30 @@ setenv(const char *name, const char *value, int overwrite) | ||
| 16159 | } | ||
| 16160 | #endif /* HAVE_SETENV */ | ||
| 16161 | |||
| 16162 | -/* returns centiseconds */ | ||
| 16163 | netsnmp_feature_child_of(calculate_time_diff, netsnmp_unused) | ||
| 16164 | #ifndef NETSNMP_FEATURE_REMOVE_CALCULATE_TIME_DIFF | ||
| 16165 | +/** | ||
| 16166 | + * Compute (*now - *then) in centiseconds. | ||
| 16167 | + */ | ||
| 16168 | int | ||
| 16169 | calculate_time_diff(const struct timeval *now, const struct timeval *then) | ||
| 16170 | { | ||
| 16171 | - struct timeval tmp, diff; | ||
| 16172 | - memcpy(&tmp, now, sizeof(struct timeval)); | ||
| 16173 | - tmp.tv_sec--; | ||
| 16174 | - tmp.tv_usec += 1000000L; | ||
| 16175 | - diff.tv_sec = tmp.tv_sec - then->tv_sec; | ||
| 16176 | - diff.tv_usec = tmp.tv_usec - then->tv_usec; | ||
| 16177 | - if (diff.tv_usec > 1000000L) { | ||
| 16178 | - diff.tv_usec -= 1000000L; | ||
| 16179 | - diff.tv_sec++; | ||
| 16180 | - } | ||
| 16181 | + struct timeval diff; | ||
| 16182 | + | ||
| 16183 | + NETSNMP_TIMERSUB(now, then, &diff); | ||
| 16184 | return (int)(diff.tv_sec * 100 + diff.tv_usec / 10000); | ||
| 16185 | } | ||
| 16186 | #endif /* NETSNMP_FEATURE_REMOVE_CALCULATE_TIME_DIFF */ | ||
| 16187 | |||
| 16188 | #ifndef NETSNMP_FEATURE_REMOVE_CALCULATE_SECTIME_DIFF | ||
| 16189 | -/* returns diff in rounded seconds */ | ||
| 16190 | +/** Compute rounded (*now - *then) in seconds. */ | ||
| 16191 | u_int | ||
| 16192 | calculate_sectime_diff(const struct timeval *now, const struct timeval *then) | ||
| 16193 | { | ||
| 16194 | - struct timeval tmp, diff; | ||
| 16195 | - memcpy(&tmp, now, sizeof(struct timeval)); | ||
| 16196 | - tmp.tv_sec--; | ||
| 16197 | - tmp.tv_usec += 1000000L; | ||
| 16198 | - diff.tv_sec = tmp.tv_sec - then->tv_sec; | ||
| 16199 | - diff.tv_usec = tmp.tv_usec - then->tv_usec; | ||
| 16200 | - if (diff.tv_usec >= 1000000L) { | ||
| 16201 | - diff.tv_usec -= 1000000L; | ||
| 16202 | - diff.tv_sec++; | ||
| 16203 | - } | ||
| 16204 | - if (diff.tv_usec >= 500000L) | ||
| 16205 | - return (u_int)(diff.tv_sec + 1); | ||
| 16206 | - return (u_int)(diff.tv_sec); | ||
| 16207 | + struct timeval diff; | ||
| 16208 | + | ||
| 16209 | + NETSNMP_TIMERSUB(now, then, &diff); | ||
| 16210 | + return diff.tv_sec + (diff.tv_usec >= 500000L); | ||
| 16211 | } | ||
| 16212 | #endif /* NETSNMP_FEATURE_REMOVE_CALCULATE_SECTIME_DIFF */ | ||
| 16213 | |||
| 16214 | @@ -1171,8 +1166,17 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) | ||
| 16215 | struct stat sbuf; | ||
| 16216 | char *ourcopy = strdup(pathname); | ||
| 16217 | char *entry; | ||
| 16218 | - char buf[SNMP_MAXPATH]; | ||
| 16219 | + char *buf = NULL; | ||
| 16220 | char *st = NULL; | ||
| 16221 | + int res; | ||
| 16222 | + | ||
| 16223 | + res = SNMPERR_GENERR; | ||
| 16224 | + if (!ourcopy) | ||
| 16225 | + goto out; | ||
| 16226 | + | ||
| 16227 | + buf = malloc(strlen(pathname) + 2); | ||
| 16228 | + if (!buf) | ||
| 16229 | + goto out; | ||
| 16230 | |||
| 16231 | #if defined (WIN32) || defined (cygwin) | ||
| 16232 | /* convert backslash to forward slash */ | ||
| 16233 | @@ -1215,12 +1219,9 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) | ||
| 16234 | #else | ||
| 16235 | if (mkdir(buf, mode) == -1) | ||
| 16236 | #endif | ||
| 16237 | - { | ||
| 16238 | - free(ourcopy); | ||
| 16239 | - return SNMPERR_GENERR; | ||
| 16240 | - } else { | ||
| 16241 | + goto out; | ||
| 16242 | + else | ||
| 16243 | snmp_log(LOG_INFO, "Created directory: %s\n", buf); | ||
| 16244 | - } | ||
| 16245 | } else { | ||
| 16246 | /* | ||
| 16247 | * exists, is it a file? | ||
| 16248 | @@ -1229,13 +1230,15 @@ mkdirhier(const char *pathname, mode_t mode, int skiplast) | ||
| 16249 | /* | ||
| 16250 | * ack! can't make a directory on top of a file | ||
| 16251 | */ | ||
| 16252 | - free(ourcopy); | ||
| 16253 | - return SNMPERR_GENERR; | ||
| 16254 | + goto out; | ||
| 16255 | } | ||
| 16256 | } | ||
| 16257 | } | ||
| 16258 | + res = SNMPERR_SUCCESS; | ||
| 16259 | +out: | ||
| 16260 | + free(buf); | ||
| 16261 | free(ourcopy); | ||
| 16262 | - return SNMPERR_SUCCESS; | ||
| 16263 | + return res; | ||
| 16264 | } | ||
| 16265 | |||
| 16266 | /** | ||
| 16267 | @@ -1254,9 +1257,14 @@ netsnmp_mktemp(void) | ||
| 16268 | #endif | ||
| 16269 | int fd = -1; | ||
| 16270 | |||
| 16271 | - strcpy(name, get_temp_file_pattern()); | ||
| 16272 | + strlcpy(name, get_temp_file_pattern(), sizeof(name)); | ||
| 16273 | #ifdef HAVE_MKSTEMP | ||
| 16274 | - fd = mkstemp(name); | ||
| 16275 | + { | ||
| 16276 | + mode_t oldmask = umask(~(S_IRUSR | S_IWUSR)); | ||
| 16277 | + netsnmp_assert(oldmask != -1); | ||
| 16278 | + fd = mkstemp(name); | ||
| 16279 | + umask(oldmask); | ||
| 16280 | + } | ||
| 16281 | #else | ||
| 16282 | if (mktemp(name)) { | ||
| 16283 | # ifndef WIN32 | ||
| 16284 | @@ -1353,6 +1361,15 @@ netsnmp_os_kernel_width(void) | ||
| 16285 | |||
| 16286 | netsnmp_feature_child_of(str_to_uid, user_information) | ||
| 16287 | #ifndef NETSNMP_FEATURE_REMOVE_STR_TO_UID | ||
| 16288 | +/** | ||
| 16289 | + * Convert a user name or number into numeric form. | ||
| 16290 | + * | ||
| 16291 | + * @param[in] useroruid Either a Unix user name or the ASCII representation | ||
| 16292 | + * of a user number. | ||
| 16293 | + * | ||
| 16294 | + * @return Either a user number > 0 or 0 if useroruid is not a valid user | ||
| 16295 | + * name, not a valid user number or the name of the root user. | ||
| 16296 | + */ | ||
| 16297 | int netsnmp_str_to_uid(const char *useroruid) { | ||
| 16298 | int uid; | ||
| 16299 | #if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 16300 | @@ -1361,13 +1378,13 @@ int netsnmp_str_to_uid(const char *useroruid) { | ||
| 16301 | |||
| 16302 | uid = atoi(useroruid); | ||
| 16303 | |||
| 16304 | - if ( uid == 0 ) { | ||
| 16305 | + if (uid == 0) { | ||
| 16306 | #if HAVE_GETPWNAM && HAVE_PWD_H | ||
| 16307 | - pwd = getpwnam( useroruid ); | ||
| 16308 | - if (pwd) | ||
| 16309 | - uid = pwd->pw_uid; | ||
| 16310 | - else | ||
| 16311 | + pwd = getpwnam(useroruid); | ||
| 16312 | + uid = pwd ? pwd->pw_uid : 0; | ||
| 16313 | + endpwent(); | ||
| 16314 | #endif | ||
| 16315 | + if (uid == 0) | ||
| 16316 | snmp_log(LOG_WARNING, "Can't identify user (%s).\n", useroruid); | ||
| 16317 | } | ||
| 16318 | return uid; | ||
| 16319 | @@ -1377,23 +1394,31 @@ int netsnmp_str_to_uid(const char *useroruid) { | ||
| 16320 | |||
| 16321 | netsnmp_feature_child_of(str_to_gid, user_information) | ||
| 16322 | #ifndef NETSNMP_FEATURE_REMOVE_STR_TO_GID | ||
| 16323 | -int netsnmp_str_to_gid(const char *grouporgid) { | ||
| 16324 | +/** | ||
| 16325 | + * Convert a group name or number into numeric form. | ||
| 16326 | + * | ||
| 16327 | + * @param[in] grouporgid Either a Unix group name or the ASCII representation | ||
| 16328 | + * of a group number. | ||
| 16329 | + * | ||
| 16330 | + * @return Either a group number > 0 or 0 if grouporgid is not a valid group | ||
| 16331 | + * name, not a valid group number or the root group. | ||
| 16332 | + */ | ||
| 16333 | +int netsnmp_str_to_gid(const char *grouporgid) | ||
| 16334 | +{ | ||
| 16335 | int gid; | ||
| 16336 | -#if HAVE_GETGRNAM && HAVE_GRP_H | ||
| 16337 | - struct group *grp; | ||
| 16338 | -#endif | ||
| 16339 | |||
| 16340 | gid = atoi(grouporgid); | ||
| 16341 | |||
| 16342 | - if ( gid == 0 ) { | ||
| 16343 | + if (gid == 0) { | ||
| 16344 | #if HAVE_GETGRNAM && HAVE_GRP_H | ||
| 16345 | - grp = getgrnam( grouporgid ); | ||
| 16346 | - if (grp) | ||
| 16347 | - gid = grp->gr_gid; | ||
| 16348 | - else | ||
| 16349 | + struct group *grp; | ||
| 16350 | + | ||
| 16351 | + grp = getgrnam(grouporgid); | ||
| 16352 | + gid = grp ? grp->gr_gid : 0; | ||
| 16353 | + endgrent(); | ||
| 16354 | #endif | ||
| 16355 | - snmp_log(LOG_WARNING, "Can't identify group (%s).\n", | ||
| 16356 | - grouporgid); | ||
| 16357 | + if (gid == 0) | ||
| 16358 | + snmp_log(LOG_WARNING, "Can't identify group (%s).\n", grouporgid); | ||
| 16359 | } | ||
| 16360 | |||
| 16361 | return gid; | ||
| 16362 | diff --git a/snmplib/test_binary_array.c b/snmplib/test_binary_array.c | ||
| 16363 | deleted file mode 100644 | ||
| 16364 | index 44b1f0e..0000000 | ||
| 16365 | --- a/snmplib/test_binary_array.c | ||
| 16366 | +++ /dev/null | ||
| 16367 | @@ -1,171 +0,0 @@ | ||
| 16368 | -#include <net-snmp/net-snmp-config.h> | ||
| 16369 | - | ||
| 16370 | -#if HAVE_IO_H | ||
| 16371 | -#include <io.h> | ||
| 16372 | -#endif | ||
| 16373 | -#include <stdio.h> | ||
| 16374 | -#if HAVE_STDLIB_H | ||
| 16375 | -#include <stdlib.h> | ||
| 16376 | -#endif | ||
| 16377 | -#if HAVE_MALLOC_H | ||
| 16378 | -#include <malloc.h> | ||
| 16379 | -#endif | ||
| 16380 | -#include <sys/types.h> | ||
| 16381 | -#if HAVE_STRING_H | ||
| 16382 | -#include <string.h> | ||
| 16383 | -#else | ||
| 16384 | -#include <strings.h> | ||
| 16385 | -#endif | ||
| 16386 | - | ||
| 16387 | -#include <net-snmp/net-snmp-includes.h> | ||
| 16388 | -#include <net-snmp/types.h> | ||
| 16389 | -#include <net-snmp/library/snmp_api.h> | ||
| 16390 | -#include <net-snmp/library/container.h> | ||
| 16391 | -#include <net-snmp/library/container_binary_array.h> | ||
| 16392 | -#include <net-snmp/library/tools.h> | ||
| 16393 | -#include <net-snmp/library/snmp_assert.h> | ||
| 16394 | - | ||
| 16395 | -#define TEST_SIZE 7 | ||
| 16396 | - | ||
| 16397 | -void | ||
| 16398 | -print_int(netsnmp_index *i, void *v) | ||
| 16399 | -{ | ||
| 16400 | - printf("item %p = %ld\n", i, i->oids[0]); | ||
| 16401 | -} | ||
| 16402 | - | ||
| 16403 | -int | ||
| 16404 | -test_int(void) | ||
| 16405 | -{ | ||
| 16406 | - oid o1 = 1; | ||
| 16407 | - oid o2 = 2; | ||
| 16408 | - oid o3 = 6; | ||
| 16409 | - oid o4 = 8; | ||
| 16410 | - oid o5 = 9; | ||
| 16411 | - oid ox = 7; | ||
| 16412 | - oid oy = 10; | ||
| 16413 | - netsnmp_index i1,i2,i3,i4,i5,ix,iy, *ip; | ||
| 16414 | - netsnmp_index *a[TEST_SIZE] = { &i1, &i2, &i3, &ix, &i4, &i5, &iy }; | ||
| 16415 | - netsnmp_container *c = netsnmp_container_get_binary_array(); | ||
| 16416 | - int i; | ||
| 16417 | - | ||
| 16418 | - c->compare = netsnmp_compare_netsnmp_index; | ||
| 16419 | - | ||
| 16420 | - i1.oids = &o1; | ||
| 16421 | - i2.oids = &o2; | ||
| 16422 | - i3.oids = &o3; | ||
| 16423 | - i4.oids = &o4; | ||
| 16424 | - i5.oids = &o5; | ||
| 16425 | - ix.oids = &ox; | ||
| 16426 | - iy.oids = &oy; | ||
| 16427 | - i1.len = i2.len = i3.len = i4.len = i5.len = ix.len = iy.len = 1; | ||
| 16428 | - | ||
| 16429 | - printf("Creating container...\n"); | ||
| 16430 | - | ||
| 16431 | - printf("Inserting data...\n"); | ||
| 16432 | - CONTAINER_INSERT(c,&i4); | ||
| 16433 | - CONTAINER_INSERT(c,&i2); | ||
| 16434 | - CONTAINER_INSERT(c,&i3); | ||
| 16435 | - CONTAINER_INSERT(c,&i1); | ||
| 16436 | - CONTAINER_INSERT(c,&i5); | ||
| 16437 | - | ||
| 16438 | - printf("For each...\n"); | ||
| 16439 | - CONTAINER_FOR_EACH(c, print_int, NULL); | ||
| 16440 | - printf("Done.\n"); | ||
| 16441 | - | ||
| 16442 | - printf("\n"); | ||
| 16443 | - ip = CONTAINER_FIRST(c); | ||
| 16444 | - printf("Find first = %p %ld\n",ip, ip->oids[0]); | ||
| 16445 | - while( ip ) { | ||
| 16446 | - ip = CONTAINER_NEXT(c,ip); | ||
| 16447 | - if(ip) | ||
| 16448 | - printf("Find next = %p %ld\n",ip, ip->oids[0]); | ||
| 16449 | - else | ||
| 16450 | - printf("Find next = %s\n",ip); | ||
| 16451 | - } | ||
| 16452 | - | ||
| 16453 | - for( i=0; i < TEST_SIZE; ++i) { | ||
| 16454 | - printf("\n"); | ||
| 16455 | - ip = CONTAINER_FIND(c,a[i]); | ||
| 16456 | - printf("Find %ld = %p %ld\n", a[i]->oids[0], ip, ip ? ip->oids[0] : 0); | ||
| 16457 | - ip = CONTAINER_NEXT(c,a[i]); | ||
| 16458 | - printf("Next %ld = %p %ld\n", a[i]->oids[0], ip, ip ? ip->oids[0] : 0); | ||
| 16459 | - } | ||
| 16460 | - | ||
| 16461 | - printf("Done.\n"); | ||
| 16462 | - | ||
| 16463 | - return 0; | ||
| 16464 | -} | ||
| 16465 | - | ||
| 16466 | -void | ||
| 16467 | -print_string(char *i, void *v) | ||
| 16468 | -{ | ||
| 16469 | - printf("item %s\n", i); | ||
| 16470 | -} | ||
| 16471 | - | ||
| 16472 | -int | ||
| 16473 | -my_strcmp(char *lhs, char *rhs) | ||
| 16474 | -{ | ||
| 16475 | - int rc = strcmp(lhs,rhs); | ||
| 16476 | -/* printf("%s %d %s\n",lhs, rc, rhs); */ | ||
| 16477 | - return rc; | ||
| 16478 | -} | ||
| 16479 | - | ||
| 16480 | -int | ||
| 16481 | -test_string() | ||
| 16482 | -{ | ||
| 16483 | - const char *o1 = "zebra"; | ||
| 16484 | - const char *o2 = "b-two"; | ||
| 16485 | - const char *o3 = "b"; | ||
| 16486 | - const char *o4 = "cedar"; | ||
| 16487 | - const char *o5 = "alpha"; | ||
| 16488 | - const char *ox = "dev"; | ||
| 16489 | - const char *oy = "aa"; | ||
| 16490 | - const char * ip; | ||
| 16491 | - | ||
| 16492 | - const char *a[TEST_SIZE] = { o1, o2, o3, ox, o4, o5, oy }; | ||
| 16493 | - netsnmp_container *c = netsnmp_container_get_binary_array(); | ||
| 16494 | - int i; | ||
| 16495 | - | ||
| 16496 | - c->compare = my_strcmp; | ||
| 16497 | - | ||
| 16498 | - printf("Creating container...\n"); | ||
| 16499 | - | ||
| 16500 | - printf("Inserting data...\n"); | ||
| 16501 | - CONTAINER_INSERT(c,o4); | ||
| 16502 | - CONTAINER_INSERT(c,o2); | ||
| 16503 | - CONTAINER_INSERT(c,o3); | ||
| 16504 | - CONTAINER_INSERT(c,o1); | ||
| 16505 | - CONTAINER_INSERT(c,o5); | ||
| 16506 | - printf("\n"); | ||
| 16507 | - printf("For each...\n"); | ||
| 16508 | - CONTAINER_FOR_EACH(c, print_string, NULL); | ||
| 16509 | - printf("Done.\n"); | ||
| 16510 | - | ||
| 16511 | - printf("\n"); | ||
| 16512 | - ip = CONTAINER_FIRST(c); | ||
| 16513 | - printf("Find first = %s\n",ip); | ||
| 16514 | - while( ip ) { | ||
| 16515 | - ip = CONTAINER_NEXT(c,ip); | ||
| 16516 | - printf("Find next = %s\n",ip); | ||
| 16517 | - } | ||
| 16518 | - | ||
| 16519 | - for( i=0; i < TEST_SIZE; ++i) { | ||
| 16520 | - printf("\n"); | ||
| 16521 | - ip = CONTAINER_FIND(c,a[i]); | ||
| 16522 | - printf("Find %s = %s\n", a[i], ip); | ||
| 16523 | - ip = CONTAINER_NEXT(c,a[i]); | ||
| 16524 | - printf("Next %s = %s\n", a[i], ip); | ||
| 16525 | - } | ||
| 16526 | - | ||
| 16527 | - printf("Done.\n"); | ||
| 16528 | - | ||
| 16529 | - return 0; | ||
| 16530 | -} | ||
| 16531 | - | ||
| 16532 | -int | ||
| 16533 | -main(int argc, char** argv) | ||
| 16534 | -{ | ||
| 16535 | - | ||
| 16536 | - test_int(); | ||
| 16537 | - test_string(); | ||
| 16538 | -} | ||
| 16539 | diff --git a/snmplib/tools.c b/snmplib/tools.c | ||
| 16540 | index 676f36c..b2be790 100644 | ||
| 16541 | --- a/snmplib/tools.c | ||
| 16542 | +++ b/snmplib/tools.c | ||
| 16543 | @@ -613,7 +613,7 @@ void | ||
| 16544 | dump_chunk(const char *debugtoken, const char *title, const u_char * buf, | ||
| 16545 | int size) | ||
| 16546 | { | ||
| 16547 | - u_int printunit = 64; /* XXX Make global. */ | ||
| 16548 | + int printunit = 64; /* XXX Make global. */ | ||
| 16549 | char chunk[SNMP_MAXBUF], *s, *sp; | ||
| 16550 | |||
| 16551 | if (title && (*title != '\0')) { | ||
| 16552 | @@ -626,8 +626,8 @@ dump_chunk(const char *debugtoken, const char *title, const u_char * buf, | ||
| 16553 | sp = s; | ||
| 16554 | |||
| 16555 | while (size > 0) { | ||
| 16556 | - if (size > (int) printunit) { | ||
| 16557 | - strncpy(chunk, sp, printunit); | ||
| 16558 | + if (size > printunit) { | ||
| 16559 | + memcpy(chunk, sp, printunit); | ||
| 16560 | chunk[printunit] = '\0'; | ||
| 16561 | DEBUGMSGTL((debugtoken, "\t%s\n", chunk)); | ||
| 16562 | } else { | ||
| 16563 | @@ -803,15 +803,10 @@ dump_snmpEngineID(const u_char * estring, size_t * estring_len) | ||
| 16564 | |||
| 16565 | case 4: /* Text. */ | ||
| 16566 | |||
| 16567 | - /* | ||
| 16568 | - * Doesn't exist on all (many) architectures | ||
| 16569 | - */ | ||
| 16570 | - /* | ||
| 16571 | - * s += snprintf(s, remaining_len+3, "\"%s\"", esp); | ||
| 16572 | - */ | ||
| 16573 | - s += sprintf(s, "\"%.*s\"", sizeof(buf)-strlen(buf)-3, esp); | ||
| 16574 | + s += sprintf(s, "\"%.*s\"", (int) (sizeof(buf)-strlen(buf)-3), esp); | ||
| 16575 | goto dump_snmpEngineID_quit; | ||
| 16576 | break; | ||
| 16577 | + | ||
| 16578 | /*NOTREACHED*/ case 5: /* Octets. */ | ||
| 16579 | |||
| 16580 | snprint_hexstring(s, (SNMP_MAXBUF - (s-buf)), | ||
| 16581 | @@ -820,6 +815,7 @@ dump_snmpEngineID(const u_char * estring, size_t * estring_len) | ||
| 16582 | s -= 1; | ||
| 16583 | goto dump_snmpEngineID_quit; | ||
| 16584 | break; | ||
| 16585 | + | ||
| 16586 | /*NOTREACHED*/ dump_snmpEngineID_violation: | ||
| 16587 | case 0: /* Violation of RESERVED, | ||
| 16588 | * * -OR- of expected length. | ||
| 16589 | @@ -941,11 +937,11 @@ uatime_hdiff(const_marker_t first, const_marker_t second) | ||
| 16590 | } | ||
| 16591 | |||
| 16592 | /** | ||
| 16593 | - * Test: Has (marked time plus delta) exceeded current time (in msec) ? | ||
| 16594 | + * Test: Has (marked time plus delta) exceeded current time ? | ||
| 16595 | * Returns 0 if test fails or cannot be tested (no marker). | ||
| 16596 | */ | ||
| 16597 | int | ||
| 16598 | -atime_ready(const_marker_t pm, int deltaT) | ||
| 16599 | +atime_ready(const_marker_t pm, int delta_ms) | ||
| 16600 | { | ||
| 16601 | marker_t now; | ||
| 16602 | long diff; | ||
| 16603 | @@ -956,19 +952,19 @@ atime_ready(const_marker_t pm, int deltaT) | ||
| 16604 | |||
| 16605 | diff = atime_diff(pm, now); | ||
| 16606 | free(now); | ||
| 16607 | - if (diff < deltaT) | ||
| 16608 | + if (diff < delta_ms) | ||
| 16609 | return 0; | ||
| 16610 | |||
| 16611 | return 1; | ||
| 16612 | } | ||
| 16613 | |||
| 16614 | +#ifndef NETSNMP_FEATURE_REMOVE_UATIME_READY | ||
| 16615 | /** | ||
| 16616 | - * Test: Has (marked time plus delta) exceeded current time (in msec) ? | ||
| 16617 | + * Test: Has (marked time plus delta) exceeded current time ? | ||
| 16618 | * Returns 0 if test fails or cannot be tested (no marker). | ||
| 16619 | */ | ||
| 16620 | -#ifndef NETSNMP_FEATURE_REMOVE_UATIME_READY | ||
| 16621 | int | ||
| 16622 | -uatime_ready(const_marker_t pm, unsigned int deltaT) | ||
| 16623 | +uatime_ready(const_marker_t pm, unsigned int delta_ms) | ||
| 16624 | { | ||
| 16625 | marker_t now; | ||
| 16626 | u_long diff; | ||
| 16627 | @@ -979,7 +975,7 @@ uatime_ready(const_marker_t pm, unsigned int deltaT) | ||
| 16628 | |||
| 16629 | diff = uatime_diff(pm, now); | ||
| 16630 | free(now); | ||
| 16631 | - if (diff < deltaT) | ||
| 16632 | + if (diff < delta_ms) | ||
| 16633 | return 0; | ||
| 16634 | |||
| 16635 | return 1; | ||
| 16636 | diff --git a/snmplib/transports/snmpAAL5PVCDomain.c b/snmplib/transports/snmpAAL5PVCDomain.c | ||
| 16637 | index f6684f0..5ac69a1 100644 | ||
| 16638 | --- a/snmplib/transports/snmpAAL5PVCDomain.c | ||
| 16639 | +++ b/snmplib/transports/snmpAAL5PVCDomain.c | ||
| 16640 | @@ -32,6 +32,7 @@ | ||
| 16641 | #include <net-snmp/config_api.h> | ||
| 16642 | |||
| 16643 | #include <net-snmp/library/snmp_transport.h> | ||
| 16644 | +#include <net-snmp/library/tools.h> | ||
| 16645 | |||
| 16646 | |||
| 16647 | oid netsnmp_AAL5PVCDomain[10] = { NETSNMP_ENTERPRISE_MIB, 3, 3, 3 }; | ||
| 16648 | @@ -87,11 +88,13 @@ netsnmp_aal5pvc_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16649 | } | ||
| 16650 | |||
| 16651 | if (rc >= 0) { | ||
| 16652 | - char *str = netsnmp_aal5pvc_fmtaddr(t, NULL, 0); | ||
| 16653 | - DEBUGMSGTL(("netsnmp_aal5pvc", | ||
| 16654 | - "recv on fd %d got %d bytes (from %s)\n", t->sock, | ||
| 16655 | - rc, str)); | ||
| 16656 | - free(str); | ||
| 16657 | + DEBUGIF("netsnmp_aal5pvc") { | ||
| 16658 | + char *str = netsnmp_aal5pvc_fmtaddr(t, NULL, 0); | ||
| 16659 | + DEBUGMSGTL(("netsnmp_aal5pvc", | ||
| 16660 | + "recv on fd %d got %d bytes (from %s)\n", t->sock, | ||
| 16661 | + rc, str)); | ||
| 16662 | + free(str); | ||
| 16663 | + } | ||
| 16664 | } else { | ||
| 16665 | DEBUGMSGTL(("netsnmp_aal5pvc", "recv on fd %d err %d (\"%s\")\n", | ||
| 16666 | t->sock, errno, strerror(errno))); | ||
| 16667 | @@ -120,11 +123,14 @@ netsnmp_aal5pvc_send(netsnmp_transport *t, void *buf, int size, | ||
| 16668 | } | ||
| 16669 | |||
| 16670 | if (to != NULL && t != NULL && t->sock >= 0) { | ||
| 16671 | - char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *)to, | ||
| 16672 | - sizeof(struct sockaddr_atmpvc)); | ||
| 16673 | - DEBUGMSGTL(("netsnmp_aal5pvc","send %d bytes from %p to %s on fd %d\n", | ||
| 16674 | - size, buf, str, t->sock)); | ||
| 16675 | - free(str); | ||
| 16676 | + DEBUGIF("netsnmp_aal5pvc") { | ||
| 16677 | + char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *)to, | ||
| 16678 | + sizeof(struct sockaddr_atmpvc)); | ||
| 16679 | + DEBUGMSGTL(("netsnmp_aal5pvc", | ||
| 16680 | + "send %d bytes from %p to %s on fd %d\n", | ||
| 16681 | + size, buf, str, t->sock)); | ||
| 16682 | + free(str); | ||
| 16683 | + } | ||
| 16684 | while (rc < 0) { | ||
| 16685 | rc = sendto(t->sock, buf, size, 0, NULL, 0); | ||
| 16686 | if (rc < 0 && errno != EINTR) { | ||
| 16687 | @@ -165,8 +171,6 @@ netsnmp_aal5pvc_close(netsnmp_transport *t) | ||
| 16688 | netsnmp_transport * | ||
| 16689 | netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) | ||
| 16690 | { | ||
| 16691 | - char *str = NULL; | ||
| 16692 | - struct atm_qos qos; | ||
| 16693 | netsnmp_transport *t = NULL; | ||
| 16694 | |||
| 16695 | #ifdef NETSNMP_NO_LISTEN_SUPPORT | ||
| 16696 | @@ -178,18 +182,18 @@ netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) | ||
| 16697 | return NULL; | ||
| 16698 | } | ||
| 16699 | |||
| 16700 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 16701 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 16702 | if (t == NULL) { | ||
| 16703 | return NULL; | ||
| 16704 | } | ||
| 16705 | |||
| 16706 | - str = netsnmp_aal5pvc_fmtaddr(NULL, (void *) addr, | ||
| 16707 | - sizeof(struct sockaddr_atmpvc)); | ||
| 16708 | - DEBUGMSGTL(("netsnmp_aal5pvc", "open %s %s\n", local ? "local" : "remote", | ||
| 16709 | - str)); | ||
| 16710 | - free(str); | ||
| 16711 | - | ||
| 16712 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 16713 | + DEBUGIF("netsnmp_aal5pvc") { | ||
| 16714 | + char *str = netsnmp_aal5pvc_fmtaddr(NULL, (void *) addr, | ||
| 16715 | + sizeof(struct sockaddr_atmpvc)); | ||
| 16716 | + DEBUGMSGTL(("netsnmp_aal5pvc", "open %s %s\n", | ||
| 16717 | + local ? "local" : "remote", str)); | ||
| 16718 | + free(str); | ||
| 16719 | + } | ||
| 16720 | |||
| 16721 | t->domain = netsnmp_AAL5PVCDomain; | ||
| 16722 | t->domain_length = | ||
| 16723 | @@ -203,22 +207,24 @@ netsnmp_aal5pvc_transport(struct sockaddr_atmpvc *addr, int local) | ||
| 16724 | } | ||
| 16725 | DEBUGMSGTL(("netsnmp_aal5pvc", "fd %d opened\n", t->sock)); | ||
| 16726 | |||
| 16727 | - /* | ||
| 16728 | - * Set up the QOS parameters. | ||
| 16729 | - */ | ||
| 16730 | + { | ||
| 16731 | + /* | ||
| 16732 | + * Set up the QOS parameters. | ||
| 16733 | + */ | ||
| 16734 | |||
| 16735 | - memset(&qos, 0, sizeof(struct atm_qos)); | ||
| 16736 | - qos.aal = ATM_AAL5; | ||
| 16737 | - qos.rxtp.traffic_class = ATM_UBR; | ||
| 16738 | - qos.rxtp.max_sdu = SNMP_MAX_LEN; /* Hmm -- this is a bit small? */ | ||
| 16739 | - qos.txtp = qos.rxtp; | ||
| 16740 | + struct atm_qos qos = { 0 }; | ||
| 16741 | + qos.aal = ATM_AAL5; | ||
| 16742 | + qos.rxtp.traffic_class = ATM_UBR; | ||
| 16743 | + qos.rxtp.max_sdu = SNMP_MAX_LEN; /* Hmm -- this is a bit small? */ | ||
| 16744 | + qos.txtp = qos.rxtp; | ||
| 16745 | |||
| 16746 | - if (setsockopt(t->sock, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0) { | ||
| 16747 | - DEBUGMSGTL(("netsnmp_aal5pvc", "setsockopt failed (%s)\n", | ||
| 16748 | - strerror(errno))); | ||
| 16749 | - netsnmp_aal5pvc_close(t); | ||
| 16750 | - netsnmp_transport_free(t); | ||
| 16751 | - return NULL; | ||
| 16752 | + if (setsockopt(t->sock, SOL_ATM, SO_ATMQOS, &qos, sizeof(qos)) < 0) { | ||
| 16753 | + DEBUGMSGTL(("netsnmp_aal5pvc", "setsockopt failed (%s)\n", | ||
| 16754 | + strerror(errno))); | ||
| 16755 | + netsnmp_aal5pvc_close(t); | ||
| 16756 | + netsnmp_transport_free(t); | ||
| 16757 | + return NULL; | ||
| 16758 | + } | ||
| 16759 | } | ||
| 16760 | |||
| 16761 | if (local) { | ||
| 16762 | diff --git a/snmplib/transports/snmpCallbackDomain.c b/snmplib/transports/snmpCallbackDomain.c | ||
| 16763 | index e487f28..95018b8 100644 | ||
| 16764 | --- a/snmplib/transports/snmpCallbackDomain.c | ||
| 16765 | +++ b/snmplib/transports/snmpCallbackDomain.c | ||
| 16766 | @@ -353,7 +353,7 @@ netsnmp_callback_accept(netsnmp_transport *t) | ||
| 16767 | { | ||
| 16768 | DEBUGMSGTL(("transport_callback", "hook_accept enter\n")); | ||
| 16769 | DEBUGMSGTL(("transport_callback", "hook_accept exit\n")); | ||
| 16770 | - return 0; | ||
| 16771 | + return -1; | ||
| 16772 | } | ||
| 16773 | |||
| 16774 | |||
| 16775 | @@ -385,8 +385,10 @@ netsnmp_callback_transport(int to) | ||
| 16776 | * our stuff | ||
| 16777 | */ | ||
| 16778 | mydata = SNMP_MALLOC_TYPEDEF(netsnmp_callback_info); | ||
| 16779 | - if (!mydata) | ||
| 16780 | + if (!mydata) { | ||
| 16781 | + SNMP_FREE(t); | ||
| 16782 | return NULL; | ||
| 16783 | + } | ||
| 16784 | mydata->linkedto = to; | ||
| 16785 | mydata->callback_num = ++callback_count; | ||
| 16786 | mydata->data = NULL; | ||
| 16787 | diff --git a/snmplib/transports/snmpDTLSUDPDomain.c b/snmplib/transports/snmpDTLSUDPDomain.c | ||
| 16788 | index fcbc5a2..9c56d19 100644 | ||
| 16789 | --- a/snmplib/transports/snmpDTLSUDPDomain.c | ||
| 16790 | +++ b/snmplib/transports/snmpDTLSUDPDomain.c | ||
| 16791 | @@ -231,8 +231,10 @@ start_new_cached_connection(netsnmp_transport *t, | ||
| 16792 | return NULL; | ||
| 16793 | |||
| 16794 | /* allocate our TLS specific data */ | ||
| 16795 | - if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, !we_are_client))) | ||
| 16796 | + if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, !we_are_client))) { | ||
| 16797 | + SNMP_FREE(cachep); | ||
| 16798 | return NULL; | ||
| 16799 | + } | ||
| 16800 | cachep->tlsdata = tlsdata; | ||
| 16801 | |||
| 16802 | /* RFC5953: section 5.3.1, step 1: | ||
| 16803 | @@ -427,7 +429,7 @@ _extract_addr_pair(netsnmp_transport *t, void *opaque, int olen) | ||
| 16804 | |||
| 16805 | if (opaque && olen == sizeof(netsnmp_tmStateReference)) { | ||
| 16806 | netsnmp_tmStateReference *tmStateRef = | ||
| 16807 | - tmStateRef = (netsnmp_tmStateReference *) opaque; | ||
| 16808 | + (netsnmp_tmStateReference *) opaque; | ||
| 16809 | |||
| 16810 | if (tmStateRef->have_addresses) | ||
| 16811 | addr_pair = &(tmStateRef->addresses); | ||
| 16812 | @@ -817,6 +819,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16813 | DEBUGMSGTL(("dtlsudp", "peer disconnected\n")); | ||
| 16814 | cachep->flags |= NETSNMP_BIO_DISCONNECTED; | ||
| 16815 | remove_and_free_bio_cache(cachep); | ||
| 16816 | + SNMP_FREE(tmStateRef); | ||
| 16817 | return rc; | ||
| 16818 | } | ||
| 16819 | cachep->flags |= NETSNMP_BIO_CONNECTED; | ||
| 16820 | @@ -913,6 +916,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16821 | /* XXX: probably need to check for whether we should | ||
| 16822 | send stuff from our end to continue the transaction | ||
| 16823 | */ | ||
| 16824 | + SNMP_FREE(tmStateRef); | ||
| 16825 | return -1; | ||
| 16826 | } else { | ||
| 16827 | /* XXX: free needed memory */ | ||
| 16828 | @@ -922,6 +926,7 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16829 | /* Step 5 says these are always incremented */ | ||
| 16830 | snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONINVALIDSERVERCERTIFICATES); | ||
| 16831 | snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONOPENERRORS); | ||
| 16832 | + SNMP_FREE(tmStateRef); | ||
| 16833 | return -1; | ||
| 16834 | } | ||
| 16835 | } | ||
| 16836 | @@ -939,12 +944,14 @@ netsnmp_dtlsudp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16837 | /* XXX: probably need to check for whether we should | ||
| 16838 | send stuff from our end to continue the transaction | ||
| 16839 | */ | ||
| 16840 | + SNMP_FREE(tmStateRef); | ||
| 16841 | return -1; | ||
| 16842 | } else { | ||
| 16843 | /* XXX: free needed memory */ | ||
| 16844 | snmp_log(LOG_ERR, | ||
| 16845 | "DTLSUDP: failed to verify ssl certificate (of the client)\n"); | ||
| 16846 | snmp_increment_statistic(STAT_TLSTM_SNMPTLSTMSESSIONINVALIDCLIENTCERTIFICATES); | ||
| 16847 | + SNMP_FREE(tmStateRef); | ||
| 16848 | return -1; | ||
| 16849 | } | ||
| 16850 | } | ||
| 16851 | @@ -1061,7 +1068,7 @@ netsnmp_dtlsudp_send(netsnmp_transport *t, void *buf, int size, | ||
| 16852 | specs) then we create one automatically here. | ||
| 16853 | */ | ||
| 16854 | if (opaque != NULL && *opaque != NULL && | ||
| 16855 | - *olength == sizeof(netsnmp_tmStateReference)) | ||
| 16856 | + olength != NULL && *olength == sizeof(netsnmp_tmStateReference)) | ||
| 16857 | tmStateRef = (netsnmp_tmStateReference *) *opaque; | ||
| 16858 | |||
| 16859 | |||
| 16860 | @@ -1506,13 +1513,11 @@ netsnmp_dtlsudp_create_tstring(const char *str, int isserver, | ||
| 16861 | tlsdata = (_netsnmpTLSBaseData *) t->data; | ||
| 16862 | /* search for a : */ | ||
| 16863 | if (NULL != (cp = strrchr(str, ':'))) { | ||
| 16864 | - strncpy(buf, str, SNMP_MIN(cp-str, sizeof(buf)-1)); | ||
| 16865 | - buf[SNMP_MIN(cp-str, sizeof(buf)-1)] = '\0'; | ||
| 16866 | + sprintf(buf, "%.*s", (int) SNMP_MIN(cp - str, sizeof(buf) - 1), | ||
| 16867 | + str); | ||
| 16868 | } else { | ||
| 16869 | /* else the entire spec is a host name only */ | ||
| 16870 | - strncpy(buf, str, | ||
| 16871 | - SNMP_MIN(strlen(str), sizeof(buf)-1)); | ||
| 16872 | - buf[SNMP_MIN(strlen(str), sizeof(buf)-1)] = '\0'; | ||
| 16873 | + strlcpy(buf, str, sizeof(buf)); | ||
| 16874 | } | ||
| 16875 | tlsdata->their_hostname = strdup(buf); | ||
| 16876 | } | ||
| 16877 | diff --git a/snmplib/transports/snmpIPXDomain.c b/snmplib/transports/snmpIPXDomain.c | ||
| 16878 | index 75994d4..24c13a4 100644 | ||
| 16879 | --- a/snmplib/transports/snmpIPXDomain.c | ||
| 16880 | +++ b/snmplib/transports/snmpIPXDomain.c | ||
| 16881 | @@ -34,6 +34,7 @@ | ||
| 16882 | #include <net-snmp/config_api.h> | ||
| 16883 | |||
| 16884 | #include <net-snmp/library/snmp_transport.h> | ||
| 16885 | +#include <net-snmp/library/tools.h> | ||
| 16886 | |||
| 16887 | #define SNMP_IPX_DEFAULT_PORT 36879 /* Specified in RFC 1420. */ | ||
| 16888 | static netsnmp_tdomain ipxDomain; | ||
| 16889 | @@ -99,10 +100,13 @@ netsnmp_ipx_recv(netsnmp_transport *t, void *buf, int size, | ||
| 16890 | } | ||
| 16891 | |||
| 16892 | if (rc >= 0) { | ||
| 16893 | - char *str = netsnmp_ipx_fmtaddr(NULL, from, fromlen); | ||
| 16894 | - DEBUGMSGTL(("netsnmp_ipx","recvfrom fd %d got %d bytes(from %s)\n", | ||
| 16895 | - t->sock, rc, str)); | ||
| 16896 | - free(str); | ||
| 16897 | + DEBUGIF("netsnmp_ipx") { | ||
| 16898 | + char *str = netsnmp_ipx_fmtaddr(NULL, from, fromlen); | ||
| 16899 | + DEBUGMSGTL(("netsnmp_ipx", | ||
| 16900 | + "recvfrom fd %d got %d bytes(from %s)\n", | ||
| 16901 | + t->sock, rc, str)); | ||
| 16902 | + free(str); | ||
| 16903 | + } | ||
| 16904 | } else { | ||
| 16905 | DEBUGMSGTL(("netsnmp_ipx", "recvfrom fd %d err %d (\"%s\")\n", | ||
| 16906 | t->sock, errno, strerror(errno))); | ||
| 16907 | @@ -131,11 +135,13 @@ netsnmp_ipx_send(netsnmp_transport *t, void *buf, int size, | ||
| 16908 | } | ||
| 16909 | |||
| 16910 | if (to != NULL && t != NULL && t->sock >= 0) { | ||
| 16911 | - char *str = netsnmp_ipx_fmtaddr(NULL, (void *)to, | ||
| 16912 | - sizeof(struct sockaddr_ipx)); | ||
| 16913 | - DEBUGMSGTL(("netsnmp_ipx", "send %d bytes from %p to %s on fd %d\n", | ||
| 16914 | - size, buf, str, t->sock)); | ||
| 16915 | - free(str); | ||
| 16916 | + DEBUGIF("netsnmp_ipx") { | ||
| 16917 | + char *str = netsnmp_ipx_fmtaddr(NULL, (void *)to, | ||
| 16918 | + sizeof(struct sockaddr_ipx)); | ||
| 16919 | + DEBUGMSGTL(("netsnmp_ipx", "send %d bytes from %p to %s on fd %d\n", | ||
| 16920 | + size, buf, str, t->sock)); | ||
| 16921 | + free(str); | ||
| 16922 | + } | ||
| 16923 | while (rc < 0) { | ||
| 16924 | rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr)); | ||
| 16925 | if (rc < 0 && errno != EINTR) { | ||
| 16926 | @@ -176,7 +182,6 @@ netsnmp_ipx_transport(struct sockaddr_ipx *addr, int local) | ||
| 16927 | { | ||
| 16928 | netsnmp_transport *t = NULL; | ||
| 16929 | int rc = 0; | ||
| 16930 | - char *str = NULL; | ||
| 16931 | |||
| 16932 | #ifdef NETSNMP_NO_LISTEN_SUPPORT | ||
| 16933 | if (local) | ||
| 16934 | @@ -187,18 +192,18 @@ netsnmp_ipx_transport(struct sockaddr_ipx *addr, int local) | ||
| 16935 | return NULL; | ||
| 16936 | } | ||
| 16937 | |||
| 16938 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 16939 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 16940 | if (t == NULL) { | ||
| 16941 | return NULL; | ||
| 16942 | } | ||
| 16943 | |||
| 16944 | - str = netsnmp_ipx_fmtaddr(NULL, (void *)addr, | ||
| 16945 | - sizeof(struct sockaddr_ipx)); | ||
| 16946 | - DEBUGMSGTL(("netsnmp_ipx", "open %s %s\n", local ? "local" : "remote", | ||
| 16947 | - str)); | ||
| 16948 | - free(str); | ||
| 16949 | - | ||
| 16950 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 16951 | + DEBUGIF("netsnmp_ipx") { | ||
| 16952 | + char *str = netsnmp_ipx_fmtaddr(NULL, (void *)addr, | ||
| 16953 | + sizeof(struct sockaddr_ipx)); | ||
| 16954 | + DEBUGMSGTL(("netsnmp_ipx", "open %s %s\n", local ? "local" : "remote", | ||
| 16955 | + str)); | ||
| 16956 | + free(str); | ||
| 16957 | + } | ||
| 16958 | |||
| 16959 | t->domain = netsnmpIPXDomain; | ||
| 16960 | t->domain_length = netsnmpIPXDomain_len; | ||
| 16961 | @@ -358,9 +363,7 @@ netsnmp_sockaddr_ipx2(struct sockaddr_ipx *addr, const char *peername, | ||
| 16962 | node = "000000000000"; | ||
| 16963 | |||
| 16964 | if (port == NULL || *port == '\0') | ||
| 16965 | -#define val(x) __STRING(x) | ||
| 16966 | - port = val(SNMP_IPX_DEFAULT_PORT); | ||
| 16967 | -#undef val | ||
| 16968 | + port = __STRING(SNMP_IPX_DEFAULT_PORT); | ||
| 16969 | |||
| 16970 | DEBUGMSGTL(("netsnmp_sockaddr_ipx", "Address: %s:%s/%s\n", | ||
| 16971 | network ? network : "[NIL]", node ? node : "[NIL]", | ||
| 16972 | diff --git a/snmplib/transports/snmpIPv6BaseDomain.c b/snmplib/transports/snmpIPv6BaseDomain.c | ||
| 16973 | index a7daf1c..9bad950 100644 | ||
| 16974 | --- a/snmplib/transports/snmpIPv6BaseDomain.c | ||
| 16975 | +++ b/snmplib/transports/snmpIPv6BaseDomain.c | ||
| 16976 | @@ -127,7 +127,6 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr, | ||
| 16977 | char debug_addr[INET6_ADDRSTRLEN]; | ||
| 16978 | #if HAVE_GETADDRINFO | ||
| 16979 | struct addrinfo *addrs = NULL; | ||
| 16980 | - struct addrinfo hint; | ||
| 16981 | int err; | ||
| 16982 | #elif HAVE_GETIPNODEBYNAME | ||
| 16983 | struct hostent *hp = NULL; | ||
| 16984 | @@ -333,13 +332,15 @@ netsnmp_sockaddr_in6_2(struct sockaddr_in6 *addr, | ||
| 16985 | } | ||
| 16986 | |||
| 16987 | #if HAVE_GETADDRINFO | ||
| 16988 | - memset(&hint, 0, sizeof hint); | ||
| 16989 | - hint.ai_flags = 0; | ||
| 16990 | - hint.ai_family = PF_INET6; | ||
| 16991 | - hint.ai_socktype = SOCK_DGRAM; | ||
| 16992 | - hint.ai_protocol = 0; | ||
| 16993 | - | ||
| 16994 | - err = netsnmp_getaddrinfo(peername, NULL, &hint, &addrs); | ||
| 16995 | + { | ||
| 16996 | + struct addrinfo hint = { 0 }; | ||
| 16997 | + hint.ai_flags = 0; | ||
| 16998 | + hint.ai_family = PF_INET6; | ||
| 16999 | + hint.ai_socktype = SOCK_DGRAM; | ||
| 17000 | + hint.ai_protocol = 0; | ||
| 17001 | + | ||
| 17002 | + err = netsnmp_getaddrinfo(peername, NULL, &hint, &addrs); | ||
| 17003 | + } | ||
| 17004 | if (err != 0) { | ||
| 17005 | #if HAVE_GAI_STRERROR | ||
| 17006 | snmp_log(LOG_ERR, "getaddrinfo(\"%s\", NULL, ...): %s\n", peername, | ||
| 17007 | diff --git a/snmplib/transports/snmpSSHDomain.c b/snmplib/transports/snmpSSHDomain.c | ||
| 17008 | index 72cc59e..a9ed81f 100644 | ||
| 17009 | --- a/snmplib/transports/snmpSSHDomain.c | ||
| 17010 | +++ b/snmplib/transports/snmpSSHDomain.c | ||
| 17011 | @@ -236,9 +236,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17012 | user_pw->pw_name); | ||
| 17013 | return -1; | ||
| 17014 | } | ||
| 17015 | - strncpy(addr_pair->username, user_pw->pw_name, | ||
| 17016 | + strlcpy(addr_pair->username, user_pw->pw_name, | ||
| 17017 | sizeof(addr_pair->username)); | ||
| 17018 | - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; | ||
| 17019 | } | ||
| 17020 | DEBUGMSGTL(("ssh", "Setting user name to %s\n", | ||
| 17021 | addr_pair->username)); | ||
| 17022 | @@ -309,9 +308,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17023 | user_pw->pw_name); | ||
| 17024 | return -1; | ||
| 17025 | } | ||
| 17026 | - strncpy(addr_pair->username, user_pw->pw_name, | ||
| 17027 | + strlcpy(addr_pair->username, user_pw->pw_name, | ||
| 17028 | sizeof(addr_pair->username)); | ||
| 17029 | - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; | ||
| 17030 | } | ||
| 17031 | */ | ||
| 17032 | |||
| 17033 | @@ -330,12 +328,12 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17034 | if (iamclient && 0) { | ||
| 17035 | /* XXX: we're on the client; we should have named the | ||
| 17036 | connection ourselves... pull this from session somehow? */ | ||
| 17037 | - strncpy(tmStateRef->securityName, addr_pair->username, | ||
| 17038 | - sizeof(tmStateRef->securityName)-1); | ||
| 17039 | + strlcpy(tmStateRef->securityName, addr_pair->username, | ||
| 17040 | + sizeof(tmStateRef->securityName)); | ||
| 17041 | } else { | ||
| 17042 | #ifdef SNMPSSHDOMAIN_USE_EXTERNAL_PIPE | ||
| 17043 | - strncpy(tmStateRef->securityName, addr_pair->username, | ||
| 17044 | - sizeof(tmStateRef->securityName)-1); | ||
| 17045 | + strlcpy(tmStateRef->securityName, addr_pair->username, | ||
| 17046 | + sizeof(tmStateRef->securityName)); | ||
| 17047 | #else /* we're called directly by sshd and use stdin/out */ | ||
| 17048 | /* we're on the server... */ | ||
| 17049 | /* XXX: this doesn't copy properly and can get pointer | ||
| 17050 | @@ -349,8 +347,8 @@ netsnmp_ssh_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17051 | |||
| 17052 | /* XXX: detect and throw out overflow secname sizes rather | ||
| 17053 | than truncating. */ | ||
| 17054 | - strncpy(tmStateRef->securityName, getenv("USER"), | ||
| 17055 | - sizeof(tmStateRef->securityName)-1); | ||
| 17056 | + strlcpy(tmStateRef->securityName, getenv("USER"), | ||
| 17057 | + sizeof(tmStateRef->securityName)); | ||
| 17058 | #endif /* ! SNMPSSHDOMAIN_USE_EXTERNAL_PIPE */ | ||
| 17059 | } | ||
| 17060 | tmStateRef->securityName[sizeof(tmStateRef->securityName)-1] = '\0'; | ||
| 17061 | @@ -389,9 +387,8 @@ netsnmp_ssh_send(netsnmp_transport *t, void *buf, int size, | ||
| 17062 | |||
| 17063 | if (NULL != t && NULL != addr_pair && NULL != addr_pair->channel) { | ||
| 17064 | if (addr_pair->username[0] == '\0') { | ||
| 17065 | - strncpy(addr_pair->username, tmStateRef->securityName, | ||
| 17066 | - sizeof(addr_pair->username)-1); | ||
| 17067 | - addr_pair->username[sizeof(addr_pair->username)-1] = '\0'; | ||
| 17068 | + strlcpy(addr_pair->username, tmStateRef->securityName, | ||
| 17069 | + sizeof(addr_pair->username)); | ||
| 17070 | } else if (strcmp(addr_pair->username, tmStateRef->securityName) != 0 || | ||
| 17071 | strlen(addr_pair->username) != tmStateRef->securityNameLen) { | ||
| 17072 | /* error! they must always match */ | ||
| 17073 | @@ -599,7 +596,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) | ||
| 17074 | if (t == NULL) { | ||
| 17075 | return NULL; | ||
| 17076 | } | ||
| 17077 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17078 | |||
| 17079 | t->domain = netsnmp_snmpSSHDomain; | ||
| 17080 | t->domain_length = netsnmp_snmpSSHDomain_len; | ||
| 17081 | @@ -728,7 +724,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) | ||
| 17082 | #endif /* NETSNMP_NO_LISTEN_SUPPORT */ | ||
| 17083 | } else { | ||
| 17084 | char *username; | ||
| 17085 | - size_t username_len; | ||
| 17086 | char *keyfilepub; | ||
| 17087 | char *keyfilepriv; | ||
| 17088 | |||
| 17089 | @@ -740,7 +735,6 @@ netsnmp_ssh_transport(struct sockaddr_in *addr, int local) | ||
| 17090 | snmp_log(LOG_ERR, "You must specify a ssh username to use. See the snmp.conf manual page\n"); | ||
| 17091 | return NULL; | ||
| 17092 | } | ||
| 17093 | - username_len = strlen(username); | ||
| 17094 | |||
| 17095 | /* use the requested public key file */ | ||
| 17096 | keyfilepub = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID, | ||
| 17097 | diff --git a/snmplib/transports/snmpSTDDomain.c b/snmplib/transports/snmpSTDDomain.c | ||
| 17098 | index 21e0d79..0a1c3f9 100644 | ||
| 17099 | --- a/snmplib/transports/snmpSTDDomain.c | ||
| 17100 | +++ b/snmplib/transports/snmpSTDDomain.c | ||
| 17101 | @@ -154,11 +154,10 @@ netsnmp_std_transport(const char *instring, size_t instring_len, | ||
| 17102 | { | ||
| 17103 | netsnmp_transport *t; | ||
| 17104 | |||
| 17105 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 17106 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17107 | if (t == NULL) { | ||
| 17108 | return NULL; | ||
| 17109 | } | ||
| 17110 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17111 | |||
| 17112 | t->domain = netsnmp_snmpSTDDomain; | ||
| 17113 | t->domain_length = | ||
| 17114 | diff --git a/snmplib/transports/snmpTCPDomain.c b/snmplib/transports/snmpTCPDomain.c | ||
| 17115 | index 426ae08..b8bdba4 100644 | ||
| 17116 | --- a/snmplib/transports/snmpTCPDomain.c | ||
| 17117 | +++ b/snmplib/transports/snmpTCPDomain.c | ||
| 17118 | @@ -41,6 +41,7 @@ | ||
| 17119 | #include <net-snmp/library/snmpIPv4BaseDomain.h> | ||
| 17120 | #include <net-snmp/library/snmpSocketBaseDomain.h> | ||
| 17121 | #include <net-snmp/library/snmpTCPBaseDomain.h> | ||
| 17122 | +#include <net-snmp/library/tools.h> | ||
| 17123 | |||
| 17124 | /* | ||
| 17125 | * needs to be in sync with the definitions in snmplib/snmpUDPDomain.c | ||
| 17126 | @@ -77,7 +78,6 @@ netsnmp_tcp_accept(netsnmp_transport *t) | ||
| 17127 | netsnmp_udp_addr_pair *addr_pair = NULL; | ||
| 17128 | int newsock = -1; | ||
| 17129 | socklen_t farendlen = sizeof(netsnmp_udp_addr_pair); | ||
| 17130 | - char *str = NULL; | ||
| 17131 | |||
| 17132 | addr_pair = (netsnmp_udp_addr_pair *)malloc(farendlen); | ||
| 17133 | if (addr_pair == NULL) { | ||
| 17134 | @@ -106,9 +106,11 @@ netsnmp_tcp_accept(netsnmp_transport *t) | ||
| 17135 | |||
| 17136 | t->data = addr_pair; | ||
| 17137 | t->data_length = sizeof(netsnmp_udp_addr_pair); | ||
| 17138 | - str = netsnmp_tcp_fmtaddr(NULL, farend, farendlen); | ||
| 17139 | - DEBUGMSGTL(("netsnmp_tcp", "accept succeeded (from %s)\n", str)); | ||
| 17140 | - free(str); | ||
| 17141 | + DEBUGIF("netsnmp_tcp") { | ||
| 17142 | + char *str = netsnmp_tcp_fmtaddr(NULL, farend, farendlen); | ||
| 17143 | + DEBUGMSGTL(("netsnmp_tcp", "accept succeeded (from %s)\n", str)); | ||
| 17144 | + free(str); | ||
| 17145 | + } | ||
| 17146 | |||
| 17147 | /* | ||
| 17148 | * Try to make the new socket blocking. | ||
| 17149 | @@ -157,11 +159,10 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local) | ||
| 17150 | return NULL; | ||
| 17151 | } | ||
| 17152 | |||
| 17153 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 17154 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17155 | if (t == NULL) { | ||
| 17156 | return NULL; | ||
| 17157 | } | ||
| 17158 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17159 | |||
| 17160 | addr_pair = (netsnmp_udp_addr_pair *)malloc(sizeof(netsnmp_udp_addr_pair)); | ||
| 17161 | if (addr_pair == NULL) { | ||
| 17162 | diff --git a/snmplib/transports/snmpTCPIPv6Domain.c b/snmplib/transports/snmpTCPIPv6Domain.c | ||
| 17163 | index 5e866eb..3c96856 100644 | ||
| 17164 | --- a/snmplib/transports/snmpTCPIPv6Domain.c | ||
| 17165 | +++ b/snmplib/transports/snmpTCPIPv6Domain.c | ||
| 17166 | @@ -47,6 +47,7 @@ | ||
| 17167 | #include <net-snmp/library/snmp_transport.h> | ||
| 17168 | #include <net-snmp/library/snmpSocketBaseDomain.h> | ||
| 17169 | #include <net-snmp/library/snmpTCPBaseDomain.h> | ||
| 17170 | +#include <net-snmp/library/tools.h> | ||
| 17171 | |||
| 17172 | #include "inet_ntop.h" | ||
| 17173 | |||
| 17174 | @@ -70,7 +71,6 @@ netsnmp_tcp6_accept(netsnmp_transport *t) | ||
| 17175 | struct sockaddr_in6 *farend = NULL; | ||
| 17176 | int newsock = -1; | ||
| 17177 | socklen_t farendlen = sizeof(struct sockaddr_in6); | ||
| 17178 | - char *str = NULL; | ||
| 17179 | |||
| 17180 | farend = (struct sockaddr_in6 *) malloc(sizeof(struct sockaddr_in6)); | ||
| 17181 | |||
| 17182 | @@ -98,9 +98,11 @@ netsnmp_tcp6_accept(netsnmp_transport *t) | ||
| 17183 | |||
| 17184 | t->data = farend; | ||
| 17185 | t->data_length = farendlen; | ||
| 17186 | - str = netsnmp_tcp6_fmtaddr(NULL, farend, farendlen); | ||
| 17187 | - DEBUGMSGTL(("netsnmp_tcp6", "accept succeeded (from %s)\n", str)); | ||
| 17188 | - free(str); | ||
| 17189 | + DEBUGIF("netsnmp_tcp6") { | ||
| 17190 | + char *str = netsnmp_tcp6_fmtaddr(NULL, farend, farendlen); | ||
| 17191 | + DEBUGMSGTL(("netsnmp_tcp6", "accept succeeded (from %s)\n", str)); | ||
| 17192 | + free(str); | ||
| 17193 | + } | ||
| 17194 | |||
| 17195 | /* | ||
| 17196 | * Try to make the new socket blocking. | ||
| 17197 | @@ -138,7 +140,6 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) | ||
| 17198 | { | ||
| 17199 | netsnmp_transport *t = NULL; | ||
| 17200 | int rc = 0; | ||
| 17201 | - char *str = NULL; | ||
| 17202 | |||
| 17203 | #ifdef NETSNMP_NO_LISTEN_SUPPORT | ||
| 17204 | if (local) | ||
| 17205 | @@ -149,19 +150,18 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) | ||
| 17206 | return NULL; | ||
| 17207 | } | ||
| 17208 | |||
| 17209 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 17210 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17211 | if (t == NULL) { | ||
| 17212 | return NULL; | ||
| 17213 | } | ||
| 17214 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17215 | - | ||
| 17216 | - str = netsnmp_tcp6_fmtaddr(NULL, (void *)addr, | ||
| 17217 | - sizeof(struct sockaddr_in6)); | ||
| 17218 | - DEBUGMSGTL(("netsnmp_tcp6", "open %s %s\n", local ? "local" : "remote", | ||
| 17219 | - str)); | ||
| 17220 | - free(str); | ||
| 17221 | |||
| 17222 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17223 | + DEBUGIF("netsnmp_tcp6") { | ||
| 17224 | + char *str = netsnmp_tcp6_fmtaddr(NULL, (void *)addr, | ||
| 17225 | + sizeof(struct sockaddr_in6)); | ||
| 17226 | + DEBUGMSGTL(("netsnmp_tcp6", "open %s %s\n", local ? "local" : "remote", | ||
| 17227 | + str)); | ||
| 17228 | + free(str); | ||
| 17229 | + } | ||
| 17230 | |||
| 17231 | t->data = malloc(sizeof(netsnmp_indexed_addr_pair)); | ||
| 17232 | if (t->data == NULL) { | ||
| 17233 | @@ -169,7 +169,7 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local) | ||
| 17234 | return NULL; | ||
| 17235 | } | ||
| 17236 | t->data_length = sizeof(netsnmp_indexed_addr_pair); | ||
| 17237 | - memcpy(t->data, addr, sizeof(netsnmp_indexed_addr_pair)); | ||
| 17238 | + memcpy(t->data, addr, sizeof(struct sockaddr_in6)); | ||
| 17239 | |||
| 17240 | t->domain = netsnmp_TCPIPv6Domain; | ||
| 17241 | t->domain_length = sizeof(netsnmp_TCPIPv6Domain) / sizeof(oid); | ||
| 17242 | diff --git a/snmplib/transports/snmpTLSBaseDomain.c b/snmplib/transports/snmpTLSBaseDomain.c | ||
| 17243 | index 12a69c6..c54d6ad 100644 | ||
| 17244 | --- a/snmplib/transports/snmpTLSBaseDomain.c | ||
| 17245 | +++ b/snmplib/transports/snmpTLSBaseDomain.c | ||
| 17246 | @@ -51,6 +51,7 @@ netsnmp_feature_require(cert_util) | ||
| 17247 | #include <net-snmp/library/snmp_transport.h> | ||
| 17248 | #include <net-snmp/library/snmp_secmod.h> | ||
| 17249 | #include <net-snmp/library/read_config.h> | ||
| 17250 | +#include <net-snmp/library/system.h> | ||
| 17251 | |||
| 17252 | #define LOGANDDIE(msg) do { snmp_log(LOG_ERR, "%s\n", msg); return 0; } while(0) | ||
| 17253 | |||
| 17254 | @@ -105,12 +106,13 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { | ||
| 17255 | 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))); | ||
| 17256 | DEBUGMSGTL(("tls_x509:verify", " accepting matching fp of self-signed certificate found in: %s\n", | ||
| 17257 | cert->info.filename)); | ||
| 17258 | + SNMP_FREE(fingerprint); | ||
| 17259 | return 1; | ||
| 17260 | } else { | ||
| 17261 | DEBUGMSGTL(("tls_x509:verify", " no matching fp found\n")); | ||
| 17262 | /* log where we are and why called */ | ||
| 17263 | 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)); | ||
| 17264 | - | ||
| 17265 | + SNMP_FREE(fingerprint); | ||
| 17266 | return 0; | ||
| 17267 | } | ||
| 17268 | |||
| 17269 | @@ -118,6 +120,7 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { | ||
| 17270 | (verify_info->flags & VRFY_PARENT_WAS_OK)) { | ||
| 17271 | 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))); | ||
| 17272 | DEBUGMSGTL(("tls_x509:verify", " a parent was ok, so returning ok for this child certificate\n")); | ||
| 17273 | + SNMP_FREE(fingerprint); | ||
| 17274 | return 1; /* we'll check the hostname later at this level */ | ||
| 17275 | } | ||
| 17276 | } | ||
| 17277 | @@ -128,6 +131,7 @@ int verify_callback(int ok, X509_STORE_CTX *ctx) { | ||
| 17278 | 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))); | ||
| 17279 | DEBUGMSGTL(("tls_x509:verify", " returning the passed in value of %d\n", | ||
| 17280 | ok)); | ||
| 17281 | + SNMP_FREE(fingerprint); | ||
| 17282 | return(ok); | ||
| 17283 | } | ||
| 17284 | |||
| 17285 | @@ -186,6 +190,7 @@ _netsnmp_tlsbase_verify_remote_fingerprint(X509 *remote_cert, | ||
| 17286 | } | ||
| 17287 | } else { | ||
| 17288 | DEBUGMSGTL(("tls_x509:verify", "No fingerprint for the remote entity available to verify\n")); | ||
| 17289 | + free(fingerprint); | ||
| 17290 | return NO_FINGERPRINT_AVAILABLE; | ||
| 17291 | } | ||
| 17292 | |||
| 17293 | @@ -262,7 +267,7 @@ netsnmp_tlsbase_verify_server_cert(SSL *ssl, _netsnmpTLSBaseData *tlsdata) { | ||
| 17294 | *check_name && j < sizeof(buf)-1; | ||
| 17295 | ++check_name, ++j ) { | ||
| 17296 | if (isascii(*check_name)) | ||
| 17297 | - buf[j] = tolower(*check_name); | ||
| 17298 | + buf[j] = tolower(0xFF & *check_name); | ||
| 17299 | } | ||
| 17300 | if (j < sizeof(buf)) | ||
| 17301 | buf[j] = '\0'; | ||
| 17302 | @@ -914,9 +919,8 @@ int netsnmp_tlsbase_wrapup_recv(netsnmp_tmStateReference *tmStateRef, | ||
| 17303 | /* RFC5953 Section 5.1.2 step 2: tmSecurityName */ | ||
| 17304 | /* XXX: detect and throw out overflow secname sizes rather | ||
| 17305 | than truncating. */ | ||
| 17306 | - strncpy(tmStateRef->securityName, tlsdata->securityName, | ||
| 17307 | - sizeof(tmStateRef->securityName)-1); | ||
| 17308 | - tmStateRef->securityName[sizeof(tmStateRef->securityName)-1] = '\0'; | ||
| 17309 | + strlcpy(tmStateRef->securityName, tlsdata->securityName, | ||
| 17310 | + sizeof(tmStateRef->securityName)); | ||
| 17311 | tmStateRef->securityNameLen = strlen(tmStateRef->securityName); | ||
| 17312 | |||
| 17313 | /* RFC5953 Section 5.1.2 step 2: tmSessionID */ | ||
| 17314 | @@ -1080,6 +1084,7 @@ const char * _x509_get_error(int x509failvalue, const char *location) { | ||
| 17315 | #endif | ||
| 17316 | case X509_V_ERR_APPLICATION_VERIFICATION: | ||
| 17317 | reason = "X509_V_ERR_APPLICATION_VERIFICATION"; | ||
| 17318 | + break; | ||
| 17319 | default: | ||
| 17320 | reason = "unknown failure code"; | ||
| 17321 | } | ||
| 17322 | diff --git a/snmplib/transports/snmpTLSTCPDomain.c b/snmplib/transports/snmpTLSTCPDomain.c | ||
| 17323 | index c1423f6..a92091e 100644 | ||
| 17324 | --- a/snmplib/transports/snmpTLSTCPDomain.c | ||
| 17325 | +++ b/snmplib/transports/snmpTLSTCPDomain.c | ||
| 17326 | @@ -152,7 +152,7 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17327 | snmp_log(LOG_ERR, | ||
| 17328 | "tlstcp received an invalid invocation with missing data\n"); | ||
| 17329 | DEBUGMSGTL(("tlstcp", "recvfrom fd %d err %d (\"%s\")\n", | ||
| 17330 | - t->sock, errno, strerror(errno))); | ||
| 17331 | + (t ? t->sock : -1), errno, strerror(errno))); | ||
| 17332 | DEBUGMSGTL(("tlstcp", " tdata = %p\n", t->data)); | ||
| 17333 | return -1; | ||
| 17334 | } | ||
| 17335 | @@ -248,8 +248,8 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17336 | */ | ||
| 17337 | |||
| 17338 | /* read the packet from openssl */ | ||
| 17339 | - rc = SSL_read(tlsdata->ssl, buf, size); | ||
| 17340 | - while (rc <= 0) { | ||
| 17341 | + do { | ||
| 17342 | + rc = SSL_read(tlsdata->ssl, buf, size); | ||
| 17343 | if (rc == 0) { | ||
| 17344 | /* XXX closed connection */ | ||
| 17345 | DEBUGMSGTL(("tlstcp", "remote side closed connection\n")); | ||
| 17346 | @@ -257,24 +257,22 @@ netsnmp_tlstcp_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17347 | SNMP_FREE(tmStateRef); | ||
| 17348 | return -1; | ||
| 17349 | } | ||
| 17350 | - rc = SSL_read(tlsdata->ssl, buf, size); | ||
| 17351 | - } | ||
| 17352 | + if (rc == -1) { | ||
| 17353 | + int err = SSL_get_error(tlsdata->ssl, rc); | ||
| 17354 | + if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE) { | ||
| 17355 | + /* error detected */ | ||
| 17356 | + _openssl_log_error(rc, tlsdata->ssl, "SSL_read"); | ||
| 17357 | + SNMP_FREE(tmStateRef); | ||
| 17358 | + return rc; | ||
| 17359 | + } | ||
| 17360 | + } | ||
| 17361 | + /* retry read for SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE */ | ||
| 17362 | + } while (rc <= 0); | ||
| 17363 | |||
| 17364 | DEBUGMSGTL(("tlstcp", "received %d decoded bytes from tls\n", rc)); | ||
| 17365 | |||
| 17366 | - /* Check for errors */ | ||
| 17367 | - if (rc == -1) { | ||
| 17368 | - if (SSL_get_error(tlsdata->ssl, rc) == SSL_ERROR_WANT_READ) | ||
| 17369 | - return -1; /* XXX: it's ok, but what's the right return? */ | ||
| 17370 | - | ||
| 17371 | - _openssl_log_error(rc, tlsdata->ssl, "SSL_read"); | ||
| 17372 | - SNMP_FREE(tmStateRef); | ||
| 17373 | - | ||
| 17374 | - return rc; | ||
| 17375 | - } | ||
| 17376 | - | ||
| 17377 | /* log the packet */ | ||
| 17378 | - { | ||
| 17379 | + DEBUGIF("tlstcp") { | ||
| 17380 | char *str = netsnmp_tlstcp_fmtaddr(t, NULL, 0); | ||
| 17381 | DEBUGMSGTL(("tlstcp", | ||
| 17382 | "recvfrom fd %d got %d bytes (from %s)\n", | ||
| 17383 | @@ -416,7 +414,7 @@ netsnmp_tlstcp_send(netsnmp_transport *t, void *buf, int size, | ||
| 17384 | /* If the first packet and we have no secname, then copy the | ||
| 17385 | important securityName data into the longer-lived session | ||
| 17386 | reference information. */ | ||
| 17387 | - if ((tlsdata->flags | NETSNMP_TLSBASE_IS_CLIENT) && | ||
| 17388 | + if ((tlsdata->flags & NETSNMP_TLSBASE_IS_CLIENT) && | ||
| 17389 | !tlsdata->securityName && tmStateRef && tmStateRef->securityNameLen > 0) | ||
| 17390 | tlsdata->securityName = strdup(tmStateRef->securityName); | ||
| 17391 | |||
| 17392 | @@ -921,7 +919,6 @@ netsnmp_tlstcp_transport(const char *addr_string, int isserver) | ||
| 17393 | if (NULL == t) { | ||
| 17394 | return NULL; | ||
| 17395 | } | ||
| 17396 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17397 | |||
| 17398 | /* allocate our TLS specific data */ | ||
| 17399 | if (NULL == (tlsdata = netsnmp_tlsbase_allocate_tlsdata(t, isserver))) | ||
| 17400 | @@ -936,12 +933,13 @@ netsnmp_tlstcp_transport(const char *addr_string, int isserver) | ||
| 17401 | if (!isserver && tlsdata && addr_string) { | ||
| 17402 | /* search for a : */ | ||
| 17403 | if (NULL != (cp = strrchr(addr_string, ':'))) { | ||
| 17404 | - strncpy(buf, addr_string, sizeof(buf)-1); | ||
| 17405 | + sprintf(buf, "%.*s", | ||
| 17406 | + (int) SNMP_MIN(cp - addr_string, sizeof(buf) - 1), | ||
| 17407 | + addr_string); | ||
| 17408 | } else { | ||
| 17409 | /* else the entire spec is a host name only */ | ||
| 17410 | - strncpy(buf, addr_string, sizeof(buf)-1); | ||
| 17411 | + strlcpy(buf, addr_string, sizeof(buf)); | ||
| 17412 | } | ||
| 17413 | - buf[sizeof(buf)-1] = '\0'; | ||
| 17414 | tlsdata->their_hostname = strdup(buf); | ||
| 17415 | } | ||
| 17416 | |||
| 17417 | @@ -989,7 +987,7 @@ netsnmp_tlstcp_create_tstring(const char *str, int local, | ||
| 17418 | for(cp = str; *cp != '\0'; cp++) { | ||
| 17419 | /* if ALL numbers, it must be just a port */ | ||
| 17420 | /* if it contains anything else, assume a host or ip address */ | ||
| 17421 | - if (!isdigit(*cp)) { | ||
| 17422 | + if (!isdigit(0xFF & *cp)) { | ||
| 17423 | isport = 0; | ||
| 17424 | break; | ||
| 17425 | } | ||
| 17426 | diff --git a/snmplib/transports/snmpUDPBaseDomain.c b/snmplib/transports/snmpUDPBaseDomain.c | ||
| 17427 | index eb5f1a1..fc5c1cc 100644 | ||
| 17428 | --- a/snmplib/transports/snmpUDPBaseDomain.c | ||
| 17429 | +++ b/snmplib/transports/snmpUDPBaseDomain.c | ||
| 17430 | @@ -89,6 +89,160 @@ _netsnmp_udp_sockopt_set(int fd, int local) | ||
| 17431 | netsnmp_sock_buffer_set(fd, SO_RCVBUF, local, 0); | ||
| 17432 | } | ||
| 17433 | |||
| 17434 | +#if (defined(linux) && defined(IP_PKTINFO)) \ | ||
| 17435 | + || defined(IP_RECVDSTADDR) && HAVE_STRUCT_MSGHDR_MSG_CONTROL \ | ||
| 17436 | + && HAVE_STRUCT_MSGHDR_MSG_FLAGS | ||
| 17437 | +#if defined(linux) && defined(IP_PKTINFO) | ||
| 17438 | +#elif defined(IP_RECVDSTADDR) | ||
| 17439 | +# ifndef IP_SENDSRCADDR | ||
| 17440 | +# define IP_SENDSRCADDR IP_RECVDSTADDR /* DragonFly BSD */ | ||
| 17441 | +# endif | ||
| 17442 | +#endif | ||
| 17443 | + | ||
| 17444 | +#define netsnmp_udpbase_recvfrom_sendto_defined | ||
| 17445 | + | ||
| 17446 | +enum { | ||
| 17447 | +#if defined(linux) && defined(IP_PKTINFO) | ||
| 17448 | + cmsg_data_size = sizeof(struct in_pktinfo) | ||
| 17449 | +#elif defined(IP_RECVDSTADDR) | ||
| 17450 | + cmsg_data_size = sizeof(struct in_addr) | ||
| 17451 | +#endif | ||
| 17452 | +}; | ||
| 17453 | + | ||
| 17454 | +int | ||
| 17455 | +netsnmp_udpbase_recvfrom(int s, void *buf, int len, struct sockaddr *from, | ||
| 17456 | + socklen_t *fromlen, struct sockaddr *dstip, | ||
| 17457 | + socklen_t *dstlen, int *if_index) | ||
| 17458 | +{ | ||
| 17459 | + int r; | ||
| 17460 | + struct iovec iov; | ||
| 17461 | + char cmsg[CMSG_SPACE(cmsg_data_size)]; | ||
| 17462 | + struct cmsghdr *cm; | ||
| 17463 | + struct msghdr msg; | ||
| 17464 | + | ||
| 17465 | + iov.iov_base = buf; | ||
| 17466 | + iov.iov_len = len; | ||
| 17467 | + | ||
| 17468 | + memset(&msg, 0, sizeof msg); | ||
| 17469 | + msg.msg_name = from; | ||
| 17470 | + msg.msg_namelen = *fromlen; | ||
| 17471 | + msg.msg_iov = &iov; | ||
| 17472 | + msg.msg_iovlen = 1; | ||
| 17473 | + msg.msg_control = &cmsg; | ||
| 17474 | + msg.msg_controllen = sizeof(cmsg); | ||
| 17475 | + | ||
| 17476 | + r = recvmsg(s, &msg, NETSNMP_DONTWAIT); | ||
| 17477 | + | ||
| 17478 | + if (r == -1) { | ||
| 17479 | + return -1; | ||
| 17480 | + } | ||
| 17481 | + | ||
| 17482 | + DEBUGMSGTL(("udpbase:recv", "got source addr: %s\n", | ||
| 17483 | + inet_ntoa(((struct sockaddr_in *)from)->sin_addr))); | ||
| 17484 | + | ||
| 17485 | + { | ||
| 17486 | + /* Get the local port number for use in diagnostic messages */ | ||
| 17487 | + int r2 = getsockname(s, dstip, dstlen); | ||
| 17488 | + netsnmp_assert(r2 == 0); | ||
| 17489 | + } | ||
| 17490 | + | ||
| 17491 | + for (cm = CMSG_FIRSTHDR(&msg); cm != NULL; cm = CMSG_NXTHDR(&msg, cm)) { | ||
| 17492 | +#if defined(linux) && defined(IP_PKTINFO) | ||
| 17493 | + if (cm->cmsg_level == SOL_IP && cm->cmsg_type == IP_PKTINFO) { | ||
| 17494 | + struct in_pktinfo* src = (struct in_pktinfo *)CMSG_DATA(cm); | ||
| 17495 | + netsnmp_assert(dstip->sa_family == AF_INET); | ||
| 17496 | + ((struct sockaddr_in*)dstip)->sin_addr = src->ipi_addr; | ||
| 17497 | + *if_index = src->ipi_ifindex; | ||
| 17498 | + DEBUGMSGTL(("udpbase:recv", | ||
| 17499 | + "got destination (local) addr %s, iface %d\n", | ||
| 17500 | + inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr), | ||
| 17501 | + *if_index)); | ||
| 17502 | + } | ||
| 17503 | +#elif defined(IP_RECVDSTADDR) | ||
| 17504 | + if (cm->cmsg_level == IPPROTO_IP && cm->cmsg_type == IP_RECVDSTADDR) { | ||
| 17505 | + struct in_addr* src = (struct in_addr *)CMSG_DATA(cm); | ||
| 17506 | + ((struct sockaddr_in*)dstip)->sin_addr = *src; | ||
| 17507 | + DEBUGMSGTL(("netsnmp_udp", "got destination (local) addr %s\n", | ||
| 17508 | + inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr))); | ||
| 17509 | + } | ||
| 17510 | +#endif | ||
| 17511 | + } | ||
| 17512 | + return r; | ||
| 17513 | +} | ||
| 17514 | + | ||
| 17515 | +int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, | ||
| 17516 | + struct sockaddr *remote, void *data, int len) | ||
| 17517 | +{ | ||
| 17518 | + struct iovec iov; | ||
| 17519 | + struct msghdr m = { 0 }; | ||
| 17520 | + char cmsg[CMSG_SPACE(cmsg_data_size)]; | ||
| 17521 | + | ||
| 17522 | + iov.iov_base = data; | ||
| 17523 | + iov.iov_len = len; | ||
| 17524 | + | ||
| 17525 | + m.msg_name = remote; | ||
| 17526 | + m.msg_namelen = sizeof(struct sockaddr_in); | ||
| 17527 | + m.msg_iov = &iov; | ||
| 17528 | + m.msg_iovlen = 1; | ||
| 17529 | + m.msg_flags = 0; | ||
| 17530 | + | ||
| 17531 | + if (srcip && srcip->s_addr != INADDR_ANY) { | ||
| 17532 | + struct cmsghdr *cm; | ||
| 17533 | + | ||
| 17534 | + DEBUGMSGTL(("udpbase:sendto", "sending from %s\n", inet_ntoa(*srcip))); | ||
| 17535 | + | ||
| 17536 | + memset(cmsg, 0, sizeof(cmsg)); | ||
| 17537 | + | ||
| 17538 | + m.msg_control = &cmsg; | ||
| 17539 | + m.msg_controllen = sizeof(cmsg); | ||
| 17540 | + | ||
| 17541 | + cm = CMSG_FIRSTHDR(&m); | ||
| 17542 | + cm->cmsg_len = CMSG_LEN(cmsg_data_size); | ||
| 17543 | + | ||
| 17544 | +#if defined(linux) && defined(IP_PKTINFO) | ||
| 17545 | + cm->cmsg_level = SOL_IP; | ||
| 17546 | + cm->cmsg_type = IP_PKTINFO; | ||
| 17547 | + | ||
| 17548 | + { | ||
| 17549 | + struct in_pktinfo ipi = { 0 }; | ||
| 17550 | + ipi.ipi_ifindex = 0; | ||
| 17551 | + ipi.ipi_spec_dst.s_addr = srcip->s_addr; | ||
| 17552 | + memcpy(CMSG_DATA(cm), &ipi, sizeof(ipi)); | ||
| 17553 | + } | ||
| 17554 | + | ||
| 17555 | + { | ||
| 17556 | + errno = 0; | ||
| 17557 | + const int rc = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); | ||
| 17558 | + | ||
| 17559 | + if (rc >= 0 || errno != EINVAL) | ||
| 17560 | + return rc; | ||
| 17561 | + } | ||
| 17562 | + | ||
| 17563 | + /* | ||
| 17564 | + * The error might be caused by broadcast srcip (i.e. we're responding | ||
| 17565 | + * to a broadcast request) - sendmsg does not like it. Try to resend it | ||
| 17566 | + * using the interface on which it was received | ||
| 17567 | + */ | ||
| 17568 | + | ||
| 17569 | + DEBUGMSGTL(("udpbase:sendto", "re-sending on iface %d\n", if_index)); | ||
| 17570 | + | ||
| 17571 | + { | ||
| 17572 | + struct in_pktinfo ipi = { 0 }; | ||
| 17573 | + ipi.ipi_ifindex = if_index; | ||
| 17574 | + ipi.ipi_spec_dst.s_addr = INADDR_ANY; | ||
| 17575 | + memcpy(CMSG_DATA(cm), &ipi, sizeof(ipi)); | ||
| 17576 | + } | ||
| 17577 | +#elif defined(IP_SENDSRCADDR) | ||
| 17578 | + cm->cmsg_level = IPPROTO_IP; | ||
| 17579 | + cm->cmsg_type = IP_SENDSRCADDR; | ||
| 17580 | + memcpy((struct in_addr *)CMSG_DATA(cm), srcip, sizeof(struct in_addr)); | ||
| 17581 | +#endif | ||
| 17582 | + } | ||
| 17583 | + | ||
| 17584 | + return sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); | ||
| 17585 | +} | ||
| 17586 | +#endif /* (linux && IP_PKTINFO) || IP_RECVDSTADDR */ | ||
| 17587 | + | ||
| 17588 | /* | ||
| 17589 | * You can write something into opaque that will subsequently get passed back | ||
| 17590 | * to your send function if you like. For instance, you might want to | ||
| 17591 | @@ -116,25 +270,28 @@ netsnmp_udpbase_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17592 | } | ||
| 17593 | |||
| 17594 | while (rc < 0) { | ||
| 17595 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17596 | +#ifdef netsnmp_udpbase_recvfrom_sendto_defined | ||
| 17597 | socklen_t local_addr_len = sizeof(addr_pair->local_addr); | ||
| 17598 | rc = netsnmp_udp_recvfrom(t->sock, buf, size, from, &fromlen, | ||
| 17599 | (struct sockaddr*)&(addr_pair->local_addr), | ||
| 17600 | &local_addr_len, &(addr_pair->if_index)); | ||
| 17601 | #else | ||
| 17602 | rc = recvfrom(t->sock, buf, size, NETSNMP_DONTWAIT, from, &fromlen); | ||
| 17603 | -#endif /* linux && IP_PKTINFO */ | ||
| 17604 | +#endif /* netsnmp_udpbase_recvfrom_sendto_defined */ | ||
| 17605 | if (rc < 0 && errno != EINTR) { | ||
| 17606 | break; | ||
| 17607 | } | ||
| 17608 | } | ||
| 17609 | |||
| 17610 | if (rc >= 0) { | ||
| 17611 | - char *str = netsnmp_udp_fmtaddr(NULL, addr_pair, sizeof(netsnmp_indexed_addr_pair)); | ||
| 17612 | - DEBUGMSGTL(("netsnmp_udp", | ||
| 17613 | - "recvfrom fd %d got %d bytes (from %s)\n", | ||
| 17614 | - t->sock, rc, str)); | ||
| 17615 | - free(str); | ||
| 17616 | + DEBUGIF("netsnmp_udp") { | ||
| 17617 | + char *str = netsnmp_udp_fmtaddr( | ||
| 17618 | + NULL, addr_pair, sizeof(netsnmp_indexed_addr_pair)); | ||
| 17619 | + DEBUGMSGTL(("netsnmp_udp", | ||
| 17620 | + "recvfrom fd %d got %d bytes (from %s)\n", | ||
| 17621 | + t->sock, rc, str)); | ||
| 17622 | + free(str); | ||
| 17623 | + } | ||
| 17624 | } else { | ||
| 17625 | DEBUGMSGTL(("netsnmp_udp", "recvfrom fd %d err %d (\"%s\")\n", | ||
| 17626 | t->sock, errno, strerror(errno))); | ||
| 17627 | @@ -167,19 +324,21 @@ netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size, | ||
| 17628 | to = &addr_pair->remote_addr.sa; | ||
| 17629 | |||
| 17630 | if (to != NULL && t != NULL && t->sock >= 0) { | ||
| 17631 | - char *str = netsnmp_udp_fmtaddr(NULL, (void *) addr_pair, | ||
| 17632 | - sizeof(netsnmp_indexed_addr_pair)); | ||
| 17633 | - DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p to %s on fd %d\n", | ||
| 17634 | - size, buf, str, t->sock)); | ||
| 17635 | - free(str); | ||
| 17636 | + DEBUGIF("netsnmp_udp") { | ||
| 17637 | + char *str = netsnmp_udp_fmtaddr(NULL, (void *) addr_pair, | ||
| 17638 | + sizeof(netsnmp_indexed_addr_pair)); | ||
| 17639 | + DEBUGMSGTL(("netsnmp_udp", "send %d bytes from %p to %s on fd %d\n", | ||
| 17640 | + size, buf, str, t->sock)); | ||
| 17641 | + free(str); | ||
| 17642 | + } | ||
| 17643 | while (rc < 0) { | ||
| 17644 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17645 | +#ifdef netsnmp_udpbase_recvfrom_sendto_defined | ||
| 17646 | rc = netsnmp_udp_sendto(t->sock, | ||
| 17647 | addr_pair ? &(addr_pair->local_addr.sin.sin_addr) : NULL, | ||
| 17648 | addr_pair ? addr_pair->if_index : 0, to, buf, size); | ||
| 17649 | #else | ||
| 17650 | rc = sendto(t->sock, buf, size, 0, to, sizeof(struct sockaddr)); | ||
| 17651 | -#endif /* linux && IP_PKTINFO */ | ||
| 17652 | +#endif /* netsnmp_udpbase_recvfrom_sendto_defined */ | ||
| 17653 | if (rc < 0 && errno != EINTR) { | ||
| 17654 | DEBUGMSGTL(("netsnmp_udp", "sendto error, rc %d (errno %d)\n", | ||
| 17655 | rc, errno)); | ||
| 17656 | @@ -189,153 +348,3 @@ netsnmp_udpbase_send(netsnmp_transport *t, void *buf, int size, | ||
| 17657 | } | ||
| 17658 | return rc; | ||
| 17659 | } | ||
| 17660 | - | ||
| 17661 | -#if (defined(linux) && defined(IP_PKTINFO)) \ | ||
| 17662 | - || defined(IP_RECVDSTADDR) && HAVE_STRUCT_MSGHDR_MSG_CONTROL \ | ||
| 17663 | - && HAVE_STRUCT_MSGHDR_MSG_FLAGS | ||
| 17664 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17665 | -# define netsnmp_dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr)) | ||
| 17666 | -#elif defined(IP_RECVDSTADDR) | ||
| 17667 | -# define netsnmp_dstaddr(x) (&(struct cmsghr *)(CMSG_DATA(x))) | ||
| 17668 | -# ifndef IP_SENDSRCADDR | ||
| 17669 | -# define IP_SENDSRCADDR IP_RECVDSTADDR /* DragonFly BSD */ | ||
| 17670 | -# endif | ||
| 17671 | -#endif | ||
| 17672 | - | ||
| 17673 | -int | ||
| 17674 | -netsnmp_udpbase_recvfrom(int s, void *buf, int len, struct sockaddr *from, | ||
| 17675 | - socklen_t *fromlen, struct sockaddr *dstip, | ||
| 17676 | - socklen_t *dstlen, int *if_index) | ||
| 17677 | -{ | ||
| 17678 | - int r, r2; | ||
| 17679 | - struct iovec iov[1]; | ||
| 17680 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17681 | - char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; | ||
| 17682 | -#elif defined(IP_RECVDSTADDR) | ||
| 17683 | - char cmsg[CMSG_SPACE(sizeof(struct in_addr))]; | ||
| 17684 | -#endif | ||
| 17685 | - struct cmsghdr *cmsgptr; | ||
| 17686 | - struct msghdr msg; | ||
| 17687 | - | ||
| 17688 | - iov[0].iov_base = buf; | ||
| 17689 | - iov[0].iov_len = len; | ||
| 17690 | - | ||
| 17691 | - memset(&msg, 0, sizeof msg); | ||
| 17692 | - msg.msg_name = from; | ||
| 17693 | - msg.msg_namelen = *fromlen; | ||
| 17694 | - msg.msg_iov = iov; | ||
| 17695 | - msg.msg_iovlen = 1; | ||
| 17696 | - msg.msg_control = &cmsg; | ||
| 17697 | - msg.msg_controllen = sizeof(cmsg); | ||
| 17698 | - | ||
| 17699 | - r = recvmsg(s, &msg, NETSNMP_DONTWAIT); | ||
| 17700 | - | ||
| 17701 | - if (r == -1) { | ||
| 17702 | - return -1; | ||
| 17703 | - } | ||
| 17704 | - | ||
| 17705 | - r2 = getsockname(s, dstip, dstlen); | ||
| 17706 | - netsnmp_assert(r2 == 0); | ||
| 17707 | - | ||
| 17708 | - DEBUGMSGTL(("udpbase:recv", "got source addr: %s\n", | ||
| 17709 | - inet_ntoa(((struct sockaddr_in *)from)->sin_addr))); | ||
| 17710 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17711 | - for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) { | ||
| 17712 | - if (cmsgptr->cmsg_level != SOL_IP || cmsgptr->cmsg_type != IP_PKTINFO) | ||
| 17713 | - continue; | ||
| 17714 | - | ||
| 17715 | - netsnmp_assert(dstip->sa_family == AF_INET); | ||
| 17716 | - ((struct sockaddr_in*)dstip)->sin_addr = *netsnmp_dstaddr(cmsgptr); | ||
| 17717 | - *if_index = (((struct in_pktinfo *)(CMSG_DATA(cmsgptr)))->ipi_ifindex); | ||
| 17718 | - DEBUGMSGTL(("udpbase:recv", | ||
| 17719 | - "got destination (local) addr %s, iface %d\n", | ||
| 17720 | - inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr), | ||
| 17721 | - *if_index)); | ||
| 17722 | - } | ||
| 17723 | -#elif defined(IP_RECVDSTADDR) | ||
| 17724 | - for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) { | ||
| 17725 | - if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVDSTADDR) { | ||
| 17726 | - memcpy((void *) dstip, CMSG_DATA(cmsgptr), sizeof(struct in_addr)); | ||
| 17727 | - DEBUGMSGTL(("netsnmp_udp", "got destination (local) addr %s\n", | ||
| 17728 | - inet_ntoa(((struct sockaddr_in*)dstip)->sin_addr))); | ||
| 17729 | - } | ||
| 17730 | - } | ||
| 17731 | -#endif | ||
| 17732 | - return r; | ||
| 17733 | -} | ||
| 17734 | - | ||
| 17735 | -#if defined(linux) && defined(IP_PKTINFO) | ||
| 17736 | -int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, | ||
| 17737 | - struct sockaddr *remote, void *data, int len) | ||
| 17738 | -{ | ||
| 17739 | - struct iovec iov; | ||
| 17740 | - struct { | ||
| 17741 | - struct cmsghdr cm; | ||
| 17742 | - struct in_pktinfo ipi; | ||
| 17743 | - } cmsg; | ||
| 17744 | - struct msghdr m; | ||
| 17745 | - int ret; | ||
| 17746 | - | ||
| 17747 | - iov.iov_base = data; | ||
| 17748 | - iov.iov_len = len; | ||
| 17749 | - memset(&cmsg, 0, sizeof(cmsg)); | ||
| 17750 | - cmsg.cm.cmsg_len = sizeof(struct cmsghdr) + sizeof(struct in_pktinfo); | ||
| 17751 | - cmsg.cm.cmsg_level = SOL_IP; | ||
| 17752 | - cmsg.cm.cmsg_type = IP_PKTINFO; | ||
| 17753 | - cmsg.ipi.ipi_ifindex = 0; | ||
| 17754 | - cmsg.ipi.ipi_spec_dst.s_addr = (srcip ? srcip->s_addr : INADDR_ANY); | ||
| 17755 | - | ||
| 17756 | - m.msg_name = remote; | ||
| 17757 | - m.msg_namelen = sizeof(struct sockaddr_in); | ||
| 17758 | - m.msg_iov = &iov; | ||
| 17759 | - m.msg_iovlen = 1; | ||
| 17760 | - m.msg_control = &cmsg; | ||
| 17761 | - m.msg_controllen = sizeof(cmsg); | ||
| 17762 | - m.msg_flags = 0; | ||
| 17763 | - | ||
| 17764 | - DEBUGMSGTL(("udpbase:sendto", "sending from %s iface %d\n", | ||
| 17765 | - (srcip ? inet_ntoa(*srcip) : "NULL"), if_index)); | ||
| 17766 | - errno = 0; | ||
| 17767 | - ret = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); | ||
| 17768 | - if (ret < 0 && errno == EINVAL && srcip) { | ||
| 17769 | - /* The error might be caused by broadcast srcip (i.e. we're responding | ||
| 17770 | - * to broadcast request) - sendmsg does not like it. Try to resend it | ||
| 17771 | - * with global address and using the interface on whicg it was | ||
| 17772 | - * received */ | ||
| 17773 | - cmsg.ipi.ipi_ifindex = if_index; | ||
| 17774 | - cmsg.ipi.ipi_spec_dst.s_addr = INADDR_ANY; | ||
| 17775 | - DEBUGMSGTL(("udpbase:sendto", "re-sending the message\n")); | ||
| 17776 | - ret = sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); | ||
| 17777 | - } | ||
| 17778 | - return ret; | ||
| 17779 | -} | ||
| 17780 | -#elif defined(IP_SENDSRCADDR) | ||
| 17781 | -int netsnmp_udpbase_sendto(int fd, struct in_addr *srcip, int if_index, | ||
| 17782 | - struct sockaddr *remote, void *data, int len) | ||
| 17783 | -{ | ||
| 17784 | - struct iovec iov = { data, len }; | ||
| 17785 | - struct cmsghdr *cm; | ||
| 17786 | - struct msghdr m; | ||
| 17787 | - char cmbuf[CMSG_SPACE(sizeof(struct in_addr))]; | ||
| 17788 | - | ||
| 17789 | - memset(&m, 0, sizeof(struct msghdr)); | ||
| 17790 | - m.msg_name = remote; | ||
| 17791 | - m.msg_namelen = sizeof(struct sockaddr_in); | ||
| 17792 | - m.msg_iov = &iov; | ||
| 17793 | - m.msg_iovlen = 1; | ||
| 17794 | - m.msg_control = cmbuf; | ||
| 17795 | - m.msg_controllen = sizeof(cmbuf); | ||
| 17796 | - m.msg_flags = 0; | ||
| 17797 | - | ||
| 17798 | - cm = CMSG_FIRSTHDR(&m); | ||
| 17799 | - cm->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); | ||
| 17800 | - cm->cmsg_level = IPPROTO_IP; | ||
| 17801 | - cm->cmsg_type = IP_SENDSRCADDR; | ||
| 17802 | - | ||
| 17803 | - memcpy((struct in_addr *)CMSG_DATA(cm), srcip, sizeof(struct in_addr)); | ||
| 17804 | - | ||
| 17805 | - return sendmsg(fd, &m, NETSNMP_NOSIGNAL|NETSNMP_DONTWAIT); | ||
| 17806 | -} | ||
| 17807 | -#endif | ||
| 17808 | -#endif /* (linux && IP_PKTINFO) || IP_RECVDSTADDR */ | ||
| 17809 | - | ||
| 17810 | diff --git a/snmplib/transports/snmpUDPIPv4BaseDomain.c b/snmplib/transports/snmpUDPIPv4BaseDomain.c | ||
| 17811 | index 5a4f5b0..5f2f2da 100644 | ||
| 17812 | --- a/snmplib/transports/snmpUDPIPv4BaseDomain.c | ||
| 17813 | +++ b/snmplib/transports/snmpUDPIPv4BaseDomain.c | ||
| 17814 | @@ -64,7 +64,6 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) | ||
| 17815 | { | ||
| 17816 | netsnmp_transport *t = NULL; | ||
| 17817 | int rc = 0, rc2; | ||
| 17818 | - char *str = NULL; | ||
| 17819 | char *client_socket = NULL; | ||
| 17820 | netsnmp_indexed_addr_pair addr_pair; | ||
| 17821 | socklen_t local_addr_len; | ||
| 17822 | @@ -84,11 +83,13 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) | ||
| 17823 | t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17824 | netsnmp_assert_or_return(t != NULL, NULL); | ||
| 17825 | |||
| 17826 | - str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, | ||
| 17827 | - sizeof(netsnmp_indexed_addr_pair)); | ||
| 17828 | - DEBUGMSGTL(("netsnmp_udpbase", "open %s %s\n", local ? "local" : "remote", | ||
| 17829 | - str)); | ||
| 17830 | - free(str); | ||
| 17831 | + DEBUGIF("netsnmp_udpbase") { | ||
| 17832 | + char *str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, | ||
| 17833 | + sizeof(netsnmp_indexed_addr_pair)); | ||
| 17834 | + DEBUGMSGTL(("netsnmp_udpbase", "open %s %s\n", | ||
| 17835 | + local ? "local" : "remote", str)); | ||
| 17836 | + free(str); | ||
| 17837 | + } | ||
| 17838 | |||
| 17839 | t->sock = socket(PF_INET, SOCK_DGRAM, 0); | ||
| 17840 | DEBUGMSGTL(("UDPBase", "openned socket %d as local=%d\n", t->sock, local)); | ||
| 17841 | @@ -128,6 +129,17 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) | ||
| 17842 | } | ||
| 17843 | DEBUGMSGTL(("netsnmp_udpbase", "set IP_PKTINFO\n")); | ||
| 17844 | } | ||
| 17845 | +#elif defined(IP_RECVDSTADDR) | ||
| 17846 | + { | ||
| 17847 | + int sockopt = 1; | ||
| 17848 | + if (setsockopt(t->sock, IPPROTO_IP, IP_RECVDSTADDR, &sockopt, sizeof sockopt) == -1) { | ||
| 17849 | + DEBUGMSGTL(("netsnmp_udp", "couldn't set IP_RECVDSTADDR: %s\n", | ||
| 17850 | + strerror(errno))); | ||
| 17851 | + netsnmp_transport_free(t); | ||
| 17852 | + return NULL; | ||
| 17853 | + } | ||
| 17854 | + DEBUGMSGTL(("netsnmp_udp", "set IP_RECVDSTADDR\n")); | ||
| 17855 | + } | ||
| 17856 | #endif | ||
| 17857 | rc = bind(t->sock, (struct sockaddr *) addr, | ||
| 17858 | sizeof(struct sockaddr)); | ||
| 17859 | @@ -169,10 +181,12 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local) | ||
| 17860 | netsnmp_assert(rc2 == 0); | ||
| 17861 | } | ||
| 17862 | |||
| 17863 | - str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, | ||
| 17864 | - sizeof(netsnmp_indexed_addr_pair)); | ||
| 17865 | - DEBUGMSGTL(("netsnmp_udpbase", "client open %s\n", str)); | ||
| 17866 | - free(str); | ||
| 17867 | + DEBUGIF("netsnmp_udpbase") { | ||
| 17868 | + char *str = netsnmp_udp_fmtaddr(NULL, (void *)&addr_pair, | ||
| 17869 | + sizeof(netsnmp_indexed_addr_pair)); | ||
| 17870 | + DEBUGMSGTL(("netsnmp_udpbase", "client open %s\n", str)); | ||
| 17871 | + free(str); | ||
| 17872 | + } | ||
| 17873 | |||
| 17874 | /* | ||
| 17875 | * Save the (remote) address in the | ||
| 17876 | diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c | ||
| 17877 | index 90607b5..b3eaae4 100644 | ||
| 17878 | --- a/snmplib/transports/snmpUDPIPv6Domain.c | ||
| 17879 | +++ b/snmplib/transports/snmpUDPIPv6Domain.c | ||
| 17880 | @@ -65,6 +65,7 @@ static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; | ||
| 17881 | |||
| 17882 | #include <net-snmp/library/snmp_transport.h> | ||
| 17883 | #include <net-snmp/library/snmpSocketBaseDomain.h> | ||
| 17884 | +#include <net-snmp/library/tools.h> | ||
| 17885 | |||
| 17886 | #include "inet_ntop.h" | ||
| 17887 | #include "inet_pton.h" | ||
| 17888 | @@ -123,11 +124,13 @@ netsnmp_udp6_recv(netsnmp_transport *t, void *buf, int size, | ||
| 17889 | } | ||
| 17890 | |||
| 17891 | if (rc >= 0) { | ||
| 17892 | - char *str = netsnmp_udp6_fmtaddr(NULL, from, fromlen); | ||
| 17893 | - DEBUGMSGTL(("netsnmp_udp6", | ||
| 17894 | - "recvfrom fd %d got %d bytes (from %s)\n", t->sock, | ||
| 17895 | - rc, str)); | ||
| 17896 | - free(str); | ||
| 17897 | + DEBUGIF("netsnmp_udp6") { | ||
| 17898 | + char *str = netsnmp_udp6_fmtaddr(NULL, from, fromlen); | ||
| 17899 | + DEBUGMSGTL(("netsnmp_udp6", | ||
| 17900 | + "recvfrom fd %d got %d bytes (from %s)\n", t->sock, | ||
| 17901 | + rc, str)); | ||
| 17902 | + free(str); | ||
| 17903 | + } | ||
| 17904 | } else { | ||
| 17905 | DEBUGMSGTL(("netsnmp_udp6", "recvfrom fd %d err %d (\"%s\")\n", | ||
| 17906 | t->sock, errno, strerror(errno))); | ||
| 17907 | @@ -157,11 +160,14 @@ netsnmp_udp6_send(netsnmp_transport *t, void *buf, int size, | ||
| 17908 | } | ||
| 17909 | |||
| 17910 | if (to != NULL && t != NULL && t->sock >= 0) { | ||
| 17911 | - char *str = netsnmp_udp6_fmtaddr(NULL, (void *)to, | ||
| 17912 | - sizeof(struct sockaddr_in6)); | ||
| 17913 | - DEBUGMSGTL(("netsnmp_udp6", "send %d bytes from %p to %s on fd %d\n", | ||
| 17914 | - size, buf, str, t->sock)); | ||
| 17915 | - free(str); | ||
| 17916 | + DEBUGIF("netsnmp_udp6") { | ||
| 17917 | + char *str = netsnmp_udp6_fmtaddr(NULL, (void *)to, | ||
| 17918 | + sizeof(struct sockaddr_in6)); | ||
| 17919 | + DEBUGMSGTL(("netsnmp_udp6", | ||
| 17920 | + "send %d bytes from %p to %s on fd %d\n", | ||
| 17921 | + size, buf, str, t->sock)); | ||
| 17922 | + free(str); | ||
| 17923 | + } | ||
| 17924 | while (rc < 0) { | ||
| 17925 | rc = sendto(t->sock, buf, size, 0, to,sizeof(struct sockaddr_in6)); | ||
| 17926 | if (rc < 0 && errno != EINTR) { | ||
| 17927 | @@ -184,7 +190,6 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local) | ||
| 17928 | { | ||
| 17929 | netsnmp_transport *t = NULL; | ||
| 17930 | int rc = 0; | ||
| 17931 | - char *str = NULL; | ||
| 17932 | |||
| 17933 | #ifdef NETSNMP_NO_LISTEN_SUPPORT | ||
| 17934 | if (local) | ||
| 17935 | @@ -195,18 +200,18 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local) | ||
| 17936 | return NULL; | ||
| 17937 | } | ||
| 17938 | |||
| 17939 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 17940 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17941 | if (t == NULL) { | ||
| 17942 | return NULL; | ||
| 17943 | } | ||
| 17944 | |||
| 17945 | - str = netsnmp_udp6_fmtaddr(NULL, (void *) addr, | ||
| 17946 | - sizeof(struct sockaddr_in6)); | ||
| 17947 | - DEBUGMSGTL(("netsnmp_udp6", "open %s %s\n", local ? "local" : "remote", | ||
| 17948 | - str)); | ||
| 17949 | - free(str); | ||
| 17950 | - | ||
| 17951 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17952 | + DEBUGIF("netsnmp_udp6") { | ||
| 17953 | + char *str = netsnmp_udp6_fmtaddr(NULL, (void *) addr, | ||
| 17954 | + sizeof(struct sockaddr_in6)); | ||
| 17955 | + DEBUGMSGTL(("netsnmp_udp6", "open %s %s\n", local ? "local" : "remote", | ||
| 17956 | + str)); | ||
| 17957 | + free(str); | ||
| 17958 | + } | ||
| 17959 | |||
| 17960 | t->domain = netsnmp_UDPIPv6Domain; | ||
| 17961 | t->domain_length = | ||
| 17962 | diff --git a/snmplib/transports/snmpUnixDomain.c b/snmplib/transports/snmpUnixDomain.c | ||
| 17963 | index fbdeb03..674dc2b 100644 | ||
| 17964 | --- a/snmplib/transports/snmpUnixDomain.c | ||
| 17965 | +++ b/snmplib/transports/snmpUnixDomain.c | ||
| 17966 | @@ -35,6 +35,7 @@ | ||
| 17967 | #include <net-snmp/library/snmp_transport.h> | ||
| 17968 | #include <net-snmp/library/snmpSocketBaseDomain.h> | ||
| 17969 | #include <net-snmp/library/system.h> /* mkdirhier */ | ||
| 17970 | +#include <net-snmp/library/tools.h> | ||
| 17971 | |||
| 17972 | netsnmp_feature_child_of(transport_unix_socket_all, transport_all) | ||
| 17973 | netsnmp_feature_child_of(unix_socket_paths, transport_unix_socket_all) | ||
| 17974 | @@ -294,7 +295,6 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local) | ||
| 17975 | netsnmp_transport *t = NULL; | ||
| 17976 | sockaddr_un_pair *sup = NULL; | ||
| 17977 | int rc = 0; | ||
| 17978 | - char *string = NULL; | ||
| 17979 | |||
| 17980 | #ifdef NETSNMP_NO_LISTEN_SUPPORT | ||
| 17981 | /* SPECIAL CIRCUMSTANCE: We still want AgentX to be able to operate, | ||
| 17982 | @@ -307,18 +307,18 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local) | ||
| 17983 | return NULL; | ||
| 17984 | } | ||
| 17985 | |||
| 17986 | - t = (netsnmp_transport *) malloc(sizeof(netsnmp_transport)); | ||
| 17987 | + t = SNMP_MALLOC_TYPEDEF(netsnmp_transport); | ||
| 17988 | if (t == NULL) { | ||
| 17989 | return NULL; | ||
| 17990 | } | ||
| 17991 | |||
| 17992 | - string = netsnmp_unix_fmtaddr(NULL, (void *)addr, | ||
| 17993 | - sizeof(struct sockaddr_un)); | ||
| 17994 | - DEBUGMSGTL(("netsnmp_unix", "open %s %s\n", local ? "local" : "remote", | ||
| 17995 | - string)); | ||
| 17996 | - free(string); | ||
| 17997 | - | ||
| 17998 | - memset(t, 0, sizeof(netsnmp_transport)); | ||
| 17999 | + DEBUGIF("netsnmp_unix") { | ||
| 18000 | + char *str = netsnmp_unix_fmtaddr(NULL, (void *)addr, | ||
| 18001 | + sizeof(struct sockaddr_un)); | ||
| 18002 | + DEBUGMSGTL(("netsnmp_unix", "open %s %s\n", local ? "local" : "remote", | ||
| 18003 | + str)); | ||
| 18004 | + free(str); | ||
| 18005 | + } | ||
| 18006 | |||
| 18007 | t->domain = netsnmp_UnixDomain; | ||
| 18008 | t->domain_length = | ||
| 18009 | @@ -463,7 +463,7 @@ netsnmp_unix_create_tstring(const char *string, int local, | ||
| 18010 | (strlen(string) < sizeof(addr.sun_path))) { | ||
| 18011 | addr.sun_family = AF_UNIX; | ||
| 18012 | memset(addr.sun_path, 0, sizeof(addr.sun_path)); | ||
| 18013 | - strncpy(addr.sun_path, string, sizeof(addr.sun_path) - 1); | ||
| 18014 | + strlcpy(addr.sun_path, string, sizeof(addr.sun_path)); | ||
| 18015 | return netsnmp_unix_transport(&addr, local); | ||
| 18016 | } else { | ||
| 18017 | if (string != NULL && *string != '\0') { | ||
| 18018 | @@ -483,7 +483,7 @@ netsnmp_unix_create_ostring(const u_char * o, size_t o_len, int local) | ||
| 18019 | if (o_len > 0 && o_len < (sizeof(addr.sun_path) - 1)) { | ||
| 18020 | addr.sun_family = AF_UNIX; | ||
| 18021 | memset(addr.sun_path, 0, sizeof(addr.sun_path)); | ||
| 18022 | - strncpy(addr.sun_path, (const char *)o, o_len); | ||
| 18023 | + strlcpy(addr.sun_path, (const char *)o, sizeof(addr.sun_path)); | ||
| 18024 | return netsnmp_unix_transport(&addr, local); | ||
| 18025 | } else { | ||
| 18026 | if (o_len > 0) { | ||
| 18027 | diff --git a/testing/RUNTESTS b/testing/RUNTESTS | ||
| 18028 | index 8976c31..0b093da 100755 | ||
| 18029 | --- a/testing/RUNTESTS | ||
| 18030 | +++ b/testing/RUNTESTS | ||
| 18031 | @@ -10,13 +10,13 @@ if [ "x$MIBDIRS" = "x" ]; then | ||
| 18032 | export MIBDIRS | ||
| 18033 | fi | ||
| 18034 | |||
| 18035 | -# Make sure MinGW / MSYS users have the kill.exe program to stop the agent and | ||
| 18036 | +# Make sure MinGW / MSYS users have the pskill.exe program to stop the agent and | ||
| 18037 | # snmptrapd | ||
| 18038 | -if [ "x$OSTYPE" = "xmsys" -a "x`type -p kill.exe`" = "x" ]; then | ||
| 18039 | - echo Could not find kill.exe. Aborting tests. | ||
| 18040 | - echo kill.exe can be installed as follows: | ||
| 18041 | - echo - Download pskill.exe from http://technet.microsoft.com/en-us/sysinternals/default.aspx. | ||
| 18042 | - echo - Copy pskill.exe to C:\Windows\kill.exe. | ||
| 18043 | +if [ "x$OSTYPE" = "xmsys" -a "x`type -p pskill.exe`" = "x" ]; then | ||
| 18044 | + echo "Could not find pskill.exe. Aborting tests." | ||
| 18045 | + echo "pskill.exe can be installed as follows:" | ||
| 18046 | + echo "- Download pskill.exe from http://technet.microsoft.com/en-us/sysinternals/default.aspx." | ||
| 18047 | + echo "- Copy pskill.exe to C:\\MinGW\\msys\\1.0\\bin." | ||
| 18048 | exit 1 | ||
| 18049 | fi | ||
| 18050 | |||
| 18051 | diff --git a/testing/fulltests/default/T035snmpv3trapdusermgmt_simple b/testing/fulltests/default/T035snmpv3trapdusermgmt_simple | ||
| 18052 | index e42690f..e1b06c1 100644 | ||
| 18053 | --- a/testing/fulltests/default/T035snmpv3trapdusermgmt_simple | ||
| 18054 | +++ b/testing/fulltests/default/T035snmpv3trapdusermgmt_simple | ||
| 18055 | @@ -7,7 +7,8 @@ HEADER SNMPv3 snmptrapd USM user management with snmpusm | ||
| 18056 | SKIPIFNOT USING_AGENTX_MASTER_MODULE | ||
| 18057 | SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE | ||
| 18058 | SKIPIFNOT USING_SNMPV3_USMUSER_MODULE | ||
| 18059 | -SKIPIF NETSNMP_SNMPTRAPD_DISABLE_AGENTX | ||
| 18060 | +SKIPIF NETSNMP_SNMPTRAPD_DISABLE_AGENTX | ||
| 18061 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18062 | SKIPIFNOT NETSNMP_CAN_DO_CRYPTO | ||
| 18063 | SKIPIFNOT NETSNMP_ENABLE_SCAPI_AUTHPRIV | ||
| 18064 | |||
| 18065 | diff --git a/testing/fulltests/default/T065agentextend_simple b/testing/fulltests/default/T065agentextend_simple | ||
| 18066 | index c7cf6aa..07dcae3 100644 | ||
| 18067 | --- a/testing/fulltests/default/T065agentextend_simple | ||
| 18068 | +++ b/testing/fulltests/default/T065agentextend_simple | ||
| 18069 | @@ -4,6 +4,7 @@ | ||
| 18070 | |||
| 18071 | HEADER "extending agent functionality with extend" | ||
| 18072 | |||
| 18073 | +[ "x$OSTYPE" = xmsys -a "x$MSYS_SH" = x ] && SKIP "\$MSYS_SH has not been set" | ||
| 18074 | SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18075 | SKIPIFNOT USING_AGENT_EXTEND_MODULE | ||
| 18076 | SKIPIFNOT USING_UTILITIES_EXECUTE_MODULE | ||
| 18077 | diff --git a/testing/fulltests/default/T066pass_simple b/testing/fulltests/default/T066pass_simple | ||
| 18078 | new file mode 100644 | ||
| 18079 | index 0000000..6396ed1 | ||
| 18080 | --- /dev/null | ||
| 18081 | +++ b/testing/fulltests/default/T066pass_simple | ||
| 18082 | @@ -0,0 +1,53 @@ | ||
| 18083 | +#!/bin/sh | ||
| 18084 | + | ||
| 18085 | +. ../support/simple_eval_tools.sh | ||
| 18086 | + | ||
| 18087 | +HEADER "extending agent functionality with pass" | ||
| 18088 | + | ||
| 18089 | +SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18090 | +SKIPIFNOT USING_UCD_SNMP_PASS_MODULE | ||
| 18091 | +SKIPIFNOT USING_UTILITIES_EXECUTE_MODULE | ||
| 18092 | + | ||
| 18093 | +# Don't run this test on MinGW - local/passtest is a shell script and | ||
| 18094 | +# hence passing it to the MSVCRT popen() doesn't work. | ||
| 18095 | +[ "x$OSTYPE" = "xmsys" ] && SKIP "MinGW" | ||
| 18096 | + | ||
| 18097 | +# make sure snmpget and snmpwalk can be executed | ||
| 18098 | +SNMPGET="${builddir}/apps/snmpget" | ||
| 18099 | +[ -x "$SNMPGET" ] || SKIP | ||
| 18100 | +SNMPWALK="${builddir}/apps/snmpwalk" | ||
| 18101 | +[ -x "$SNMPWALK" ] || SKIP | ||
| 18102 | + | ||
| 18103 | +snmp_version=v2c | ||
| 18104 | +TESTCOMMUNITY=testcommunity | ||
| 18105 | +. ./Sv2cconfig | ||
| 18106 | + | ||
| 18107 | +# | ||
| 18108 | +# Begin test | ||
| 18109 | +# | ||
| 18110 | +oid=.1.3.6.1.4.1.8072.2.255 # NET-SNMP-PASS-MIB::netSnmpPassExamples | ||
| 18111 | +CONFIGAGENT pass $oid ${srcdir}/local/passtest | ||
| 18112 | + | ||
| 18113 | +ORIG_AGENT_FLAGS="$AGENT_FLAGS" | ||
| 18114 | +AGENT_FLAGS="$ORIG_AGENT_FLAGS -Ducd-snmp/pass" | ||
| 18115 | +STARTAGENT | ||
| 18116 | + | ||
| 18117 | +#COMMENT Check a full walk of the sample data | ||
| 18118 | +CAPTURE "$SNMPWALK $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $oid" | ||
| 18119 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassString.0 = STRING: Life, the Universe, and Everything" | ||
| 18120 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassInteger.1 = INTEGER: 42" | ||
| 18121 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassOID.1 = OID: NET-SNMP-PASS-MIB::netSnmpPassOIDValue" | ||
| 18122 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassTimeTicks.0 = Timeticks: (363136200) 42 days, 0:42:42.00 " | ||
| 18123 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassIpAddress.0 = IpAddress: 127.0.0.1" | ||
| 18124 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassCounter.0 = Counter32: 42" | ||
| 18125 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassGauge.0 = Gauge32: 42" | ||
| 18126 | + | ||
| 18127 | +#COMMENT A couple of spot checks of GET requests. | ||
| 18128 | +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassInteger.1" | ||
| 18129 | +CHECKORDIE "INTEGER: 42" | ||
| 18130 | + | ||
| 18131 | +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" | ||
| 18132 | +CHECKORDIE "Counter32: 42" | ||
| 18133 | + | ||
| 18134 | +STOPAGENT | ||
| 18135 | +FINISHED | ||
| 18136 | diff --git a/testing/fulltests/default/T067passpersist_simple b/testing/fulltests/default/T067passpersist_simple | ||
| 18137 | new file mode 100644 | ||
| 18138 | index 0000000..f91651a | ||
| 18139 | --- /dev/null | ||
| 18140 | +++ b/testing/fulltests/default/T067passpersist_simple | ||
| 18141 | @@ -0,0 +1,61 @@ | ||
| 18142 | +#!/bin/sh | ||
| 18143 | + | ||
| 18144 | +. ../support/simple_eval_tools.sh | ||
| 18145 | + | ||
| 18146 | +HEADER "extending agent functionality with pass_persist" | ||
| 18147 | + | ||
| 18148 | +SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18149 | +SKIPIFNOT USING_UCD_SNMP_PASS_PERSIST_MODULE | ||
| 18150 | + | ||
| 18151 | +# Don't run this test on MinGW - local/pass_persisttest is a shell script and | ||
| 18152 | +# hence passing it to the MSVCRT popen() doesn't work. | ||
| 18153 | +[ "x$OSTYPE" = "xmsys" ] && SKIP "MinGW" | ||
| 18154 | + | ||
| 18155 | +# make sure snmpget and snmpwalk can be executed | ||
| 18156 | +SNMPGET="${builddir}/apps/snmpget" | ||
| 18157 | +[ -x "$SNMPGET" ] || SKIP | ||
| 18158 | +SNMPWALK="${builddir}/apps/snmpwalk" | ||
| 18159 | +[ -x "$SNMPWALK" ] || SKIP | ||
| 18160 | + | ||
| 18161 | +snmp_version=v2c | ||
| 18162 | +TESTCOMMUNITY=testcommunity | ||
| 18163 | +. ./Sv2cconfig | ||
| 18164 | + | ||
| 18165 | +# | ||
| 18166 | +# Begin test | ||
| 18167 | +# | ||
| 18168 | +oid=.1.3.6.1.4.1.8072.2.255 # NET-SNMP-PASS-MIB::netSnmpPassExamples | ||
| 18169 | +CONFIGAGENT pass_persist $oid ${srcdir}/local/pass_persisttest | ||
| 18170 | + | ||
| 18171 | +ORIG_AGENT_FLAGS="$AGENT_FLAGS" | ||
| 18172 | +AGENT_FLAGS="$ORIG_AGENT_FLAGS -Ducd-snmp/pass_persist" | ||
| 18173 | +PASS_PERSIST_PIDFILE="$SNMP_TMPDIR/pass_persist.pid.$$" | ||
| 18174 | +export PASS_PERSIST_PIDFILE | ||
| 18175 | +STARTAGENT | ||
| 18176 | + | ||
| 18177 | +#COMMENT Check a full walk of the sample data | ||
| 18178 | +CAPTURE "$SNMPWALK $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $oid" | ||
| 18179 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassString.0 = STRING: Life, the Universe, and Everything" | ||
| 18180 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassInteger.1 = INTEGER: 42" | ||
| 18181 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassOID.1 = OID: NET-SNMP-PASS-MIB::netSnmpPassOIDValue" | ||
| 18182 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassTimeTicks.0 = Timeticks: (363136200) 42 days, 0:42:42.00 " | ||
| 18183 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassIpAddress.0 = IpAddress: 127.0.0.1" | ||
| 18184 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassCounter.0 = Counter32: 1" | ||
| 18185 | +CHECKORDIE "NET-SNMP-PASS-MIB::netSnmpPassGauge.0 = Gauge32: 42" | ||
| 18186 | + | ||
| 18187 | +#COMMENT A couple of spot checks of GET requests. | ||
| 18188 | +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassInteger.1" | ||
| 18189 | +CHECKORDIE "INTEGER: 42" | ||
| 18190 | + | ||
| 18191 | +#COMMENT netSnmpPassCounter should increment, since this is pass_persist | ||
| 18192 | +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" | ||
| 18193 | +CHECKORDIE "Counter32: 2" | ||
| 18194 | + | ||
| 18195 | +#COMMENT now kill the pass_persist script, and check that it recovers. | ||
| 18196 | +STOPPROG $PASS_PERSIST_PIDFILE | ||
| 18197 | +#COMMENT netSnmpPassCounter should have reverted to 1, as this is a new instance. | ||
| 18198 | +CAPTURE "$SNMPGET $SNMP_FLAGS -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT NET-SNMP-PASS-MIB::netSnmpPassCounter.0" | ||
| 18199 | +CHECKORDIE "Counter32: 1" | ||
| 18200 | + | ||
| 18201 | +STOPAGENT | ||
| 18202 | +FINISHED | ||
| 18203 | diff --git a/testing/fulltests/default/T111agentxset_simple b/testing/fulltests/default/T111agentxset_simple | ||
| 18204 | index 2423be5..c767064 100644 | ||
| 18205 | --- a/testing/fulltests/default/T111agentxset_simple | ||
| 18206 | +++ b/testing/fulltests/default/T111agentxset_simple | ||
| 18207 | @@ -7,6 +7,7 @@ HEADER AgentX SET support | ||
| 18208 | SKIPIFNOT USING_AGENTX_MASTER_MODULE | ||
| 18209 | SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE | ||
| 18210 | SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE | ||
| 18211 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18212 | |||
| 18213 | # | ||
| 18214 | # Begin test | ||
| 18215 | diff --git a/testing/fulltests/default/T112agentxsetfail_simple b/testing/fulltests/default/T112agentxsetfail_simple | ||
| 18216 | index 9976144..4f1f0cb 100644 | ||
| 18217 | --- a/testing/fulltests/default/T112agentxsetfail_simple | ||
| 18218 | +++ b/testing/fulltests/default/T112agentxsetfail_simple | ||
| 18219 | @@ -7,6 +7,7 @@ HEADER AgentX illegal SET handling support | ||
| 18220 | SKIPIFNOT USING_AGENTX_MASTER_MODULE | ||
| 18221 | SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE | ||
| 18222 | SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE | ||
| 18223 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18224 | |||
| 18225 | # | ||
| 18226 | # Begin test | ||
| 18227 | diff --git a/testing/fulltests/default/T114agentxagentxtrap_simple b/testing/fulltests/default/T114agentxagentxtrap_simple | ||
| 18228 | index ae72d5c..58475d0 100644 | ||
| 18229 | --- a/testing/fulltests/default/T114agentxagentxtrap_simple | ||
| 18230 | +++ b/testing/fulltests/default/T114agentxagentxtrap_simple | ||
| 18231 | @@ -38,7 +38,7 @@ STOPAGENT | ||
| 18232 | STOPTRAPD | ||
| 18233 | |||
| 18234 | # Check that the trap was received | ||
| 18235 | -CHECKTRAPD "mostly_harmless" | ||
| 18236 | +CHECKTRAPD "= STRING: \"*mostly_harmless\"*" | ||
| 18237 | |||
| 18238 | # all done (whew) | ||
| 18239 | FINISHED | ||
| 18240 | diff --git a/testing/fulltests/default/T121proxyset_simple b/testing/fulltests/default/T121proxyset_simple | ||
| 18241 | index 335a2da..d3d77d9 100644 | ||
| 18242 | --- a/testing/fulltests/default/T121proxyset_simple | ||
| 18243 | +++ b/testing/fulltests/default/T121proxyset_simple | ||
| 18244 | @@ -6,7 +6,8 @@ HEADER Proxy SET support | ||
| 18245 | |||
| 18246 | SKIPIFNOT USING_UCD_SNMP_PROXY_MODULE | ||
| 18247 | SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE | ||
| 18248 | -SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18249 | +SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18250 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18251 | |||
| 18252 | # XXX: ucd-snmp/proxy doesn't properly support TCP -- remove this once it does | ||
| 18253 | [ "x$SNMP_TRANSPORT_SPEC" = "xtcp" -o "x$SNMP_TRANSPORT_SPEC" = "xtcp6" ] && SKIP | ||
| 18254 | diff --git a/testing/fulltests/default/T122proxysetfail_simple b/testing/fulltests/default/T122proxysetfail_simple | ||
| 18255 | index a49b3ef..d149f56 100644 | ||
| 18256 | --- a/testing/fulltests/default/T122proxysetfail_simple | ||
| 18257 | +++ b/testing/fulltests/default/T122proxysetfail_simple | ||
| 18258 | @@ -6,7 +6,8 @@ HEADER Proxy illegal SET handling support | ||
| 18259 | |||
| 18260 | SKIPIFNOT USING_UCD_SNMP_PROXY_MODULE | ||
| 18261 | SKIPIFNOT USING_MIBII_SYSTEM_MIB_MODULE | ||
| 18262 | -SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18263 | +SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18264 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18265 | |||
| 18266 | # XXX: ucd-snmp/proxy doesn't properly support TCP -- remove this once it does | ||
| 18267 | [ "x$SNMP_TRANSPORT_SPEC" = "xtcp" ] && SKIP | ||
| 18268 | diff --git a/testing/fulltests/default/T130snmpv1vacmget_simple b/testing/fulltests/default/T130snmpv1vacmget_simple | ||
| 18269 | index 1974b7f..80623f4 100644 | ||
| 18270 | --- a/testing/fulltests/default/T130snmpv1vacmget_simple | ||
| 18271 | +++ b/testing/fulltests/default/T130snmpv1vacmget_simple | ||
| 18272 | @@ -16,6 +16,7 @@ SKIPIF NETSNMP_DISABLE_SNMPV1 | ||
| 18273 | snmp_version=v1 | ||
| 18274 | . ./Svacmconfig | ||
| 18275 | |||
| 18276 | +AGENT_FLAGS="$AGENT_FLAGS -I-winExtDLL" | ||
| 18277 | STARTAGENT | ||
| 18278 | |||
| 18279 | 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" | ||
| 18280 | diff --git a/testing/fulltests/default/T141snmpv2cvacmgetfail_simple b/testing/fulltests/default/T141snmpv2cvacmgetfail_simple | ||
| 18281 | index b97cf5d..69c2925 100644 | ||
| 18282 | --- a/testing/fulltests/default/T141snmpv2cvacmgetfail_simple | ||
| 18283 | +++ b/testing/fulltests/default/T141snmpv2cvacmgetfail_simple | ||
| 18284 | @@ -5,6 +5,7 @@ | ||
| 18285 | HEADER SNMPv2 vacm denial support | ||
| 18286 | |||
| 18287 | SKIPIF NETSNMP_DISABLE_SNMPV2C | ||
| 18288 | +SKIPIF NETSNMP_DISABLE_SET_SUPPORT | ||
| 18289 | SKIPIFNOT USING_MIBII_VACM_CONF_MODULE | ||
| 18290 | |||
| 18291 | # | ||
| 18292 | diff --git a/testing/fulltests/snmpv3/T040keymanagetest_capp.c b/testing/fulltests/snmpv3/T040keymanagetest_capp.c | ||
| 18293 | index f3f8dcc..d68f663 100644 | ||
| 18294 | --- a/testing/fulltests/snmpv3/T040keymanagetest_capp.c | ||
| 18295 | +++ b/testing/fulltests/snmpv3/T040keymanagetest_capp.c | ||
| 18296 | @@ -360,7 +360,6 @@ test_genkul(void) | ||
| 18297 | char *s = NULL; | ||
| 18298 | const char *testname = "Using HMACMD5 to create master key."; | ||
| 18299 | const char *hashname_Ku = "usmHMACMD5AuthProtocol"; | ||
| 18300 | - const char *hashname_kul = NULL; | ||
| 18301 | |||
| 18302 | u_char Ku[LOCAL_MAXBUF], kul[LOCAL_MAXBUF]; | ||
| 18303 | |||
| 18304 | @@ -413,7 +412,6 @@ test_genkul(void) | ||
| 18305 | test_genkul_again_master: | ||
| 18306 | memset(Ku, 0, LOCAL_MAXBUF); | ||
| 18307 | kulen = LOCAL_MAXBUF; | ||
| 18308 | - hashname_kul = "usmHMACMD5AuthProtocol"; | ||
| 18309 | hashtype_kul = usmHMACMD5AuthProtocol; | ||
| 18310 | properlength = BYTESIZE(SNMP_TRANS_AUTHLEN_HMACMD5); | ||
| 18311 | |||
| 18312 | @@ -461,7 +459,6 @@ test_genkul(void) | ||
| 18313 | */ | ||
| 18314 | if (hashtype_kul == usmHMACMD5AuthProtocol) { | ||
| 18315 | hashtype_kul = usmHMACSHA1AuthProtocol; | ||
| 18316 | - hashname_kul = "usmHMACSHA1AuthProtocol"; | ||
| 18317 | properlength = BYTESIZE(SNMP_TRANS_AUTHLEN_HMACSHA1); | ||
| 18318 | goto test_genkul_again_local; | ||
| 18319 | } | ||
| 18320 | diff --git a/testing/fulltests/support/clib_build b/testing/fulltests/support/clib_build | ||
| 18321 | index 7a72285..0c7eb6d 100755 | ||
| 18322 | --- a/testing/fulltests/support/clib_build | ||
| 18323 | +++ b/testing/fulltests/support/clib_build | ||
| 18324 | @@ -13,6 +13,7 @@ cat >>"$2.c" <<EOF | ||
| 18325 | #include <net-snmp/library/testing.h> | ||
| 18326 | |||
| 18327 | /* standard headers */ | ||
| 18328 | +#include <errno.h> | ||
| 18329 | #include <stdio.h> | ||
| 18330 | #include <sys/types.h> | ||
| 18331 | #ifdef HAVE_STDLIB_H | ||
| 18332 | @@ -23,6 +24,9 @@ cat >>"$2.c" <<EOF | ||
| 18333 | #else | ||
| 18334 | #include <strings.h> | ||
| 18335 | #endif | ||
| 18336 | +#ifdef HAVE_NETDB_H | ||
| 18337 | +#include <netdb.h> | ||
| 18338 | +#endif | ||
| 18339 | #ifdef HAVE_ARPA_INET_H | ||
| 18340 | #include <arpa/inet.h> | ||
| 18341 | #endif | ||
| 18342 | diff --git a/testing/fulltests/support/simple_TESTCONF.sh b/testing/fulltests/support/simple_TESTCONF.sh | ||
| 18343 | index f8f229a..83c38c2 100644 | ||
| 18344 | --- a/testing/fulltests/support/simple_TESTCONF.sh | ||
| 18345 | +++ b/testing/fulltests/support/simple_TESTCONF.sh | ||
| 18346 | @@ -7,6 +7,28 @@ | ||
| 18347 | # *SNMP_PERSISTENT_FILE: where to store the agent's persistent information | ||
| 18348 | # (XXX: this should be specific to just the agent) | ||
| 18349 | |||
| 18350 | +# MinGW/MSYS only: translate an MSYS path back into a DOS path such that snmpd | ||
| 18351 | +# and the Net-SNMP applications can understand it. One of the features of MSYS | ||
| 18352 | +# is that if a POSIX-style path is passed as a command-line argument to an | ||
| 18353 | +# executable that MSYS translates that path to a DOS-style path before | ||
| 18354 | +# starting the executable. This is a key feature of MSYS that makes it | ||
| 18355 | +# possible to run shell scripts unmodified and at the same time to use | ||
| 18356 | +# executables that accept DOS-style paths. There is no support however for | ||
| 18357 | +# automatical translation of environment variables that contain paths. Hence | ||
| 18358 | +# this function that translates paths explicitly. | ||
| 18359 | +translate_path() { | ||
| 18360 | + if [ "$OSTYPE" = msys ]; then | ||
| 18361 | + local t=`set \ | ||
| 18362 | + | sed -n -e "s/^$1='\(.*\)'$/${SNMP_ENV_SEPARATOR}\1/p" \ | ||
| 18363 | + -e "s/^$1=\(.*\)$/${SNMP_ENV_SEPARATOR}\1/p" \ | ||
| 18364 | + | sed -e "s|${SNMP_ENV_SEPARATOR}/c/|${SNMP_ENV_SEPARATOR}c:/|g" \ | ||
| 18365 | + -e "s|${SNMP_ENV_SEPARATOR}/tmp/|${SNMP_ENV_SEPARATOR}c:/windows/temp/|g" \ | ||
| 18366 | + | sed -e "s/^${SNMP_ENV_SEPARATOR}//" \ | ||
| 18367 | + ` | ||
| 18368 | + eval "$1='$t'" | ||
| 18369 | + fi | ||
| 18370 | +} | ||
| 18371 | + | ||
| 18372 | # | ||
| 18373 | # Only allow ourselves to be eval'ed once | ||
| 18374 | # | ||
| 18375 | @@ -48,6 +70,8 @@ if [ "x$SNMP_VERBOSE" = "x" ]; then | ||
| 18376 | export SNMP_VERBOSE | ||
| 18377 | fi | ||
| 18378 | |||
| 18379 | +SNMP_ENV_SEPARATOR="`${builddir}/net-snmp-config --env-separator`" | ||
| 18380 | + | ||
| 18381 | if [ "x$MIBDIRS" = "x" ]; then | ||
| 18382 | if [ "x$SNMP_PREFER_NEAR_MIBS" = "x1" ]; then | ||
| 18383 | MIBDIRS=${srcdir}/mibs | ||
| 18384 | @@ -103,6 +127,7 @@ if [ "x$SNMP_HEADERONLY" != "xyes" ]; then | ||
| 18385 | testnum=0 | ||
| 18386 | fi | ||
| 18387 | SNMP_TMPDIR="/tmp/snmp-test-$testnum-$$" | ||
| 18388 | + translate_path SNMP_TMPDIR | ||
| 18389 | export SNMP_TMPDIR | ||
| 18390 | if [ -d $SNMP_TMPDIR ]; then | ||
| 18391 | echo "$0: ERROR: $SNMP_TMPDIR already existed." | ||
| 18392 | @@ -110,7 +135,7 @@ if [ "x$SNMP_HEADERONLY" != "xyes" ]; then | ||
| 18393 | fi | ||
| 18394 | fi | ||
| 18395 | if [ ! -d $SNMP_TMPDIR ]; then | ||
| 18396 | - mkdir $SNMP_TMPDIR | ||
| 18397 | + mkdir -p $SNMP_TMPDIR | ||
| 18398 | chmod 0700 $SNMP_TMPDIR | ||
| 18399 | fi | ||
| 18400 | if [ "x$SNMP_TMP_PERSISTENTDIR" = "x" ]; then | ||
| 18401 | @@ -130,7 +155,6 @@ fi | ||
| 18402 | |||
| 18403 | SNMP_IGNORE_WINDOWS_REGISTRY="true" | ||
| 18404 | export SNMP_IGNORE_WINDOWS_REGISTRY | ||
| 18405 | -SNMP_ENV_SEPARATOR="`${builddir}/net-snmp-config --env-separator`" | ||
| 18406 | SNMP_PERLPROG="`${builddir}/net-snmp-config --perlprog`" | ||
| 18407 | SNMP_TESTDIR="$SNMP_BASEDIR/tests" | ||
| 18408 | SNMP_CONFIG_FILE="$SNMP_TMPDIR/snmpd.conf" | ||
| 18409 | @@ -144,8 +168,10 @@ SNMP_SNMPD_LOG_FILE="$SNMP_TMPDIR/snmpd.log" | ||
| 18410 | SNMP_AGENTX_PID_FILE="$SNMP_TMPDIR/agentx.pid" | ||
| 18411 | SNMP_AGENTX_LOG_FILE="$SNMP_TMPDIR/agentx.log" | ||
| 18412 | SNMPCONFPATH="${SNMP_TMPDIR}${SNMP_ENV_SEPARATOR}${SNMP_TMP_PERSISTENTDIR}" | ||
| 18413 | +translate_path SNMPCONFPATH | ||
| 18414 | export SNMPCONFPATH | ||
| 18415 | SNMP_PERSISTENT_DIR=$SNMP_TMP_PERSISTENTDIR | ||
| 18416 | +translate_path SNMP_PERSISTENT_DIR | ||
| 18417 | export SNMP_PERSISTENT_DIR | ||
| 18418 | #SNMP_PERSISTENT_FILE="$SNMP_TMP_PERSISTENTDIR/persistent-store.conf" | ||
| 18419 | #export SNMP_PERSISTENT_FILE | ||
| 18420 | @@ -175,8 +201,12 @@ else | ||
| 18421 | fi | ||
| 18422 | |||
| 18423 | if [ "x$OSTYPE" = "xmsys" ]; then | ||
| 18424 | - # To do: make configure find out the path of MSYS' sh.exe. | ||
| 18425 | - MSYS_SH="c:/msys/1.0/bin/sh.exe" | ||
| 18426 | + # Obtain the MSYS installation path from the !C: environment variable, | ||
| 18427 | + # remove surrounding single quotes and convert backslashes into forward | ||
| 18428 | + # slashes. | ||
| 18429 | + MSYS_PATH="$(set \ | ||
| 18430 | + | sed -n 's|^\!C:='"'"'\(.*\)'"'"'$|\1|p' | sed 's|\\|/|g')" | ||
| 18431 | + MSYS_SH="$MSYS_PATH/sh.exe" | ||
| 18432 | fi | ||
| 18433 | |||
| 18434 | PROBE_FOR_PORT() { | ||
| 18435 | diff --git a/testing/fulltests/support/simple_eval_tools.sh b/testing/fulltests/support/simple_eval_tools.sh | ||
| 18436 | index f16d9a6..d1dfbc8 100644 | ||
| 18437 | --- a/testing/fulltests/support/simple_eval_tools.sh | ||
| 18438 | +++ b/testing/fulltests/support/simple_eval_tools.sh | ||
| 18439 | @@ -114,7 +114,7 @@ SKIP() { | ||
| 18440 | } | ||
| 18441 | |||
| 18442 | ISDEFINED() { | ||
| 18443 | - 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 | ||
| 18444 | + 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 | ||
| 18445 | } | ||
| 18446 | |||
| 18447 | SKIPIFNOT() { | ||
| 18448 | @@ -131,7 +131,7 @@ VERIFY() { # <path_to_file(s)> | ||
| 18449 | local missingfiles= | ||
| 18450 | |||
| 18451 | for f in $*; do | ||
| 18452 | - [ -e "$f" ] && continue | ||
| 18453 | + [ -f "$f" ] && continue | ||
| 18454 | echo "FAILED: Cannot find file \"$f\"." | ||
| 18455 | missingfiles=true | ||
| 18456 | done | ||
| 18457 | @@ -148,7 +148,7 @@ NEWOUTPUTFILE() { | ||
| 18458 | # | ||
| 18459 | STARTTEST() { | ||
| 18460 | NEWOUTPUTFILE | ||
| 18461 | - [ ! -e "$junkoutputfile" ] && { | ||
| 18462 | + [ ! -f "$junkoutputfile" ] && { | ||
| 18463 | touch $junkoutputfile | ||
| 18464 | return | ||
| 18465 | } | ||
| 18466 | @@ -365,7 +365,7 @@ ISRUNNING() { | ||
| 18467 | # Echo a command that asks the process with pid $1 to stop. | ||
| 18468 | ECHOSENDSIGTERM() { | ||
| 18469 | if [ "x$OSTYPE" = "xmsys" ]; then | ||
| 18470 | - echo kill.exe $1 | ||
| 18471 | + echo pskill.exe $1 | ||
| 18472 | else | ||
| 18473 | echo kill -TERM $1 | ||
| 18474 | fi | ||
| 18475 | @@ -374,7 +374,7 @@ ECHOSENDSIGTERM() { | ||
| 18476 | # Echo a command that stops the process with pid $1 forcibly. | ||
| 18477 | ECHOSENDSIGKILL() { | ||
| 18478 | if [ "x$OSTYPE" = "xmsys" ]; then | ||
| 18479 | - echo kill.exe $1 | ||
| 18480 | + echo pskill.exe $1 | ||
| 18481 | else | ||
| 18482 | echo kill -KILL $1 | ||
| 18483 | fi | ||
| 18484 | @@ -489,7 +489,6 @@ CONFIGAPP() { | ||
| 18485 | # | ||
| 18486 | # common to STARTAGENT and STARTTRAPD | ||
| 18487 | # log command to "invoked" file | ||
| 18488 | -# delay after command to allow for settle | ||
| 18489 | # | ||
| 18490 | STARTPROG() { | ||
| 18491 | if [ "x$DYNAMIC_ANALYZER" != "x" ]; then | ||
| 18492 | @@ -537,6 +536,7 @@ STARTAGENT() { | ||
| 18493 | PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" | ||
| 18494 | fi | ||
| 18495 | STARTPROG | ||
| 18496 | + WAITFORCOND test -f $SNMP_SNMPD_PID_FILE | ||
| 18497 | WAITFORAGENT "NET-SNMP version" | ||
| 18498 | } | ||
| 18499 | |||
| 18500 | @@ -551,6 +551,7 @@ STARTTRAPD() { | ||
| 18501 | PORT_SPEC="${SNMP_TRANSPORT_SPEC}:${SNMP_TEST_DEST}${PORT_SPEC}" | ||
| 18502 | fi | ||
| 18503 | STARTPROG | ||
| 18504 | + WAITFORCOND test -f $SNMP_SNMPTRAPD_PID_FILE | ||
| 18505 | WAITFORTRAPD "NET-SNMP version" | ||
| 18506 | } | ||
| 18507 | |||
| 18508 | @@ -559,7 +560,7 @@ STARTTRAPD() { | ||
| 18509 | HUPPROG() { | ||
| 18510 | if [ -f $1 ]; then | ||
| 18511 | if [ "x$OSTYPE" = "xmsys" ]; then | ||
| 18512 | - COMMAND='echo "Skipping SIGHUP (not supported by kill.exe on MinGW)"' | ||
| 18513 | + COMMAND='echo "Skipping SIGHUP (not possible with MinGW)"' | ||
| 18514 | else | ||
| 18515 | COMMAND="kill -HUP `cat $1`" | ||
| 18516 | fi | ||
| 18517 | @@ -595,7 +596,10 @@ STOPPROG() { | ||
| 18518 | echo "$COMMAND ($1)" >> $SNMP_TMPDIR/invoked | ||
| 18519 | VERBOSE_OUT 0 "$COMMAND ($1)" | ||
| 18520 | $COMMAND >/dev/null 2>&1 | ||
| 18521 | - if [ "x$OSTYPE" != "xmsys" ]; then | ||
| 18522 | + if [ "x$OSTYPE" = "xmsys" ]; then | ||
| 18523 | + # Wait until $pid and its parent have stopped. | ||
| 18524 | + sleep 1 | ||
| 18525 | + else | ||
| 18526 | WAITFORNOTCOND "ISRUNNING $pid" | ||
| 18527 | fi | ||
| 18528 | fi | ||
| 18529 | diff --git a/testing/fulltests/unit-tests/T004snmp_enum_clib.c b/testing/fulltests/unit-tests/T004snmp_enum_clib.c | ||
| 18530 | index e78ffca..d28b19b 100644 | ||
| 18531 | --- a/testing/fulltests/unit-tests/T004snmp_enum_clib.c | ||
| 18532 | +++ b/testing/fulltests/unit-tests/T004snmp_enum_clib.c | ||
| 18533 | @@ -1,15 +1,69 @@ | ||
| 18534 | /* HEADER Testing snmp_enum */ | ||
| 18535 | |||
| 18536 | +#define CONFIG_TYPE "snmp-enum-unit-test" | ||
| 18537 | #define STRING1 "life, and everything" | ||
| 18538 | #define STRING2 "restaurant at the end of the universe" | ||
| 18539 | #define STRING3 "label3" | ||
| 18540 | +#define LONG_STRING "a-string-of-255-characters-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" | ||
| 18541 | |||
| 18542 | +#define STORE_AND_COMPARE(maj, min, s) \ | ||
| 18543 | + { \ | ||
| 18544 | + FILE *fp; \ | ||
| 18545 | + int read = 0; \ | ||
| 18546 | + char *p, contents[4096]; \ | ||
| 18547 | + \ | ||
| 18548 | + se_store_list(maj, min, CONFIG_TYPE); \ | ||
| 18549 | + fp = fopen(tmp_persist_file, "r"); \ | ||
| 18550 | + if (fp) { \ | ||
| 18551 | + read = fread(contents, 1, sizeof(contents) - 1, fp); \ | ||
| 18552 | + fclose(fp); \ | ||
| 18553 | + } \ | ||
| 18554 | + contents[read > 0 ? read : 0] = '\0'; \ | ||
| 18555 | + for (p = contents; *p; ++p) \ | ||
| 18556 | + if (*p == '\n') \ | ||
| 18557 | + *p = '|'; \ | ||
| 18558 | + OKF(strcmp(contents, (s)) == 0, \ | ||
| 18559 | + ("stored list %s <> %s", (s), contents)); \ | ||
| 18560 | + remove(tmp_persist_file); \ | ||
| 18561 | + } | ||
| 18562 | + | ||
| 18563 | +char tmp_persist_file[256]; | ||
| 18564 | char *se_find_result; | ||
| 18565 | |||
| 18566 | +sprintf(tmp_persist_file, "/tmp/snmp-enum-unit-test-%d", getpid()); | ||
| 18567 | +netsnmp_setenv("SNMP_PERSISTENT_FILE", tmp_persist_file, 1); | ||
| 18568 | + | ||
| 18569 | init_snmp_enum("snmp"); | ||
| 18570 | + | ||
| 18571 | +STORE_AND_COMPARE(1, 1, "enum 1:1|"); | ||
| 18572 | + | ||
| 18573 | se_add_pair(1, 1, strdup("hi"), 1); | ||
| 18574 | + | ||
| 18575 | +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi|"); | ||
| 18576 | + | ||
| 18577 | se_add_pair(1, 1, strdup("there"), 2); | ||
| 18578 | |||
| 18579 | +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there|"); | ||
| 18580 | + | ||
| 18581 | +se_add_pair(1, 1, strdup(LONG_STRING), 3); | ||
| 18582 | +se_add_pair(1, 1, strdup(LONG_STRING), 4); | ||
| 18583 | +se_add_pair(1, 1, strdup(LONG_STRING), 5); | ||
| 18584 | +se_add_pair(1, 1, strdup(LONG_STRING), 6); | ||
| 18585 | +se_add_pair(1, 1, strdup(LONG_STRING), 7); | ||
| 18586 | +se_add_pair(1, 1, strdup(LONG_STRING), 8); | ||
| 18587 | +se_add_pair(1, 1, strdup(LONG_STRING), 9); | ||
| 18588 | + | ||
| 18589 | +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING | ||
| 18590 | + " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING | ||
| 18591 | + " 8:" LONG_STRING " 9:" LONG_STRING "|"); | ||
| 18592 | + | ||
| 18593 | +se_add_pair(1, 1, strdup(LONG_STRING), 10); | ||
| 18594 | + | ||
| 18595 | +STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING | ||
| 18596 | + " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING | ||
| 18597 | + " 8:" LONG_STRING " 9:" LONG_STRING "|" | ||
| 18598 | + "enum 1:1 10:" LONG_STRING "|"); | ||
| 18599 | + | ||
| 18600 | OK(se_find_value(1, 1, "hi") == 1, | ||
| 18601 | "lookup by number #1 should be the proper string"); | ||
| 18602 | OK(strcmp(se_find_label(1, 1, 2), "there") == 0, | ||
| 18603 | @@ -33,10 +87,10 @@ se_read_conf("enum", | ||
| 18604 | OK(se_find_list(2, 3), "list (2, 3) should be present"); | ||
| 18605 | if (se_find_list(2, 3)) { | ||
| 18606 | OK(se_find_value(2, 3, "kiwifruit") == 3, | ||
| 18607 | - "lookup by string should return the proper value") | ||
| 18608 | + "lookup by string should return the proper value"); | ||
| 18609 | se_find_result = se_find_label(2, 3, 2); | ||
| 18610 | OK(se_find_result && strcmp(se_find_result, "pear") == 0, | ||
| 18611 | - "lookup by label should return the proper string") | ||
| 18612 | + "lookup by label should return the proper string"); | ||
| 18613 | } | ||
| 18614 | |||
| 18615 | se_read_conf("enum", | ||
| 18616 | diff --git a/testing/fulltests/unit-tests/T008asn1_clib.c b/testing/fulltests/unit-tests/T008asn1_clib.c | ||
| 18617 | index 222ec7a..73a2f73 100644 | ||
| 18618 | --- a/testing/fulltests/unit-tests/T008asn1_clib.c | ||
| 18619 | +++ b/testing/fulltests/unit-tests/T008asn1_clib.c | ||
| 18620 | @@ -78,6 +78,8 @@ debug_register_tokens("dumpv_recv,dumpv_send,asn"); | ||
| 18621 | } | ||
| 18622 | } | ||
| 18623 | |||
| 18624 | +#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | ||
| 18625 | + | ||
| 18626 | #define TOINT64(c) ((long long)(long)(c).high << 32 | (c).low) | ||
| 18627 | |||
| 18628 | { | ||
| 18629 | @@ -128,6 +130,8 @@ debug_register_tokens("dumpv_recv,dumpv_send,asn"); | ||
| 18630 | } | ||
| 18631 | } | ||
| 18632 | |||
| 18633 | +#endif | ||
| 18634 | + | ||
| 18635 | #define TOUINT64(c) ((unsigned long long)(c).high << 32 | (c).low) | ||
| 18636 | |||
| 18637 | { | ||
| 18638 | diff --git a/testing/fulltests/unit-tests/T009large_fd_set_clib.c b/testing/fulltests/unit-tests/T009large_fd_set_clib.c | ||
| 18639 | index 0951dc2..eee4d41 100644 | ||
| 18640 | --- a/testing/fulltests/unit-tests/T009large_fd_set_clib.c | ||
| 18641 | +++ b/testing/fulltests/unit-tests/T009large_fd_set_clib.c | ||
| 18642 | @@ -2,7 +2,8 @@ | ||
| 18643 | |||
| 18644 | netsnmp_large_fd_set fds; | ||
| 18645 | netsnmp_large_fd_set_init(&fds, 2000); | ||
| 18646 | -netsnmp_large_fd_set_resize(&fds, 2000); | ||
| 18647 | +OKF(fds.lfs_setsize == 2000, ("initialization")); | ||
| 18648 | +OKF(netsnmp_large_fd_set_resize(&fds, 2000) == 1, ("resizing to 2000")); | ||
| 18649 | NETSNMP_LARGE_FD_ZERO(&fds); | ||
| 18650 | |||
| 18651 | { | ||
| 18652 | @@ -16,7 +17,7 @@ NETSNMP_LARGE_FD_ZERO(&fds); | ||
| 18653 | } | ||
| 18654 | } | ||
| 18655 | |||
| 18656 | -netsnmp_large_fd_set_resize(&fds, 3000); | ||
| 18657 | +OKF(netsnmp_large_fd_set_resize(&fds, 3000) == 1, ("resizing to 3000")); | ||
| 18658 | |||
| 18659 | { | ||
| 18660 | int i; | ||
| 18661 | @@ -29,7 +30,7 @@ netsnmp_large_fd_set_resize(&fds, 3000); | ||
| 18662 | } | ||
| 18663 | } | ||
| 18664 | |||
| 18665 | -netsnmp_large_fd_set_resize(&fds, 1000); | ||
| 18666 | +OKF(netsnmp_large_fd_set_resize(&fds, 1000) == 1, ("resizing to 1000")); | ||
| 18667 | |||
| 18668 | { | ||
| 18669 | int i; | ||
| 18670 | diff --git a/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c b/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c | ||
| 18671 | new file mode 100644 | ||
| 18672 | index 0000000..6f1d449 | ||
| 18673 | --- /dev/null | ||
| 18674 | +++ b/testing/fulltests/unit-tests/T011snmp_old_api_registration_cagentlib.c | ||
| 18675 | @@ -0,0 +1,46 @@ | ||
| 18676 | +/* HEADER Testing SNMP handler registration via the old API */ | ||
| 18677 | + | ||
| 18678 | +static oid Oid[] = { 1, 3, 6, 1, 3, 327 }; /* experimental.327 */ | ||
| 18679 | +struct variable var_array[] = { | ||
| 18680 | + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 1 } }, | ||
| 18681 | + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 2 } }, | ||
| 18682 | + { 0, 0/*type*/, 0/*acl*/, NULL/*findVar*/, 7, { 1, 3, 6, 1, 3, 327, 3 } }, | ||
| 18683 | +}; | ||
| 18684 | +netsnmp_session *sess; | ||
| 18685 | +int res; | ||
| 18686 | + | ||
| 18687 | +init_snmp("snmp"); | ||
| 18688 | + | ||
| 18689 | +sess = calloc(1, sizeof(*sess)); | ||
| 18690 | +snmp_sess_init(sess); | ||
| 18691 | + | ||
| 18692 | +res = | ||
| 18693 | +netsnmp_register_old_api("exp.327.a", | ||
| 18694 | + var_array, | ||
| 18695 | + sizeof(var_array[0]), | ||
| 18696 | + sizeof(var_array)/sizeof(var_array[0]), | ||
| 18697 | + Oid, | ||
| 18698 | + sizeof(Oid)/sizeof(Oid[0]), | ||
| 18699 | + 2, /* priority */ | ||
| 18700 | + 0, /* range_subid */ | ||
| 18701 | + 0, /* range_ubound */ | ||
| 18702 | + sess, | ||
| 18703 | + "context", 5/*timeout*/, 0/*flags - ignored*/); | ||
| 18704 | +OK(res == SNMPERR_SUCCESS, "Handler registration (1)."); | ||
| 18705 | + | ||
| 18706 | +/* Verify that duplicate registration does not cause any havoc. */ | ||
| 18707 | +res = | ||
| 18708 | +netsnmp_register_old_api("exp.327.b", | ||
| 18709 | + var_array, | ||
| 18710 | + sizeof(var_array[0]), | ||
| 18711 | + sizeof(var_array)/sizeof(var_array[0]), | ||
| 18712 | + Oid, | ||
| 18713 | + sizeof(Oid)/sizeof(Oid[0]), | ||
| 18714 | + 2, /* priority */ | ||
| 18715 | + 0, /* range_subid */ | ||
| 18716 | + 0, /* range_ubound */ | ||
| 18717 | + sess, | ||
| 18718 | + "context", 5/*timeout*/, 0/*flags - ignored*/); | ||
| 18719 | +OK(res == SNMPERR_SUCCESS, "Handler registration (2)."); | ||
| 18720 | + | ||
| 18721 | +snmp_shutdown("snmp"); | ||
| 18722 | diff --git a/testing/fulltests/unit-tests/T012binary_array_oid_clib.c b/testing/fulltests/unit-tests/T012binary_array_oid_clib.c | ||
| 18723 | new file mode 100644 | ||
| 18724 | index 0000000..aeeb502 | ||
| 18725 | --- /dev/null | ||
| 18726 | +++ b/testing/fulltests/unit-tests/T012binary_array_oid_clib.c | ||
| 18727 | @@ -0,0 +1,72 @@ | ||
| 18728 | +/* HEADER Testing binary OID array */ | ||
| 18729 | + | ||
| 18730 | +static const char test_name[] = "binary-array-of-OIDs-test"; | ||
| 18731 | +oid o1 = 1; | ||
| 18732 | +oid o2 = 2; | ||
| 18733 | +oid o3 = 6; | ||
| 18734 | +oid o4 = 8; | ||
| 18735 | +oid o5 = 9; | ||
| 18736 | +oid ox = 7; | ||
| 18737 | +oid oy = 10; | ||
| 18738 | +netsnmp_index i1, i2, i3, i4, i5, ix, iy, *ip; | ||
| 18739 | +const netsnmp_index *const i_last = &i5; | ||
| 18740 | +netsnmp_index *a[] = { &ix, &iy }; | ||
| 18741 | +netsnmp_index *b[] = { &i4, &i2, &i3, &i1, &i5 }; | ||
| 18742 | +netsnmp_container *c; | ||
| 18743 | +int i; | ||
| 18744 | + | ||
| 18745 | +init_snmp(test_name); | ||
| 18746 | + | ||
| 18747 | +c = netsnmp_container_get_binary_array(); | ||
| 18748 | +c->compare = netsnmp_compare_netsnmp_index; | ||
| 18749 | + | ||
| 18750 | +i1.oids = &o1; | ||
| 18751 | +i2.oids = &o2; | ||
| 18752 | +i3.oids = &o3; | ||
| 18753 | +i4.oids = &o4; | ||
| 18754 | +i5.oids = &o5; | ||
| 18755 | +ix.oids = &ox; | ||
| 18756 | +iy.oids = &oy; | ||
| 18757 | +i1.len = i2.len = i3.len = i4.len = i5.len = ix.len = iy.len = 1; | ||
| 18758 | + | ||
| 18759 | +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) | ||
| 18760 | + CONTAINER_INSERT(c, b[i]); | ||
| 18761 | + | ||
| 18762 | +for (ip = CONTAINER_FIRST(c); ip; ip = CONTAINER_NEXT(c, ip)) { | ||
| 18763 | + for (i = sizeof(b)/sizeof(b[0]) - 1; i >= 0; --i) | ||
| 18764 | + if (c->compare(ip, b[i]) == 0) | ||
| 18765 | + break; | ||
| 18766 | + OKF(i >= 0, ("OID b[%d] = %" NETSNMP_PRIo "d present", i, b[i]->oids[0])); | ||
| 18767 | +} | ||
| 18768 | + | ||
| 18769 | +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) { | ||
| 18770 | + ip = CONTAINER_FIND(c, b[i]); | ||
| 18771 | + OKF(ip, ("Value b[%d] = %" NETSNMP_PRIo "d present", i, b[i]->oids[0])); | ||
| 18772 | + ip = CONTAINER_NEXT(c, b[i]); | ||
| 18773 | + if (c->compare(b[i], i_last) < 0) | ||
| 18774 | + OKF(ip && c->compare(b[i], ip) < 0, | ||
| 18775 | + ("Successor of b[%d] = %" NETSNMP_PRIo "d is %" NETSNMP_PRIo "d", | ||
| 18776 | + i, b[i]->oids[0], ip->oids[0])); | ||
| 18777 | + else | ||
| 18778 | + OKF(!ip, ("No successor found for b[%d] = %" NETSNMP_PRIo "d", i, | ||
| 18779 | + b[i]->oids[0])); | ||
| 18780 | +} | ||
| 18781 | + | ||
| 18782 | +for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { | ||
| 18783 | + ip = CONTAINER_FIND(c, a[i]); | ||
| 18784 | + OKF(!ip, ("a[%d] = %" NETSNMP_PRIo "d absent", i, a[i]->oids[0])); | ||
| 18785 | + ip = CONTAINER_NEXT(c, a[i]); | ||
| 18786 | + if (c->compare(a[i], i_last) < 0) | ||
| 18787 | + OKF(ip && c->compare(ip, a[i]) > 0, | ||
| 18788 | + ("Successor of a[%d] = %" NETSNMP_PRIo "d is %" NETSNMP_PRIo "d", | ||
| 18789 | + i, a[i]->oids[0], ip->oids[0])); | ||
| 18790 | + else | ||
| 18791 | + OKF(!ip, ("No successor found for a[%d] = %" NETSNMP_PRIo "d", i, | ||
| 18792 | + a[i]->oids[0])); | ||
| 18793 | +} | ||
| 18794 | + | ||
| 18795 | +while ((ip = CONTAINER_FIRST(c))) | ||
| 18796 | + CONTAINER_REMOVE(c, ip); | ||
| 18797 | +CONTAINER_FREE(c); | ||
| 18798 | + | ||
| 18799 | +snmp_shutdown(test_name); | ||
| 18800 | diff --git a/testing/fulltests/unit-tests/T013binary_array_string_clib.c b/testing/fulltests/unit-tests/T013binary_array_string_clib.c | ||
| 18801 | new file mode 100644 | ||
| 18802 | index 0000000..cc4361b | ||
| 18803 | --- /dev/null | ||
| 18804 | +++ b/testing/fulltests/unit-tests/T013binary_array_string_clib.c | ||
| 18805 | @@ -0,0 +1,59 @@ | ||
| 18806 | +/* HEADER Testing binary string array */ | ||
| 18807 | + | ||
| 18808 | +static const char test_name[] = "binary-array-of-strings-test"; | ||
| 18809 | +const char o1[] = "zebra"; | ||
| 18810 | +const char o2[] = "b-two"; | ||
| 18811 | +const char o3[] = "b"; | ||
| 18812 | +const char o4[] = "cedar"; | ||
| 18813 | +const char o5[] = "alpha"; | ||
| 18814 | +const char ox[] = "dev"; | ||
| 18815 | +const char oy[] = "aa"; | ||
| 18816 | +const char* const o_last = o1; | ||
| 18817 | +const char *ip; | ||
| 18818 | +const char *const a[] = { ox, oy }; | ||
| 18819 | +const char *const b[] = { o4, o2, o3, o1, o5 }; | ||
| 18820 | +netsnmp_container *c; | ||
| 18821 | +int i; | ||
| 18822 | + | ||
| 18823 | +init_snmp(test_name); | ||
| 18824 | + | ||
| 18825 | +c = netsnmp_container_get_binary_array(); | ||
| 18826 | +c->compare = (netsnmp_container_compare*)strcmp; | ||
| 18827 | + | ||
| 18828 | +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) | ||
| 18829 | + CONTAINER_INSERT(c, b[i]); | ||
| 18830 | + | ||
| 18831 | +for (ip = CONTAINER_FIRST(c); ip; ip = CONTAINER_NEXT(c, ip)) { | ||
| 18832 | + for (i = sizeof(b)/sizeof(b[0]) - 1; i >= 0; --i) | ||
| 18833 | + if (c->compare(ip, b[i]) == 0) | ||
| 18834 | + break; | ||
| 18835 | + OKF(i >= 0, ("string b[%d] = \"%s\" present", i, b[i])); | ||
| 18836 | +} | ||
| 18837 | + | ||
| 18838 | +for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i) { | ||
| 18839 | + ip = CONTAINER_FIND(c, b[i]); | ||
| 18840 | + OKF(ip, ("b[%d] = \"%s\" present", i, b[i])); | ||
| 18841 | + ip = CONTAINER_NEXT(c, b[i]); | ||
| 18842 | + if (c->compare(b[i], o_last) < 0) | ||
| 18843 | + OKF(ip && c->compare(b[i], ip) < 0, | ||
| 18844 | + ("Successor of b[%d] = \"%s\" is \"%s\"", i, b[i], ip)); | ||
| 18845 | + else | ||
| 18846 | + OKF(!ip, ("No successor found for b[%d] = \"%s\"", i, b[i])); | ||
| 18847 | +} | ||
| 18848 | + | ||
| 18849 | +for (i = 0; i < sizeof(a)/sizeof(a[0]); ++i) { | ||
| 18850 | + ip = CONTAINER_FIND(c, a[i]); | ||
| 18851 | + OKF(!ip, ("a[%d] = \"%s\" absent", i, a[i])); | ||
| 18852 | + ip = CONTAINER_NEXT(c, a[i]); | ||
| 18853 | + if (c->compare(a[i], o_last) < 0) | ||
| 18854 | + OKF(ip && c->compare(ip, a[i]) > 0, | ||
| 18855 | + ("Successor of a[%d] = \"%s\" is \"%s\"", i, a[i], ip)); | ||
| 18856 | + else | ||
| 18857 | + OKF(!ip, ("No successor found for a[%d] = \"%s\"", i, a[i])); | ||
| 18858 | +} | ||
| 18859 | + | ||
| 18860 | +while ((ip = CONTAINER_FIRST(c))) | ||
| 18861 | + CONTAINER_REMOVE(c, ip); | ||
| 18862 | +CONTAINER_FREE(c); | ||
| 18863 | + | ||
| 18864 | +snmp_shutdown(test_name); | ||
| 18865 | diff --git a/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c | ||
| 18866 | new file mode 100644 | ||
| 18867 | index 0000000..4c633ed | ||
| 18868 | --- /dev/null | ||
| 18869 | +++ b/testing/fulltests/unit-tests/T014gethostbyaddr_clib.c | ||
| 18870 | @@ -0,0 +1,55 @@ | ||
| 18871 | +/* HEADER Testing netsnmp_gethostbyaddr() */ | ||
| 18872 | + | ||
| 18873 | +SOCK_STARTUP; | ||
| 18874 | + | ||
| 18875 | +{ | ||
| 18876 | + int ran_test = 0; | ||
| 18877 | +#ifdef HAVE_GETHOSTBYADDR | ||
| 18878 | + struct hostent *h; | ||
| 18879 | + struct in_addr v4loop; | ||
| 18880 | + struct sockaddr_in sin_addr; | ||
| 18881 | + int s; | ||
| 18882 | + | ||
| 18883 | + v4loop.s_addr = htonl(INADDR_LOOPBACK); | ||
| 18884 | + memset(&sin_addr, 0, sizeof(sin_addr)); | ||
| 18885 | + sin_addr.sin_family = AF_INET; | ||
| 18886 | + sin_addr.sin_addr = v4loop; | ||
| 18887 | + s = socket(AF_INET, SOCK_DGRAM, 0); | ||
| 18888 | + if (s >= 0) { | ||
| 18889 | + if (bind(s, (struct sockaddr *)&sin_addr, sizeof(sin_addr)) >= 0) { | ||
| 18890 | + h = netsnmp_gethostbyaddr(&v4loop, sizeof(v4loop), AF_INET); | ||
| 18891 | + OKF(h && strcmp(h->h_name, "localhost") == 0, | ||
| 18892 | + ("127.0.0.1 lookup (%s)", h ? h->h_name : "(failed)")); | ||
| 18893 | + ran_test = 1; | ||
| 18894 | + } | ||
| 18895 | + close(s); | ||
| 18896 | + } | ||
| 18897 | +#endif | ||
| 18898 | + if (!ran_test) | ||
| 18899 | + OKF(1, ("Skipped IPv4 test")); | ||
| 18900 | +} | ||
| 18901 | + | ||
| 18902 | +{ | ||
| 18903 | + struct hostent *h; | ||
| 18904 | + static const struct in6_addr v6loop = IN6ADDR_LOOPBACK_INIT; | ||
| 18905 | + struct sockaddr_in6 sin6_addr; | ||
| 18906 | + int s, ran_test = 0; | ||
| 18907 | + | ||
| 18908 | + memset(&sin6_addr, 0, sizeof(sin6_addr)); | ||
| 18909 | + sin6_addr.sin6_family = AF_INET6; | ||
| 18910 | + sin6_addr.sin6_addr = v6loop; | ||
| 18911 | + s = socket(AF_INET6, SOCK_DGRAM, 0); | ||
| 18912 | + if (s >= 0) { | ||
| 18913 | + if (bind(s, (struct sockaddr*)&sin6_addr, sizeof(sin6_addr)) >= 0) { | ||
| 18914 | + h = netsnmp_gethostbyaddr(&v6loop, sizeof(v6loop), AF_INET6); | ||
| 18915 | + OKF(h && strcmp(h->h_name, "localhost") == 0, | ||
| 18916 | + ("::1 lookup (%s)", h ? h->h_name : "(failed)")); | ||
| 18917 | + ran_test = 1; | ||
| 18918 | + } | ||
| 18919 | + close(s); | ||
| 18920 | + } | ||
| 18921 | + if (!ran_test) | ||
| 18922 | + OKF(1, ("Skipped IPv6 test")); | ||
| 18923 | +} | ||
| 18924 | + | ||
| 18925 | +SOCK_CLEANUP; | ||
| 18926 | diff --git a/testing/fulltests/unit-tests/T015int64_clib.c b/testing/fulltests/unit-tests/T015int64_clib.c | ||
| 18927 | new file mode 100644 | ||
| 18928 | index 0000000..5f5f4b6 | ||
| 18929 | --- /dev/null | ||
| 18930 | +++ b/testing/fulltests/unit-tests/T015int64_clib.c | ||
| 18931 | @@ -0,0 +1,82 @@ | ||
| 18932 | +/* HEADER Testing 64-bit integer operations (U64). */ | ||
| 18933 | + | ||
| 18934 | +int i, j; | ||
| 18935 | +char buf[22]; | ||
| 18936 | +static const int64_t intval[] = { | ||
| 18937 | + 0, | ||
| 18938 | + -1, | ||
| 18939 | + 1, | ||
| 18940 | + 37, | ||
| 18941 | + 0x7fffffffUL, | ||
| 18942 | + 0x80000000UL, | ||
| 18943 | + 0x99999999UL, | ||
| 18944 | + 0x7fffffffffffffffULL, | ||
| 18945 | + 0x8000000000000000ULL, | ||
| 18946 | +}; | ||
| 18947 | + | ||
| 18948 | +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { | ||
| 18949 | + U64 a, b; | ||
| 18950 | + a.low = (uint32_t)intval[i]; | ||
| 18951 | + a.high = (uint32_t)(intval[i] >> 32); | ||
| 18952 | + printI64(buf, &a); | ||
| 18953 | + read64(&b, buf); | ||
| 18954 | + OKF(memcmp(&a, &b, sizeof(a)) == 0, | ||
| 18955 | + ("[%d]: %" PRId64 " <> %s <> %" PRId64, i, intval[i], buf, | ||
| 18956 | + ((uint64_t)b.high) << 32 | b.low)); | ||
| 18957 | +} | ||
| 18958 | + | ||
| 18959 | +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { | ||
| 18960 | + for (j = i; j < sizeof(intval)/sizeof(intval[0]); ++j) { | ||
| 18961 | + U64 a, b; | ||
| 18962 | + uint64_t d; | ||
| 18963 | + a.low = (uint32_t)intval[i]; | ||
| 18964 | + a.high = (uint32_t)(intval[i] >> 32); | ||
| 18965 | + b.low = (uint32_t)intval[j]; | ||
| 18966 | + b.high = (uint32_t)(intval[j] >> 32); | ||
| 18967 | + u64Incr(&a, &b); | ||
| 18968 | + d = (uint64_t)a.high << 32 | a.low; | ||
| 18969 | + OKF(intval[i] + intval[j] == d, | ||
| 18970 | + ("%" PRId64 " + %" PRId64 " = %" PRId64 " <> %" PRId64, intval[i], | ||
| 18971 | + intval[j], intval[i] + intval[j], d)); | ||
| 18972 | + } | ||
| 18973 | +} | ||
| 18974 | + | ||
| 18975 | +for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) { | ||
| 18976 | + for (j = i; j < sizeof(intval)/sizeof(intval[0]); ++j) { | ||
| 18977 | + U64 a, b, c; | ||
| 18978 | + uint64_t d; | ||
| 18979 | + a.low = (uint32_t)intval[i]; | ||
| 18980 | + a.high = (uint32_t)(intval[i] >> 32); | ||
| 18981 | + b.low = (uint32_t)intval[j]; | ||
| 18982 | + b.high = (uint32_t)(intval[j] >> 32); | ||
| 18983 | + u64Subtract(&a, &b, &c); | ||
| 18984 | + d = (uint64_t)c.high << 32 | c.low; | ||
| 18985 | + OKF(intval[i] - intval[j] == d, | ||
| 18986 | + ("%" PRId64 " - %" PRId64 " = %" PRId64 " <> %" PRId64, intval[i], | ||
| 18987 | + intval[j], intval[i] - intval[j], d)); | ||
| 18988 | + } | ||
| 18989 | +} | ||
| 18990 | + | ||
| 18991 | +{ | ||
| 18992 | + U64 old_val, new_val; | ||
| 18993 | + old_val.low = 7; | ||
| 18994 | + old_val.high = 0; | ||
| 18995 | + new_val = old_val; | ||
| 18996 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap1"); | ||
| 18997 | + new_val.low = 8; | ||
| 18998 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap2"); | ||
| 18999 | + new_val.low = 6; | ||
| 19000 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 32, "cwrap3"); | ||
| 19001 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 1) == 32 | ||
| 19002 | + && new_val.low == 6 && new_val.high == 1, "cwrap4"); | ||
| 19003 | + old_val.low = 7; | ||
| 19004 | + old_val.high = 0xffffffffU; | ||
| 19005 | + new_val.low = 7; | ||
| 19006 | + new_val.high = old_val.high; | ||
| 19007 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap5"); | ||
| 19008 | + new_val.low = 8; | ||
| 19009 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 0, "cwrap6"); | ||
| 19010 | + new_val.low = 6; | ||
| 19011 | + new_val.high = 0; | ||
| 19012 | + OK(netsnmp_c64_check_for_32bit_wrap(&old_val, &new_val, 0) == 64, "cwrap7"); | ||
| 19013 | +} | ||
| 19014 | diff --git a/testing/fulltests/unit-tests/T016read_config_clib.c b/testing/fulltests/unit-tests/T016read_config_clib.c | ||
| 19015 | new file mode 100644 | ||
| 19016 | index 0000000..c11a591 | ||
| 19017 | --- /dev/null | ||
| 19018 | +++ b/testing/fulltests/unit-tests/T016read_config_clib.c | ||
| 19019 | @@ -0,0 +1,82 @@ | ||
| 19020 | +/* HEADER Testing read_config_read_octet_string_const(). */ | ||
| 19021 | + | ||
| 19022 | +struct read_config_testcase { | ||
| 19023 | + /* | ||
| 19024 | + * inputs | ||
| 19025 | + */ | ||
| 19026 | + const char *(*pf) (const char * readfrom, u_char ** str, | ||
| 19027 | + size_t * len); | ||
| 19028 | + const char *readfrom; | ||
| 19029 | + size_t obuf_len; | ||
| 19030 | + | ||
| 19031 | + /* | ||
| 19032 | + * expected outputs | ||
| 19033 | + */ | ||
| 19034 | + size_t expected_offset; | ||
| 19035 | + const u_char *expected_output; | ||
| 19036 | + size_t expected_len; | ||
| 19037 | +}; | ||
| 19038 | + | ||
| 19039 | +static const u_char obuf1[] = { 1, 0, 2 }; | ||
| 19040 | +static const u_char obuf2[] = { 'a', 'b', 'c', 0 }; | ||
| 19041 | + | ||
| 19042 | +static const struct read_config_testcase test_input[] = { | ||
| 19043 | + { &read_config_read_octet_string_const, "", 1, -1, NULL, 0 }, | ||
| 19044 | + { &read_config_read_octet_string_const, "0x0", 1, -1, NULL, 1 }, | ||
| 19045 | + { &read_config_read_octet_string_const, "0x0 0", 1, -1, NULL, 1 }, | ||
| 19046 | + | ||
| 19047 | + { &read_config_read_octet_string_const, "0x010002", 1, -1, NULL, 0 }, | ||
| 19048 | + { &read_config_read_octet_string_const, "0x010002", 2, -1, NULL, 0 }, | ||
| 19049 | + { &read_config_read_octet_string_const, "0x010002", 3, -1, obuf1, 0 }, | ||
| 19050 | + { &read_config_read_octet_string_const, "0x010002", 4, -1, obuf1, 3 }, | ||
| 19051 | + { &read_config_read_octet_string_const, "0x010002 0", 4, 9, obuf1, 3 }, | ||
| 19052 | + { &read_config_read_octet_string_const, "0x010002", 0, -1, obuf1, 3 }, | ||
| 19053 | + | ||
| 19054 | + { &read_config_read_octet_string_const, "abc", 1, -1, NULL, 0 }, | ||
| 19055 | + { &read_config_read_octet_string_const, "abc z", 1, 4, NULL, 0 }, | ||
| 19056 | + { &read_config_read_octet_string_const, "abc", 2, -1, NULL, 1 }, | ||
| 19057 | + { &read_config_read_octet_string_const, "abc", 3, -1, obuf2, 2 }, | ||
| 19058 | + { &read_config_read_octet_string_const, "abc", 4, -1, obuf2, 3 }, | ||
| 19059 | + { &read_config_read_octet_string_const, "abc z", 4, 4, obuf2, 3 }, | ||
| 19060 | + { &read_config_read_octet_string_const, "abc", 0, -1, obuf2, 3 }, | ||
| 19061 | +}; | ||
| 19062 | + | ||
| 19063 | +unsigned int i, j, ok; | ||
| 19064 | + | ||
| 19065 | +for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { | ||
| 19066 | + const struct read_config_testcase *const p = &test_input[i]; | ||
| 19067 | + size_t len = p->obuf_len; | ||
| 19068 | + u_char *str = len > 0 ? malloc(len) : NULL; | ||
| 19069 | + const char *result; | ||
| 19070 | + size_t offset; | ||
| 19071 | + | ||
| 19072 | + fflush(stdout); | ||
| 19073 | + result = (p->pf) (p->readfrom, &str, &len); | ||
| 19074 | + offset = result ? result - p->readfrom : -1; | ||
| 19075 | + OKF(offset == p->expected_offset, | ||
| 19076 | + ("test %d: expected offset %zd, got offset %" NETSNMP_PRIz "d", | ||
| 19077 | + i, p->expected_offset, offset)); | ||
| 19078 | + if (offset == p->expected_offset) { | ||
| 19079 | + OKF(len == p->expected_len, | ||
| 19080 | + ("test %d: expected length %" NETSNMP_PRIz "d, got length %" | ||
| 19081 | + NETSNMP_PRIz "d", i, p->expected_len, len)); | ||
| 19082 | + if (len == p->expected_len) { | ||
| 19083 | + ok = len < 0 || !p->expected_output | ||
| 19084 | + || memcmp(str, p->expected_output, len) == 0 | ||
| 19085 | + || p->expected_output[len] != 0; | ||
| 19086 | + OKF(ok, ("test %d: output buffer mismatch", i)); | ||
| 19087 | + if (!ok) { | ||
| 19088 | + printf("Expected: "); | ||
| 19089 | + for (j = 0; j < p->expected_len; ++j) | ||
| 19090 | + printf("%02x ", p->expected_output[j]); | ||
| 19091 | + printf("\nActual: "); | ||
| 19092 | + for (j = 0; j < len; ++j) | ||
| 19093 | + printf("%02x ", str[j]); | ||
| 19094 | + printf("\n"); | ||
| 19095 | + } | ||
| 19096 | + } | ||
| 19097 | + } | ||
| 19098 | + | ||
| 19099 | + if (str) | ||
| 19100 | + free(str); | ||
| 19101 | +} | ||
| 19102 | diff --git a/testing/fulltests/unit-tests/T017strtoull_clib.c b/testing/fulltests/unit-tests/T017strtoull_clib.c | ||
| 19103 | new file mode 100644 | ||
| 19104 | index 0000000..4ab9cad | ||
| 19105 | --- /dev/null | ||
| 19106 | +++ b/testing/fulltests/unit-tests/T017strtoull_clib.c | ||
| 19107 | @@ -0,0 +1,94 @@ | ||
| 19108 | +/* HEADER Testing strtoull(). */ | ||
| 19109 | + | ||
| 19110 | +#ifdef HAVE_STRTOULL | ||
| 19111 | + | ||
| 19112 | +OK(1, "Skipping strtoull() test because using strtoull() from C library.\n");; | ||
| 19113 | + | ||
| 19114 | +#else | ||
| 19115 | + | ||
| 19116 | +/* | ||
| 19117 | + * UINT64_C: C99 macro for the suffix for uint64_t constants. | ||
| 19118 | + */ | ||
| 19119 | +#ifndef UINT64_C | ||
| 19120 | +#ifdef _MSC_VER | ||
| 19121 | +#define UINT64_C(c) c##ui64 | ||
| 19122 | +#else | ||
| 19123 | +#define UINT64_C(c) c##ULL | ||
| 19124 | +#endif | ||
| 19125 | +#endif | ||
| 19126 | + | ||
| 19127 | +/* | ||
| 19128 | + * According to the C99 standard, the constant ULLONG_MAX must be defined in | ||
| 19129 | + * <limits.h>. Define it here for pre-C99 compilers. | ||
| 19130 | + */ | ||
| 19131 | +#ifndef ULLONG_MAX | ||
| 19132 | +#define ULLONG_MAX UINT64_C(0xffffffffffffffff) | ||
| 19133 | +#endif | ||
| 19134 | + | ||
| 19135 | +#ifndef PRIu64 | ||
| 19136 | +#ifdef _MSC_VER | ||
| 19137 | +#define PRIu64 "I64u" | ||
| 19138 | +#else | ||
| 19139 | +#define PRIu64 "llu" | ||
| 19140 | +#endif | ||
| 19141 | +#endif | ||
| 19142 | + | ||
| 19143 | +struct strtoull_testcase { | ||
| 19144 | + /* | ||
| 19145 | + * inputs | ||
| 19146 | + */ | ||
| 19147 | + const char *nptr; | ||
| 19148 | + int base; | ||
| 19149 | + /* | ||
| 19150 | + * expected outputs | ||
| 19151 | + */ | ||
| 19152 | + int expected_errno; | ||
| 19153 | + int expected_end; | ||
| 19154 | + uint64_t expected_result; | ||
| 19155 | +}; | ||
| 19156 | + | ||
| 19157 | +static const struct strtoull_testcase test_input[] = { | ||
| 19158 | + {"0x0", 0, 0, 3, 0}, | ||
| 19159 | + {"1", 0, 0, 1, 1}, | ||
| 19160 | + {"0x1", 0, 0, 3, 1}, | ||
| 19161 | + {" -0666", 0, 0, 7, -0666}, | ||
| 19162 | + {" -0x666", 0, 0, 8, -0x666}, | ||
| 19163 | + {"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)}, | ||
| 19164 | + {"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)}, | ||
| 19165 | + {"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)}, | ||
| 19166 | + {"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)}, | ||
| 19167 | + {"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)}, | ||
| 19168 | + {"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)}, | ||
| 19169 | + {"ff", 16, 0, 2, 255}, | ||
| 19170 | + {"0xff", 16, 0, 4, 255}, | ||
| 19171 | + {" ", 0, 0, 0, 0}, | ||
| 19172 | + {"0x", 0, 0, 1, 0}, | ||
| 19173 | + {"0x", 8, 0, 1, 0}, | ||
| 19174 | + {"0x", 16, 0, 1, 0}, | ||
| 19175 | + {"zyyy", 0, 0, 0, 0}, | ||
| 19176 | + {"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX}, | ||
| 19177 | + {"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX} | ||
| 19178 | +}; | ||
| 19179 | + | ||
| 19180 | +unsigned int i; | ||
| 19181 | + | ||
| 19182 | +for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { | ||
| 19183 | + const struct strtoull_testcase *const p = &test_input[i]; | ||
| 19184 | + char *endptr; | ||
| 19185 | + uint64_t result; | ||
| 19186 | + | ||
| 19187 | + errno = 0; | ||
| 19188 | + result = strtoull(p->nptr, &endptr, p->base); | ||
| 19189 | + OKF(errno == p->expected_errno, | ||
| 19190 | + ("test %d (input \"%s\"): expected errno %d, got errno %d", | ||
| 19191 | + i, p->nptr, p->expected_errno, errno)); | ||
| 19192 | + OKF(result == p->expected_result, | ||
| 19193 | + ("test %d (input \"%s\"): expected result %" PRIu64 | ||
| 19194 | + ", got result %" PRIu64, | ||
| 19195 | + i, p->nptr, p->expected_result, result)); | ||
| 19196 | + OKF(endptr - p->nptr == p->expected_end, | ||
| 19197 | + ("test %d (input \"%s\"): expected end %d, got end %d", | ||
| 19198 | + i, p->nptr, p->expected_end, (int) (endptr - p->nptr))); | ||
| 19199 | +} | ||
| 19200 | + | ||
| 19201 | +#endif | ||
| 19202 | diff --git a/testing/fulltests/unit-tests/T102pdu_build_clib.c b/testing/fulltests/unit-tests/T102pdu_build_clib.c | ||
| 19203 | index 088a282..1fba69e 100644 | ||
| 19204 | --- a/testing/fulltests/unit-tests/T102pdu_build_clib.c | ||
| 19205 | +++ b/testing/fulltests/unit-tests/T102pdu_build_clib.c | ||
| 19206 | @@ -1,4 +1,7 @@ | ||
| 19207 | /* HEADER PDU building */ | ||
| 19208 | + | ||
| 19209 | +SOCK_STARTUP; | ||
| 19210 | + | ||
| 19211 | netsnmp_pdu *pdu; | ||
| 19212 | u_char *packet; | ||
| 19213 | size_t packet_len, offset = 0; | ||
| 19214 | @@ -60,3 +63,5 @@ rc = snmp_build(&packet, &packet_len, &offset, ss, pdu); | ||
| 19215 | |||
| 19216 | OKF((rc == SNMPERR_SUCCESS), | ||
| 19217 | ("Building an INFORM PDU/packet should have succeed: %d", rc)); | ||
| 19218 | + | ||
| 19219 | +SOCK_CLEANUP; | ||
| 19220 | diff --git a/win32/encode_keychange/encode_keychange.dsp b/win32/encode_keychange/encode_keychange.dsp | ||
| 19221 | index 5e19366..5a252f5 100644 | ||
| 19222 | --- a/win32/encode_keychange/encode_keychange.dsp | ||
| 19223 | +++ b/win32/encode_keychange/encode_keychange.dsp | ||
| 19224 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19225 | # ADD BSC32 /nologo | ||
| 19226 | LINK32=link.exe | ||
| 19227 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19228 | -# 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" | ||
| 19229 | +# 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" | ||
| 19230 | |||
| 19231 | !ELSEIF "$(CFG)" == "encode_keychange - Win32 Debug" | ||
| 19232 | |||
| 19233 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19234 | # ADD BSC32 /nologo | ||
| 19235 | LINK32=link.exe | ||
| 19236 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19237 | -# 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" | ||
| 19238 | +# 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" | ||
| 19239 | |||
| 19240 | !ENDIF | ||
| 19241 | |||
| 19242 | diff --git a/win32/libsnmp/Makefile.in b/win32/libsnmp/Makefile.in | ||
| 19243 | index 382b329..98d83c8 100644 | ||
| 19244 | --- a/win32/libsnmp/Makefile.in | ||
| 19245 | +++ b/win32/libsnmp/Makefile.in | ||
| 19246 | @@ -66,6 +66,7 @@ LIB32_OBJS= \ | ||
| 19247 | "$(INTDIR)\snmp_version.obj" \ | ||
| 19248 | "$(INTDIR)\snmpusm.obj" \ | ||
| 19249 | "$(INTDIR)\snmpv3.obj" \ | ||
| 19250 | + "$(INTDIR)\strlcat.obj" \ | ||
| 19251 | "$(INTDIR)\strlcpy.obj" \ | ||
| 19252 | "$(INTDIR)\strtok_r.obj" \ | ||
| 19253 | "$(INTDIR)\strtoull.obj" \ | ||
| 19254 | @@ -468,6 +469,12 @@ SOURCE=..\..\snmplib\snmpv3.c | ||
| 19255 | $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19256 | |||
| 19257 | |||
| 19258 | +SOURCE=..\..\snmplib\strlcat.c | ||
| 19259 | + | ||
| 19260 | +"$(INTDIR)\strlcat.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19261 | + $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19262 | + | ||
| 19263 | + | ||
| 19264 | SOURCE=..\..\snmplib\strlcpy.c | ||
| 19265 | |||
| 19266 | "$(INTDIR)\strlcpy.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19267 | diff --git a/win32/libsnmp/libsnmp.dsp b/win32/libsnmp/libsnmp.dsp | ||
| 19268 | index 7a34939..2386331 100644 | ||
| 19269 | --- a/win32/libsnmp/libsnmp.dsp | ||
| 19270 | +++ b/win32/libsnmp/libsnmp.dsp | ||
| 19271 | @@ -313,6 +313,10 @@ SOURCE=..\..\snmplib\snmpv3.c | ||
| 19272 | # End Source File | ||
| 19273 | # Begin Source File | ||
| 19274 | |||
| 19275 | +SOURCE=..\..\snmplib\strlcat.c | ||
| 19276 | +# End Source File | ||
| 19277 | +# Begin Source File | ||
| 19278 | + | ||
| 19279 | SOURCE=..\..\snmplib\strlcpy.c | ||
| 19280 | # End Source File | ||
| 19281 | # Begin Source File | ||
| 19282 | diff --git a/win32/libsnmp_dll/Makefile.in b/win32/libsnmp_dll/Makefile.in | ||
| 19283 | index 31279f3..42235d2 100644 | ||
| 19284 | --- a/win32/libsnmp_dll/Makefile.in | ||
| 19285 | +++ b/win32/libsnmp_dll/Makefile.in | ||
| 19286 | @@ -67,6 +67,7 @@ LINK32_OBJS= \ | ||
| 19287 | "$(INTDIR)\snmp_version.obj" \ | ||
| 19288 | "$(INTDIR)\snmpusm.obj" \ | ||
| 19289 | "$(INTDIR)\snmpv3.obj" \ | ||
| 19290 | + "$(INTDIR)\strlcat.obj" \ | ||
| 19291 | "$(INTDIR)\strlcpy.obj" \ | ||
| 19292 | "$(INTDIR)\strtok_r.obj" \ | ||
| 19293 | "$(INTDIR)\strtoull.obj" \ | ||
| 19294 | @@ -484,6 +485,12 @@ SOURCE=..\..\snmplib\snmpv3.c | ||
| 19295 | $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19296 | |||
| 19297 | |||
| 19298 | +SOURCE=..\..\snmplib\strlcat.c | ||
| 19299 | + | ||
| 19300 | +"$(INTDIR)\strlcat.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19301 | + $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19302 | + | ||
| 19303 | + | ||
| 19304 | SOURCE=..\..\snmplib\strlcpy.c | ||
| 19305 | |||
| 19306 | "$(INTDIR)\strlcpy.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19307 | diff --git a/win32/libsnmp_dll/libsnmp_dll.dsp b/win32/libsnmp_dll/libsnmp_dll.dsp | ||
| 19308 | index 098c3b9..12c0414 100644 | ||
| 19309 | --- a/win32/libsnmp_dll/libsnmp_dll.dsp | ||
| 19310 | +++ b/win32/libsnmp_dll/libsnmp_dll.dsp | ||
| 19311 | @@ -320,6 +320,10 @@ SOURCE=..\..\snmplib\snmpv3.c | ||
| 19312 | # End Source File | ||
| 19313 | # Begin Source File | ||
| 19314 | |||
| 19315 | +SOURCE=..\..\snmplib\strlcat.c | ||
| 19316 | +# End Source File | ||
| 19317 | +# Begin Source File | ||
| 19318 | + | ||
| 19319 | SOURCE=..\..\snmplib\strlcpy.c | ||
| 19320 | # End Source File | ||
| 19321 | # Begin Source File | ||
| 19322 | diff --git a/win32/mib_module_includes.h b/win32/mib_module_includes.h | ||
| 19323 | index 18a9281..014ade0 100644 | ||
| 19324 | --- a/win32/mib_module_includes.h | ||
| 19325 | +++ b/win32/mib_module_includes.h | ||
| 19326 | @@ -73,7 +73,6 @@ | ||
| 19327 | #include "mibgroup/agent/extend.h" | ||
| 19328 | #include "mibgroup/ucd-snmp/errormib.h" | ||
| 19329 | #include "mibgroup/ucd-snmp/file.h" | ||
| 19330 | -#include "mibgroup/ucd-snmp/dlmod.h" | ||
| 19331 | #include "mibgroup/ucd-snmp/proxy.h" | ||
| 19332 | #endif | ||
| 19333 | |||
| 19334 | diff --git a/win32/mib_module_inits.h b/win32/mib_module_inits.h | ||
| 19335 | index 875fcb9..a4b39bc 100644 | ||
| 19336 | --- a/win32/mib_module_inits.h | ||
| 19337 | +++ b/win32/mib_module_inits.h | ||
| 19338 | @@ -34,7 +34,6 @@ | ||
| 19339 | if (should_init("extend")) init_extend(); | ||
| 19340 | if (should_init("errormib")) init_errormib(); | ||
| 19341 | if (should_init("file")) init_file(); | ||
| 19342 | - if (should_init("dlmod")) init_dlmod(); | ||
| 19343 | if (should_init("proxy")) init_proxy(); | ||
| 19344 | #endif | ||
| 19345 | if (should_init("snmpEngine")) init_snmpEngine(); | ||
| 19346 | diff --git a/win32/net-snmp/net-snmp-config.h b/win32/net-snmp/net-snmp-config.h | ||
| 19347 | index da3c031..f63a83f 100644 | ||
| 19348 | --- a/win32/net-snmp/net-snmp-config.h | ||
| 19349 | +++ b/win32/net-snmp/net-snmp-config.h | ||
| 19350 | @@ -22,7 +22,9 @@ | ||
| 19351 | * When compiling with the MSVC workspace, this must be set manually. | ||
| 19352 | * See the PACKAGE_VERSION variable in Unix /configure script | ||
| 19353 | */ | ||
| 19354 | +#ifndef PACKAGE_VERSION | ||
| 19355 | #define PACKAGE_VERSION "unknown" | ||
| 19356 | +#endif | ||
| 19357 | |||
| 19358 | /* Define HAVE_WIN32_PLATFORM_SDK if you have: | ||
| 19359 | * Microsoft Visual Studio MSVC 6.0 and the Platform SDK (PSDK) | ||
| 19360 | @@ -60,7 +62,7 @@ | ||
| 19361 | |||
| 19362 | /* default list of mibs to load */ | ||
| 19363 | |||
| 19364 | -#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" | ||
| 19365 | +#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" | ||
| 19366 | |||
| 19367 | /* default location to look for mibs to load using the above tokens | ||
| 19368 | and/or those in the MIBS envrionment variable*/ | ||
| 19369 | @@ -944,13 +946,17 @@ | ||
| 19370 | /* #undef PACKAGE_BUGREPORT */ | ||
| 19371 | |||
| 19372 | /* Define to the full name of this package. */ | ||
| 19373 | +#ifndef PACKAGE_NAME | ||
| 19374 | #define PACKAGE_NAME "Net-SNMP" | ||
| 19375 | +#endif | ||
| 19376 | |||
| 19377 | /* Define to the full name and version of this package. */ | ||
| 19378 | /* #undef PACKAGE_STRING */ | ||
| 19379 | |||
| 19380 | /* Define to the one symbol short name of this package. */ | ||
| 19381 | +#ifndef PACKAGE_TARNAME | ||
| 19382 | #define PACKAGE_TARNAME "net-snmp" | ||
| 19383 | +#endif | ||
| 19384 | |||
| 19385 | /* Define to the version of this package. */ | ||
| 19386 | /* #undef PACKAGE_VERSION */ | ||
| 19387 | @@ -1358,6 +1364,12 @@ | ||
| 19388 | /* Define to 1 if you have the <openssl/aes.h> header file. */ | ||
| 19389 | #define HAVE_OPENSSL_AES_H 1 | ||
| 19390 | |||
| 19391 | +/* Define to 1 if you have the `EVP_MD_CTX_create' function. */ | ||
| 19392 | +#define HAVE_EVP_MD_CTX_CREATE 1 | ||
| 19393 | + | ||
| 19394 | +/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */ | ||
| 19395 | +#define HAVE_EVP_MD_CTX_DESTROY 1 | ||
| 19396 | + | ||
| 19397 | /* Define to 1 if you have the `AES_cfb128_encrypt' function. */ | ||
| 19398 | #define HAVE_AES_CFB128_ENCRYPT 1 | ||
| 19399 | |||
| 19400 | @@ -1570,15 +1582,14 @@ typedef unsigned short mode_t; | ||
| 19401 | #ifndef HAVE_STDINT_H | ||
| 19402 | typedef unsigned char uint8_t; | ||
| 19403 | typedef char int8_t; | ||
| 19404 | -typedef unsigned short uint16_t; | ||
| 19405 | -typedef short int16_t; | ||
| 19406 | +typedef unsigned __int16 uint16_t; | ||
| 19407 | +typedef __int16 int16_t; | ||
| 19408 | typedef unsigned __int32 uint32_t; | ||
| 19409 | -typedef long int32_t; | ||
| 19410 | +typedef __int32 int32_t; | ||
| 19411 | typedef unsigned __int64 uint64_t; | ||
| 19412 | typedef __int64 int64_t; | ||
| 19413 | typedef unsigned __int64 uintmax_t; | ||
| 19414 | typedef __int64 intmax_t; | ||
| 19415 | -typedef unsigned short uint16_t; | ||
| 19416 | #else /* HAVE_STDINT_H */ | ||
| 19417 | #include <stdint.h> | ||
| 19418 | #endif /* HAVE_STDINT_H */ | ||
| 19419 | @@ -1663,9 +1674,9 @@ enum { | ||
| 19420 | #endif /* NETSNMP_USE_DLL */ | ||
| 19421 | |||
| 19422 | /* MSVC OpenSSL linker settings. */ | ||
| 19423 | -#if defined(WIN32) && !defined(mingw32) | ||
| 19424 | +#if defined(_MSC_VER) | ||
| 19425 | # if defined(NETSNMP_USE_OPENSSL) | ||
| 19426 | -# ifdef NETSNMP_USE_DLL | ||
| 19427 | +# ifdef _DLL | ||
| 19428 | # ifdef _DEBUG | ||
| 19429 | # pragma comment(lib, "libeay32MDd.lib") | ||
| 19430 | # else | ||
| 19431 | @@ -1679,6 +1690,7 @@ enum { | ||
| 19432 | # endif | ||
| 19433 | # endif | ||
| 19434 | # pragma comment(lib, "gdi32.lib") | ||
| 19435 | +# pragma comment(lib, "user32.lib") | ||
| 19436 | # endif | ||
| 19437 | #endif | ||
| 19438 | |||
| 19439 | diff --git a/win32/net-snmp/net-snmp-config.h.in b/win32/net-snmp/net-snmp-config.h.in | ||
| 19440 | index 7101702..005e4f9 100644 | ||
| 19441 | --- a/win32/net-snmp/net-snmp-config.h.in | ||
| 19442 | +++ b/win32/net-snmp/net-snmp-config.h.in | ||
| 19443 | @@ -22,7 +22,9 @@ | ||
| 19444 | * When compiling with the MSVC workspace, this must be set manually. | ||
| 19445 | * See the PACKAGE_VERSION variable in Unix /configure script | ||
| 19446 | */ | ||
| 19447 | +#ifndef PACKAGE_VERSION | ||
| 19448 | #define PACKAGE_VERSION "unknown" | ||
| 19449 | +#endif | ||
| 19450 | |||
| 19451 | /* Define HAVE_WIN32_PLATFORM_SDK if you have: | ||
| 19452 | * Microsoft Visual Studio MSVC 6.0 and the Platform SDK (PSDK) | ||
| 19453 | @@ -60,7 +62,7 @@ | ||
| 19454 | |||
| 19455 | /* default list of mibs to load */ | ||
| 19456 | |||
| 19457 | -#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" | ||
| 19458 | +#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" | ||
| 19459 | |||
| 19460 | /* default location to look for mibs to load using the above tokens | ||
| 19461 | and/or those in the MIBS envrionment variable*/ | ||
| 19462 | @@ -944,13 +946,17 @@ | ||
| 19463 | /* #undef PACKAGE_BUGREPORT */ | ||
| 19464 | |||
| 19465 | /* Define to the full name of this package. */ | ||
| 19466 | +#ifndef PACKAGE_NAME | ||
| 19467 | #define PACKAGE_NAME "Net-SNMP" | ||
| 19468 | +#endif | ||
| 19469 | |||
| 19470 | /* Define to the full name and version of this package. */ | ||
| 19471 | /* #undef PACKAGE_STRING */ | ||
| 19472 | |||
| 19473 | /* Define to the one symbol short name of this package. */ | ||
| 19474 | +#ifndef PACKAGE_TARNAME | ||
| 19475 | #define PACKAGE_TARNAME "net-snmp" | ||
| 19476 | +#endif | ||
| 19477 | |||
| 19478 | /* Define to the version of this package. */ | ||
| 19479 | /* #undef PACKAGE_VERSION */ | ||
| 19480 | @@ -1358,6 +1364,12 @@ | ||
| 19481 | /* Define to 1 if you have the <openssl/aes.h> header file. */ | ||
| 19482 | #define HAVE_OPENSSL_AES_H 1 | ||
| 19483 | |||
| 19484 | +/* Define to 1 if you have the `EVP_MD_CTX_create' function. */ | ||
| 19485 | +#define HAVE_EVP_MD_CTX_CREATE 1 | ||
| 19486 | + | ||
| 19487 | +/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */ | ||
| 19488 | +#define HAVE_EVP_MD_CTX_DESTROY 1 | ||
| 19489 | + | ||
| 19490 | /* Define to 1 if you have the `AES_cfb128_encrypt' function. */ | ||
| 19491 | #define HAVE_AES_CFB128_ENCRYPT 1 | ||
| 19492 | |||
| 19493 | @@ -1570,15 +1582,14 @@ typedef unsigned short mode_t; | ||
| 19494 | #ifndef HAVE_STDINT_H | ||
| 19495 | typedef unsigned char uint8_t; | ||
| 19496 | typedef char int8_t; | ||
| 19497 | -typedef unsigned short uint16_t; | ||
| 19498 | -typedef short int16_t; | ||
| 19499 | +typedef unsigned __int16 uint16_t; | ||
| 19500 | +typedef __int16 int16_t; | ||
| 19501 | typedef unsigned __int32 uint32_t; | ||
| 19502 | -typedef long int32_t; | ||
| 19503 | +typedef __int32 int32_t; | ||
| 19504 | typedef unsigned __int64 uint64_t; | ||
| 19505 | typedef __int64 int64_t; | ||
| 19506 | typedef unsigned __int64 uintmax_t; | ||
| 19507 | typedef __int64 intmax_t; | ||
| 19508 | -typedef unsigned short uint16_t; | ||
| 19509 | #else /* HAVE_STDINT_H */ | ||
| 19510 | #include <stdint.h> | ||
| 19511 | #endif /* HAVE_STDINT_H */ | ||
| 19512 | @@ -1663,9 +1674,9 @@ enum { | ||
| 19513 | #endif /* NETSNMP_USE_DLL */ | ||
| 19514 | |||
| 19515 | /* MSVC OpenSSL linker settings. */ | ||
| 19516 | -#if defined(WIN32) && !defined(mingw32) | ||
| 19517 | +#if defined(_MSC_VER) | ||
| 19518 | # if defined(NETSNMP_USE_OPENSSL) | ||
| 19519 | -# ifdef NETSNMP_USE_DLL | ||
| 19520 | +# ifdef _DLL | ||
| 19521 | # ifdef _DEBUG | ||
| 19522 | # pragma comment(lib, "libeay32MDd.lib") | ||
| 19523 | # else | ||
| 19524 | @@ -1679,6 +1690,7 @@ enum { | ||
| 19525 | # endif | ||
| 19526 | # endif | ||
| 19527 | # pragma comment(lib, "gdi32.lib") | ||
| 19528 | +# pragma comment(lib, "user32.lib") | ||
| 19529 | # endif | ||
| 19530 | #endif | ||
| 19531 | |||
| 19532 | diff --git a/win32/netsnmpmibs/Makefile.in b/win32/netsnmpmibs/Makefile.in | ||
| 19533 | index ed44162..44d0203 100644 | ||
| 19534 | --- a/win32/netsnmpmibs/Makefile.in | ||
| 19535 | +++ b/win32/netsnmpmibs/Makefile.in | ||
| 19536 | @@ -85,13 +85,13 @@ LIB32_OBJS1= \ | ||
| 19537 | "$(INTDIR)\mteTriggerThresholdTable.obj" \ | ||
| 19538 | "$(INTDIR)\example.obj" \ | ||
| 19539 | "$(INTDIR)\ucdDemoPublic.obj" \ | ||
| 19540 | - "$(INTDIR)\dlmod.obj" \ | ||
| 19541 | "$(INTDIR)\errormib.obj" \ | ||
| 19542 | "$(INTDIR)\extensible.obj" \ | ||
| 19543 | "$(INTDIR)\file.obj" | ||
| 19544 | LIB32_OBJS2= \ | ||
| 19545 | "$(INTDIR)\loadave.obj" \ | ||
| 19546 | "$(INTDIR)\pass.obj" \ | ||
| 19547 | + "$(INTDIR)\pass_common.obj" \ | ||
| 19548 | "$(INTDIR)\pass_persist.obj" \ | ||
| 19549 | "$(INTDIR)\proc.obj" \ | ||
| 19550 | "$(INTDIR)\proxy.obj" \ | ||
| 19551 | @@ -314,12 +314,6 @@ SOURCE=..\..\agent\mibgroup\examples\ucdDemoPublic.c | ||
| 19552 | $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19553 | |||
| 19554 | |||
| 19555 | -SOURCE="..\..\agent\mibgroup\ucd-snmp\dlmod.c" | ||
| 19556 | - | ||
| 19557 | -"$(INTDIR)\dlmod.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19558 | - $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19559 | - | ||
| 19560 | - | ||
| 19561 | SOURCE="..\..\agent\mibgroup\ucd-snmp\errormib.c" | ||
| 19562 | |||
| 19563 | "$(INTDIR)\errormib.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19564 | @@ -350,6 +344,12 @@ SOURCE="..\..\agent\mibgroup\ucd-snmp\pass.c" | ||
| 19565 | $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19566 | |||
| 19567 | |||
| 19568 | +SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_common.c" | ||
| 19569 | + | ||
| 19570 | +"$(INTDIR)\pass_common.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19571 | + $(CPP) $(CPP_PROJ) $(SOURCE) | ||
| 19572 | + | ||
| 19573 | + | ||
| 19574 | SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_persist.c" | ||
| 19575 | |||
| 19576 | "$(INTDIR)\pass_persist.obj" : $(SOURCE) "$(INTDIR)" | ||
| 19577 | diff --git a/win32/netsnmpmibs/netsnmpmibs.dsp b/win32/netsnmpmibs/netsnmpmibs.dsp | ||
| 19578 | index 5c88b97..9034eed 100644 | ||
| 19579 | --- a/win32/netsnmpmibs/netsnmpmibs.dsp | ||
| 19580 | +++ b/win32/netsnmpmibs/netsnmpmibs.dsp | ||
| 19581 | @@ -245,10 +245,6 @@ SOURCE=..\..\agent\mibgroup\examples\ucdDemoPublic.c | ||
| 19582 | # PROP Default_Filter "" | ||
| 19583 | # Begin Source File | ||
| 19584 | |||
| 19585 | -SOURCE="..\..\agent\mibgroup\ucd-snmp\dlmod.c" | ||
| 19586 | -# End Source File | ||
| 19587 | -# Begin Source File | ||
| 19588 | - | ||
| 19589 | SOURCE="..\..\agent\mibgroup\ucd-snmp\errormib.c" | ||
| 19590 | # End Source File | ||
| 19591 | # Begin Source File | ||
| 19592 | @@ -269,6 +265,10 @@ SOURCE="..\..\agent\mibgroup\ucd-snmp\pass.c" | ||
| 19593 | # End Source File | ||
| 19594 | # Begin Source File | ||
| 19595 | |||
| 19596 | +SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_common.c" | ||
| 19597 | +# End Source File | ||
| 19598 | +# Begin Source File | ||
| 19599 | + | ||
| 19600 | SOURCE="..\..\agent\mibgroup\ucd-snmp\pass_persist.c" | ||
| 19601 | # End Source File | ||
| 19602 | # Begin Source File | ||
| 19603 | diff --git a/win32/snmpbulkget/snmpbulkget.dsp b/win32/snmpbulkget/snmpbulkget.dsp | ||
| 19604 | index fe5e5ae..39599db 100644 | ||
| 19605 | --- a/win32/snmpbulkget/snmpbulkget.dsp | ||
| 19606 | +++ b/win32/snmpbulkget/snmpbulkget.dsp | ||
| 19607 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19608 | # ADD BSC32 /nologo | ||
| 19609 | LINK32=link.exe | ||
| 19610 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19611 | -# 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" | ||
| 19612 | +# 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" | ||
| 19613 | |||
| 19614 | !ELSEIF "$(CFG)" == "snmpbulkget - Win32 Debug" | ||
| 19615 | |||
| 19616 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19617 | # ADD BSC32 /nologo | ||
| 19618 | LINK32=link.exe | ||
| 19619 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19620 | -# 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" | ||
| 19621 | +# 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" | ||
| 19622 | |||
| 19623 | !ENDIF | ||
| 19624 | |||
| 19625 | diff --git a/win32/snmpbulkwalk/snmpbulkwalk.dsp b/win32/snmpbulkwalk/snmpbulkwalk.dsp | ||
| 19626 | index ea8bb0c..91e94d3 100644 | ||
| 19627 | --- a/win32/snmpbulkwalk/snmpbulkwalk.dsp | ||
| 19628 | +++ b/win32/snmpbulkwalk/snmpbulkwalk.dsp | ||
| 19629 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19630 | # ADD BSC32 /nologo | ||
| 19631 | LINK32=link.exe | ||
| 19632 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19633 | -# 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" | ||
| 19634 | +# 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" | ||
| 19635 | |||
| 19636 | !ELSEIF "$(CFG)" == "snmpbulkwalk - Win32 Debug" | ||
| 19637 | |||
| 19638 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19639 | # ADD BSC32 /nologo | ||
| 19640 | LINK32=link.exe | ||
| 19641 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19642 | -# 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" | ||
| 19643 | +# 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" | ||
| 19644 | |||
| 19645 | !ENDIF | ||
| 19646 | |||
| 19647 | diff --git a/win32/snmpd/snmpd.dsp b/win32/snmpd/snmpd.dsp | ||
| 19648 | index 5534306..45e2cad 100644 | ||
| 19649 | --- a/win32/snmpd/snmpd.dsp | ||
| 19650 | +++ b/win32/snmpd/snmpd.dsp | ||
| 19651 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19652 | # ADD BSC32 /nologo | ||
| 19653 | LINK32=link.exe | ||
| 19654 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19655 | -# 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" | ||
| 19656 | +# 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" | ||
| 19657 | |||
| 19658 | !ELSEIF "$(CFG)" == "snmpd - Win32 Debug" | ||
| 19659 | |||
| 19660 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19661 | # ADD BSC32 /nologo | ||
| 19662 | LINK32=link.exe | ||
| 19663 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19664 | -# 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" | ||
| 19665 | +# 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" | ||
| 19666 | |||
| 19667 | !ENDIF | ||
| 19668 | |||
| 19669 | diff --git a/win32/snmpdelta/snmpdelta.dsp b/win32/snmpdelta/snmpdelta.dsp | ||
| 19670 | index b17b822..7f5a5d3 100644 | ||
| 19671 | --- a/win32/snmpdelta/snmpdelta.dsp | ||
| 19672 | +++ b/win32/snmpdelta/snmpdelta.dsp | ||
| 19673 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19674 | # ADD BSC32 /nologo | ||
| 19675 | LINK32=link.exe | ||
| 19676 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19677 | -# 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" | ||
| 19678 | +# 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" | ||
| 19679 | |||
| 19680 | !ELSEIF "$(CFG)" == "snmpdelta - Win32 Debug" | ||
| 19681 | |||
| 19682 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19683 | # ADD BSC32 /nologo | ||
| 19684 | LINK32=link.exe | ||
| 19685 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19686 | -# 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" | ||
| 19687 | +# 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" | ||
| 19688 | |||
| 19689 | !ENDIF | ||
| 19690 | |||
| 19691 | diff --git a/win32/snmpdf/snmpdf.dsp b/win32/snmpdf/snmpdf.dsp | ||
| 19692 | index 88c3f6d..e2e4b94 100644 | ||
| 19693 | --- a/win32/snmpdf/snmpdf.dsp | ||
| 19694 | +++ b/win32/snmpdf/snmpdf.dsp | ||
| 19695 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19696 | # ADD BSC32 /nologo | ||
| 19697 | LINK32=link.exe | ||
| 19698 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19699 | -# 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" | ||
| 19700 | +# 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" | ||
| 19701 | |||
| 19702 | !ELSEIF "$(CFG)" == "snmpdf - Win32 Debug" | ||
| 19703 | |||
| 19704 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19705 | # ADD BSC32 /nologo | ||
| 19706 | LINK32=link.exe | ||
| 19707 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19708 | -# 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" | ||
| 19709 | +# 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" | ||
| 19710 | |||
| 19711 | !ENDIF | ||
| 19712 | |||
| 19713 | diff --git a/win32/snmpget/snmpget.dsp b/win32/snmpget/snmpget.dsp | ||
| 19714 | index 64980ed..0603232 100644 | ||
| 19715 | --- a/win32/snmpget/snmpget.dsp | ||
| 19716 | +++ b/win32/snmpget/snmpget.dsp | ||
| 19717 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19718 | # ADD BSC32 /nologo | ||
| 19719 | LINK32=link.exe | ||
| 19720 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19721 | -# 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" | ||
| 19722 | +# 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" | ||
| 19723 | |||
| 19724 | !ELSEIF "$(CFG)" == "snmpget - Win32 Debug" | ||
| 19725 | |||
| 19726 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19727 | # ADD BSC32 /nologo | ||
| 19728 | LINK32=link.exe | ||
| 19729 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19730 | -# 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" | ||
| 19731 | +# 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" | ||
| 19732 | |||
| 19733 | !ENDIF | ||
| 19734 | |||
| 19735 | diff --git a/win32/snmpgetnext/snmpgetnext.dsp b/win32/snmpgetnext/snmpgetnext.dsp | ||
| 19736 | index 233199d..cb63c84 100644 | ||
| 19737 | --- a/win32/snmpgetnext/snmpgetnext.dsp | ||
| 19738 | +++ b/win32/snmpgetnext/snmpgetnext.dsp | ||
| 19739 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19740 | # ADD BSC32 /nologo | ||
| 19741 | LINK32=link.exe | ||
| 19742 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19743 | -# 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" | ||
| 19744 | +# 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" | ||
| 19745 | |||
| 19746 | !ELSEIF "$(CFG)" == "snmpgetnext - Win32 Debug" | ||
| 19747 | |||
| 19748 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19749 | # ADD BSC32 /nologo | ||
| 19750 | LINK32=link.exe | ||
| 19751 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19752 | -# 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" | ||
| 19753 | +# 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" | ||
| 19754 | |||
| 19755 | !ENDIF | ||
| 19756 | |||
| 19757 | diff --git a/win32/snmpnetstat/snmpnetstat.dsp b/win32/snmpnetstat/snmpnetstat.dsp | ||
| 19758 | index 25ec031..35dd7e8 100644 | ||
| 19759 | --- a/win32/snmpnetstat/snmpnetstat.dsp | ||
| 19760 | +++ b/win32/snmpnetstat/snmpnetstat.dsp | ||
| 19761 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19762 | # ADD BSC32 /nologo | ||
| 19763 | LINK32=link.exe | ||
| 19764 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19765 | -# 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" | ||
| 19766 | +# 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" | ||
| 19767 | |||
| 19768 | !ELSEIF "$(CFG)" == "snmpnetstat - Win32 Debug" | ||
| 19769 | |||
| 19770 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19771 | # ADD BSC32 /nologo | ||
| 19772 | LINK32=link.exe | ||
| 19773 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19774 | -# 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" | ||
| 19775 | +# 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" | ||
| 19776 | |||
| 19777 | !ENDIF | ||
| 19778 | |||
| 19779 | diff --git a/win32/snmpset/snmpset.dsp b/win32/snmpset/snmpset.dsp | ||
| 19780 | index fdeca30..ad0f509 100644 | ||
| 19781 | --- a/win32/snmpset/snmpset.dsp | ||
| 19782 | +++ b/win32/snmpset/snmpset.dsp | ||
| 19783 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19784 | # ADD BSC32 /nologo | ||
| 19785 | LINK32=link.exe | ||
| 19786 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19787 | -# 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" | ||
| 19788 | +# 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" | ||
| 19789 | |||
| 19790 | !ELSEIF "$(CFG)" == "snmpset - Win32 Debug" | ||
| 19791 | |||
| 19792 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19793 | # ADD BSC32 /nologo | ||
| 19794 | LINK32=link.exe | ||
| 19795 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19796 | -# 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" | ||
| 19797 | +# 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" | ||
| 19798 | |||
| 19799 | !ENDIF | ||
| 19800 | |||
| 19801 | diff --git a/win32/snmpstatus/snmpstatus.dsp b/win32/snmpstatus/snmpstatus.dsp | ||
| 19802 | index 1b68373..e6a4100 100644 | ||
| 19803 | --- a/win32/snmpstatus/snmpstatus.dsp | ||
| 19804 | +++ b/win32/snmpstatus/snmpstatus.dsp | ||
| 19805 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19806 | # ADD BSC32 /nologo | ||
| 19807 | LINK32=link.exe | ||
| 19808 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19809 | -# 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" | ||
| 19810 | +# 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" | ||
| 19811 | |||
| 19812 | !ELSEIF "$(CFG)" == "snmpstatus - Win32 Debug" | ||
| 19813 | |||
| 19814 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19815 | # ADD BSC32 /nologo | ||
| 19816 | LINK32=link.exe | ||
| 19817 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19818 | -# 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" | ||
| 19819 | +# 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" | ||
| 19820 | |||
| 19821 | !ENDIF | ||
| 19822 | |||
| 19823 | diff --git a/win32/snmptable/snmptable.dsp b/win32/snmptable/snmptable.dsp | ||
| 19824 | index 75f964f..1dfc138 100644 | ||
| 19825 | --- a/win32/snmptable/snmptable.dsp | ||
| 19826 | +++ b/win32/snmptable/snmptable.dsp | ||
| 19827 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19828 | # ADD BSC32 /nologo | ||
| 19829 | LINK32=link.exe | ||
| 19830 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19831 | -# 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" | ||
| 19832 | +# 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" | ||
| 19833 | |||
| 19834 | !ELSEIF "$(CFG)" == "snmptable - Win32 Debug" | ||
| 19835 | |||
| 19836 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19837 | # ADD BSC32 /nologo | ||
| 19838 | LINK32=link.exe | ||
| 19839 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19840 | -# 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" | ||
| 19841 | +# 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" | ||
| 19842 | |||
| 19843 | !ENDIF | ||
| 19844 | |||
| 19845 | diff --git a/win32/snmptest/snmptest.dsp b/win32/snmptest/snmptest.dsp | ||
| 19846 | index dfb0cf1..89c08e9 100644 | ||
| 19847 | --- a/win32/snmptest/snmptest.dsp | ||
| 19848 | +++ b/win32/snmptest/snmptest.dsp | ||
| 19849 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19850 | # ADD BSC32 /nologo | ||
| 19851 | LINK32=link.exe | ||
| 19852 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19853 | -# 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" | ||
| 19854 | +# 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" | ||
| 19855 | |||
| 19856 | !ELSEIF "$(CFG)" == "snmptest - Win32 Debug" | ||
| 19857 | |||
| 19858 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19859 | # ADD BSC32 /nologo | ||
| 19860 | LINK32=link.exe | ||
| 19861 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19862 | -# 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" | ||
| 19863 | +# 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" | ||
| 19864 | |||
| 19865 | !ENDIF | ||
| 19866 | |||
| 19867 | diff --git a/win32/snmptranslate/snmptranslate.dsp b/win32/snmptranslate/snmptranslate.dsp | ||
| 19868 | index a3ebde5..c3eca02 100644 | ||
| 19869 | --- a/win32/snmptranslate/snmptranslate.dsp | ||
| 19870 | +++ b/win32/snmptranslate/snmptranslate.dsp | ||
| 19871 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19872 | # ADD BSC32 /nologo | ||
| 19873 | LINK32=link.exe | ||
| 19874 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19875 | -# 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" | ||
| 19876 | +# 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" | ||
| 19877 | |||
| 19878 | !ELSEIF "$(CFG)" == "snmptranslate - Win32 Debug" | ||
| 19879 | |||
| 19880 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19881 | # ADD BSC32 /nologo | ||
| 19882 | LINK32=link.exe | ||
| 19883 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19884 | -# 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" | ||
| 19885 | +# 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" | ||
| 19886 | |||
| 19887 | !ENDIF | ||
| 19888 | |||
| 19889 | diff --git a/win32/snmptrap/snmptrap.dsp b/win32/snmptrap/snmptrap.dsp | ||
| 19890 | index 8d27ee1..c34ffd8 100644 | ||
| 19891 | --- a/win32/snmptrap/snmptrap.dsp | ||
| 19892 | +++ b/win32/snmptrap/snmptrap.dsp | ||
| 19893 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19894 | # ADD BSC32 /nologo | ||
| 19895 | LINK32=link.exe | ||
| 19896 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19897 | -# 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" | ||
| 19898 | +# 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" | ||
| 19899 | |||
| 19900 | !ELSEIF "$(CFG)" == "snmptrap - Win32 Debug" | ||
| 19901 | |||
| 19902 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19903 | # ADD BSC32 /nologo | ||
| 19904 | LINK32=link.exe | ||
| 19905 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19906 | -# 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" | ||
| 19907 | +# 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" | ||
| 19908 | |||
| 19909 | !ENDIF | ||
| 19910 | |||
| 19911 | diff --git a/win32/snmptrapd/snmptrapd.dsp b/win32/snmptrapd/snmptrapd.dsp | ||
| 19912 | index 503918a..9f49389 100644 | ||
| 19913 | --- a/win32/snmptrapd/snmptrapd.dsp | ||
| 19914 | +++ b/win32/snmptrapd/snmptrapd.dsp | ||
| 19915 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19916 | # ADD BSC32 /nologo | ||
| 19917 | LINK32=link.exe | ||
| 19918 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19919 | -# 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" | ||
| 19920 | +# 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" | ||
| 19921 | |||
| 19922 | !ELSEIF "$(CFG)" == "snmptrapd - Win32 Debug" | ||
| 19923 | |||
| 19924 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19925 | # ADD BSC32 /nologo | ||
| 19926 | LINK32=link.exe | ||
| 19927 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19928 | -# 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" | ||
| 19929 | +# 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" | ||
| 19930 | |||
| 19931 | !ENDIF | ||
| 19932 | |||
| 19933 | diff --git a/win32/snmpusm/snmpusm.dsp b/win32/snmpusm/snmpusm.dsp | ||
| 19934 | index db43f2e..a1c0124 100644 | ||
| 19935 | --- a/win32/snmpusm/snmpusm.dsp | ||
| 19936 | +++ b/win32/snmpusm/snmpusm.dsp | ||
| 19937 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19938 | # ADD BSC32 /nologo | ||
| 19939 | LINK32=link.exe | ||
| 19940 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19941 | -# 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" | ||
| 19942 | +# 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" | ||
| 19943 | |||
| 19944 | !ELSEIF "$(CFG)" == "snmpusm - Win32 Debug" | ||
| 19945 | |||
| 19946 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19947 | # ADD BSC32 /nologo | ||
| 19948 | LINK32=link.exe | ||
| 19949 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19950 | -# 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" | ||
| 19951 | +# 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" | ||
| 19952 | |||
| 19953 | !ENDIF | ||
| 19954 | |||
| 19955 | diff --git a/win32/snmpvacm/snmpvacm.dsp b/win32/snmpvacm/snmpvacm.dsp | ||
| 19956 | index 0856832..2fd53fd 100644 | ||
| 19957 | --- a/win32/snmpvacm/snmpvacm.dsp | ||
| 19958 | +++ b/win32/snmpvacm/snmpvacm.dsp | ||
| 19959 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19960 | # ADD BSC32 /nologo | ||
| 19961 | LINK32=link.exe | ||
| 19962 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19963 | -# 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" | ||
| 19964 | +# 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" | ||
| 19965 | |||
| 19966 | !ELSEIF "$(CFG)" == "snmpvacm - Win32 Debug" | ||
| 19967 | |||
| 19968 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19969 | # ADD BSC32 /nologo | ||
| 19970 | LINK32=link.exe | ||
| 19971 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19972 | -# 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" | ||
| 19973 | +# 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" | ||
| 19974 | |||
| 19975 | !ENDIF | ||
| 19976 | |||
| 19977 | diff --git a/win32/snmpwalk/snmpwalk.dsp b/win32/snmpwalk/snmpwalk.dsp | ||
| 19978 | index 5d81957..67598f1 100644 | ||
| 19979 | --- a/win32/snmpwalk/snmpwalk.dsp | ||
| 19980 | +++ b/win32/snmpwalk/snmpwalk.dsp | ||
| 19981 | @@ -50,7 +50,7 @@ BSC32=bscmake.exe | ||
| 19982 | # ADD BSC32 /nologo | ||
| 19983 | LINK32=link.exe | ||
| 19984 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /machine:I386 | ||
| 19985 | -# 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" | ||
| 19986 | +# 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" | ||
| 19987 | |||
| 19988 | !ELSEIF "$(CFG)" == "snmpwalk - Win32 Debug" | ||
| 19989 | |||
| 19990 | @@ -74,7 +74,7 @@ BSC32=bscmake.exe | ||
| 19991 | # ADD BSC32 /nologo | ||
| 19992 | LINK32=link.exe | ||
| 19993 | # ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||
| 19994 | -# 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" | ||
| 19995 | +# 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" | ||
| 19996 | |||
| 19997 | !ENDIF | ||
| 19998 | |||
diff --git a/meta-oe/recipes-extended/net-snmp/net-snmp_5.7.1.bb b/meta-oe/recipes-extended/net-snmp/net-snmp_5.7.1.bb index 59d84077f1..55dd9a6666 100644 --- a/meta-oe/recipes-extended/net-snmp/net-snmp_5.7.1.bb +++ b/meta-oe/recipes-extended/net-snmp/net-snmp_5.7.1.bb | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | require net-snmp.inc | 1 | require net-snmp.inc |
| 2 | PR = "${INC_PR}.0" | 2 | PR = "${INC_PR}.1" |
| 3 | LIC_FILES_CHKSUM = "file://README;beginline=3;endline=8;md5=7f7f00ba639ac8e8deb5a622ea24634e" | 3 | LIC_FILES_CHKSUM = "file://README;beginline=3;endline=8;md5=7f7f00ba639ac8e8deb5a622ea24634e" |
| 4 | 4 | ||
| 5 | SRC_URI = "${SOURCEFORGE_MIRROR}/net-snmp/net-snmp-${PV}.tar.gz \ | 5 | SRC_URI = "${SOURCEFORGE_MIRROR}/net-snmp/net-snmp-${PV}.tar.gz \ |
| 6 | file://sync-with-5.7-branch.patch \ | ||
| 6 | file://init \ | 7 | file://init \ |
| 7 | file://snmpd.conf \ | 8 | file://snmpd.conf \ |
| 8 | file://snmptrapd.conf" | 9 | file://snmptrapd.conf" |
