Skip to content

Commit 7ce4d26

Browse files
committed
Initialize optional fields' discriminant when none in deserializer
1 parent 5727630 commit 7ce4d26

1 file changed

Lines changed: 44 additions & 6 deletions

File tree

libs/pdf/src/deserialize.c

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "deserialize.h"
22

3+
#include <stdint.h>
34
#include <string.h>
45

56
#include "arena/arena.h"
@@ -388,6 +389,14 @@ PdfError* pdf_deserialize_optional_field(
388389
);
389390
}
390391

392+
static void
393+
pdf_optional_field_none(void* field_ptr, PdfOptionalFieldData field_data) {
394+
RELEASE_ASSERT(field_ptr);
395+
396+
void* discriminant_ptr = (char*)field_ptr + field_data.discriminant_offset;
397+
*(bool*)discriminant_ptr = false;
398+
}
399+
391400
PdfError* pdf_deserialize_object(
392401
void* target,
393402
const PdfObject* object,
@@ -488,12 +497,19 @@ PdfError* pdf_deserialize_object(
488497
break;
489498
}
490499

491-
if (!found && field->info.kind != PDF_FIELD_KIND_OPTIONAL) {
492-
return PDF_ERROR(
493-
PDF_ERR_MISSING_DICT_KEY,
494-
"Missing key `%s`",
495-
field->key
496-
);
500+
if (!found) {
501+
if (field->info.kind == PDF_FIELD_KIND_OPTIONAL) {
502+
pdf_optional_field_none(
503+
(char*)target + field->offset,
504+
field->info.data.optional
505+
);
506+
} else {
507+
return PDF_ERROR(
508+
PDF_ERR_MISSING_DICT_KEY,
509+
"Missing key `%s`",
510+
field->key
511+
);
512+
}
497513
}
498514
}
499515

@@ -992,6 +1008,28 @@ TEST_FUNC(test_deserialize_inline_optional) {
9921008
return TEST_RESULT_PASS;
9931009
}
9941010

1011+
TEST_FUNC(test_deserialize_inline_optional_none) {
1012+
Arena* arena = arena_new(1024);
1013+
const char* objects[] = {"<< >>"};
1014+
1015+
char* buffer =
1016+
pdf_construct_deserde_test_doc(objects, 1, "<< /Size 2 >>", arena);
1017+
1018+
DESERIALIZER_TEST_HELPER();
1019+
1020+
TestDeserializeInlineOptional deserialized = {.inner.discriminant = true};
1021+
TEST_PDF_REQUIRE(deserialize_test_inline_optional(
1022+
&object,
1023+
arena,
1024+
pdf_op_resolver_some(resolver),
1025+
&deserialized
1026+
));
1027+
1028+
TEST_ASSERT(!deserialized.inner.discriminant);
1029+
1030+
return TEST_RESULT_PASS;
1031+
}
1032+
9951033
DESERIALIZABLE_ARRAY_TYPE(DeserializeTestStringArray)
9961034
DESERIALIZABLE_ARRAY_TYPE(DeserializeTestIntegerArray)
9971035

0 commit comments

Comments
 (0)