Subj : HPT Bug: Corrupted packets not rejected due to missing date validation To : All From : Stephen Walsh Date : Fri Oct 10 2025 10:38 am Hi Husky developers, I've discovered a bug in HPT where packets with corrupted/empty message date fields are not properly rejected and renamed to .bad as they should be. PROBLEM DESCRIPTION: =================== When processing packets, HPT reads the 20-byte datetime field from each message header (pktread.c:771) and calls parse_ftsc_date() to parse it (line 777). However, the return value from parse_ftsc_date() is ignored. The parse_ftsc_date() function returns flag_t values indicating: - FTSC_BROKEN (2) - field cannot be parsed - FTSC_FLAWY (1) - field has correctable errors - FTSC_TS_BROKEN (128) - timestamp broken but date OK Currently, even when parse_ftsc_date() returns FTSC_BROKEN, the badmsg counter is not incremented, so the packet is not renamed to .bad and continues to be processed. REAL-WORLD IMPACT: ================== I encountered a packet in the wild (from 2:341/66) that contains: - Message 3: Empty date field (0 bytes) - Message 4: Invalid date field (1 byte: '0') The bad packet can be obtained at: https://vk3heg.net/badpkt.zip HPT processed this packet instead of rejecting it. PROPOSED FIX: ============= After calling parse_ftsc_date(), check if the FTSC_BROKEN flag is set and increment badmsg accordingly. This ensures corrupted packets are properly renamed to .bad. Patch attached below. Please review and consider applying to the codebase. --- hpt/src/pktread.c.orig 2025-10-09 10:00:00.000000000 +1100 +++ hpt/src/pktread.c 2025-10-09 10:05:00.000000000 +1100 @@ -734,6 +734,7 @@ { s_message * msg; size_t len; + flag_t date_flags; int badmsg = 0; struct tm tm; long unread; @@ -774,7 +775,16 @@ } msg->datetime[20] = 0; /* ensure it's null-terminated */ - parse_ftsc_date(&tm, (char *)msg->datetime); + date_flags = parse_ftsc_date(&tm, (char *)msg->datetime); + + /* Check if the date field is broken and cannot be parsed */ + if(date_flags & FTSC_BROKEN) + { + w_log(LL_ERR, + "wrong msg header: datetime field is broken ('%s')", + msg->datetime); + badmsg++; + } /* val: make_ftsc_date((char*)msg->datetime, &tm); */ if(globalBuffer == NULL) TESTING: ======== With this patch applied, packets with broken date fields will be properly rejected and renamed to .bad instead of being processed. Be .