WritePacket does not properly wrap errors, breaking errors.Is detection (should use %w not %v)
- 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
Assessment
This issue has not been assessed yet.