summaryrefslogtreecommitdiffstats
path: root/dom/base/IDTracker.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:13:27 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:13:27 +0000
commit40a355a42d4a9444dc753c04c6608dade2f06a23 (patch)
tree871fc667d2de662f171103ce5ec067014ef85e61 /dom/base/IDTracker.cpp
parentAdding upstream version 124.0.1. (diff)
downloadfirefox-adbda400be353e676059e335c3c0aaf99e719475.tar.xz
firefox-adbda400be353e676059e335c3c0aaf99e719475.zip
Adding upstream version 125.0.1.upstream/125.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/base/IDTracker.cpp')
-rw-r--r--dom/base/IDTracker.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/dom/base/IDTracker.cpp b/dom/base/IDTracker.cpp
index 4db592534d..813aa44e11 100644
--- a/dom/base/IDTracker.cpp
+++ b/dom/base/IDTracker.cpp
@@ -132,13 +132,30 @@ void IDTracker::ResetWithLocalRef(Element& aFrom, const nsAString& aLocalRef,
bool aWatch) {
MOZ_ASSERT(nsContentUtils::IsLocalRefURL(aLocalRef));
- nsAutoCString ref;
- if (!AppendUTF16toUTF8(Substring(aLocalRef, 1), ref, mozilla::fallible)) {
+ auto ref = Substring(aLocalRef, 1);
+ if (ref.IsEmpty()) {
Unlink();
return;
}
- NS_UnescapeURL(ref);
- RefPtr<nsAtom> idAtom = NS_Atomize(ref);
+
+ nsAutoCString utf8Ref;
+ if (!AppendUTF16toUTF8(ref, utf8Ref, mozilla::fallible)) {
+ Unlink();
+ return;
+ }
+
+ // Only unescape ASCII characters; if we were to unescape arbitrary bytes,
+ // we'd potentially end up with invalid UTF-8.
+ nsAutoCString unescaped;
+ bool appended;
+ if (NS_FAILED(NS_UnescapeURL(utf8Ref.BeginReading(), utf8Ref.Length(),
+ esc_OnlyASCII | esc_AlwaysCopy, unescaped,
+ appended, mozilla::fallible))) {
+ Unlink();
+ return;
+ }
+
+ RefPtr<nsAtom> idAtom = NS_Atomize(unescaped);
ResetWithID(aFrom, idAtom, aWatch);
}