diff options
author | 2020-09-03 17:01:15 +0000 | |
---|---|---|
committer | 2020-09-03 17:01:15 +0000 | |
commit | 1f7940eec8254c03681d8b6a96a010bc1ee7e9cb (patch) | |
tree | 050383ef59c7d222daa91ed12f4dab8c9e5aa8df /lib | |
parent | The "USL" VT switch and keyboard ioctls are a hack and don't follow the (diff) | |
download | wireguard-openbsd-1f7940eec8254c03681d8b6a96a010bc1ee7e9cb.tar.xz wireguard-openbsd-1f7940eec8254c03681d8b6a96a010bc1ee7e9cb.zip |
Make sure ober_read_elements sets errno on every case where NULL is
returned.
OK deraadt@ tb@
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libutil/ber.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/libutil/ber.c b/lib/libutil/ber.c index 0e1914c5faa..d7cc863eaeb 100644 --- a/lib/libutil/ber.c +++ b/lib/libutil/ber.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ber.c,v 1.15 2019/10/24 12:39:26 tb Exp $ */ +/* $OpenBSD: ber.c,v 1.16 2020/09/03 17:01:15 martijn Exp $ */ /* * Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> @@ -1266,8 +1266,10 @@ ober_read_element(struct ber *ber, struct ber_element *elm) /* smallest number of contents octets only */ if ((i == 1 && last == 0 && (c & 0x80) == 0) || - (i == 1 && last == 0xff && (c & 0x80) != 0)) + (i == 1 && last == 0xff && (c & 0x80) != 0)) { + errno = EINVAL; return -1; + } val <<= 8; val |= c; @@ -1299,8 +1301,10 @@ ober_read_element(struct ber *ber, struct ber_element *elm) ((u_char *)elm->be_val)[len] = '\0'; break; case BER_TYPE_NULL: /* no payload */ - if (len != 0) + if (len != 0) { + errno = EINVAL; return -1; + } break; case BER_TYPE_SEQUENCE: case BER_TYPE_SET: @@ -1346,8 +1350,10 @@ ober_read(struct ber *ber, void *buf, size_t len) { size_t sz; - if (ber->br_rbuf == NULL) + if (ber->br_rbuf == NULL) { + errno = ENOBUFS; return -1; + } sz = ber->br_rend - ber->br_rptr; if (len > sz) { |