@@ -68,7 +68,7 @@ ScriptDecoder::ScriptDecoder(const Encoding* aEncoding,
6868template <typename Unit>
6969nsresult ScriptDecoder::DecodeRawDataHelper (
7070 JS::loader::ScriptLoadRequest* aRequest, const uint8_t * aData,
71- uint32_t aDataLength, bool aEndOfStream) {
71+ uint32_t aDataLength, bool aEndOfStream, const StringTaint& aTaint ) {
7272 CheckedInt<size_t > needed =
7373 ScriptDecoding<Unit>::MaxBufferLength (mDecoder , aDataLength);
7474 if (!needed.isValid ()) {
@@ -99,19 +99,26 @@ nsresult ScriptDecoder::DecodeRawDataHelper(
9999 MOZ_ALWAYS_TRUE (scriptText.resize (haveRead));
100100 aRequest->SetReceivedScriptTextLength (scriptText.length ());
101101
102+ // Foxhound: Append Taint
103+ // Foxhound(David): Check if this really matches the prior semantics
104+ SafeStringTaint taint (aRequest->Taint ());
105+ taint.concat (aTaint, aRequest->ReceivedScriptTextLength ());
106+ aRequest->SetReceivedScriptTaint (taint);
107+
102108 return NS_OK;
103109}
104110
105111nsresult ScriptDecoder::DecodeRawData (JS::loader::ScriptLoadRequest* aRequest,
106112 const uint8_t * aData,
107- uint32_t aDataLength, bool aEndOfStream) {
113+ uint32_t aDataLength, bool aEndOfStream,
114+ const StringTaint& aTaint) {
108115 if (aRequest->IsUTF16Text ()) {
109116 return DecodeRawDataHelper<char16_t >(aRequest, aData, aDataLength,
110- aEndOfStream);
117+ aEndOfStream, aTaint );
111118 }
112119
113120 return DecodeRawDataHelper<Utf8Unit>(aRequest, aData, aDataLength,
114- aEndOfStream);
121+ aEndOfStream, aTaint );
115122}
116123
117124ScriptLoadHandler::ScriptLoadHandler (
@@ -191,8 +198,18 @@ ScriptLoadHandler::OnIncrementalData(nsIIncrementalStreamLoader* aLoader,
191198
192199 // Decoder has already been initialized. -- trying to decode all loaded
193200 // bytes.
201+ SafeStringTaint taint (EmptyTaint);
202+ if (aTaint != nullptr ) {
203+ taint = *aTaint;
204+ }
194205 rv = mDecoder ->DecodeRawData (mRequest , aData, aDataLength,
195- /* aEndOfStream = */ false );
206+ /* aEndOfStream = */ false , taint);
207+
208+ #if (DEBUG_E2E_TAINTING)
209+ puts (__PRETTY_FUNCTION__);
210+ DumpTaint (taint);
211+ #endif
212+
196213 NS_ENSURE_SUCCESS (rv, rv);
197214
198215 // If SRI is required for this load, appending new bytes to the hash.
@@ -419,7 +436,7 @@ ScriptLoadHandler::OnStreamComplete(nsIIncrementalStreamLoader* aLoader,
419436 EnsureDecoder (aLoader, aData, aDataLength, /* aEndOfStream = */ true );
420437 MOZ_ASSERT (encoderSet);
421438 rv = mDecoder ->DecodeRawData (mRequest , aData, aDataLength,
422- /* aEndOfStream = */ true );
439+ /* aEndOfStream = */ true , *aTaint );
423440 NS_ENSURE_SUCCESS (rv, rv);
424441
425442 LOG ((" ScriptLoadRequest (%p): Source length in code units = %u" ,
0 commit comments