Bug 1776210 - [macOS 13] Stack underflow crashes on Wifi Monitor thread on macOS 13 (Ventura) beta r=mac-reviewers,necko-reviewers,mstange,dragana

Use a larger stack size on macOS 13 for the Wifi monitor thread to accommodate Core WLAN code allocating 217K+ on the stack.

Differential Revision: https://phabricator.services.mozilla.com/D152555
This commit is contained in:
Haik Aftandilian 2022-07-25 14:09:09 +00:00
Родитель 6506fc7cf1
Коммит f43f562153
4 изменённых файлов: 34 добавлений и 1 удалений

Просмотреть файл

@ -19,6 +19,10 @@
#include "mozilla/IntegerPrintfMacros.h"
#include "mozilla/Services.h"
#ifdef XP_MACOSX
# include "nsCocoaFeatures.h"
#endif
using namespace mozilla;
LazyLogModule gWifiMonitorLog("WifiMonitor");
@ -50,6 +54,19 @@ nsWifiMonitor::Observe(nsISupports* subject, const char* topic,
return NS_OK;
}
uint32_t nsWifiMonitor::GetMonitorThreadStackSize() {
#ifdef XP_MACOSX
// If this ASSERT fails, we've increased our default stack size and
// may no longer need to special-case the stack size on macOS.
MOZ_ASSERT(kMacOS13MonitorStackSize > nsIThreadManager::DEFAULT_STACK_SIZE);
return nsCocoaFeatures::OnVenturaOrLater()
? kMacOS13MonitorStackSize
: nsIThreadManager::DEFAULT_STACK_SIZE;
#else
return nsIThreadManager::DEFAULT_STACK_SIZE;
#endif
}
NS_IMETHODIMP nsWifiMonitor::StartWatching(nsIWifiListener* aListener) {
LOG(("nsWifiMonitor::StartWatching %p thread %p listener %p\n", this,
mThread.get(), aListener));
@ -75,7 +92,8 @@ NS_IMETHODIMP nsWifiMonitor::StartWatching(nsIWifiListener* aListener) {
}
if (!mThread) {
rv = NS_NewNamedThread("Wifi Monitor", getter_AddRefs(mThread), this);
rv = NS_NewNamedThread("Wifi Monitor", getter_AddRefs(mThread), this,
GetMonitorThreadStackSize());
if (NS_FAILED(rv)) {
return rv;
}

Просмотреть файл

@ -30,6 +30,12 @@ class nsWifiAccessPoint;
#define kDefaultWifiScanInterval 5 /* seconds */
#ifdef XP_MACOSX
// Use a larger stack size for the monitor thread on macOS 13+
// to accommodate Core WLAN making large stack allocations.
# define kMacOS13MonitorStackSize (512 * 1024)
#endif
class nsWifiListener {
public:
explicit nsWifiListener(nsMainThreadPtrHolder<nsIWifiListener>* aListener) {
@ -59,6 +65,8 @@ class nsWifiMonitor final : nsIRunnable, nsIWifiMonitor, nsIObserver {
nsresult CallWifiListeners(const nsCOMArray<nsWifiAccessPoint>& aAccessPoints,
bool aAccessPointsChanged);
uint32_t GetMonitorThreadStackSize();
mozilla::Atomic<bool> mKeepGoing;
mozilla::Atomic<bool> mThreadComplete;
nsCOMPtr<nsIThread> mThread; // only accessed on MainThread

Просмотреть файл

@ -24,6 +24,7 @@ class nsCocoaFeatures {
static bool OnCatalinaOrLater();
static bool OnBigSurOrLater();
static bool OnMontereyOrLater();
static bool OnVenturaOrLater();
static bool IsAtLeastVersion(int32_t aMajor, int32_t aMinor,
int32_t aBugFix = 0);

Просмотреть файл

@ -25,6 +25,7 @@
#define MACOS_VERSION_10_16_HEX 0x000A1000
#define MACOS_VERSION_11_0_HEX 0x000B0000
#define MACOS_VERSION_12_0_HEX 0x000C0000
#define MACOS_VERSION_13_0_HEX 0x000D0000
#include "nsCocoaFeatures.h"
#include "nsCocoaUtils.h"
@ -189,6 +190,11 @@ bool Gecko_OnSierraExactly() { return nsCocoaFeatures::OnSierraExactly(); }
return (macOSVersion() >= MACOS_VERSION_12_0_HEX);
}
/* static */ bool nsCocoaFeatures::OnVenturaOrLater() {
// See comments above regarding SYSTEM_VERSION_COMPAT.
return (macOSVersion() >= MACOS_VERSION_13_0_HEX);
}
/* static */ bool nsCocoaFeatures::IsAtLeastVersion(int32_t aMajor, int32_t aMinor,
int32_t aBugFix) {
return macOSVersion() >= GetVersion(aMajor, aMinor, aBugFix);