diff -Nru net-snmp-5.8+dfsg/debian/changelog net-snmp-5.8+dfsg/debian/changelog --- net-snmp-5.8+dfsg/debian/changelog 2023-01-06 16:07:55.000000000 +0000 +++ net-snmp-5.8+dfsg/debian/changelog 2023-02-17 03:05:10.000000000 +0000 @@ -1,3 +1,12 @@ +net-snmp (5.8+dfsg-2ubuntu2.7) focal; urgency=medium + + * Fix snmptrapd reconnection issue after hitting MySQL wait_timeout + (LP: #1999711) + - d/p/snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch + - d/p/snmptrapd-mysql-fix-build-error.patch + + -- Chengen Du Fri, 17 Feb 2023 03:05:10 +0000 + net-snmp (5.8+dfsg-2ubuntu2.6) focal-security; urgency=medium * SECURITY UPDATE: DoS via null pointer exception issues diff -Nru net-snmp-5.8+dfsg/debian/patches/series net-snmp-5.8+dfsg/debian/patches/series --- net-snmp-5.8+dfsg/debian/patches/series 2023-01-06 16:07:46.000000000 +0000 +++ net-snmp-5.8+dfsg/debian/patches/series 2023-02-17 02:52:54.000000000 +0000 @@ -51,3 +51,5 @@ CVE-2022-4479x-1.patch CVE-2022-4479x-2.patch CVE-2022-4479x-3.patch +snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch +snmptrapd-mysql-fix-build-error.patch diff -Nru net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-fix-build-error.patch net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-fix-build-error.patch --- net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-fix-build-error.patch 1970-01-01 00:00:00.000000000 +0000 +++ net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-fix-build-error.patch 2023-02-17 03:04:53.000000000 +0000 @@ -0,0 +1,30 @@ +From: Bart Van Assche +Date: Mon Dec 5 19:19:40 2022 -0800 +Subject: apps/snmptrapd_sql: Fix a recently introduced build error + + Fixes: 62b2907a46c9 ("apps/snmptrap: Fix mysql reconnection after hitting wait_timeout") + +Origin: upstream, https://github.com/net-snmp/net-snmp/commit/a1c80f7778da0aaadfb3fc44b213586f632d8d5d +Bug-Ubuntu: https://bugs.launchpad.net/bugs/1999711 +Last-Update: 2023-02-17 + +--- net-snmp-5.8+dfsg.orig/apps/snmptrapd_sql.c ++++ net-snmp-5.8+dfsg/apps/snmptrapd_sql.c +@@ -254,7 +254,7 @@ netsnmp_sql_disconnected(void) + } + } + +-static bool ++static int + netsnmp_sql_server_disconnected(int err) + { + // CR_SERVER_GONE_ERROR | CR_SERVER_LOST | ER_CLIENT_INTERACTION_TIMEOUT +@@ -1128,7 +1128,7 @@ _sql_process_queue(u_int dontcare, void + (void) netsnmp_mysql_connect(); + } + +- bool sql_has_connected = _sql.connected; ++ int sql_has_connected = _sql.connected; + + CONTAINER_FOR_EACH(_sql.queue, (netsnmp_container_obj_func*)_sql_save, + NULL); diff -Nru net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch --- net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch 1970-01-01 00:00:00.000000000 +0000 +++ net-snmp-5.8+dfsg/debian/patches/snmptrapd-mysql-reconnection-after-hitting-wait_timeout.patch 2023-02-17 02:49:26.000000000 +0000 @@ -0,0 +1,155 @@ +From: Chengen Du +Date: Wed, 23 Nov 2022 14:11:36 +0800 +Subject: apps/snmptrap: Fix mysql reconnection after hitting wait_timeout + + MySQL v8.0 supports ER_CLIENT_INTERACTION_TIMEOUT, which is not handled + in snmptrapd + +Origin: upstream, https://github.com/net-snmp/net-snmp/pull/484/files +Bug-Ubuntu: https://bugs.launchpad.net/bugs/1999711 +Last-Update: 2023-02-17 + +--- net-snmp-5.8+dfsg.orig/apps/snmptrapd_sql.c ++++ net-snmp-5.8+dfsg/apps/snmptrapd_sql.c +@@ -254,6 +254,13 @@ netsnmp_sql_disconnected(void) + } + } + ++static bool ++netsnmp_sql_server_disconnected(int err) ++{ ++ // CR_SERVER_GONE_ERROR | CR_SERVER_LOST | ER_CLIENT_INTERACTION_TIMEOUT ++ return CR_SERVER_GONE_ERROR == err || CR_SERVER_LOST == err || 4031 == err; ++} ++ + /* + * convenience function to log mysql errors + */ +@@ -261,17 +268,20 @@ static void + netsnmp_sql_error(const char *message) + { + u_int err = mysql_errno(_sql.conn); +- snmp_log(LOG_ERR, "%s\n", message); +- if (_sql.conn != NULL) { ++ ++ if (0 == _sql.connected || !netsnmp_sql_server_disconnected(err)) { ++ snmp_log(LOG_ERR, "%s\n", message); ++ if (_sql.conn != NULL) { + #if MYSQL_VERSION_ID >= 40101 +- snmp_log(LOG_ERR, "Error %u (%s): %s\n", +- err, mysql_sqlstate(_sql.conn), mysql_error(_sql.conn)); ++ snmp_log(LOG_ERR, "Error %u (%s): %s\n", ++ err, mysql_sqlstate(_sql.conn), mysql_error(_sql.conn)); + #else +- snmp(LOG_ERR, "Error %u: %s\n", +- mysql_errno(_sql.conn), mysql_error(_sql.conn)); ++ snmp(LOG_ERR, "Error %u: %s\n", ++ mysql_errno(_sql.conn), mysql_error(_sql.conn)); + #endif ++ } + } +- if (CR_SERVER_GONE_ERROR == err) ++ if (netsnmp_sql_server_disconnected(err)) + netsnmp_sql_disconnected(); + } + +@@ -283,14 +293,15 @@ netsnmp_sql_stmt_error (MYSQL_STMT *stmt + { + u_int err = mysql_errno(_sql.conn); + +- snmp_log(LOG_ERR, "%s\n", message); +- if (stmt) { +- snmp_log(LOG_ERR, "SQL Error %u (%s): %s\n", +- mysql_stmt_errno(stmt), mysql_stmt_sqlstate(stmt), +- mysql_stmt_error(stmt)); ++ if (0 == _sql.connected || !netsnmp_sql_server_disconnected(err)) { ++ snmp_log(LOG_ERR, "%s\n", message); ++ if (stmt) { ++ snmp_log(LOG_ERR, "SQL Error %u (%s): %s\n", ++ mysql_stmt_errno(stmt), mysql_stmt_sqlstate(stmt), ++ mysql_stmt_error(stmt)); ++ } + } +- +- if (CR_SERVER_GONE_ERROR == err) ++ if (netsnmp_sql_server_disconnected(err)) + netsnmp_sql_disconnected(); + } + +@@ -313,15 +324,6 @@ netsnmp_mysql_cleanup(void) + CONTAINER_FREE(_sql.queue); + _sql.queue = NULL; + +- if (_sql.trap_stmt) { +- mysql_stmt_close(_sql.trap_stmt); +- _sql.trap_stmt = NULL; +- } +- if (_sql.vb_stmt) { +- mysql_stmt_close(_sql.vb_stmt); +- _sql.vb_stmt = NULL; +- } +- + /** disconnect from server */ + netsnmp_sql_disconnected(); + +@@ -379,6 +381,21 @@ netsnmp_mysql_connect(void) + + DEBUGMSGTL(("sql:connection","connecting\n")); + ++ if (_sql.conn) { ++ mysql_close(_sql.conn); ++ _sql.conn = NULL; ++ } ++ ++ _sql.conn = mysql_init (NULL); ++ if (_sql.conn == NULL) { ++ netsnmp_sql_error("mysql_init() failed (out of memory?)"); ++ goto err; ++ } ++ ++#if HAVE_MYSQL_OPTIONS ++ mysql_options(_sql.conn, MYSQL_READ_DEFAULT_GROUP, "snmptrapd"); ++#endif ++ + /** connect to server */ + if (mysql_real_connect (_sql.conn, _sql.host_name, _sql.user_name, + _sql.password, _sql.db_name, _sql.port_num, +@@ -555,16 +572,6 @@ netsnmp_mysql_init(void) + #endif + _vbind[VBIND_VAL].length = &_vbind[VBIND_VAL].buffer_length; + +- _sql.conn = mysql_init (NULL); +- if (_sql.conn == NULL) { +- netsnmp_sql_error("mysql_init() failed (out of memory?)"); +- return -1; +- } +- +-#if HAVE_MYSQL_OPTIONS +- mysql_options(_sql.conn, MYSQL_READ_DEFAULT_GROUP, "snmptrapd"); +-#endif +- + /** try to connect; we'll try again later if we fail */ + (void) netsnmp_mysql_connect(); + +@@ -1121,6 +1128,8 @@ _sql_process_queue(u_int dontcare, void + (void) netsnmp_mysql_connect(); + } + ++ bool sql_has_connected = _sql.connected; ++ + CONTAINER_FOR_EACH(_sql.queue, (netsnmp_container_obj_func*)_sql_save, + NULL); + +@@ -1134,8 +1143,10 @@ _sql_process_queue(u_int dontcare, void + } + } + +- CONTAINER_CLEAR(_sql.queue, (netsnmp_container_obj_func*)_sql_buf_free, +- NULL); ++ if (!sql_has_connected || _sql.connected) { ++ CONTAINER_CLEAR(_sql.queue, (netsnmp_container_obj_func*)_sql_buf_free, ++ NULL); ++ } + } + + #else