19
19
#include <bson/bson-string.h>
20
20
#include <bson/bson-value.h>
21
21
#include <bson/bson-oid.h>
22
+ #include <bson/bson-cmp.h>
22
23
23
24
24
25
void
@@ -35,8 +36,11 @@ bson_value_copy (const bson_value_t *src, /* IN */
35
36
dst -> value .v_double = src -> value .v_double ;
36
37
break ;
37
38
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 );
38
42
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 );
40
44
memcpy (dst -> value .v_utf8 .str , src -> value .v_utf8 .str , dst -> value .v_utf8 .len );
41
45
dst -> value .v_utf8 .str [dst -> value .v_utf8 .len ] = '\0' ;
42
46
break ;
@@ -68,28 +72,40 @@ bson_value_copy (const bson_value_t *src, /* IN */
68
72
dst -> value .v_regex .options = bson_strdup (src -> value .v_regex .options );
69
73
break ;
70
74
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 );
71
78
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 );
73
80
memcpy (
74
81
dst -> value .v_dbpointer .collection , src -> value .v_dbpointer .collection , dst -> value .v_dbpointer .collection_len );
75
82
dst -> value .v_dbpointer .collection [dst -> value .v_dbpointer .collection_len ] = '\0' ;
76
83
bson_oid_copy (& src -> value .v_dbpointer .oid , & dst -> value .v_dbpointer .oid );
77
84
break ;
78
85
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 );
79
89
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 );
81
91
memcpy (dst -> value .v_code .code , src -> value .v_code .code , dst -> value .v_code .code_len );
82
92
dst -> value .v_code .code [dst -> value .v_code .code_len ] = '\0' ;
83
93
break ;
84
94
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 );
85
98
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 );
87
100
memcpy (dst -> value .v_symbol .symbol , src -> value .v_symbol .symbol , dst -> value .v_symbol .len );
88
101
dst -> value .v_symbol .symbol [dst -> value .v_symbol .len ] = '\0' ;
89
102
break ;
90
103
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 );
91
107
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 );
93
109
memcpy (dst -> value .v_codewscope .code , src -> value .v_codewscope .code , dst -> value .v_codewscope .code_len );
94
110
dst -> value .v_codewscope .code [dst -> value .v_codewscope .code_len ] = '\0' ;
95
111
dst -> value .v_codewscope .scope_len = src -> value .v_codewscope .scope_len ;
0 commit comments