netbirdio/netbird · error

tun device %s panic: %v

Error message

tun device %s panic: %v

What it means

Error "tun device %s panic: %v" thrown in netbirdio/netbird.

Source

Thrown at client/iface/device/device_filter.go:167

// wintun write path and converting them into errors.
func (d *FilteredDevice) deviceWrite(bufs [][]byte, offset int) (n int, err error) {
	defer d.recoverFromPanic("write", &n, &err)
	return d.Device.Write(bufs, offset)
}

// recoverFromPanic converts a panic in the underlying device into a regular
// error and invokes the registered panic handler. The wintun read path is
// known to panic on zero-length packets that third-party filter drivers can
// place in the ring.
func (d *FilteredDevice) recoverFromPanic(op string, n *int, err *error) {
	r := recover()
	if r == nil {
		return
	}

	log.Errorf("recovered panic in tun device %s: %v\n%s", op, r, debug.Stack())
	*n = 0
	*err = fmt.Errorf("tun device %s panic: %v", op, r)

	if handler := d.panicHandler.Load(); handler != nil {
		(*handler)()
	}
}

// SetFilter sets packet filter to device
func (d *FilteredDevice) SetFilter(filter PacketFilter) {
	d.mutex.Lock()
	d.filter = filter
	d.mutex.Unlock()
}

// SetPanicHandler registers a handler invoked after a recovered panic in Read
// or Write. The device is unusable after such a panic; the handler should
// trigger recreation of the interface. Pass nil to remove.
func (d *FilteredDevice) SetPanicHandler(handler func()) {
	if handler == nil {

View on GitHub (pinned to 93e97f4bf1)

When it happens

Trigger: Thrown at client/iface/device/device_filter.go:167 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of netbirdio/netbird@93e97f4bf1 (2026-08-16). Data as JSON: /api/errors/49711b334ec1769b. Report an issue: GitHub.