AmendHub

Download:

jcs

/

subtext

/

amendments

/

598

binkp: Add packet read timeout, minor socket read improvement

binkp_frame is not a packed struct of the actual frame, so read into
buf and assign to binkp_frame manually.

jcs made amendment 598 11 months ago
--- binkp.c Tue Jan 23 16:24:43 2024 +++ binkp.c Wed Oct 22 22:12:22 2025 @@ -380,27 +380,38 @@ binkp_read_frame(void) return false; } - if (binkpc->tcp_status_pb.amtUnreadData < 2) + if (binkpc->tcp_status_pb.amtUnreadData < 2) { + if (Time - binkpc->last_frame_at > 60) { + logger_printf("[binkp] No data received in %ld seconds, " + "disconnecting", Time - binkpc->last_frame_at); + binkpc->error = true; + } return false; + } rlen = 2; error = _TCPRcv(&binkpc->tcp_read_iopb, binkpc->tcp_stream, - (Ptr)&binkpc->cur_frame, &rlen, nil, nil, false); + (Ptr)binkpc->buf, &rlen, nil, nil, false); if (error) { binkpc->error = true; return false; } +#ifdef BINKP_DEBUG + logger_printf("[binkp] Received frame header 0x%x 0x%x", + (unsigned char)binkpc->buf[0], (unsigned char)binkpc->buf[1]); +#endif + + binkpc->cur_frame.type = (unsigned char)binkpc->buf[0] >> 7; + binkpc->cur_frame.data_size = + (unsigned short)((unsigned char)binkpc->buf[0] & 127) << 8; + binkpc->cur_frame.data_size |= (unsigned char)binkpc->buf[1]; if (binkpc->cur_frame.data_size == 0) { logger_printf("[binkp] Received bogus frame, no data_size"); return false; } binkpc->last_frame_at = Time; - binkpc->cur_frame.type = - (binkpc->cur_frame.data_size & (1 << 15)) == 0 ? BINKP_TYPE_DATA : - BINKP_TYPE_COMMAND; - binkpc->cur_frame.data_size &= 0x7fff; frame_data_read = 0; while (frame_data_read < binkpc->cur_frame.data_size) { --- binkp.h Tue Jan 23 16:25:03 2024 +++ binkp.h Wed Oct 22 21:54:37 2025 @@ -21,8 +21,12 @@ #include "tcp.h" #include "uthread.h" #include "util.h" - + +/* this is not the on-wire format */ struct binkp_frame { + char type; +#define BINKP_TYPE_DATA 0x0 +#define BINKP_TYPE_COMMAND 0x1 u_int16_t data_size; char command_id; #define BINKP_DATA -1 @@ -37,10 +41,6 @@ struct binkp_frame { #define BINKP_COMMAND_M_BSY 8 #define BINKP_COMMAND_M_GET 9 #define BINKP_COMMAND_M_SKIP 10 - - char type; -#define BINKP_TYPE_DATA 0x0 -#define BINKP_TYPE_COMMAND 0x1 }; struct binkp_file {