google / google/gopacket

WritePacket does not properly wrap errors, breaking errors.Is detection (should use %w not %v)

Open
#1,213 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
6.8k
Forks
1.2k
PR merge metrics
No merged PRs in 30d

Description

In writer.go, the WritePacket function uses %v when returning wrapped errors. This prevents errors.Is and errors.As from working correctly on underlying system errors (e.g. syscall.ENOSPC when the disk is full).

From [writer.go](https://github.com/google/gopacket/blob/master/pcapgo/write.go#L125)
`if err := w.writePacketHeader(ci); err != nil {
return fmt.Errorf("error writing packet header: %v", err)
}`

This formats the error as a string but does not wrap it. As a result, error checks like this fail:
`if errors.Is(err, syscall.ENOSPC) {
// never triggered
}`

Even though the underlying error is ENOSPC, it gets lost because %v does not preserve the error.

**Why This Matters**
Applications relying on gopacket cannot reliably detect and handle system-level write failures (like disk full, permissions, etc.), because the root error is lost. This makes robust error handling (like throttled logging or retries) impossible.

**Proposed Fix**
Change all %v error wrapping in return paths to %w where propagation is intended, e.g.:

```
- return fmt.Errorf("error writing packet header: %v", err)
+ return fmt.Errorf("error writing packet header: %w", err)
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.