Skip to content

Commit 56bad1f

Browse files
authored
MONGOCRYPT-891 fix check in KMIP parser (#1142)
1 parent 2b1ea0b commit 56bad1f

3 files changed

Lines changed: 27 additions & 0 deletions

File tree

kms-message/src/kms_kmip_reader_writer.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ kmip_reader_find (kmip_reader_t *reader,
451451
if (read_tag == search_tag && read_type == type) {
452452
*pos = reader->pos;
453453
*length = read_length;
454+
CHECK_REMAINING_BUFFER_AND_RET (compute_padded_length(read_length));
454455
return true;
455456
}
456457

@@ -477,6 +478,10 @@ kmip_reader_find_and_recurse (kmip_reader_t *reader, kmip_tag_type_t tag)
477478
}
478479

479480
reader->pos = 0;
481+
482+
if (pos + compute_padded_length (length) > reader->len) {
483+
return false;
484+
}
480485
reader->ptr = reader->ptr + pos;
481486
reader->len = length;
482487
return true;

kms-message/test/test_kmip_reader_writer.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,26 @@ kms_kmip_reader_find_and_recurse_test (void)
443443
free (data);
444444
}
445445

446+
void kms_kmip_reader_find_and_recurse_invalid_test (void); // -Wmissing-prototypes: for testing only.
447+
void
448+
kms_kmip_reader_find_and_recurse_invalid_test (void)
449+
{
450+
uint8_t *data;
451+
size_t datalen;
452+
kmip_reader_t *reader;
453+
454+
// Structure with overly large length:
455+
data = hex_to_data (
456+
"42 00 20 | 01 | 00 00 00 FF", // Struct with bad length
457+
&datalen);
458+
459+
reader = kmip_reader_new (data, datalen);
460+
// Expect error:
461+
ASSERT (!kmip_reader_find_and_recurse (reader, KMIP_TAG_CompromiseDate));
462+
kmip_reader_destroy (reader);
463+
free (data);
464+
}
465+
446466
void kms_kmip_reader_find_and_read_enum_test (void); // -Wmissing-prototypes: for testing only.
447467
void
448468
kms_kmip_reader_find_and_read_enum_test (void)

kms-message/test/test_kms_request.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,7 @@ extern void kms_kmip_reader_test (void);
12161216
extern void kms_kmip_reader_negative_int_test (void);
12171217
extern void kms_kmip_reader_find_test (void);
12181218
extern void kms_kmip_reader_find_and_recurse_test (void);
1219+
extern void kms_kmip_reader_find_and_recurse_invalid_test (void);
12191220
extern void kms_kmip_reader_find_and_read_enum_test (void);
12201221
extern void kms_kmip_reader_find_and_read_bytes_test (void);
12211222
extern void kms_kmip_request_register_secretdata_test (void);
@@ -1280,6 +1281,7 @@ main (int argc, char *argv[])
12801281
RUN_TEST (kms_kmip_reader_negative_int_test);
12811282
RUN_TEST (kms_kmip_reader_test);
12821283
RUN_TEST (kms_kmip_reader_find_and_recurse_test);
1284+
RUN_TEST (kms_kmip_reader_find_and_recurse_invalid_test);
12831285
RUN_TEST (kms_kmip_reader_find_and_read_enum_test);
12841286
RUN_TEST (kms_kmip_reader_find_and_read_bytes_test);
12851287
RUN_TEST (kms_kmip_request_register_secretdata_test);

0 commit comments

Comments
 (0)