[erlang-patches] SNMP: patch for Counter32 decode function
Niclas Eklund
nick@REDACTED
Wed Jan 12 15:20:35 CET 2011
Hello!
Thank you for reporting this and the suggested patch!
Best regards,
Niclas @ Erlang/OTP
On Wed, 12 Jan 2011, Aleksey Morarash wrote:
> 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
>
> ________________________________________________________________
> erlang-patches (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-patches-unsubscribe@REDACTED
>
More information about the erlang-patches
mailing list