Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package dqlite for openSUSE:Factory checked in at 2026-06-05 14:58:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dqlite (Old) and /work/SRC/openSUSE:Factory/.dqlite.new.2375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dqlite" Fri Jun 5 14:58:01 2026 rev:17 rq:1357126 version:1.18.6 Changes: -------- --- /work/SRC/openSUSE:Factory/dqlite/dqlite.changes 2026-03-02 17:45:37.844516821 +0100 +++ /work/SRC/openSUSE:Factory/.dqlite.new.2375/dqlite.changes 2026-06-05 14:58:58.413014564 +0200 @@ -1,0 +2,8 @@ +Wed Jun 3 05:00:00 UTC 2026 - Andreas Stieger <[email protected]> + +- Update to 1.18.6: + * set SOCK_CLOEXEC on socket creation to prevent FD leak to child + processes + * fix null deref when stopping or handing over before start + +------------------------------------------------------------------- Old: ---- dqlite-1.18.5.tar.gz New: ---- dqlite-1.18.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dqlite.spec ++++++ --- /var/tmp/diff_new_pack.NxOEPl/_old 2026-06-05 14:58:59.329052447 +0200 +++ /var/tmp/diff_new_pack.NxOEPl/_new 2026-06-05 14:58:59.329052447 +0200 @@ -2,7 +2,7 @@ # spec file for package dqlite # # Copyright (c) 2026 SUSE LLC and contributors -# Copyright (c) 2024 Andreas Stieger <[email protected]> +# Copyright (c) 2026 Andreas Stieger <[email protected]> # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define lname libdqlite0 Name: dqlite -Version: 1.18.5 +Version: 1.18.6 Release: 0 Summary: Distributed SQLite License: LGPL-3.0-only WITH LGPL-3.0-linking-exception @@ -80,7 +80,7 @@ %ldconfig_scriptlets -n %{lname} %check -make check %{?_smp_mflags} +%make_build check %files devel %license LICENSE ++++++ dqlite-1.18.5.tar.gz -> dqlite-1.18.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/configure.ac new/dqlite-1.18.6/configure.ac --- old/dqlite-1.18.5/configure.ac 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/configure.ac 2026-04-20 12:33:02.000000000 +0200 @@ -1,5 +1,5 @@ AC_PREREQ(2.60) -AC_INIT([libdqlite], [1.18.5], [https://github.com/canonical/dqlite]) +AC_INIT([libdqlite], [1.18.6], [https://github.com/canonical/dqlite]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([ac]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/include/dqlite.h new/dqlite-1.18.6/include/dqlite.h --- old/dqlite-1.18.5/include/dqlite.h 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/include/dqlite.h 2026-04-20 12:33:02.000000000 +0200 @@ -32,7 +32,7 @@ */ #define DQLITE_VERSION_MAJOR 1 #define DQLITE_VERSION_MINOR 18 -#define DQLITE_VERSION_RELEASE 5 +#define DQLITE_VERSION_RELEASE 6 #define DQLITE_VERSION_NUMBER \ (DQLITE_VERSION_MAJOR * 100 * 100 + DQLITE_VERSION_MINOR * 100 + \ DQLITE_VERSION_RELEASE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/src/server.c new/dqlite-1.18.6/src/server.c --- old/dqlite-1.18.5/src/server.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/src/server.c 2026-04-20 12:33:02.000000000 +0200 @@ -244,15 +244,10 @@ } domain = addr->sa_family; - fd = socket(domain, SOCK_STREAM, 0); + fd = socket(domain, SOCK_STREAM | SOCK_CLOEXEC, 0); if (fd == -1) { return DQLITE_ERROR; } - rv = fcntl(fd, FD_CLOEXEC); - if (rv != 0) { - close(fd); - return DQLITE_ERROR; - } if (domain == AF_INET || domain == AF_INET6) { int reuse = 1; @@ -872,6 +867,10 @@ { int rv; + if (!d->running) { + return DQLITE_MISUSE; + } + rv = uv_async_send(&d->handover); dqlite_assert(rv == 0); @@ -886,6 +885,10 @@ void *result; int rv; + if (!d->running) { + return DQLITE_MISUSE; + } + /* Prevents using @d multiple times from different contexts */ if (d->lock_fd == -EBADF) { return EBADF; @@ -1111,7 +1114,7 @@ struct client_node_info info; version_str = p; - nl = memchr(p, '\n', (size_t)(end - version_str)); + nl = (char*)memchr(p, '\n', (size_t)(end - version_str)); if (nl == NULL) { return 1; } @@ -1123,7 +1126,7 @@ while (p != end) { addr = p; - nl = memchr(p, '\n', (size_t)(end - addr)); + nl = (char*)memchr(p, '\n', (size_t)(end - addr)); if (nl == NULL) { return 1; } @@ -1131,7 +1134,7 @@ p = nl + 1; id_str = p; - nl = memchr(p, '\n', (size_t)(end - id_str)); + nl = (char*)memchr(p, '\n', (size_t)(end - id_str)); if (nl == NULL) { return 1; } @@ -1150,7 +1153,7 @@ } role_str = p; - nl = memchr(p, '\n', (size_t)(end - role_str)); + nl = (char*)memchr(p, '\n', (size_t)(end - role_str)); if (nl == NULL) { return 1; } @@ -1247,7 +1250,7 @@ unsigned long long id; version_str = p; - nl = memchr(version_str, '\n', (size_t)(end - version_str)); + nl = (char*)memchr(version_str, '\n', (size_t)(end - version_str)); if (nl == NULL) { return 1; } @@ -1258,7 +1261,7 @@ } addr = p; - nl = memchr(addr, '\n', (size_t)(end - addr)); + nl = (char*)memchr(addr, '\n', (size_t)(end - addr)); if (nl == NULL) { return 1; } @@ -1266,7 +1269,7 @@ p = nl + 1; id_str = p; - nl = memchr(id_str, '\n', (size_t)(end - id_str)); + nl = (char*)memchr(id_str, '\n', (size_t)(end - id_str)); if (nl == NULL) { return 1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/src/transport.c new/dqlite-1.18.6/src/transport.c --- old/dqlite-1.18.5/src/transport.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/src/transport.c 2026-04-20 12:33:02.000000000 +0200 @@ -223,7 +223,7 @@ } dqlite_assert(addr->sa_family == AF_INET || addr->sa_family == AF_INET6); - *fd = socket(addr->sa_family, SOCK_STREAM, 0); + *fd = socket(addr->sa_family, SOCK_STREAM | SOCK_CLOEXEC, 0); if (*fd == -1) { return RAFT_NOCONNECTION; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/test/integration/test_node.c new/dqlite-1.18.6/test/integration/test_node.c --- old/dqlite-1.18.5/test/integration/test_node.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/test/integration/test_node.c 2026-04-20 12:33:02.000000000 +0200 @@ -160,7 +160,43 @@ munit_assert_int(rv, ==, 0); rv = dqlite_node_stop(f->node); - munit_assert_int(rv, ==, EBADF); + munit_assert_int(rv, ==, DQLITE_MISUSE); + + return MUNIT_OK; +} + +TEST(node, stopBeforeStart, setUpLocal, tearDown, 0, node_params) +{ + struct fixture *f = data; + int rv; + + rv = dqlite_node_stop(f->node); + munit_assert_int(rv, ==, DQLITE_MISUSE); + + rv = dqlite_node_start(f->node); + munit_assert_int(rv, ==, DQLITE_OK); + rv = dqlite_node_stop(f->node); + munit_assert_int(rv, ==, DQLITE_OK); + + return MUNIT_OK; +} + +TEST(node, handoverBeforeStart, setUpLocal, tearDown, 0, node_params) +{ + struct fixture *f = data; + int rv; + + rv = dqlite_node_handover(f->node); + munit_assert_int(rv, ==, DQLITE_MISUSE); + + rv = dqlite_node_start(f->node); + munit_assert_int(rv, ==, DQLITE_OK); + + rv = dqlite_node_handover(f->node); + munit_assert_int(rv, ==, DQLITE_ERROR); // Can't handover in a single node cluster! + + rv = dqlite_node_stop(f->node); + munit_assert_int(rv, ==, DQLITE_OK); return MUNIT_OK; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/test/lib/endpoint.c new/dqlite-1.18.6/test/lib/endpoint.c --- old/dqlite-1.18.5/test/lib/endpoint.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/test/lib/endpoint.c 2026-04-20 12:33:02.000000000 +0200 @@ -144,13 +144,13 @@ } /* Accept the client connection. */ - fd = accept(e->fd, address, &size); + fd = accept4(e->fd, address, &size, SOCK_CLOEXEC); if (fd < 0) { /* Check if the endpoint has been closed, so this is benign. */ if (errno == EBADF || errno == EINVAL || errno == ENOTSOCK) { return -1; } - munit_errorf("accept(): %s", strerror(errno)); + munit_errorf("accept4(): %s", strerror(errno)); } /* Set non-blocking mode */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/test/lib/server.c new/dqlite-1.18.6/test/lib/server.c --- old/dqlite-1.18.5/test/lib/server.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/test/lib/server.c 2026-04-20 12:33:02.000000000 +0200 @@ -13,7 +13,7 @@ memset(&addr, 0, sizeof addr); addr.sun_family = AF_UNIX; strcpy(addr.sun_path + 1, address + 1); - *fd = socket(AF_UNIX, SOCK_STREAM, 0); + *fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); munit_assert_int(*fd, !=, -1); rv = connect(*fd, (struct sockaddr *)&addr, sizeof(sa_family_t) + strlen(address + 1) + 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dqlite-1.18.5/test/raft/lib/tcp.c new/dqlite-1.18.6/test/raft/lib/tcp.c --- old/dqlite-1.18.5/test/raft/lib/tcp.c 2026-01-26 09:03:58.000000000 +0100 +++ new/dqlite-1.18.6/test/raft/lib/tcp.c 2026-04-20 12:33:02.000000000 +0200 @@ -69,9 +69,9 @@ size = sizeof(address); - socket = accept(s->socket, (struct sockaddr *)&address, &size); + socket = accept4(s->socket, (struct sockaddr *)&address, &size, SOCK_CLOEXEC); if (socket < 0) { - munit_errorf("tcp server: accept(): %s", strerror(errno)); + munit_errorf("tcp server: accept4(): %s", strerror(errno)); } return socket; @@ -227,9 +227,9 @@ size = sizeof(address); - socket = accept(t->server.socket, (struct sockaddr *)&address, &size); + socket = accept4(t->server.socket, (struct sockaddr *)&address, &size, SOCK_CLOEXEC); if (socket < 0) { - munit_errorf("tcp: accept(): %s", strerror(errno)); + munit_errorf("tcp: accept4(): %s", strerror(errno)); } return socket;
