# HG changeset patch # User Nikolas Wipper # Date 1759164988 0 # Node ID 6b0a460d27cdbd71a9e6cb191571b54715538b99 # Parent 57bda5fa146eca15680b0416e340df8426ce928f Bug 1956754 - don't flush base64 when buffer is null. r=jschanck Differential Revision: https://phabricator.services.mozilla.com/D263261 diff --git a/gtests/util_gtest/util_b64_unittest.cc b/gtests/util_gtest/util_b64_unittest.cc --- a/gtests/util_gtest/util_b64_unittest.cc +++ b/gtests/util_gtest/util_b64_unittest.cc @@ -56,16 +56,25 @@ class B64EncodeDecodeTest : public ::tes TEST_F(B64EncodeDecodeTest, DecEncTest) { TestDecodeStr("VGhpcyBpcyBOU1Mh"); } TEST_F(B64EncodeDecodeTest, EncDecTest) { uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; SECItem tmp = {siBuffer, data, sizeof(data)}; TestEncodeItem(&tmp); } +TEST_F(B64EncodeDecodeTest, IncompleteData) { + NSSBase64Decoder *context = NSSBase64Decoder_Create( + [](void *, const unsigned char *, PRInt32) { return 0; }, nullptr); + EXPECT_TRUE(!!context); + char data = 'A'; + EXPECT_EQ(SECSuccess, NSSBase64Decoder_Update(context, &data, 1)); + EXPECT_EQ(SECFailure, NSSBase64Decoder_Destroy(context, false)); +} + TEST_F(B64EncodeDecodeTest, FakeDecTest) { EXPECT_TRUE(TestFakeDecode(100)); } TEST_F(B64EncodeDecodeTest, FakeEncDecTest) { EXPECT_TRUE(TestFakeEncode(100)); } // These takes a while ... TEST_F(B64EncodeDecodeTest, DISABLED_LongFakeDecTest1) { diff --git a/lib/util/nssb64d.c b/lib/util/nssb64d.c --- a/lib/util/nssb64d.c +++ b/lib/util/nssb64d.c @@ -352,16 +352,19 @@ pl_base64_decode_flush(PLBase64Decoder * /* * If no remaining characters, or all are padding (also not well-formed * input, but again, be tolerant), then nothing more to do. (And, that * is considered successful.) */ if (data->token_size == 0 || data->token[0] == B64_PAD) return PR_SUCCESS; + if (!data->output_buffer) + return PR_FAILURE; + /* * Assume we have all the interesting input except for some expected * padding characters. Add them and decode the resulting token. */ while (data->token_size < 4) data->token[data->token_size++] = B64_PAD; data->token_size = 0; /* so a subsequent flush call is a no-op */ @@ -394,17 +397,17 @@ pl_base64_decode_flush(PLBase64Decoder * /* * The maximum space needed to hold the output of the decoder given * input data of length "size". */ static PRUint32 PL_Base64MaxDecodedLength(PRUint32 size) { - return size * 0.75; + return (((PRUint64)size) * 3) / 4; } /* * A distinct internal creation function for the buffer version to use. * (It does not want to specify an output_fn, and we want the normal * Create function to require that.) If more common initialization * of the decoding context needs to be done, it should be done *here*. */