diff --git a/crypto/packet.c b/crypto/packet.c index 661b59e84217acfd98bed7b2d9c4f1bab3114bec..6db97a5434444369d89db1a0f07e3f29dfd2cbdd 100644 --- a/crypto/packet.c +++ b/crypto/packet.c @@ -265,7 +265,10 @@ static int wpacket_intern_close(WPACKET *pkt, WPACKET_SUB *sub, int doclose) && !put_value(&buf[sub->packet_len], packlen, sub->lenbytes)) return 0; - } else if (pkt->endfirst && sub->parent != NULL) { + } else if (pkt->endfirst && sub->parent != NULL + && (packlen != 0 + || (sub->flags + & WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH) == 0)) { size_t tmplen = packlen; size_t numlenbytes = 1; diff --git a/test/wpackettest.c b/test/wpackettest.c index 08b5f976ca22592a93237a70639f9473f19ab1d8..b03dfcd2e04e42546b5ee62a1c722277c5f47b60 100644 --- a/test/wpackettest.c +++ b/test/wpackettest.c @@ -360,6 +360,8 @@ static int test_WPACKET_init_der(void) unsigned char testdata[] = { 0x00, 0x01, 0x02, 0x03 }; unsigned char testdata2[259] = { 0x82, 0x01, 0x00 }; size_t written[2]; + size_t size1, size2; + int flags = WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH; int i; /* Test initialising for writing DER */ @@ -370,6 +372,13 @@ static int test_WPACKET_init_der(void) || !TEST_true(WPACKET_memcpy(&pkt, testdata, sizeof(testdata))) || !TEST_true(WPACKET_close(&pkt)) || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xfc)) + /* this sub-packet is empty, and should render zero bytes */ + || (!TEST_true(WPACKET_start_sub_packet(&pkt)) + || !TEST_true(WPACKET_set_flags(&pkt, flags)) + || !TEST_true(WPACKET_get_total_written(&pkt, &size1)) + || !TEST_true(WPACKET_close(&pkt)) + || !TEST_true(WPACKET_get_total_written(&pkt, &size2)) + || !TEST_size_t_eq(size1, size2)) || !TEST_true(WPACKET_finish(&pkt)) || !TEST_true(WPACKET_get_total_written(&pkt, &written[0])) || !TEST_mem_eq(WPACKET_get_curr(&pkt), written[0], simpleder,