SNMP: patch for Counter32 decode function

Aleksey Morarash aleksey.morarash@REDACTED
Wed Jan 12 15:06:14 CET 2011


Hi all!

I have encountered problems receiving SNMP replies from
ethernet switch HP ProCurve 1400 8G which contain varbinds
of type Counter32. Investigation showed following:
SNMP agent encodes Counter32 as unsigned 32-bit integer,
but snmp_pdus module decodes it as signed integer, as it
described in X.690. So, for some values decode crashes
with error like {error, {bad_counter32, -16276764}}.

Here is example of SNMP reply which snmp_pdus unable to decode:

13:42:12.441281 00:1d:b3:cb:81:20 > 00:1f:d0:8b:ae:fb, ethertype IPv4
(0x0800), length 91: 192.168.9.50.161 > 192.168.9.105.40547:
GetResponse(34)  .1.3.6.1.2.1.2.2.1.10.103=2908389204
        0x0000:  4500 004d 0c9a 0000 4011 da1a c0a8 0932  E..M....@REDACTED
        0x0010:  c0a8 0969 00a1 9e63 0039 0000 302f 0201  ...i...c.9..0/..
        0x0020:  0104 0670 7562 6c69 63a2 2202 0443 f34f  ...public."..C.O
        0x0030:  3802 0100 0201 0030 1430 1206 0a2b 0601  8......0.0...+..
        0x0040:  0201 0202 010a 6741 04ad 5a7f 54         ......gA..Z.T

Counter32 value 2908389204 is encoded as "ad 5a7f 54".
By the way, tcpdump recognizes value correctly in this case.


I`ve noticed the difference between snmp_pdus in R12B5
and R14B1: in R14B1 additional check added for such buggy
SNMP agent behaviour but only for Counter64 values.

My patch will add such additional check for Counter32
values too.

Also I noticed of a tens "magic numbers" over all snmp_pdus
module which have not neither defined or commented.
I wrote patch in style corresponds common module style,
but looks like somebody must do anything with all of this magic.

Here is the patch:

--- lib/snmp/src/misc/snmp_pdus.erl
+++ lib/snmp/src/misc/snmp_pdus.erl
@@ -272,6 +272,8 @@
     {Value, Rest} = dec_integer_notag(Bytes),
     if Value >= 0, Value =< 4294967295 ->
            {{'Counter32', Value}, Rest};
+       Value >= -2147483648, Value < 0 ->
+           {{'Counter32', 4294967296 + Value}, Rest};
        true ->
            exit({error, {bad_counter32, Value}})
     end;



Regards,
Aleksey Morarash,
e-mail: aleksey.morarash at gmail.com


More information about the erlang-patches mailing list