]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
isc_buffer_*(): if source can be NULL, only call memmove() when length is non-zero
authorMichał Kępień <michal@isc.org>
Tue, 15 May 2018 06:18:01 +0000 (08:18 +0200)
committerMichał Kępień <michal@isc.org>
Tue, 15 May 2018 07:11:34 +0000 (09:11 +0200)
Certain isc_buffer_*() functions might call memmove() with the second
argument (source) set to NULL and the third argument (length) set to 0.
While harmless, it triggers an ubsan warning:

    runtime error: null pointer passed as argument 2, which is declared to never be null

Modify all memmove() call sites in lib/isc/include/isc/buffer.h and
lib/isc/buffer.c which may potentially use NULL as the second argument
(source) so that memmove() is only called if the third argument (length)
is non-zero.

lib/isc/buffer.c
lib/isc/include/isc/buffer.h
lib/isc/netaddr.c

index 3e24a27b2739e87a2742b45d5bad9983dd1efab0..79b64d75c4f9f8a89f41f53dac0db15370357bb4 100644 (file)
@@ -59,7 +59,10 @@ isc_buffer_reinit(isc_buffer_t *b, void *base, unsigned int length) {
        REQUIRE(base != NULL);
        REQUIRE(!b->autore);
 
-       (void)memmove(base, b->base, b->length);
+       if (b->length > 0U) {
+               (void)memmove(base, b->base, b->length);
+       }
+
        b->base = base;
        b->length = length;
 }
@@ -253,7 +256,9 @@ isc_buffer_compact(isc_buffer_t *b) {
 
        src = isc_buffer_current(b);
        length = isc_buffer_remaininglength(b);
-       (void)memmove(b->base, src, (size_t)length);
+       if (length > 0U) {
+               (void)memmove(b->base, src, (size_t)length);
+       }
 
        if (b->active > b->current)
                b->active -= b->current;
@@ -526,8 +531,10 @@ isc_buffer_copyregion(isc_buffer_t *b, const isc_region_t *r) {
        }
        if (r->length > available)
                return (ISC_R_NOSPACE);
-       memmove(base, r->base, r->length);
-       b->used += r->length;
+       if (r->length > 0U) {
+               memmove(base, r->base, r->length);
+               b->used += r->length;
+       }
 
        return (ISC_R_SUCCESS);
 }
index 8eb7791a09f6403d81804bb22b698c87173e1bf9..9af0f40fe32fefef839fb0c205de900612a02a2c 100644 (file)
@@ -920,8 +920,10 @@ ISC_LANG_ENDDECLS
                                == ISC_R_SUCCESS); \
                } \
                ISC_REQUIRE(isc_buffer_availablelength(_b) >= (unsigned int) _length); \
-               memmove(isc_buffer_used(_b), (_base), (_length)); \
-               (_b)->used += (_length); \
+               if (_length > 0U) { \
+                       memmove(isc_buffer_used(_b), (_base), (_length)); \
+                       (_b)->used += (_length); \
+               } \
        } while (0)
 
 #define ISC__BUFFER_PUTSTR(_b, _source) \
index 0f29a6fff3cd0a1c02d6eb6ae813ea19e86f1d68..233c1e90dfdfe4955d9f4e7f666fd84985b9b3a4 100644 (file)
@@ -166,7 +166,7 @@ isc_netaddr_totext(const isc_netaddr_t *netaddr, isc_buffer_t *target) {
                return (ISC_R_NOSPACE);
 
        isc_buffer_putmem(target, (unsigned char *)abuf, alen);
-       isc_buffer_putmem(target, (unsigned char *)zbuf, zlen);
+       isc_buffer_putmem(target, (unsigned char *)zbuf, (unsigned int)zlen);
 
        return (ISC_R_SUCCESS);
 }