diff options
author | Andrea Marchesini <amarchesini@mozilla.com> | 2020-07-29 10:52:30 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2020-07-29 14:28:45 +0000 |
commit | 3323a8eda3d4cbb29909f6761cee96cc5e164cf2 (patch) | |
tree | e2b69428455e26be4e48d75c99e407825b2a4f99 /xpcom/io | |
parent | 71293f0fe4db15d4e0309488337ab4669e9c55b3 (diff) | |
download | UXP-3323a8eda3d4cbb29909f6761cee96cc5e164cf2.tar UXP-3323a8eda3d4cbb29909f6761cee96cc5e164cf2.tar.gz UXP-3323a8eda3d4cbb29909f6761cee96cc5e164cf2.tar.lz UXP-3323a8eda3d4cbb29909f6761cee96cc5e164cf2.tar.xz UXP-3323a8eda3d4cbb29909f6761cee96cc5e164cf2.zip |
[xpcom] Make Base64 compatible with ReadSegments() with small buffers.
Diffstat (limited to 'xpcom/io')
-rw-r--r-- | xpcom/io/Base64.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/xpcom/io/Base64.cpp b/xpcom/io/Base64.cpp index 911c0595a..b9fa7baf8 100644 --- a/xpcom/io/Base64.cpp +++ b/xpcom/io/Base64.cpp @@ -108,30 +108,51 @@ EncodeInputStream_Encoder(nsIInputStream* aStream, EncodeInputStream_State<T>* state = static_cast<EncodeInputStream_State<T>*>(aClosure); + // We always consume all data. + *aWriteCount = aCount; + // If we have any data left from last time, encode it now. uint32_t countRemaining = aCount; const unsigned char* src = (const unsigned char*)aFromSegment; if (state->charsOnStack) { + MOZ_ASSERT(state->charsOnStack == 1 || state->charsOnStack == 2); + + // Not enough data to compose a triple. + if (state->charsOnStack == 1 && countRemaining == 1) { + state->charsOnStack = 2; + state->c[1] = src[0]; + return NS_OK; + } + + uint32_t consumed = 0; unsigned char firstSet[4]; if (state->charsOnStack == 1) { firstSet[0] = state->c[0]; firstSet[1] = src[0]; - firstSet[2] = (countRemaining > 1) ? src[1] : '\0'; + firstSet[2] = src[1]; firstSet[3] = '\0'; + consumed = 2; } else /* state->charsOnStack == 2 */ { firstSet[0] = state->c[0]; firstSet[1] = state->c[1]; firstSet[2] = src[0]; firstSet[3] = '\0'; + consumed = 1; } + Encode(firstSet, 3, state->buffer); state->buffer += 4; - countRemaining -= (3 - state->charsOnStack); - src += (3 - state->charsOnStack); + countRemaining -= consumed; + src += consumed; state->charsOnStack = 0; + + // Bail if there is nothing left. + if (!countRemaining) { + return NS_OK; + } } - // Encode the bulk of the + // Encode as many full triplets as possible. uint32_t encodeLength = countRemaining - countRemaining % 3; MOZ_ASSERT(encodeLength % 3 == 0, "Should have an exact number of triplets!"); @@ -140,9 +161,6 @@ EncodeInputStream_Encoder(nsIInputStream* aStream, src += encodeLength; countRemaining -= encodeLength; - // We must consume all data, so if there's some data left stash it - *aWriteCount = aCount; - if (countRemaining) { // We should never have a full triplet left at this point. MOZ_ASSERT(countRemaining < 3, "We should have encoded more!"); |