From 8822c0fff500567af73b79e1332032b35366b677 Mon Sep 17 00:00:00 2001 From: Net-SNMP Packaging Team Date: Mon, 27 Jun 2022 15:01:26 +0800 Subject: [PATCH] Fix perl bulk gets Reviewed-by: Craig Small Last-Updated: 2019-02-07 Gbp-Pq: Name fix_perl_bulk_gets.diff --- perl/SNMP/SNMP.pm | 55 +++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/perl/SNMP/SNMP.pm b/perl/SNMP/SNMP.pm index 2267b76..ae71601 100644 --- a/perl/SNMP/SNMP.pm +++ b/perl/SNMP/SNMP.pm @@ -866,22 +866,11 @@ sub _gettable_do_it() { $vbl = $_[$#_] if ($state->{'options'}{'callback'}); - while ($#$vbl > -1 && !$this->{ErrorNum}) { - if (($#$vbl + 1) % ($#{$state->{'stopconds'}} + 1) != 0) { - if ($vbl->[$#$vbl][2] ne 'ENDOFMIBVIEW') { - # unless it's an end of mib view we didn't get the - # proper number of results back. - print STDERR "ack: gettable results not appropriate\n"; - } - my @k = keys(%{$state->{'result_hash'}}); - last if ($#k > -1); # bail with what we have - return; - } + my $num_vbls = defined($vbl) ? scalar @$vbl : 0; + my $num_stopconds = scalar @{$state->{'stopconds'}}; - $state->{'varbinds'} = []; - my $newstopconds; - - my $lastsetstart = ($state->{'repeatcount'}-1) * ($#{$state->{'stopconds'}}+1); + while ($num_vbls > 0 && !$this->{ErrorNum}) { + my @found_eof = (0) x $num_stopconds; for (my $i = 0; $i <= $#$vbl; $i++) { my $row_oid = SNMP::translateObj($vbl->[$i][0]); @@ -890,9 +879,11 @@ sub _gettable_do_it() { my $row_value = $vbl->[$i][2]; my $row_type = $vbl->[$i][3]; - if ($row_oid =~ - /^$state->{'stopconds'}[$i % ($#{$state->{'stopconds'}}+1)]/ && - $row_value ne 'ENDOFMIBVIEW' ){ + my $stopcond_num = $i % $num_stopconds; + my $stopcond = $state->{'stopconds'}[$stopcond_num]; + if ($row_oid !~ /^\Q$stopcond\E/ || $row_value eq 'ENDOFMIBVIEW') { + $found_eof[$stopcond_num] = 1; + } else { if ($row_type eq "OBJECTID") { @@ -903,26 +894,30 @@ sub _gettable_do_it() { } + # continue past this next time + + $state->{'varbinds'}[$stopcond_num] = [ $row_text, $row_index ]; + # Place the results in a hash $state->{'result_hash'}{$row_index}{$row_text} = $row_value; - - # continue past this next time - if ($i >= $lastsetstart) { - push @$newstopconds, - $state->{'stopconds'}->[$i%($#{$state->{'stopconds'}}+1)]; - push @{$state->{'varbinds'}},[$vbl->[$i][0],$vbl->[$i][1]]; - } } } - if ($#$newstopconds == -1) { + + my @newstopconds = (); + my @newvarbinds = (); + for (my $i = 0; $i < $num_stopconds; ++$i) { + unless ($found_eof[$i]) { + push @newstopconds, $state->{'stopconds'}[$i]; + push @newvarbinds, $state->{'varbinds'}[$i]; + } + } + if ($#newstopconds == -1) { last; } - if ($#{$state->{'varbinds'}} == -1) { - print "gettable ack. shouldn't get here\n"; - } + $state->{'varbinds'} = \@newvarbinds; + $state->{'stopconds'} = \@newstopconds; $vbl = $state->{'varbinds'}; - $state->{'stopconds'} = $newstopconds; # # if we've been configured with a callback, then call the