Hello,

Net-SNMP version: 5.9.3
OS: Plain Vanilla Linux (kernel 6.6.23)
Hardware: custom ARM board with many sensors

Back in the net-snmp 5.4 days we created a custom mib in c using the
example found at: netsnmp/agent/mibgroup/example.c

This has worked great with one minor patch that we add to be able to go
beyhond the 255 custom oid limitation set by a u_char magic. We would
change that to u_short magic in the two files below, and then when calling
an oid that has a magic number beyhond 255 it does not wrap to zero and
start returning wrong vales.

Change all u_char magic; to u_short magic; in the two files below.
netsnmp/include/netsnmp/agent/snmp_vars.h
netsnmp/include/netsnmp/agent/var_struct.h

As mentioned our custom patch has worked for many years and many newer
versions than net-snmp 5.4. Now fast forward to today. We want to upgrade
our net-snmp to a newer version that supports newer openssl. So we install
5.9.3, test our custom mib, and all works as expected including the 255
limitation. When walking the tree we can observe that when the 255 limit is
reached it wraps around and outputs from the beginning. So, no problem. We
just have to add our patches to increase the size of the magic variable
from u_char (8-bit) to u_short (16-bit) in two files mentioned above.

We recompile everything and install no problem, but instead of fixing our
problem it caused net-snmp-5.9.3 to not be able to start. The error it
gives is: Bad user id, which could be a red herring. example below:
[root@testboard: /root# /etc/init.d/S59netsnmp restart
Stopping SNMP daemon: [OK]
Starting SNMP daemon: Bad user id: snmp
[root@testboard: /root#

So, we take our patches out and recompile and install, and it works again
but still has the 255 custom oid limitation.

A snippet from our header file. Too big to paste it all.

#define TEMPC 1
#define TEMPF 2
#define   UPTIME_STR 3
#define   SERIALNUMBER 4
#define   ALLOFIT 5
#define   ROOTFSBUILD 6
#define   KERNELBUILD      7
#define   OSINFO     8
......
#define PRODUCT_ID 250
#define RUNSCRIPT 251
#define TIMER1 252
#define TIMER2 253
#define TIMER3 254
#define TIMER4 255
#define TIMER5 256 <- This outpts an error because it wraps around and 0 is
not defined.
#define TIMER6 257 <- This outputs TEMPC value instead of TIMER6.
#define TIMER7 258
#define TIMER8 259
#define TIMER9 260
#define TIMER10 261

#define    EXAMPLETIMETICKS 3333
#define EXAMPLEIPADDRESS        4444
#define   EXAMPLECOUNTER 7777
#define EXAMPLEGAUGE            8888
#define EXAMPLETRIGGERTRAP      9999
#define EXAMPLETRIGGERTRAP2     1000

Notice the example defines above that were provided in the example C header
file, those magic numbers would have never worked because of the u_char
(8-bit) magic variable limitation.

This is a code snippet from our custom mib C file.

struct variable4 testboard_variables[] = {
   {ROOTFSBUILD, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {7,
1}},
   {KERNELBUILD, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {7,
2}},
   {OSINFO, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {7, 3}},
   {PRODUCT_ID, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, etestboard_var, 2, {7,
4}},
   {UPTIME_STR, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {5,
1}},
   {SERIALNUMBER, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2,
{5, 2}},
   {TEMPC, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {6,1}},
   {TEMPF, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY, testboard_var, 2, {6,2}},

We have poured over the souce code looking for any other instance of u_char
magic that we may have missed, but they are only defined in the two files
mentioned above.

We need some help with this. What else do we need to do in the 5.9 versions
to make the magic number not wrap around to zero after 255 and not crash
when we do that?

Thanks,

Neeraj Bansal
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to