]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: Make sure memcpy() isn't called with NULL parameters
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sat, 14 Jan 2023 22:42:39 +0000 (00:42 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 1 Feb 2023 11:02:50 +0000 (11:02 +0000)
Add an explicit if-check to make sure neither destination nor source pointer
parameter is NULL, since it's undefined behavior and can lead to crashes
with current compilers.

Currently this code isn't known to have caused issues.

15 files changed:
src/lib-fs/fs-api.c
src/lib-sql/driver-cassandra.c
src/lib-storage/index/dbox-multi/mdbox-map.c
src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib/buffer.c
src/lib/hmac.c
src/lib/istream-concat.c
src/lib/istream.c
src/lib/md4.c
src/lib/md5.c
src/lib/mempool-alloconly.c
src/lib/mempool-datastack.c
src/lib/mempool-unsafe-datastack.c
src/lib/sha2.c

index 09a74399866b686f013f56957f7cd4bec4fabe03..4c869625ac7c258eaba263225f7985b076780d3e 100644 (file)
@@ -689,7 +689,8 @@ ssize_t fs_read_via_stream(struct fs_file *file, void *buf, size_t size)
                             i_stream_get_error(file->pending_read_input));
        } else {
                ret = I_MIN(size, data_size);
-               memcpy(buf, data, ret);
+               if (ret > 0)
+                       memcpy(buf, data, ret);
        }
        i_stream_unref(&file->pending_read_input);
        return ret;
index 46b5d539c65dba74f6834a7ad8ff16bd03917a1b..e48914c5c626f6f8776cfa79e0b861b302515a30 100644 (file)
@@ -1752,7 +1752,8 @@ driver_cassandra_get_value(struct cassandra_result *result,
                return -1;
        }
        output_dup = p_malloc(result->row_pool, output_size + 1);
-       memcpy(output_dup, output, output_size);
+       if (output_size > 0)
+               memcpy(output_dup, output, output_size);
        *str_r = output_dup;
        *len_r = output_size;
        return 0;
index 978223e64d45cd8de71869b6da0330d7edbb6ae9..309a17ba07c25d813095a79bc9be62ed5ae4d950 100644 (file)
@@ -264,7 +264,8 @@ mdbox_map_get_ext_hdr(struct mdbox_map *map, struct mail_index_view *view,
 
        mail_index_get_header_ext(view, map->map_ext_id, &data, &data_size);
        i_zero(hdr_r);
-       memcpy(hdr_r, data, I_MIN(data_size, sizeof(*hdr_r)));
+       if (data_size > 0)
+               memcpy(hdr_r, data, I_MIN(data_size, sizeof(*hdr_r)));
 }
 
 uint32_t mdbox_map_get_rebuild_count(struct mdbox_map *map)
index 3db6be2ff7ce53438f0baa4500d9811ba40fe663..b69125f7c588251598df3194a3a9535e58cf6c27 100644 (file)
@@ -495,7 +495,8 @@ mdbox_rebuild_get_header(struct mail_index_view *view, uint32_t hdr_ext_id,
 
        mail_index_get_header_ext(view, hdr_ext_id, &data, &data_size);
        i_zero(hdr_r);
-       memcpy(hdr_r, data, I_MIN(data_size, sizeof(*hdr_r)));
+       if (data_size > 0)
+               memcpy(hdr_r, data, I_MIN(data_size, sizeof(*hdr_r)));
        *need_resize_r = data_size < sizeof(*hdr_r);
 }
 
@@ -928,8 +929,10 @@ mdbox_storage_rebuild_scan_prepare(struct mdbox_storage_rebuild_context *ctx)
                                  ctx->storage->map->map_ext_id,
                                  &data, &data_size);
        i_zero(&ctx->orig_map_hdr);
-       memcpy(&ctx->orig_map_hdr, data,
-              I_MIN(data_size, sizeof(ctx->orig_map_hdr)));
+       if (data_size > 0) {
+               memcpy(&ctx->orig_map_hdr, data,
+                      I_MIN(data_size, sizeof(ctx->orig_map_hdr)));
+       }
        ctx->highest_file_id = ctx->orig_map_hdr.highest_file_id;
 
        /* get storage rebuild counter after locking */
