]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Restore RTR request session vs negotiated session check
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Mon, 6 Jul 2026 22:16:01 +0000 (16:16 -0600)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Mon, 6 Jul 2026 22:16:01 +0000 (16:16 -0600)
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.

src/rtr/pdu_handler.c
src/rtr/pdu_stream.c
src/rtr/pdu_stream.h

index 8646ee861359e8b1c56f49e764c20b8960fad9df..303b4776e93e093337d80ca00f8be8caac24599b 100644 (file)
@@ -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);
 
index 36b515f2a478d9ab16d39c5f1db0290cb27ce892..bb28cbc1c42dc025544906bfa7035341723b586c 100644 (file)
@@ -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;
index 33ec6d57db6f68567c08fc5259862e182b89e4c1..313bd12979187de4413977fc1146063531ef2365 100644 (file)
@@ -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 */