From 1629c8e14857e253f634c9f6e230cfe6993ce890 Mon Sep 17 00:00:00 2001 From: patterniha Date: Wed, 14 May 2025 23:22:50 +0330 Subject: [PATCH] Sniffer: fix infinite loop stuck --- app/dispatcher/default.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/dispatcher/default.go b/app/dispatcher/default.go index 54864cbb..ec81b3fe 100644 --- a/app/dispatcher/default.go +++ b/app/dispatcher/default.go @@ -2,6 +2,7 @@ package dispatcher import ( "context" + "io" "regexp" "strings" "sync" @@ -373,7 +374,14 @@ func sniffer(ctx context.Context, cReader *cachedReader, metadataOnly bool, netw return nil, ctx.Err() default: cachingStartingTimeStamp := time.Now() + payloadLen := payload.Len() cacheErr := cReader.Cache(payload, cacheDeadline) + if cacheErr != nil { + return nil, cacheErr + } + if payload.Len() == payloadLen { + return nil, io.EOF + } cachingTimeElapsed := time.Since(cachingStartingTimeStamp) cacheDeadline -= cachingTimeElapsed @@ -383,14 +391,14 @@ func sniffer(ctx context.Context, cReader *cachedReader, metadataOnly bool, netw case common.ErrNoClue: // No Clue: protocol not matches, and sniffer cannot determine whether there will be a match or not totalAttempt++ case protocol.ErrProtoNeedMoreData: // Protocol Need More Data: protocol matches, but need more data to complete sniffing - if cacheErr != nil { // Cache error (e.g. timeout) counts for failed attempt - totalAttempt++ - } + totalAttempt++ default: return result, err } + } else { + return nil, io.EOF } - if totalAttempt >= 2 || cacheDeadline <= 0 { + if totalAttempt >= 32 || cacheDeadline <= 0 { return nil, errSniffingTimeout } }