From 7fa72c27ec944466d73be4e00c25775b2c0446b7 Mon Sep 17 00:00:00 2001 From: Rivers Zhang Date: Tue, 4 Feb 2025 23:40:49 -0500 Subject: [PATCH] Handling misused rte in evbuffer If we see an "rte", write a response and wait for the next "newsql". Signed-off-by: Rivers Zhang --- .../com/bloomberg/comdb2/jdbc/BadRte.java | 16 +++++++++++++ net/net_evbuffer.c | 24 +++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 cdb2jdbc/src/test/java/com/bloomberg/comdb2/jdbc/BadRte.java diff --git a/cdb2jdbc/src/test/java/com/bloomberg/comdb2/jdbc/BadRte.java b/cdb2jdbc/src/test/java/com/bloomberg/comdb2/jdbc/BadRte.java new file mode 100644 index 0000000000..14c36f3827 --- /dev/null +++ b/cdb2jdbc/src/test/java/com/bloomberg/comdb2/jdbc/BadRte.java @@ -0,0 +1,16 @@ +package com.bloomberg.comdb2.jdbc; + +import org.junit.*; +import org.junit.Assert.*; + +public class BadRte { + @Test public void testBadRteClient() throws SQLException { + String db = System.getProperty("cdb2jdbc.test.database"); + String cluster = System.getProperty("cdb2jdbc.test.cluster"); + Connection conn = DriverManager.getConnection(String.format("jdbc:comdb2://%s/%s?allow_pmux_route=1&portmuxport=19000", cluster, db)); + Statement stmt = conn.createStatement(); + stmt.executeQuery("SELECT 1"); + stmt.close(); + conn.close(); + } +} diff --git a/net/net_evbuffer.c b/net/net_evbuffer.c index 2215599eb0..467df5172b 100644 --- a/net/net_evbuffer.c +++ b/net/net_evbuffer.c @@ -2844,7 +2844,8 @@ static void rd_connect_msg_len(int fd, short what, void *data) } } -static int do_appsock_evbuffer(struct evbuffer *buf, struct sockaddr_in *ss, int fd, int is_readonly, int secure) +static int do_appsock_evbuffer(struct evbuffer *buf, struct sockaddr_in *ss, int fd, int is_readonly, int secure, + int *pagain) { struct appsock_info *info = NULL; struct evbuffer_ptr b = evbuffer_search(buf, "\n", 1, NULL); @@ -2861,6 +2862,16 @@ static int do_appsock_evbuffer(struct evbuffer *buf, struct sockaddr_in *ss, int return 1; } + if (strcmp(key, "rte ") == 0) { + evbuffer_read(buf, fd, -1); + evbuffer_free(buf); + logmsg(LOGMSG_ERROR, "misused rte!\n"); + ssize_t rc = write(fd, "0\n", 2); + if (rc == 2 && pagain) + *pagain = 1; + return 1; + } + info = get_appsock_info(key); } @@ -2903,6 +2914,7 @@ static void do_read(int fd, short what, void *data) netinfo_type *netinfo_ptr = a->netinfo_ptr; struct sockaddr_in ss = a->ss; int secure = a->secure; + int again = 0; a->fd = -1; accept_info_free(a); a = NULL; @@ -2911,8 +2923,12 @@ static void do_read(int fd, short what, void *data) shutdown_close(fd); return; } - if ((do_appsock_evbuffer(buf, &ss, fd, 0, secure)) == 0) return; - handle_appsock(netinfo_ptr, &ss, first_byte, buf, fd); + if ((do_appsock_evbuffer(buf, &ss, fd, 0, secure, &again)) == 0) + return; + if (again) + accept_info_new(netinfo_ptr, &ss, fd, secure); + else + handle_appsock(netinfo_ptr, &ss, first_byte, buf, fd); } static void accept_cb(struct evconnlistener *listener, evutil_socket_t fd, @@ -3881,5 +3897,5 @@ void do_revconn_evbuffer(int fd, short what, void *data) struct sockaddr_in addr; socklen_t laddr = sizeof(addr); getsockname(fd, (struct sockaddr *)&addr, &laddr); - do_appsock_evbuffer(buf, &addr, fd, 1, 0); + do_appsock_evbuffer(buf, &addr, fd, 1, 0, NULL); }