On Sun, 2007-10-07 at 11:56 +0200, Rolf Sommerhalder wrote:
> The patch below resolves a "Arithmetic exception (core dumped)" when
> performing once snmwalk or snmpget access agent hardware memory
> information. Also, on sparc64 the unpatched snmpd consumes all CPU and
RS: You'll want to fwd this onto:
Thomas Anders <[EMAIL PROTECTED]>
He has been very useful and receptive in the past to accepting upstreams
commits for bsd-specific bugs. So has:
Dave Shield <[EMAIL PROTECTED]>
~BAS
> memory resources within minutes after starting as in the background.
> Interestingly, if run in the foreground (snmpd -f)., it does not hog
> those resources and behaves.
>
> Without this patch, these problems occur on sparc64-current, whereas
> on i386-current I did not observe them. I noticed the problems already
> in 4.1 and before upgrading to net-snmp-5.4.1, but back then, I never
> got around to track it down.
>
> Please test and propose improvements for my somewhat naive,
> quick&dirty patch before committing. I do not understand the details
> of sysctl and uvmexp yet, thus just used getpagesize(3).
>
> OK on sparc64.
>
> Thanks,
> Rolf
>
>
> # diff -urN net-snmp net-snmp-5.4.1p1
> diff -urN net-snmp/Makefile net-snmp-5.4.1p1/Makefile
> --- net-snmp/Makefile Wed Sep 26 22:03:42 2007
> +++ net-snmp-5.4.1p1/Makefile Sun Oct 7 09:40:05 2007
> @@ -4,7 +4,7 @@
> COMMENT-perl= SNMP modules for Perl
>
> DISTNAME= net-snmp-5.4.1
> -PKGNAME-main= ${DISTNAME}
> +PKGNAME-main= ${DISTNAME}p1
> PKGNAME-perl= p5-SNMP-5.4.1
> SHARED_LIBS= netsnmp 7.0 \
> netsnmpagent 7.0 \
> diff -urN
> net-snmp/patches/patch-agent_mibgroup_hardware_memory_memory_netbsd_c
> net-snmp-5.4.1p1/patches/patch-agent_mibgroup_hardware_memory_memory_netbsd_c
> --- net-snmp/patches/patch-agent_mibgroup_hardware_memory_memory_netbsd_c
> Thu Jan 1 01:00:00 1970
> +++
> net-snmp-5.4.1p1/patches/patch-agent_mibgroup_hardware_memory_memory_netbsd_c
> Sun Oct 7 09:42:54 2007
> @@ -0,0 +1,29 @@
> +--- agent/mibgroup/hardware/memory/memory_netbsd.c.orig Mon Mar 6
> 17:23:52 2006
> ++++ agent/mibgroup/hardware/memory/memory_netbsd.c Sun Oct 7
> 09:33:56 2007
> +@@ -30,7 +30,11 @@
> + long pagesize;
> +
> + struct uvmexp uvmexp;
> +- int uvmexp_size = sizeof(uvmexp);
> ++ #ifdef __OpenBSD__
> ++ size_t uvmexp_size = sizeof(uvmexp);
> ++ #else
> ++ int uvmexp_size = sizeof(uvmexp);
> ++ #endif
> + int uvmexp_mib[] = { CTL_VM, VM_UVMEXP };
> +
> + struct vmtotal total;
> +@@ -50,7 +54,11 @@
> + sysctl(total_mib, 2, &total, &total_size, NULL, 0);
> + sysctl(phys_mem_mib, 2, &phys_mem, &mem_size, NULL, 0);
> + sysctl(user_mem_mib, 2, &user_mem, &mem_size, NULL, 0);
> +- pagesize = uvmexp.pagesize;
> ++ #ifdef __OpenBSD__
> ++ pagesize = getpagesize();
> ++ #else
> ++ pagesize = uvmexp.pagesize;
> ++ #endif
> +
> + /*
> + * ... and save this in a standard form.
> +
> #
>
>
> Here is an illustration of the problem on sparc64-current
>
> A) snmpd.conf is minimal:
>
> # cat /etc/snmp/snmpd.conf
> rocommunity public
>
>
> B) snmpd run in the foreground within gdb
>
> [EMAIL PROTECTED]:snmp]# gdb /usr/local/sbin/snmpd
> GNU gdb 6.3
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "sparc64-unknown-openbsd4.2"...(no
> debugging symbols found)
>
> (gdb) run -f -Lo -D
> ..
> verbose:sess_select: timer due in 4.996670 sec
> verbose:sess_select: setting timer to 4.996670 sec, clear block (was 0)
> trace: receive(): snmpd.c, 1144:
> snmpd/select: select( numfds=12, ..., tvp=0xfffffffffffead10)
> trace: receive(): snmpd.c, 1146:
> timer: tvp 4.996670
> trace: receive(): snmpd.c, 1148:
> snmpd/select: returned, count = 0
> trace: run_alarms(): snmp_alarm.c, 251:
> snmp_alarm: run alarm 2
> trace: netsnmp_cpu_get_byIdx(): hardware/cpu/cpu.c, 69:
> cpu: cpu_get_byIdx -1 (found)
> trace: netsnmp_cpu_get_byIdx(): hardware/cpu/cpu.c, 69:
> cpu: cpu_get_byIdx 0 (found)
> trace: run_alarms(): snmp_alarm.c, 253:
> snmp_alarm: alarm 2 completed
> trace: snmp_sess_select_info(): snmp_api.c, 5868:
> sess_select: for all sessions: 11 7
> sess_select: next alarm 4.996349 sec
> verbose:sess_select: timer due in 4.996349 sec
> verbose:sess_select: setting timer to 4.996349 sec, clear block (was 0)
> trace: receive(): snmpd.c, 1144:
> snmpd/select: select( numfds=12, ..., tvp=0xfffffffffffead10)
> trace: receive(): snmpd.c, 1146:
> timer: tvp 4.996349
> ..
> {
> C) the above repeats until we launch from another host:
> $ snmpwalk -v 2c -c public 172.16.71.6 .
> }
> ..
> trace: netsnmp_view_subtree_check(): vacm.c, 532:
> 9:vacm:checkSubtree: view _all_
> trace: netsnmp_view_subtree_check(): vacm.c, 569:
> 9:vacm:checkSubtree: _all_ matched?
> trace: netsnmp_view_subtree_check(): vacm.c, 630:
> 9:vacm:checkSubtree: (null) matched
> trace: netsnmp_view_subtree_check(): vacm.c, 653:
> vacm:checkSubtree: , included
> trace: snmp_call_callbacks(): callback.c, 336:
> callback: END calling callbacks for maj=1 min=12 (1 called)
> trace: _callback_unlock(): callback.c, 152:
> 9:callback:lock: unlocked (APP,null)
> trace: netsnmp_add_varbind_to_cache(): snmp_agent.c, 1941:
> snmp_agent: tp->start HOST-RESOURCES-MIB::hrMemorySize, tp->end
> HOST-RESOURCES-MIB::hrStorageTable,
> trace: netsnmp_add_varbind_to_cache(): snmp_agent.c, 1961:
> verbose:asp: asp 0x41e5fd00 reqinfo 0x47329ea0 assigned to request
> trace: netsnmp_add_varbind_to_cache(): snmp_agent.c, 1968:
> verbose:asp: asp 0x41e5fd00 reqinfo 0x47329ea0 assigned to request
> trace: netsnmp_call_handlers(): agent_handler.c, 510:
> handler:calling: main handler bulk_to_next
> trace: netsnmp_call_handler(): agent_handler.c, 430:
> handler:calling: calling handler bulk_to_next for mode GETNEXT
> trace: netsnmp_call_handler(): agent_handler.c, 438:
> handler:returned: handler bulk_to_next returned 0
> trace: netsnmp_call_handler(): agent_handler.c, 430:
> handler:calling: calling handler old_api for mode GETNEXT
> trace: header_hrstore(): host/hr_storage.c, 342:
> host/hr_storage: var_hrstore: HOST-RESOURCES-MIB::hrSystemProcesses.0 0
>
> Program received signal SIGFPE, Arithmetic exception.
> 0x0000000048813e3c in netsnmp_mem_arch_load () from
> /usr/local/lib/libnetsnmpmibs.so.7.0
> (gdb) bt
> #0 0x0000000048813e3c in netsnmp_mem_arch_load () from
> /usr/local/lib/libnetsnmpmibs.so.7.0
> #1 0x000000004d59cc28 in _cache_load () from
> /usr/local/lib/libnetsnmphelpers.so.7.0
> #2 0x00000000487c9fa0 in var_hrstore () from
> /usr/local/lib/libnetsnmpmibs.so.7.0
> #3 0x000000004d5a0ff4 in netsnmp_old_api_helper ()
> from /usr/local/lib/libnetsnmphelpers.so.7.0
> #4 0x000000004f9321d8 in netsnmp_call_handler () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #5 0x000000004f932428 in netsnmp_call_handlers () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #6 0x000000004f927618 in handle_var_requests () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #7 0x000000004f9280c0 in handle_getnext_loop () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #8 0x000000004f928b80 in handle_pdu () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #9 0x000000004f9286c0 in netsnmp_handle_request () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #10 0x000000004f925e10 in handle_snmp_packet () from
> /usr/local/lib/libnetsnmpagent.so.7.0
> #11 0x0000000042203b1c in _sess_process_packet () from
> /usr/local/lib/libnetsnmp.so.7.0
> #12 0x00000000422049a0 in _sess_read () from /usr/local/lib/libnetsnmp.so.7.0
> #13 0x000000004220507c in snmp_sess_read () from
> /usr/local/lib/libnetsnmp.so.7.0
> #14 0x0000000042203fb0 in snmp_read () from /usr/local/lib/libnetsnmp.so.7.0
> #15 0x000000000010584c in main ()
> (gdb)
>
>
>
> D) last output lines of the snmpwalk:
> ...
> SNMPv2-MIB::snmpInReadOnlys.0 = Counter32: 0
> SNMPv2-MIB::snmpInGenErrs.0 = Counter32: 0
> SNMPv2-MIB::snmpInTotalReqVars.0 = Counter32: 515
> SNMPv2-MIB::snmpInTotalSetVars.0 = Counter32: 0
> SNMPv2-MIB::snmpInGetRequests.0 = Counter32: 44
> SNMPv2-MIB::snmpInGetNexts.0 = Counter32: 475
> SNMPv2-MIB::snmpInSetRequests.0 = Counter32: 0
> SNMPv2-MIB::snmpInGetResponses.0 = Counter32: 0
> SNMPv2-MIB::snmpInTraps.0 = Counter32: 0
> SNMPv2-MIB::snmpOutTooBigs.0 = Counter32: 0
> SNMPv2-MIB::snmpOutNoSuchNames.0 = Counter32: 0
> SNMPv2-MIB::snmpOutBadValues.0 = Counter32: 0
> SNMPv2-MIB::snmpOutGenErrs.0 = Counter32: 0
> SNMPv2-MIB::snmpOutGetRequests.0 = Counter32: 0
> SNMPv2-MIB::snmpOutGetNexts.0 = Counter32: 0
> SNMPv2-MIB::snmpOutSetRequests.0 = Counter32: 0
> SNMPv2-MIB::snmpOutGetResponses.0 = Counter32: 529
> SNMPv2-MIB::snmpOutTraps.0 = Counter32: 0
> SNMPv2-MIB::snmpEnableAuthenTraps.0 = INTEGER: disabled(2)
> SNMPv2-MIB::snmpSilentDrops.0 = Counter32: 0
> SNMPv2-MIB::snmpProxyDrops.0 = Counter32: 0
> HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (40599635) 4 days,
> 16:46:36.35
> HOST-RESOURCES-MIB::hrSystemDate.0 = STRING: 2007-10-7,10:53:29.0,-190:26
> HOST-RESOURCES-MIB::hrSystemInitialLoadDevice.0 = INTEGER: 1536
> HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3
> HOST-RESOURCES-MIB::hrSystemProcesses.0 = Gauge32: 20
> Timeout: No Response from 172.16.71.6
> $
>
>
> E) inspecting the source
> /usr/ports/net/net-snmp/w-net-snmp-5.4.1/net-snmp-5.4.1/agent/mibgroup/hardware/memory/memory_netbsd.c
> reveals a division by zero, because pagesize was assigned 0.
>
>
>
>
>
>
>