Bug 1333899 - Part 1: Add a fallible NS_UnescapeURL. r=froydnj

This adds a fallible version of |NS_UnescapeURL| that can be used to
gracefully handle allocation failures when the string needs to be unescaped.

--HG--
extra : rebase_source : 8d10ca98fb372afe8219d744b147703254e02830
This commit is contained in:
Eric Rahm 2018-02-02 10:42:42 -08:00
parent 7b3894d480
commit 465336e99f
2 changed files with 48 additions and 7 deletions

View File

@ -528,10 +528,25 @@ NS_EscapeURL(const nsString& aStr, const nsTArray<char16_t>& aForbidden,
bool
NS_UnescapeURL(const char* aStr, int32_t aLen, uint32_t aFlags,
nsACString& aResult)
{
bool didAppend = false;
nsresult rv = NS_UnescapeURL(aStr, aLen, aFlags, aResult, didAppend,
mozilla::fallible);
if (rv == NS_ERROR_OUT_OF_MEMORY) {
::NS_ABORT_OOM(aLen * sizeof(nsACString::char_type));
}
return didAppend;
}
nsresult
NS_UnescapeURL(const char* aStr, int32_t aLen, uint32_t aFlags,
nsACString& aResult, bool& aDidAppend,
const mozilla::fallible_t&)
{
if (!aStr) {
NS_NOTREACHED("null pointer");
return false;
return NS_ERROR_INVALID_ARG;
}
MOZ_ASSERT(aResult.IsEmpty(),
@ -548,7 +563,9 @@ NS_UnescapeURL(const char* aStr, int32_t aLen, uint32_t aFlags,
bool skipInvalidHostChar = !!(aFlags & esc_Host);
if (writing) {
aResult.SetCapacity(aLen);
if (!aResult.SetCapacity(aLen, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
}
const char* last = aStr;
@ -566,13 +583,19 @@ NS_UnescapeURL(const char* aStr, int32_t aLen, uint32_t aFlags,
(c1 < '2' || (c1 == '7' && (c2 == 'f' || c2 == 'F'))))) {
if (!writing) {
writing = true;
aResult.SetCapacity(aLen);
if (!aResult.SetCapacity(aLen, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
}
if (p > last) {
aResult.Append(last, p - last);
if (!aResult.Append(last, p - last, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
last = p;
}
aResult.Append(u);
if (!aResult.Append(u, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
i += 2;
p += 2;
last += 3;
@ -580,8 +603,11 @@ NS_UnescapeURL(const char* aStr, int32_t aLen, uint32_t aFlags,
}
}
if (writing && last < aStr + aLen) {
aResult.Append(last, aStr + aLen - last);
if (!aResult.Append(last, aStr + aLen - last, mozilla::fallible)) {
return NS_ERROR_OUT_OF_MEMORY;
}
}
return writing;
aDidAppend = writing;
return NS_OK;
}

View File

@ -137,6 +137,20 @@ bool NS_UnescapeURL(const char* aStr,
uint32_t aFlags,
nsACString& aResult);
/**
* Fallible version of |NS_UnescapeURL|. See above for details.
*
* @param aAppended Out param: true if aResult was written to (i.e. at least
* one character was unescaped or esc_AlwaysCopy was
* requested), false otherwise.
*/
nsresult NS_UnescapeURL(const char* aStr,
int32_t aLen,
uint32_t aFlags,
nsACString& aResult,
bool& aAppended,
const mozilla::fallible_t&);
/** returns resultant string length **/
inline int32_t
NS_UnescapeURL(char* aStr)
@ -185,6 +199,7 @@ NS_UnescapeURL(const nsACString& aStr, uint32_t aFlags, nsACString& aResult)
}
return aStr;
}
const nsAString&
NS_EscapeURL(const nsAString& aStr, uint32_t aFlags, nsAString& aResult);