From 61b0147a7c705d48703858d4436e7756f8f36cc5 Mon Sep 17 00:00:00 2001 From: yusing Date: Mon, 24 Feb 2025 19:50:04 +0800 Subject: [PATCH] fix cloudflare real ip middleware data race --- internal/net/gphttp/middleware/cloudflare_real_ip.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/net/gphttp/middleware/cloudflare_real_ip.go b/internal/net/gphttp/middleware/cloudflare_real_ip.go index 845bc20..4fdcf2e 100644 --- a/internal/net/gphttp/middleware/cloudflare_real_ip.go +++ b/internal/net/gphttp/middleware/cloudflare_real_ip.go @@ -12,6 +12,7 @@ import ( "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/logging" "github.com/yusing/go-proxy/internal/net/types" + "github.com/yusing/go-proxy/internal/utils/atomic" "github.com/yusing/go-proxy/internal/utils/strutils" ) @@ -28,7 +29,7 @@ const ( ) var ( - cfCIDRsLastUpdate time.Time + cfCIDRsLastUpdate atomic.Value[time.Time] cfCIDRsMu sync.Mutex // RFC 1918. @@ -68,14 +69,14 @@ func (cri *cloudflareRealIP) getTracer() *Tracer { } func tryFetchCFCIDR() (cfCIDRs []*types.CIDR) { - if time.Since(cfCIDRsLastUpdate) < cfCIDRsUpdateInterval { + if time.Since(cfCIDRsLastUpdate.Load()) < cfCIDRsUpdateInterval { return } cfCIDRsMu.Lock() defer cfCIDRsMu.Unlock() - if time.Since(cfCIDRsLastUpdate) < cfCIDRsUpdateInterval { + if time.Since(cfCIDRsLastUpdate.Load()) < cfCIDRsUpdateInterval { return } @@ -88,7 +89,7 @@ func tryFetchCFCIDR() (cfCIDRs []*types.CIDR) { fetchUpdateCFIPRange(cfIPv6CIDRsEndpoint, &cfCIDRs), ) if err != nil { - cfCIDRsLastUpdate = time.Now().Add(-cfCIDRsUpdateRetryInterval - cfCIDRsUpdateInterval) + cfCIDRsLastUpdate.Store(time.Now().Add(-cfCIDRsUpdateRetryInterval - cfCIDRsUpdateInterval)) logging.Err(err).Msg("failed to update cloudflare range, retry in " + strutils.FormatDuration(cfCIDRsUpdateRetryInterval)) return nil } @@ -97,7 +98,7 @@ func tryFetchCFCIDR() (cfCIDRs []*types.CIDR) { } } - cfCIDRsLastUpdate = time.Now() + cfCIDRsLastUpdate.Store(time.Now()) logging.Info().Msg("cloudflare CIDR range updated") return }