diff --git a/intl/strres/src/nsStringBundle.cpp b/intl/strres/src/nsStringBundle.cpp index 5a7a50f7be76..53cb270fff1a 100644 --- a/intl/strres/src/nsStringBundle.cpp +++ b/intl/strres/src/nsStringBundle.cpp @@ -24,6 +24,8 @@ #include "nsIComponentManager.h" #include "nsIMemory.h" #include "nsIObserverService.h" +#include "pratom.h" +#include "prmem.h" #include "nsCOMArray.h" #include "nsTextFormatter.h" #include "nsIErrorService.h" diff --git a/netwerk/base/src/nsSerializationHelper.cpp b/netwerk/base/src/nsSerializationHelper.cpp index 146ee99188b2..82ff90bf420e 100644 --- a/netwerk/base/src/nsSerializationHelper.cpp +++ b/netwerk/base/src/nsSerializationHelper.cpp @@ -4,8 +4,9 @@ #include "nsSerializationHelper.h" +#include "plbase64.h" +#include "prmem.h" -#include "mozilla/Base64.h" #include "nsISerializable.h" #include "nsIObjectOutputStream.h" #include "nsIObjectInputStream.h" @@ -15,8 +16,6 @@ #include "nsComponentManagerUtils.h" #include "nsStringStream.h" -using namespace mozilla; - nsresult NS_SerializeToString(nsISerializable* obj, nsCSubstring& str) { @@ -39,12 +38,30 @@ NS_SerializeToString(nsISerializable* obj, nsCSubstring& str) nsresult NS_DeserializeObject(const nsCSubstring& str, nsISupports** obj) { - nsCString decodedData; - nsresult rv = Base64Decode(str, decodedData); - NS_ENSURE_SUCCESS(rv, rv); + // Base64 maps 3 binary bytes -> 4 ASCII bytes. If the original byte array + // does not have length 0 mod 3, the input is padded with zeros and the + // output is padded with a corresponding number of trailing '=' (which are + // then sometimes dropped). To compute the correct length of the original + // byte array, we have to subtract the number of trailing '=' and then + // multiply by 3 and then divide by 4 (making sure this is an integer + // division). + uint32_t size = str.Length(); + if (size > 0 && str[size-1] == '=') { + if (size > 1 && str[size-2] == '=') { + size -= 2; + } else { + size -= 1; + } + } + size = (size * 3) / 4; + char* buf = PL_Base64Decode(str.BeginReading(), str.Length(), nullptr); + if (!buf) + return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr stream; - rv = NS_NewCStringInputStream(getter_AddRefs(stream), decodedData); + nsresult rv = NS_NewCStringInputStream(getter_AddRefs(stream), + Substring(buf, size)); + PR_Free(buf); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr objstream = diff --git a/netwerk/base/src/nsSocketTransport2.cpp b/netwerk/base/src/nsSocketTransport2.cpp index a348eb59b117..8e0b45efa7be 100644 --- a/netwerk/base/src/nsSocketTransport2.cpp +++ b/netwerk/base/src/nsSocketTransport2.cpp @@ -19,6 +19,7 @@ #include "nsAutoPtr.h" #include "nsCOMPtr.h" #include "netCore.h" +#include "prmem.h" #include "plstr.h" #include "prnetdb.h" #include "prerror.h" diff --git a/netwerk/cache/nsCacheMetaData.cpp b/netwerk/cache/nsCacheMetaData.cpp index d7dc37a32e7e..929117e8473d 100644 --- a/netwerk/cache/nsCacheMetaData.cpp +++ b/netwerk/cache/nsCacheMetaData.cpp @@ -6,6 +6,7 @@ #include "nsCacheMetaData.h" #include "nsICacheEntryDescriptor.h" +#include "prmem.h" const char * nsCacheMetaData::GetElement(const char * key) @@ -151,7 +152,7 @@ nsresult nsCacheMetaData::EnsureBuffer(uint32_t bufSize) { if (mBufferSize < bufSize) { - char * buf = (char *)moz_realloc(mBuffer, bufSize); + char * buf = (char *)PR_REALLOC(mBuffer, bufSize); if (!buf) { return NS_ERROR_OUT_OF_MEMORY; } diff --git a/netwerk/cache/nsCacheMetaData.h b/netwerk/cache/nsCacheMetaData.h index e0879c1473f2..6bd7b995d2e6 100644 --- a/netwerk/cache/nsCacheMetaData.h +++ b/netwerk/cache/nsCacheMetaData.h @@ -18,8 +18,7 @@ public: ~nsCacheMetaData() { mBufferSize = mMetaSize = 0; - moz_free(mBuffer); - mBuffer = nullptr; + PR_FREEIF(mBuffer); } const char * GetElement(const char * key); diff --git a/netwerk/protocol/data/nsDataChannel.cpp b/netwerk/protocol/data/nsDataChannel.cpp index 9a68c7f27af2..2699b787fe49 100644 --- a/netwerk/protocol/data/nsDataChannel.cpp +++ b/netwerk/protocol/data/nsDataChannel.cpp @@ -5,10 +5,8 @@ // data implementation -#include "nsDataChannel.h" - -#include "mozilla/Base64.h" #include "nsIOService.h" +#include "nsDataChannel.h" #include "nsDataHandler.h" #include "nsNetUtil.h" #include "nsIPipe.h" @@ -16,8 +14,9 @@ #include "nsIOutputStream.h" #include "nsReadableUtils.h" #include "nsEscape.h" - -using namespace mozilla; +#include "plbase64.h" +#include "plstr.h" +#include "prmem.h" nsresult nsDataChannel::OpenContentStream(bool async, nsIInputStream **result, @@ -71,10 +70,17 @@ nsDataChannel::OpenContentStream(bool async, nsIInputStream **result, } resultLen = ((resultLen * 3) / 4); - nsAutoCString decodedData; - rv = Base64Decode(dataBuffer, decodedData); - NS_ENSURE_SUCCESS(rv, rv); - rv = bufOutStream->Write(decodedData.get(), resultLen, &contentLen); + // XXX PL_Base64Decode will return a null pointer for decoding + // errors. Since those are more likely than out-of-memory, + // should we return NS_ERROR_MALFORMED_URI instead? + char * decodedData = PL_Base64Decode(dataBuffer.get(), dataLen, nullptr); + if (!decodedData) { + return NS_ERROR_OUT_OF_MEMORY; + } + + rv = bufOutStream->Write(decodedData, resultLen, &contentLen); + + PR_Free(decodedData); } else { rv = bufOutStream->Write(dataBuffer.get(), dataBuffer.Length(), &contentLen); }