Apparently I missed one...
On Thu, 2020-09-03 at 18:00 +0200, Martijn van Duren wrote:
> Just reminded myself of this one.
> The manpage says nothing about ober_read_elements setting errno upon
> failure, yet it does in most cases. Furthermore, applications like
> snmpd use errno in ober_read_elements to determine if a read is
> incomplete (checking for ECANCELED), without initializing errno to
> 0.
>
> The danger here is that since some stale errno might linger and a
> return from ober_read_elements with NULL could test against an old
> errno.
>
> Diff below tries to remedy this.
>
> OK?
>
> martijn@
Index: ber.c
===================================================================
RCS file: /cvs/src/lib/libutil/ber.c,v
retrieving revision 1.16
diff -u -p -r1.16 ber.c
--- ber.c 3 Sep 2020 17:01:15 -0000 1.16
+++ ber.c 3 Sep 2020 18:47:38 -0000
@@ -1258,8 +1258,10 @@ ober_read_element(struct ber *ber, struc
}
case BER_TYPE_INTEGER:
case BER_TYPE_ENUMERATED:
- if (len > (ssize_t)sizeof(long long))
+ if (len > (ssize_t)sizeof(long long)) {
+ errno = ERANGE;
return -1;
+ }
for (i = 0; i < len; i++) {
if (ober_getc(ber, &c) != 1)
return -1;