From: Alberto Leiva Popper Date: Mon, 6 Jul 2026 22:16:01 +0000 (-0600) Subject: Restore RTR request session vs negotiated session check X-Git-Tag: 1.7.0.experimental~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3f8c1671ff224ca3486863000e90b9eb6ed8cf3f;p=thirdparty%2FFORT-validator.git Restore RTR request session vs negotiated session check But less convoluted, now that single-threads per client are implemented. More or less reverts 47deaf18a716596f0c3730aadd2659239f8fe7bc. Fixes Rapport 8210bis/5.1-2.10-serial-query-with-incorrect-session-id. --- diff --git a/src/rtr/pdu_handler.c b/src/rtr/pdu_handler.c index 8646ee86..303b4776 100644 --- a/src/rtr/pdu_handler.c +++ b/src/rtr/pdu_handler.c @@ -273,6 +273,8 @@ handle_reset_query_pdu(struct rtr_request *request) goto internal_error; } + request->stream->session = rtr.session; + error = send_cache_response_pdu(stream.fd, stream.ver, rtr.session); if (error) return error; @@ -554,6 +556,14 @@ handle_serial_query_pdu(struct rtr_request *request) default: goto internal_error; } + /* Negotiated session vs request session */ + if (request->stream->session == -1) + request->stream->session = request->pdu.obj.sq.session_id; + else if (request->stream->session != request->pdu.obj.sq.session_id) + return err_pdu_send_corrupt_data(stream.fd, stream.ver, + &request->pdu.raw, "Session ID doesn't match."); + + /* Request session vs existing cache session */ if (request->pdu.obj.sq.session_id != rtr.session) return send_cache_reset_pdu(stream.fd, stream.ver); diff --git a/src/rtr/pdu_stream.c b/src/rtr/pdu_stream.c index 36b515f2..bb28cbc1 100644 --- a/src/rtr/pdu_stream.c +++ b/src/rtr/pdu_stream.c @@ -41,6 +41,7 @@ struct pdu_stream *pdustream_create(int fd, char const *addr) result->fd = fd; strcpy(result->addr, addr); result->rtr_version = -1; + result->session = -1; result->start = result->buffer; result->end = result->buffer; diff --git a/src/rtr/pdu_stream.h b/src/rtr/pdu_stream.h index 33ec6d57..313bd129 100644 --- a/src/rtr/pdu_stream.h +++ b/src/rtr/pdu_stream.h @@ -10,8 +10,9 @@ struct rtr_request; struct pdu_stream { /* It's an *input* stream. */ int fd; - char addr[INET6_ADDRSTRLEN]; /* Printable address of the client. */ - int rtr_version; /* -1: unset; > 0: version number */ + char addr[INET6_ADDRSTRLEN]; /* Printable address of the client. */ + int rtr_version; /* -1: unset; > 0: version number */ + int session; /* -1: unset; > 0: session */ unsigned char buffer[RTRPDU_MAX_LEN2]; /* buffer's active bytes */