On Tue, Sep 13, 2022 at 12:00:48PM +0200, Martijn van Duren wrote:
> varbind was designed to allow both a ber NULL and a NULL pointer for
> value. The ber NULL case is there for when it was received via a PDU.
> The NULL pointer case can happen if application.c runs into a timeout
> or when a backend runs into problems.
>
> The NULL pointer case however was overlooked in appl_varbind_valid and
> results in an "missing value" error, (needlessly) terminating the
> connection to the backend.
>
> Found the hard way by Mischa Peters while stress testing agentx support
> for vmd.
>
> OK?
ok tb
>
> martijn@
>
> Index: application.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/snmpd/application.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 application.c
> --- application.c 31 Aug 2022 09:19:22 -0000 1.15
> +++ application.c 13 Sep 2022 09:59:19 -0000
> @@ -1170,8 +1170,11 @@ appl_varbind_valid(struct appl_varbind *
> int eomv = 0;
>
> if (varbind->av_value == NULL) {
> - *errstr = "missing value";
> - return 0;
> + if (!null) {
> + *errstr = "missing value";
> + return 0;
> + }
> + return 1;
> }
> if (varbind->av_value->be_class == BER_CLASS_UNIVERSAL) {
> switch (varbind->av_value->be_type) {
>