Jason McNeil a3e93a4171 Fix: Prevent memory corruption from pooled buffers in memory storage
Problem:
The memory storage uses string keys and byte slice values directly in
a Go map without copying them. When these strings/slices are backed by
pooled buffers (from sync.Pool used by Fiber for performance), the map
keys and values can become corrupted when those buffers are reused.

Root Cause:
1. Fiber v3 uses sync.Pool extensively for byte buffer reuse
2. Strings created from pooled buffers point to the underlying pooled memory
3. When used as Go map keys without copying, these strings share the pooled buffer
4. When the buffer is returned to the pool and reused, the map key gets corrupted
5. This causes intermittent failures where sessions/CSRF tokens cannot be found

Solution:
Copy both the key (string) and value ([]byte) before storing in the map.
Since this package doesn't have access to gofiber/utils, we use manual copying:
- Key: string([]byte(key)) - creates a new string with a new backing array
- Value: make new slice and copy bytes

Testing:
- Before fix: ~8% pass rate with ginkgo --repeat=100
- After fix: 100% pass rate with ginkgo --repeat=200
- No corrupted keys found in storage after fix

Impact:
- Performance: Minimal - one string copy and one byte slice copy per Set
- Safety: Prevents entire class of memory corruption bugs
- Consistency: Aligns with the fix applied to gofiber/fiber internal storage
2025-10-31 05:48:39 -03:00
---
2024-05-20 22:05:12 +00:00
2024-08-21 17:16:02 +02:00
2024-11-14 15:11:21 +01:00
2024-04-09 08:10:39 +02:00
2020-11-05 09:16:20 +01:00
2020-10-28 01:15:14 +01:00
2020-11-23 09:30:50 +01:00

title, description, sidebar_position
title description sidebar_position
👋 Welcome 📦 Premade storage drivers for 🚀 Fiber. 1

Fiber Fiber

Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares.

// Storage interface for communicating with different database/key-value
// providers. Visit https://github.com/gofiber/storage for more info.
type Storage interface {
	// Get gets the value for the given key.
	// `nil, nil` is returned when the key does not exist
	Get(key string) ([]byte, error)

	// Set stores the given value for the given key along
	// with an expiration value, 0 means no expiration.
	// Empty key or value will be ignored without an error.
	Set(key string, val []byte, exp time.Duration) error

	// Delete deletes the value for the given key.
	// It returns no error if the storage does not contain the key,
	Delete(key string) error

	// Reset resets the storage and delete all keys.
	Reset() error

	// Close closes the storage and will stop any running garbage
	// collectors and open connections.
	Close() error
}

📑 Storage Implementations

Description
📦 Premade storage drivers for 🚀 Fiber
Readme MIT 26 MiB
Languages
Go 100%