Skip to content

Commit 637d280

Browse files
committed
CDRIVER-5734 assert length in bson_value_copy before malloc (#1740)
* add asserts before malloc * convert lens to size_t
1 parent 61d6b86 commit 637d280

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

src/libbson/src/bson/bson-value.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <bson/bson-string.h>
2020
#include <bson/bson-value.h>
2121
#include <bson/bson-oid.h>
22+
#include <bson/bson-cmp.h>
2223

2324

2425
void
@@ -35,8 +36,11 @@ bson_value_copy (const bson_value_t *src, /* IN */
3536
dst->value.v_double = src->value.v_double;
3637
break;
3738
case BSON_TYPE_UTF8:
39+
BSON_ASSERT (bson_in_range_size_t_unsigned (src->value.v_utf8.len));
40+
size_t utf8_len_sz = (size_t) src->value.v_utf8.len;
41+
BSON_ASSERT (utf8_len_sz <= SIZE_MAX - 1);
3842
dst->value.v_utf8.len = src->value.v_utf8.len;
39-
dst->value.v_utf8.str = bson_malloc (src->value.v_utf8.len + 1);
43+
dst->value.v_utf8.str = bson_malloc (utf8_len_sz + 1);
4044
memcpy (dst->value.v_utf8.str, src->value.v_utf8.str, dst->value.v_utf8.len);
4145
dst->value.v_utf8.str[dst->value.v_utf8.len] = '\0';
4246
break;
@@ -68,28 +72,40 @@ bson_value_copy (const bson_value_t *src, /* IN */
6872
dst->value.v_regex.options = bson_strdup (src->value.v_regex.options);
6973
break;
7074
case BSON_TYPE_DBPOINTER:
75+
BSON_ASSERT (bson_in_range_size_t_unsigned (src->value.v_dbpointer.collection_len));
76+
size_t dbpointer_len_sz = (size_t) src->value.v_dbpointer.collection_len;
77+
BSON_ASSERT (dbpointer_len_sz <= SIZE_MAX - 1);
7178
dst->value.v_dbpointer.collection_len = src->value.v_dbpointer.collection_len;
72-
dst->value.v_dbpointer.collection = bson_malloc (src->value.v_dbpointer.collection_len + 1);
79+
dst->value.v_dbpointer.collection = bson_malloc (dbpointer_len_sz + 1);
7380
memcpy (
7481
dst->value.v_dbpointer.collection, src->value.v_dbpointer.collection, dst->value.v_dbpointer.collection_len);
7582
dst->value.v_dbpointer.collection[dst->value.v_dbpointer.collection_len] = '\0';
7683
bson_oid_copy (&src->value.v_dbpointer.oid, &dst->value.v_dbpointer.oid);
7784
break;
7885
case BSON_TYPE_CODE:
86+
BSON_ASSERT (bson_in_range_size_t_unsigned (src->value.v_code.code_len));
87+
size_t code_len_sz = (size_t) src->value.v_code.code_len;
88+
BSON_ASSERT (code_len_sz <= SIZE_MAX - 1);
7989
dst->value.v_code.code_len = src->value.v_code.code_len;
80-
dst->value.v_code.code = bson_malloc (src->value.v_code.code_len + 1);
90+
dst->value.v_code.code = bson_malloc (code_len_sz + 1);
8191
memcpy (dst->value.v_code.code, src->value.v_code.code, dst->value.v_code.code_len);
8292
dst->value.v_code.code[dst->value.v_code.code_len] = '\0';
8393
break;
8494
case BSON_TYPE_SYMBOL:
95+
BSON_ASSERT (bson_in_range_size_t_unsigned (src->value.v_symbol.len));
96+
size_t symbol_len_sz = (size_t) src->value.v_symbol.len;
97+
BSON_ASSERT (symbol_len_sz <= SIZE_MAX - 1);
8598
dst->value.v_symbol.len = src->value.v_symbol.len;
86-
dst->value.v_symbol.symbol = bson_malloc (src->value.v_symbol.len + 1);
99+
dst->value.v_symbol.symbol = bson_malloc (symbol_len_sz + 1);
87100
memcpy (dst->value.v_symbol.symbol, src->value.v_symbol.symbol, dst->value.v_symbol.len);
88101
dst->value.v_symbol.symbol[dst->value.v_symbol.len] = '\0';
89102
break;
90103
case BSON_TYPE_CODEWSCOPE:
104+
BSON_ASSERT (bson_in_range_size_t_unsigned (src->value.v_codewscope.code_len));
105+
size_t codewscope_len_sz = (size_t) src->value.v_codewscope.code_len;
106+
BSON_ASSERT (codewscope_len_sz <= SIZE_MAX - 1);
91107
dst->value.v_codewscope.code_len = src->value.v_codewscope.code_len;
92-
dst->value.v_codewscope.code = bson_malloc (src->value.v_codewscope.code_len + 1);
108+
dst->value.v_codewscope.code = bson_malloc (codewscope_len_sz + 1);
93109
memcpy (dst->value.v_codewscope.code, src->value.v_codewscope.code, dst->value.v_codewscope.code_len);
94110
dst->value.v_codewscope.code[dst->value.v_codewscope.code_len] = '\0';
95111
dst->value.v_codewscope.scope_len = src->value.v_codewscope.scope_len;

0 commit comments

Comments
 (0)