mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 21:35:39 +00:00
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:
parent
7b3894d480
commit
465336e99f
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user