82 lines
2.9 KiB
Diff
82 lines
2.9 KiB
Diff
# HG changeset patch
|
|
# User Nikolas Wipper <nwipper@mozilla.com>
|
|
# 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*.
|
|
*/
|
|
|