jamulussoftware / jamulussoftware/jamulus

Firewall hangs or crashes Jamlus

Offen
#3,776 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug
Vorherrschende Sprache
C
Sterne
1.1k
Forks
248
Ø Merge
2 T. 3 Std.
Gemergte PRs (30 T.)
9

Beschreibung

## Describe the bug

Clicking Connect while Ethernet is active and the macOS Application Firewall is enabled causes either an immediate crash (SIGPIPE, exit code 141) or a permanent hang. WiFi is not affected.

## To Reproduce

1. Plug in Ethernet (both Ethernet and WiFi active, default route via `en0`)
2. Enable the macOS Application Firewall via gui: or probably `sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on`
3. Launch Jamulus and click Connect
4. The app either crashes immediately or hangs with no response from the server

**Workaround:** Unplug Ethernet, disable the firewall, or add Jamulus to the firewall allow list.

## Expected behavior

Connect works regardless of which network interface is used and whether the firewall is enabled. If the server is unreachable, show an error instead of crashing or hanging.

## Crash report (before fix)

```
frame #0: __sendto (libsystem_kernel.dylib)
frame #1: Jamulus CSocket::Send (socket.cpp)
frame #2: Jamulus (ConnLessProtocol / Protocol layer)
frame #3: Jamulus (Protocol layer)
frame #4: QtCore QSocketNotifier (via Qt event loop)
frame #5-8: Jamulus (various)
frame #9: QObject::event
frame #10: QWidget::event
frame #11-12: QtWidgets QApplication
frame #13: QtCore QCoreApplication::sendEvent
frame #14: QtCore QCoreApplicationPrivate::sendPostedEvents
```

## Root cause (likely; AI assisted)

The macOS Application Firewall silently drops Jamulus's outgoing UDP packets when traffic originates from the Ethernet interface. WiFi works because it was already trusted (?). Before the fix, the dropped packets caused a SIGPIPE (no receiver). After the SO_NOSIGPIPE fix (handling macOS like iOS), it became a hang since the connection attempt never completes and `IsConnected()` stays false.

## Operating system

macOS 26.5.2, Apple Silicon (arm64), Xcode 26.6

## AI proposed Fix

Two changes were needed of which the first one I am not sure about:

**1. SO_NOSIGPIPE** (`src/socket.cpp`):

```cpp
// Before:
#ifdef Q_OS_IOS
int valueone = 1;
setsockopt ( UdpSocket, SOL_SOCKET, SO_NOSIGPIPE, &valueone, sizeof ( valueone ) );
#endif

// After:
#if defined( Q_OS_IOS ) || defined( Q_OS_MACOS )
int valueone = 1;
setsockopt ( UdpSocket, SOL_SOCKET, SO_NOSIGPIPE, &valueone, sizeof ( valueone ) );
#endif
```

This prevents a SIGPIPE crash but doesn't fix the hang.

**2. Connection timeout** (`src/clientdlg.cpp`):

Added a 5-second `TimerConnectTimeout` in `CClientDlg`. If `IsConnected()` is still false when it fires, the app shows a warning about the firewall and disconnects. The timer is stopped on successful connection (`OnConClientListMesReceived`) or on manual disconnect.

To be discussed.
## Additional context

/

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit dem Absturzpfad in src/socket.cpp, insbesondere mit CSocket::Send, und untersuche anschließend den Verbindungsablauf sowie die vorgeschlagenen Timeout-Stellen in src/clientdlg.cpp und CClientDlg. Reproduziere nach Möglichkeit den Fall mit Ethernet und Firewall; abgeschlossen ist die Aufgabe, wenn Verbindungsversuche nicht mehr abstürzen oder hängen bleiben und ein nicht erreichbarer Server das beschriebene Warnungs- und Trennverhalten erzeugt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
cpp, macos
Bereich
desktop, networking
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.