Package: libsnmp-perl
Version: 5.9.4+dfsg-2+deb13u1
Severity: important
Tags: patch

Dear Maintainer,

When the `get` method of an SNMP::Session object is retried in an async
context, the callback data is prematurely freed. This is due to treating
the operation NETSNMP_CALLBACK_OP_RESEND as a final operation even though
it is only meant to signify a retry.

This bug can be reproduced by running this script without having a snmp
listener at port 8000:

```perl
#!/usr/bin/perl
use strict;
use warnings;

use SNMP;
use Time::HiRes qw(time);

my $s = SNMP::Session->new(
    DestHost => 'localhost:8000',
    Version  => '2c',
    Timeout  => 200_000,
    Retries  => 1,
);

my $t0 = time;
$s->get(
    [ ['.1.3.6.1.2.1.1'] ],
    [ sub { printf "callback at %.2fs: %s\n", time - $t0, $s->{ErrorStr} } ]
);
SNMP::MainLoop(1);
```

Here is an excerpt from the output when running this script under
valgrind:

```
$ valgrind -q perl reproduction_get.pl
==3412770== Invalid read of size 8
==3412770==    at 0x5FB2261: __snmp_xs_cb (SNMP.xs:1178)
==3412770==    by 0x56D1986: snmp_sess_timeout (snmp_api.c:6881)
==3412770==    by 0x56D1B47: snmp_timeout (snmp_api.c:6726)
==3412770==    by 0x5FB1418: XS_SNMP__main_loop (SNMP.xs:5067)
==3412770==    ...
==3412770==  Address 0x6b8d728 is 8 bytes inside a block of size 16 free'd
==3412770==    at 0x484787F: free (vg_replace_malloc.c:989)
==3412770==    by 0x5FB2389: __snmp_xs_cb (SNMP.xs:1187)
==3412770==    by 0x56D0C0D: snmp_resend_request.constprop.0 (snmp_api.c:6815)
==3412770==    by 0x56D1A05: snmp_sess_timeout (snmp_api.c:6888)
==3412770==    by 0x56D1B47: snmp_timeout (snmp_api.c:6726)
==3412770==    by 0x5FB1418: XS_SNMP__main_loop (SNMP.xs:5067)
==3412770==    ...
==3412770==  Block was alloc'd at
==3412770==    at 0x4844818: malloc (vg_replace_malloc.c:446)
==3412770==    by 0x5FBD5FB: XS_SNMP__get (SNMP.xs:3335)
==3412770==    ...

==3412770== Invalid free() / delete / delete[] / realloc()
==3412770==    at 0x484787F: free (vg_replace_malloc.c:989)
==3412770==    by 0x5FB2389: __snmp_xs_cb (SNMP.xs:1187)
==3412770==    by 0x56D1986: snmp_sess_timeout (snmp_api.c:6881)
==3412770==    by 0x56D1B47: snmp_timeout (snmp_api.c:6726)
==3412770==    by 0x5FB1418: XS_SNMP__main_loop (SNMP.xs:5067)
==3412770==    ...
==3412770==  Address 0x6b8d720 is 0 bytes inside a block of size 16 free'd
==3412770==    [same free'd/alloc'd stacks as above]
```

This bug is resolved with commit cf5d7defd20 in the upstream repository.
Would it be possible to port this fix to the trixie-security suite?

A related bug with the bulkwalk method, got fixed in this PR:
https://github.com/net-snmp/net-snmp/pull/1166

Do you want me to file a separate bug report for this related bug?

-- System Information:
Debian Release: 13.7
  APT prefers stable-security
  APT policy: (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 7.2.11 (SMP w/40 CPU threads; PREEMPT)
Locale: LANG=en_DK.UTF-8, LC_CTYPE=en_DK.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_NO:en_DK:en_US:en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages libsnmp-perl depends on:
ii  libc6                       2.41-12+deb13u4
ii  libnetsnmptrapd40t64        5.9.4+dfsg-2+deb13u1
ii  libsnmp40t64                5.9.4+dfsg-2+deb13u1
ii  perl                        5.40.1-6+deb13u1
ii  perl-base [perlapi-5.40.1]  5.40.1-6+deb13u1

libsnmp-perl recommends no packages.

libsnmp-perl suggests no packages.

-- no debconf information

Reply via email to