Commits:
-
a87825b0
by Kershaw Chang at 2024-05-10T22:07:35+00:00
Bug 1870579 - Use PK11_GenerateRandom to generate random number, r=necko-reviewers,valentin
Differential Revision: https://phabricator.services.mozilla.com/D204755
-
f98bc25e
by Kershaw Chang at 2024-05-10T22:07:35+00:00
Bug 1892449 - Set network.http.digest_auth_cnonce_length to 16, a=dmeehan
Apparently, setting this value to 64 breaks some sites. We should use the same length as Chrome.
Original Revision: https://phabricator.services.mozilla.com/D208103
Differential Revision: https://phabricator.services.mozilla.com/D208119
-
e1f9025e
by Nika Layzell at 2024-05-10T22:07:35+00:00
Bug 1875248 - Check for network error preventing ExternalHelperAppService before DONT_RETARGET, r=smaug
This reverts the change from 30cde47f9364e5c7da78fd08fa8ab21737d22399,
and instead re-orders the NS_ERROR_FILE_NOT_FOUND check before
DONT_RETARGET.
Testing suggests that a-download-click-404.html behaviour isn't
impacted, and this improves the handling of this edge-case when doing
process switching.
Differential Revision: https://phabricator.services.mozilla.com/D202007
-
a04f2066
by Jonathan Kew at 2024-05-10T22:07:35+00:00
Bug 1886598 - Struct with Pointer member may not be memmove-able. r=gfx-reviewers,lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D206633
-
0d13381c
by alwu at 2024-05-10T22:07:36+00:00
Bug 1644383 - add mutexs to avoid data race. r=media-playback-reviewers,padenot
Differential Revision: https://phabricator.services.mozilla.com/D206943
8 changed files:
Changes:
dom/media/ipc/RemoteMediaDataDecoder.cpp
... |
... |
@@ -18,7 +18,12 @@ namespace mozilla { |
18
|
18
|
##__VA_ARGS__)
|
19
|
19
|
|
20
|
20
|
RemoteMediaDataDecoder::RemoteMediaDataDecoder(RemoteDecoderChild* aChild)
|
21
|
|
- : mChild(aChild) {
|
|
21
|
+ : mChild(aChild),
|
|
22
|
+ mDescription("RemoteMediaDataDecoder"_ns),
|
|
23
|
+ mProcessName("unknown"_ns),
|
|
24
|
+ mCodecName("unknown"_ns),
|
|
25
|
+ mIsHardwareAccelerated(false),
|
|
26
|
+ mConversion(ConversionRequired::kNeedNone) {
|
22
|
27
|
LOG("%p is created", this);
|
23
|
28
|
}
|
24
|
29
|
|
... |
... |
@@ -48,6 +53,7 @@ RefPtr<MediaDataDecoder::InitPromise> RemoteMediaDataDecoder::Init() { |
48
|
53
|
->Then(
|
49
|
54
|
RemoteDecoderManagerChild::GetManagerThread(), __func__,
|
50
|
55
|
[self, this](TrackType aTrack) {
|
|
56
|
+ MutexAutoLock lock(mMutex);
|
51
|
57
|
// If shutdown has started in the meantime shutdown promise may
|
52
|
58
|
// be resloved before this task. In this case mChild will be null
|
53
|
59
|
// and the init promise has to be canceled.
|
... |
... |
@@ -127,6 +133,7 @@ RefPtr<ShutdownPromise> RemoteMediaDataDecoder::Shutdown() { |
127
|
133
|
|
128
|
134
|
bool RemoteMediaDataDecoder::IsHardwareAccelerated(
|
129
|
135
|
nsACString& aFailureReason) const {
|
|
136
|
+ MutexAutoLock lock(mMutex);
|
130
|
137
|
aFailureReason = mHardwareAcceleratedReason;
|
131
|
138
|
return mIsHardwareAccelerated;
|
132
|
139
|
}
|
... |
... |
@@ -145,18 +152,24 @@ void RemoteMediaDataDecoder::SetSeekThreshold(const media::TimeUnit& aTime) { |
145
|
152
|
|
146
|
153
|
MediaDataDecoder::ConversionRequired RemoteMediaDataDecoder::NeedsConversion()
|
147
|
154
|
const {
|
|
155
|
+ MutexAutoLock lock(mMutex);
|
148
|
156
|
return mConversion;
|
149
|
157
|
}
|
150
|
158
|
|
151
|
159
|
nsCString RemoteMediaDataDecoder::GetDescriptionName() const {
|
|
160
|
+ MutexAutoLock lock(mMutex);
|
152
|
161
|
return mDescription;
|
153
|
162
|
}
|
154
|
163
|
|
155
|
164
|
nsCString RemoteMediaDataDecoder::GetProcessName() const {
|
|
165
|
+ MutexAutoLock lock(mMutex);
|
156
|
166
|
return mProcessName;
|
157
|
167
|
}
|
158
|
168
|
|
159
|
|
-nsCString RemoteMediaDataDecoder::GetCodecName() const { return mCodecName; }
|
|
169
|
+nsCString RemoteMediaDataDecoder::GetCodecName() const {
|
|
170
|
+ MutexAutoLock lock(mMutex);
|
|
171
|
+ return mCodecName;
|
|
172
|
+}
|
160
|
173
|
|
161
|
174
|
#undef LOG
|
162
|
175
|
|
dom/media/ipc/RemoteMediaDataDecoder.h
... |
... |
@@ -53,14 +53,16 @@ class RemoteMediaDataDecoder final |
53
|
53
|
// destructor when we can guarantee no other threads are accessing it). Only
|
54
|
54
|
// read from the manager thread.
|
55
|
55
|
RefPtr<RemoteDecoderChild> mChild;
|
|
56
|
+
|
|
57
|
+ mutable Mutex mMutex{"RemoteMediaDataDecoder"};
|
|
58
|
+
|
56
|
59
|
// Only ever written/modified during decoder initialisation.
|
57
|
|
- // As such can be accessed from any threads after that.
|
58
|
|
- nsCString mDescription = "RemoteMediaDataDecoder"_ns;
|
59
|
|
- nsCString mProcessName = "unknown"_ns;
|
60
|
|
- nsCString mCodecName = "unknown"_ns;
|
61
|
|
- bool mIsHardwareAccelerated = false;
|
62
|
|
- nsCString mHardwareAcceleratedReason;
|
63
|
|
- ConversionRequired mConversion = ConversionRequired::kNeedNone;
|
|
60
|
+ nsCString mDescription MOZ_GUARDED_BY(mMutex);
|
|
61
|
+ nsCString mProcessName MOZ_GUARDED_BY(mMutex);
|
|
62
|
+ nsCString mCodecName MOZ_GUARDED_BY(mMutex);
|
|
63
|
+ bool mIsHardwareAccelerated MOZ_GUARDED_BY(mMutex);
|
|
64
|
+ nsCString mHardwareAcceleratedReason MOZ_GUARDED_BY(mMutex);
|
|
65
|
+ ConversionRequired mConversion MOZ_GUARDED_BY(mMutex);
|
64
|
66
|
};
|
65
|
67
|
|
66
|
68
|
} // namespace mozilla
|
dom/media/platforms/wrappers/MediaChangeMonitor.cpp
... |
... |
@@ -668,6 +668,7 @@ RefPtr<ShutdownPromise> MediaChangeMonitor::ShutdownDecoder() { |
668
|
668
|
AssertOnThread();
|
669
|
669
|
mConversionRequired.reset();
|
670
|
670
|
if (mDecoder) {
|
|
671
|
+ MutexAutoLock lock(mMutex);
|
671
|
672
|
RefPtr<MediaDataDecoder> decoder = std::move(mDecoder);
|
672
|
673
|
return decoder->Shutdown();
|
673
|
674
|
}
|
... |
... |
@@ -715,6 +716,7 @@ MediaChangeMonitor::CreateDecoder() { |
715
|
716
|
->Then(
|
716
|
717
|
GetCurrentSerialEventTarget(), __func__,
|
717
|
718
|
[self = RefPtr{this}, this](RefPtr<MediaDataDecoder>&& aDecoder) {
|
|
719
|
+ MutexAutoLock lock(mMutex);
|
718
|
720
|
mDecoder = std::move(aDecoder);
|
719
|
721
|
DDLINKCHILD("decoder", mDecoder.get());
|
720
|
722
|
return CreateDecoderPromise::CreateAndResolve(true, __func__);
|
... |
... |
@@ -963,6 +965,11 @@ void MediaChangeMonitor::FlushThenShutdownDecoder( |
963
|
965
|
->Track(mFlushRequest);
|
964
|
966
|
}
|
965
|
967
|
|
|
968
|
+MediaDataDecoder* MediaChangeMonitor::GetDecoderOnNonOwnerThread() const {
|
|
969
|
+ MutexAutoLock lock(mMutex);
|
|
970
|
+ return mDecoder;
|
|
971
|
+}
|
|
972
|
+
|
966
|
973
|
#undef LOG
|
967
|
974
|
|
968
|
975
|
} // namespace mozilla |
dom/media/platforms/wrappers/MediaChangeMonitor.h
... |
... |
@@ -41,34 +41,34 @@ class MediaChangeMonitor final |
41
|
41
|
RefPtr<ShutdownPromise> Shutdown() override;
|
42
|
42
|
bool IsHardwareAccelerated(nsACString& aFailureReason) const override;
|
43
|
43
|
nsCString GetDescriptionName() const override {
|
44
|
|
- if (mDecoder) {
|
45
|
|
- return mDecoder->GetDescriptionName();
|
|
44
|
+ if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) {
|
|
45
|
+ return decoder->GetDescriptionName();
|
46
|
46
|
}
|
47
|
47
|
return "MediaChangeMonitor decoder (pending)"_ns;
|
48
|
48
|
}
|
49
|
49
|
nsCString GetProcessName() const override {
|
50
|
|
- if (mDecoder) {
|
51
|
|
- return mDecoder->GetProcessName();
|
|
50
|
+ if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) {
|
|
51
|
+ return decoder->GetProcessName();
|
52
|
52
|
}
|
53
|
53
|
return "MediaChangeMonitor"_ns;
|
54
|
54
|
}
|
55
|
55
|
nsCString GetCodecName() const override {
|
56
|
|
- if (mDecoder) {
|
57
|
|
- return mDecoder->GetCodecName();
|
|
56
|
+ if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) {
|
|
57
|
+ return decoder->GetCodecName();
|
58
|
58
|
}
|
59
|
59
|
return "MediaChangeMonitor"_ns;
|
60
|
60
|
}
|
61
|
61
|
void SetSeekThreshold(const media::TimeUnit& aTime) override;
|
62
|
62
|
bool SupportDecoderRecycling() const override {
|
63
|
|
- if (mDecoder) {
|
64
|
|
- return mDecoder->SupportDecoderRecycling();
|
|
63
|
+ if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) {
|
|
64
|
+ return decoder->SupportDecoderRecycling();
|
65
|
65
|
}
|
66
|
66
|
return false;
|
67
|
67
|
}
|
68
|
68
|
|
69
|
69
|
ConversionRequired NeedsConversion() const override {
|
70
|
|
- if (mDecoder) {
|
71
|
|
- return mDecoder->NeedsConversion();
|
|
70
|
+ if (RefPtr<MediaDataDecoder> decoder = GetDecoderOnNonOwnerThread()) {
|
|
71
|
+ return decoder->NeedsConversion();
|
72
|
72
|
}
|
73
|
73
|
// Default so no conversion is performed.
|
74
|
74
|
return ConversionRequired::kNeedNone;
|
... |
... |
@@ -97,6 +97,9 @@ class MediaChangeMonitor final |
97
|
97
|
MOZ_ASSERT(!mThread || mThread->IsOnCurrentThread());
|
98
|
98
|
}
|
99
|
99
|
|
|
100
|
+ // This is used for getting decoder debug info on other threads. Thread-safe.
|
|
101
|
+ MediaDataDecoder* GetDecoderOnNonOwnerThread() const;
|
|
102
|
+
|
100
|
103
|
bool CanRecycleDecoder() const;
|
101
|
104
|
|
102
|
105
|
typedef MozPromise<bool, MediaResult, true /* exclusive */>
|
... |
... |
@@ -137,6 +140,13 @@ class MediaChangeMonitor final |
137
|
140
|
const CreateDecoderParamsForAsync mParams;
|
138
|
141
|
// Keep any seek threshold set for after decoder creation and initialization.
|
139
|
142
|
Maybe<media::TimeUnit> mPendingSeekThreshold;
|
|
143
|
+
|
|
144
|
+ // This lock is used for mDecoder specifically, but it doens't need to be used
|
|
145
|
+ // for every places accessing mDecoder which is mostly on the owner thread.
|
|
146
|
+ // However, when requesting decoder debug info, it can happen on other
|
|
147
|
+ // threads, so we need this mutex to avoid the data race of
|
|
148
|
+ // creating/destroying decoder and accessing decoder's debug info.
|
|
149
|
+ mutable Mutex MOZ_ANNOTATED mMutex{"MediaChangeMonitor"};
|
140
|
150
|
};
|
141
|
151
|
|
142
|
152
|
} // namespace mozilla
|
gfx/thebes/gfxPlatformFontList.h
... |
... |
@@ -124,7 +124,7 @@ class ShmemCharMapHashEntry final : public PLDHashEntryHdr { |
124
|
124
|
return aCharMap->GetChecksum();
|
125
|
125
|
}
|
126
|
126
|
|
127
|
|
- enum { ALLOW_MEMMOVE = true };
|
|
127
|
+ enum { ALLOW_MEMMOVE = false }; // because of the Pointer member
|
128
|
128
|
|
129
|
129
|
private:
|
130
|
130
|
// charMaps are stored in the shared memory that FontList objects point to,
|
modules/libpref/init/StaticPrefList.yaml
... |
... |
@@ -12779,6 +12779,18 @@ |
12779
|
12779
|
value: true
|
12780
|
12780
|
mirror: always
|
12781
|
12781
|
|
|
12782
|
+ # The length of cnonce string used in HTTP digest auth.
|
|
12783
|
+- name: network.http.digest_auth_cnonce_length
|
|
12784
|
+ type: uint32_t
|
|
12785
|
+ value: 16
|
|
12786
|
+ mirror: always
|
|
12787
|
+
|
|
12788
|
+ # If true, HTTP response content-type headers will be parsed using the standards-compliant MimeType parser
|
|
12789
|
+- name: network.standard_content_type_parsing.response_headers
|
|
12790
|
+ type: RelaxedAtomicBool
|
|
12791
|
+ value: true
|
|
12792
|
+ mirror: always
|
|
12793
|
+
|
12782
|
12794
|
# The maximum count that we allow socket prrocess to crash. If this count is
|
12783
|
12795
|
# reached, we won't use networking over socket process.
|
12784
|
12796
|
- name: network.max_socket_process_failed_count
|
netwerk/protocol/http/nsHttpDigestAuth.cpp
... |
... |
@@ -9,6 +9,7 @@ |
9
|
9
|
|
10
|
10
|
#include "mozilla/ClearOnShutdown.h"
|
11
|
11
|
#include "mozilla/Sprintf.h"
|
|
12
|
+#include "mozilla/StaticPrefs_network.h"
|
12
|
13
|
#include "mozilla/Unused.h"
|
13
|
14
|
|
14
|
15
|
#include "nsHttp.h"
|
... |
... |
@@ -22,6 +23,7 @@ |
22
|
23
|
#include "nsCRT.h"
|
23
|
24
|
#include "nsICryptoHash.h"
|
24
|
25
|
#include "nsComponentManagerUtils.h"
|
|
26
|
+#include "pk11pub.h"
|
25
|
27
|
|
26
|
28
|
constexpr uint16_t DigestLength(uint16_t aAlgorithm) {
|
27
|
29
|
if (aAlgorithm & (ALGO_SHA256 | ALGO_SHA256_SESS)) {
|
... |
... |
@@ -321,9 +323,13 @@ nsHttpDigestAuth::GenerateCredentials( |
321
|
323
|
// returned Authentication-Info header). also used for session info.
|
322
|
324
|
//
|
323
|
325
|
nsAutoCString cnonce;
|
324
|
|
- static const char hexChar[] = "0123456789abcdef";
|
325
|
|
- for (int i = 0; i < 16; ++i) {
|
326
|
|
- cnonce.Append(hexChar[(int)(15.0 * rand() / (RAND_MAX + 1.0))]);
|
|
326
|
+ nsTArray<uint8_t> cnonceBuf;
|
|
327
|
+ cnonceBuf.SetLength(StaticPrefs::network_http_digest_auth_cnonce_length() /
|
|
328
|
+ 2);
|
|
329
|
+ PK11_GenerateRandom(reinterpret_cast<unsigned char*>(cnonceBuf.Elements()),
|
|
330
|
+ cnonceBuf.Length());
|
|
331
|
+ for (auto byte : cnonceBuf) {
|
|
332
|
+ cnonce.AppendPrintf("%02x", byte);
|
327
|
333
|
}
|
328
|
334
|
LOG((" cnonce=%s\n", cnonce.get()));
|
329
|
335
|
|
uriloader/base/nsURILoader.cpp
... |
... |
@@ -414,28 +414,28 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIRequest* request) { |
414
|
414
|
NS_ASSERTION(!m_targetStreamListener,
|
415
|
415
|
"If we found a listener, why are we not using it?");
|
416
|
416
|
|
417
|
|
- if (mFlags & nsIURILoader::DONT_RETARGET) {
|
418
|
|
- LOG(
|
419
|
|
- (" External handling forced or (listener not interested and no "
|
420
|
|
- "stream converter exists), and retargeting disallowed -> aborting"));
|
421
|
|
- return NS_ERROR_WONT_HANDLE_CONTENT;
|
422
|
|
- }
|
423
|
|
-
|
424
|
417
|
// Before dispatching to the external helper app service, check for an HTTP
|
425
|
418
|
// error page. If we got one, we don't want to handle it with a helper app,
|
426
|
419
|
// really.
|
427
|
|
- // The WPT a-download-click-404.html requires us to silently handle this
|
428
|
|
- // without displaying an error page, so we just return early here.
|
429
|
|
- // See bug 1604308 for discussion around what the ideal behaviour is.
|
430
|
420
|
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request));
|
431
|
421
|
if (httpChannel) {
|
432
|
422
|
bool requestSucceeded;
|
433
|
423
|
rv = httpChannel->GetRequestSucceeded(&requestSucceeded);
|
434
|
424
|
if (NS_FAILED(rv) || !requestSucceeded) {
|
435
|
|
- return NS_OK;
|
|
425
|
+ LOG(
|
|
426
|
+ (" Returning NS_ERROR_FILE_NOT_FOUND from "
|
|
427
|
+ "nsDocumentOpenInfo::DispatchContent due to failed HTTP response"));
|
|
428
|
+ return NS_ERROR_FILE_NOT_FOUND;
|
436
|
429
|
}
|
437
|
430
|
}
|
438
|
431
|
|
|
432
|
+ if (mFlags & nsIURILoader::DONT_RETARGET) {
|
|
433
|
+ LOG(
|
|
434
|
+ (" External handling forced or (listener not interested and no "
|
|
435
|
+ "stream converter exists), and retargeting disallowed -> aborting"));
|
|
436
|
+ return NS_ERROR_WONT_HANDLE_CONTENT;
|
|
437
|
+ }
|
|
438
|
+
|
439
|
439
|
// Fifth step:
|
440
|
440
|
//
|
441
|
441
|
// All attempts to dispatch this content have failed. Just pass it off to
|
|