index 219873ef234a515c66795bac6e99428bae7fad3d..cfa439549dc7007300ad3cec784941ad837cdf31 100644 (file)
@@ -164,7 +164,8 @@ int sdbox_read_header(struct sdbox_mailbox *mbox,
                ret = -1;
        } else {
                i_zero(hdr);
-               memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
+               if (data_size > 0)
+                       memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
                if (guid_128_is_empty(hdr->mailbox_guid))
                        ret = -1;
                else {
index 91123de15bbb3d69f8b8095f16edbf89e4db8fe0..a6d8fef03e68a9d5e8b5a8e7b470d093ee3c12b5 100644 (file)
@@ -253,7 +253,7 @@ void buffer_insert(buffer_t *_buf, size_t pos,
 
        if (pos >= buf->used)
                buffer_write(_buf, pos, data, data_size);
-       else {
+       else if (data_size > 0) {
                buffer_copy(_buf, pos + data_size, _buf, pos, SIZE_MAX);
                memcpy(buf->w_buffer + pos, data, data_size);
        }
index 0138a4a61a43d40331fd302cd74eb9d5deba5ab2..eb2436a8763c2f3c9fd308926a5d96840f911875 100644 (file)
@@ -35,7 +35,8 @@ void hmac_init(struct hmac_context *_ctx, const unsigned char *key,
                key_len = meth->digest_size;
        }
 
-       memcpy(k_ipad, key, key_len);
+       if (key_len > 0)
+               memcpy(k_ipad, key, key_len);
        memset(k_ipad + key_len, 0, meth->block_size - key_len);
        memcpy(k_opad, k_ipad, meth->block_size);
 
index 4c58b8653f9fb3434d379b490d3e358f3345783b..253edd6f6027eb999fe325238056b92cf63de006 100644 (file)
@@ -108,8 +108,10 @@ static void i_stream_concat_read_next(struct concat_istream *cstream)
        }
 
        cstream->prev_stream_left = data_size;
-       memcpy(cstream->istream.w_buffer, data, data_size);
-       i_stream_skip(prev_input, data_size);
+       if (data_size > 0) {
+               memcpy(cstream->istream.w_buffer, data, data_size);
+               i_stream_skip(prev_input, data_size);
+       }
        cstream->istream.skip = 0;
        cstream->istream.pos = data_size;
 }
index 435589a7540b80eefc07502dd21ecfb53dfbeef3..5fabe1e3f4ed400280b913709876ced0d4c10b19 100644 (file)
@@ -987,6 +987,8 @@ bool i_stream_add_data(struct istream *_stream, const unsigned char *data,
        struct istream_private *stream = _stream->real_stream;
        size_t size2;
 
+       if (size == 0)
+               return TRUE;
        (void)i_stream_try_alloc(stream, size, &size2);
        if (size > size2)
                return FALSE;
index 06e3231bde091aae8831d06f6a619da056835c34..06082f53c7484b4fdb198d7954698ac7e03ca813 100644 (file)
@@ -181,6 +181,9 @@ void md4_update(struct md4_context *ctx, const void *data, size_t size)
        uint_fast32_t saved_lo;
        unsigned long used, free;
 
+       if (size == 0)
+               return;
+
        saved_lo = ctx->lo;
        if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
                ctx->hi++;
index 6b5da6c307df32b9db28f0ee19405a7daa69481e..46cffb6d123e53b0680bb956d1b7e926d0b2b9f8 100644 (file)
@@ -195,6 +195,9 @@ md5_update(struct md5_context *ctx, const void *data, size_t size)
        uint_fast32_t saved_lo;
        unsigned long used, free;
 
+       if (size == 0)
+               return;
+
        saved_lo = ctx->lo;
        if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
                ctx->hi++;
index 42b9ff2fa2b48c85ff19b7583aaf6943f5818e4b..a9e8cd701a3593ae6ec07e6534e42e96a52c4df9 100644 (file)
@@ -475,7 +475,8 @@ static void *pool_alloconly_realloc(pool_t pool, void *mem,
        if (!pool_alloconly_try_grow(apool, mem, new_size)) {
                /* slow way - allocate + copy */
                new_mem = pool_alloconly_malloc(pool, new_size);
-               memcpy(new_mem, mem, old_size);
+               if (old_size > 0)
+                       memcpy(new_mem, mem, old_size);
                mem = new_mem;
        }
 
index b3c1094bf0321f72784fd34c33c51de1d9073fc2..6905f9592e17d32fcd8128802014f9bfad801229 100644 (file)
@@ -171,7 +171,8 @@ static void *pool_data_stack_realloc(pool_t pool, void *mem,
 
        if (!t_try_realloc(mem, new_size)) {
                new_mem = t_malloc_no0(new_size);
-               memcpy(new_mem, mem, old_size);
+               if (old_size > 0)
+                       memcpy(new_mem, mem, old_size);
                mem = new_mem;
        }
 
index 2f2751ddc8d056d766c05aa4f7b82ee1eb842221..394fdeb6a18fbf5ad77b3665e1d12023011916b4 100644 (file)
@@ -116,7 +116,8 @@ static void *pool_unsafe_data_stack_realloc(pool_t pool ATTR_UNUSED,
 
        if (!t_try_realloc(mem, new_size)) {
                new_mem = t_malloc_no0(new_size);
-               memcpy(new_mem, mem, old_size);
+               if (old_size > 0)
+                       memcpy(new_mem, mem, old_size);
                mem = new_mem;
        }
 
index 93dddfbb397bbe424173ce778ab34b3b827efbd9..552ac24e7680472d00487bdbe0b6c50b498f5e45 100644 (file)
@@ -257,6 +257,9 @@ void sha256_loop(struct sha256_ctx *ctx, const void *data,
        size_t block_nb;
        size_t new_len, rem_len, tmp_len;
 
+       if (len == 0)
+               return;
+
        tmp_len = SHA256_BLOCK_SIZE - ctx->len;
        rem_len = len < tmp_len ? len : tmp_len;
 
@@ -384,6 +387,9 @@ void sha384_loop(struct sha384_ctx *ctx, const void *data,
        size_t block_nb;
        size_t new_len, rem_len, tmp_len;
 
+       if (len == 0)
+               return;
+
        tmp_len = SHA384_BLOCK_SIZE - ctx->len;
        rem_len = len < tmp_len ? len : tmp_len;
 
@@ -511,6 +517,9 @@ void sha512_loop(struct sha512_ctx *ctx, const void *data,
        size_t block_nb;
        size_t new_len, rem_len, tmp_len;
 
+       if (len == 0)
+               return;
+
        tmp_len = SHA512_BLOCK_SIZE - ctx->len;
        rem_len = len < tmp_len ? len : tmp_len;