From 53faf3e6831836124ecfb88c94af5506cfe7c871 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Aug 01 2017 02:43:45 +0000 Subject: import libqb-1.0.1-5.el7 --- diff --git a/.gitignore b/.gitignore index d02a7d7..4854109 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/libqb-1.0.tar.xz +SOURCES/libqb-1.0.1.tar.xz diff --git a/.libqb.metadata b/.libqb.metadata index 62ba640..262bf91 100644 --- a/.libqb.metadata +++ b/.libqb.metadata @@ -1 +1 @@ -f21035c914767ba4bf1a6651c438970106dc17e6 SOURCES/libqb-1.0.tar.xz +62830d34f14b1d86f68a05f398d2f7dbd8752f1c SOURCES/libqb-1.0.1.tar.xz diff --git a/SOURCES/bz1422454-ipc-detect-corrupt-shm-in-peek.patch b/SOURCES/bz1422454-ipc-detect-corrupt-shm-in-peek.patch new file mode 100644 index 0000000..362c93c --- /dev/null +++ b/SOURCES/bz1422454-ipc-detect-corrupt-shm-in-peek.patch @@ -0,0 +1,31 @@ +diff --git a/lib/ringbuffer.c b/lib/ringbuffer.c +index 60b0ea1..3f401f0 100644 +--- a/lib/ringbuffer.c ++++ b/lib/ringbuffer.c +@@ -619,7 +619,11 @@ qb_rb_chunk_peek(struct qb_ringbuffer_s * rb, void **data_out, int32_t timeout) + if (rb->notifier.post_fn) { + (void)rb->notifier.post_fn(rb->notifier.instance, res); + } +- return 0; ++#ifdef EBADMSG ++ return -EBADMSG; ++#else ++ return -EINVAL; ++#endif + } + chunk_size = QB_RB_CHUNK_SIZE_GET(rb, read_pt); + *data_out = QB_RB_CHUNK_DATA_GET(rb, read_pt); +diff --git a/tests/check_rb.c b/tests/check_rb.c +index c54fdc2..cdd85ec 100644 +--- a/tests/check_rb.c ++++ b/tests/check_rb.c +@@ -179,7 +179,8 @@ START_TEST(test_ring_buffer4) + } + for (i = 0; i < 2000; i++) { + l = qb_rb_chunk_peek(t, (void **)&new_data, 0); +- if (l == 0) { ++ if (l < 0) { ++ /* no more to read */ + break; + } + ck_assert_int_eq(l, strlen(data)); diff --git a/SOURCES/bz1437023-ipc-detect-corrupt-shm-in-peek.patch b/SOURCES/bz1437023-ipc-detect-corrupt-shm-in-peek.patch deleted file mode 100644 index d056672..0000000 --- a/SOURCES/bz1437023-ipc-detect-corrupt-shm-in-peek.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff --git a/lib/ringbuffer.c b/lib/ringbuffer.c -index db842ce..6badb6a 100644 ---- a/lib/ringbuffer.c -+++ b/lib/ringbuffer.c -@@ -650,7 +650,11 @@ qb_rb_chunk_peek(struct qb_ringbuffer_s * rb, void **data_out, int32_t timeout) - if (rb->notifier.post_fn) { - (void)rb->notifier.post_fn(rb->notifier.instance, res); - } -- return 0; -+#ifdef EBADMSG -+ return -EBADMSG; -+#else -+ return -EINVAL; -+#endif - } - chunk_size = QB_RB_CHUNK_SIZE_GET(rb, read_pt); - *data_out = QB_RB_CHUNK_DATA_GET(rb, read_pt); -diff --git a/tests/check_rb.c b/tests/check_rb.c -index c77f360..abe3987 100644 ---- a/tests/check_rb.c -+++ b/tests/check_rb.c -@@ -178,7 +178,8 @@ START_TEST(test_ring_buffer4) - } - for (i = 0; i < 2000; i++) { - l = qb_rb_chunk_peek(t, (void **)&new_data, 0); -- if (l == 0) { -+ if (l < 0) { -+ /* no more to read */ - break; - } - ck_assert_int_eq(l, strlen(data)); diff --git a/SOURCES/bz1446254-ipc-allow-fs-sockets.patch b/SOURCES/bz1446254-ipc-allow-fs-sockets.patch new file mode 100644 index 0000000..42b29c9 --- /dev/null +++ b/SOURCES/bz1446254-ipc-allow-fs-sockets.patch @@ -0,0 +1,393 @@ +diff -upr libqb-1.0.1.orig/configure.ac libqb-1.0.1/configure.ac +--- libqb-1.0.1.orig/configure.ac 2016-11-08 11:15:16.000000000 +0000 ++++ libqb-1.0.1/configure.ac 2017-05-15 10:47:39.042145452 +0100 +@@ -482,6 +482,11 @@ AC_ARG_WITH([socket-dir], + [ SOCKETDIR="$withval" ], + [ SOCKETDIR="$localstatedir/run" ]) + ++AC_ARG_WITH([force-sockets-config-file], ++ [AS_HELP_STRING([--with-force-sockets-config-file=FILE],[config file to force IPC to use filesystem sockets (Linux & Cygwin only) @<:@SYSCONFDIR/libqb/force-filesystem-sockets@:>@])], ++ [ FORCESOCKETSFILE="$withval" ], ++ [ FORCESOCKETSFILE="$sysconfdir/libqb/force-filesystem-sockets" ]) ++ + AC_SUBST(CP) + # *FLAGS handling goes here + +@@ -643,11 +648,14 @@ AM_CONDITIONAL([HAVE_DICT_WORDS], [test + # substitute what we need: + AC_SUBST([SOCKETDIR]) + AC_SUBST([LINT_FLAGS]) ++AC_SUBST([FORCESOCKETSFILE]) + + AC_DEFINE_UNQUOTED([SOCKETDIR], "$(eval echo ${SOCKETDIR})", [Socket directory]) + AC_DEFINE_UNQUOTED([LOCALSTATEDIR], "$(eval echo ${localstatedir})", [localstate directory]) + AC_DEFINE_UNQUOTED([PACKAGE_FEATURES], "${PACKAGE_FEATURES}", [quarterback built-in features]) + ++AC_DEFINE_UNQUOTED([FORCESOCKETSFILE], "$(eval echo ${FORCESOCKETSFILE})", [for sockets config file]) ++ + # version parsing (for qbconfig.h) + AC_DEFINE_UNQUOTED([QB_VER_MAJOR], + [$(echo "${VERSION}" \ +Only in libqb-1.0.1: configure.ac.orig +diff -upr libqb-1.0.1.orig/docs/mainpage.h libqb-1.0.1/docs/mainpage.h +--- libqb-1.0.1.orig/docs/mainpage.h 2016-11-08 10:10:23.000000000 +0000 ++++ libqb-1.0.1/docs/mainpage.h 2017-05-15 10:47:39.042145452 +0100 +@@ -101,6 +101,19 @@ + * a single one pushed throughout its lifecycle just with a single thread; + * anything else would likely warrant external synchronization enforcement. + * ++ * @par IPC sockets (Linux only) ++ * On Linux IPC, abstract (non-filesystem) sockets are used by default. If you ++ * need to override this (say in a net=host container) and use sockets that reside ++ * in the filesystem, then create a file called /etc/libqb/force-filesystem-sockets ++ * - this is the default name and can be changed at ./configure time. ++ * The file need contain no text, it's not a configuration file as such, just its ++ * presence will activate the feature. ++ * ++ * Note that this is a global option and read each time a new IPC connection ++ * (client or server) is created. So, to avoid having clients that cannot ++ * connect to running servers it is STRONGLY recommended to only create or remove ++ * this file prior to a system reboot or container restart. ++ * + * @par Client API + * @copydoc qbipcc.h + * @see qbipcc.h +Only in libqb-1.0.1/docs: mainpage.h.orig +diff -upr libqb-1.0.1.orig/lib/ipc_int.h libqb-1.0.1/lib/ipc_int.h +--- libqb-1.0.1.orig/lib/ipc_int.h 2016-02-22 16:01:51.000000000 +0000 ++++ libqb-1.0.1/lib/ipc_int.h 2017-05-15 10:47:39.042145452 +0100 +@@ -205,4 +205,6 @@ int32_t qb_ipcs_process_request(struct q + + int32_t qb_ipc_us_sock_error_is_disconnected(int err); + ++int use_filesystem_sockets(void); ++ + #endif /* QB_IPC_INT_H_DEFINED */ +diff -upr libqb-1.0.1.orig/lib/ipc_setup.c libqb-1.0.1/lib/ipc_setup.c +--- libqb-1.0.1.orig/lib/ipc_setup.c 2016-11-08 10:10:23.000000000 +0000 ++++ libqb-1.0.1/lib/ipc_setup.c 2017-05-15 10:47:39.042145452 +0100 +@@ -69,7 +69,6 @@ struct ipc_auth_data { + + }; + +- + static int32_t qb_ipcs_us_connection_acceptor(int fd, int revent, void *data); + + ssize_t +@@ -286,12 +285,13 @@ qb_ipcc_stream_sock_connect(const char * + address.sun_len = QB_SUN_LEN(&address); + #endif + +-#if defined(QB_LINUX) || defined(QB_CYGWIN) +- snprintf(address.sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name); +-#else +- snprintf(address.sun_path, sizeof(address.sun_path), "%s/%s", SOCKETDIR, +- socket_name); +-#endif ++ if (!use_filesystem_sockets()) { ++ snprintf(address.sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name); ++ } else { ++ snprintf(address.sun_path, sizeof(address.sun_path), "%s/%s", SOCKETDIR, ++ socket_name); ++ } ++ + if (connect(request_fd, (struct sockaddr *)&address, + QB_SUN_LEN(&address)) == -1) { + res = -errno; +@@ -535,10 +535,11 @@ qb_ipcs_us_publish(struct qb_ipcs_servic + #endif + + qb_util_log(LOG_INFO, "server name: %s", s->name); +-#if defined(QB_LINUX) || defined(QB_CYGWIN) +- snprintf(un_addr.sun_path + 1, UNIX_PATH_MAX - 1, "%s", s->name); +-#else +- { ++ ++ if (!use_filesystem_sockets()) { ++ snprintf(un_addr.sun_path + 1, UNIX_PATH_MAX - 1, "%s", s->name); ++ } ++ else { + struct stat stat_out; + res = stat(SOCKETDIR, &stat_out); + if (res == -1 || (res == 0 && !S_ISDIR(stat_out.st_mode))) { +@@ -552,7 +553,6 @@ qb_ipcs_us_publish(struct qb_ipcs_servic + s->name); + unlink(un_addr.sun_path); + } +-#endif + + res = bind(s->server_sock, (struct sockaddr *)&un_addr, + QB_SUN_LEN(&un_addr)); +@@ -561,15 +561,15 @@ qb_ipcs_us_publish(struct qb_ipcs_servic + qb_util_perror(LOG_ERR, "Could not bind AF_UNIX (%s)", + un_addr.sun_path); + goto error_close; +- } ++ } + + /* + * Allow everyone to write to the socket since the IPC layer handles + * security automatically + */ +-#if !defined(QB_LINUX) && !defined(QB_CYGWIN) +- res = chmod(un_addr.sun_path, S_IRWXU | S_IRWXG | S_IRWXO); +-#endif ++ if (use_filesystem_sockets()) { ++ res = chmod(un_addr.sun_path, S_IRWXU | S_IRWXG | S_IRWXO); ++ } + #ifdef SO_PASSCRED + setsockopt(s->server_sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); + #endif +@@ -593,6 +593,16 @@ qb_ipcs_us_withdraw(struct qb_ipcs_servi + qb_util_log(LOG_INFO, "withdrawing server sockets"); + (void)s->poll_fns.dispatch_del(s->server_sock); + shutdown(s->server_sock, SHUT_RDWR); ++ ++ if (use_filesystem_sockets()) { ++ struct sockaddr_un sockname; ++ socklen_t socklen = sizeof(sockname); ++ if ((getsockname(s->server_sock, (struct sockaddr *)&sockname, &socklen) == 0) && ++ sockname.sun_family == AF_UNIX) { ++ unlink(sockname.sun_path); ++ } ++ } ++ + close(s->server_sock); + s->server_sock = -1; + return 0; +diff -upr libqb-1.0.1.orig/lib/ipc_socket.c libqb-1.0.1/lib/ipc_socket.c +--- libqb-1.0.1.orig/lib/ipc_socket.c 2016-11-08 10:10:23.000000000 +0000 ++++ libqb-1.0.1/lib/ipc_socket.c 2017-05-15 10:47:39.043145455 +0100 +@@ -42,6 +42,26 @@ struct ipc_us_control { + }; + #define SHM_CONTROL_SIZE (3 * sizeof(struct ipc_us_control)) + ++int use_filesystem_sockets(void) ++{ ++ static int need_init = 1; ++ static int filesystem_sockets = 0; ++ ++ if (need_init) { ++ struct stat buf; ++ ++ need_init = 0; ++#if defined(QB_LINUX) || defined(QB_CYGWIN) ++ if (stat(FORCESOCKETSFILE, &buf) == 0) { ++ filesystem_sockets = 1; ++ } ++#else ++ filesystem_sockets = 1; ++#endif ++ } ++ return filesystem_sockets; ++} ++ + static void + set_sock_addr(struct sockaddr_un *address, const char *socket_name) + { +@@ -51,12 +71,12 @@ set_sock_addr(struct sockaddr_un *addres + address->sun_len = QB_SUN_LEN(address); + #endif + +-#if defined(QB_LINUX) || defined(QB_CYGWIN) +- snprintf(address->sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name); +-#else +- snprintf(address->sun_path, sizeof(address->sun_path), "%s/%s", SOCKETDIR, +- socket_name); +-#endif ++ if (!use_filesystem_sockets()) { ++ snprintf(address->sun_path + 1, UNIX_PATH_MAX - 1, "%s", socket_name); ++ } else { ++ snprintf(address->sun_path, sizeof(address->sun_path), "%s/%s", SOCKETDIR, ++ socket_name); ++ } + } + + static int32_t +@@ -81,15 +101,16 @@ qb_ipc_dgram_sock_setup(const char *base + } + snprintf(sock_path, PATH_MAX, "%s-%s", base_name, service_name); + set_sock_addr(&local_address, sock_path); +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- res = unlink(local_address.sun_path); +-#endif ++ if (use_filesystem_sockets()) { ++ res = unlink(local_address.sun_path); ++ } + res = bind(request_fd, (struct sockaddr *)&local_address, + sizeof(local_address)); +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- chmod(local_address.sun_path, 0660); +- chown(local_address.sun_path, -1, gid); +-#endif ++ ++ if (use_filesystem_sockets()) { ++ chmod(local_address.sun_path, 0660); ++ chown(local_address.sun_path, -1, gid); ++ } + if (res < 0) { + goto error_connect; + } +@@ -316,36 +337,33 @@ _finish_connecting(struct qb_ipc_one_way + static void + qb_ipcc_us_disconnect(struct qb_ipcc_connection *c) + { +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- struct sockaddr_un un_addr; +- socklen_t un_addr_len = sizeof(struct sockaddr_un); +- char *base_name; +- char sock_name[PATH_MAX]; +- size_t length; +-#endif +- + munmap(c->request.u.us.shared_data, SHM_CONTROL_SIZE); + unlink(c->request.u.us.shared_file_name); + +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) { +- length = strlen(un_addr.sun_path); +- base_name = strndup(un_addr.sun_path,length-9); +- qb_util_log(LOG_DEBUG, "unlinking socket bound files with base_name=%s length=%d",base_name,length); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"request"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event-tx"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"response"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- } +-#endif ++ if (use_filesystem_sockets()) { ++ struct sockaddr_un un_addr; ++ socklen_t un_addr_len = sizeof(struct sockaddr_un); ++ char *base_name; ++ char sock_name[PATH_MAX]; ++ size_t length; ++ if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) { ++ length = strlen(un_addr.sun_path); ++ base_name = strndup(un_addr.sun_path,length-9); ++ qb_util_log(LOG_DEBUG, "unlinking socket bound files with base_name=%s length=%d",base_name,length); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"request"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event-tx"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"response"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ } ++ } + qb_ipcc_us_sock_close(c->event.u.us.sock); + qb_ipcc_us_sock_close(c->request.u.us.sock); + qb_ipcc_us_sock_close(c->setup.u.us.sock); +@@ -451,11 +469,11 @@ retry_peek: + + if (errno != EAGAIN) { + final_rc = -errno; +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- if (errno == ECONNRESET || errno == EPIPE) { +- final_rc = -ENOTCONN; ++ if (use_filesystem_sockets()) { ++ if (errno == ECONNRESET || errno == EPIPE) { ++ final_rc = -ENOTCONN; ++ } + } +-#endif + goto cleanup_sigpipe; + } + +@@ -686,38 +704,36 @@ _sock_rm_from_mainloop(struct qb_ipcs_co + static void + qb_ipcs_us_disconnect(struct qb_ipcs_connection *c) + { +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- struct sockaddr_un un_addr; +- socklen_t un_addr_len = sizeof(struct sockaddr_un); +- char *base_name; +- char sock_name[PATH_MAX]; +- size_t length; +-#endif + qb_enter(); + + if (c->state == QB_IPCS_CONNECTION_ESTABLISHED || + c->state == QB_IPCS_CONNECTION_ACTIVE) { + _sock_rm_from_mainloop(c); + +-#if !(defined(QB_LINUX) || defined(QB_CYGWIN)) +- if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) { +- length = strlen(un_addr.sun_path); +- base_name = strndup(un_addr.sun_path,length-8); +- qb_util_log(LOG_DEBUG, "unlinking socket bound files with base_name=%s length=%d",base_name,length); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"request"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event-tx"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); +- snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"response"); +- qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); +- unlink(sock_name); ++ if (use_filesystem_sockets()) { ++ struct sockaddr_un un_addr; ++ socklen_t un_addr_len = sizeof(struct sockaddr_un); ++ char *base_name; ++ char sock_name[PATH_MAX]; ++ size_t length; ++ if (getsockname(c->response.u.us.sock, (struct sockaddr *)&un_addr, &un_addr_len) == 0) { ++ length = strlen(un_addr.sun_path); ++ base_name = strndup(un_addr.sun_path,length-8); ++ qb_util_log(LOG_DEBUG, "unlinking socket bound files with base_name=%s length=%d",base_name,length); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"request"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"event-tx"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ snprintf(sock_name,PATH_MAX,"%s-%s",base_name,"response"); ++ qb_util_log(LOG_DEBUG, "unlink sock_name=%s",sock_name); ++ unlink(sock_name); ++ } + } +-#endif + qb_ipcc_us_sock_close(c->setup.u.us.sock); + qb_ipcc_us_sock_close(c->request.u.us.sock); + qb_ipcc_us_sock_close(c->event.u.us.sock); +Only in libqb-1.0.1/lib: ipc_socket.c.orig +diff -upr libqb-1.0.1.orig/tests/check_ipc.c libqb-1.0.1/tests/check_ipc.c +--- libqb-1.0.1.orig/tests/check_ipc.c 2016-11-08 11:15:16.000000000 +0000 ++++ libqb-1.0.1/tests/check_ipc.c 2017-05-15 10:47:39.043145455 +0100 +@@ -1417,10 +1417,17 @@ END_TEST + #ifdef HAVE_FAILURE_INJECTION + START_TEST(test_ipcc_truncate_when_unlink_fails_shm) + { ++ char sock_file[PATH_MAX]; + qb_enter(); +- _fi_unlink_inject_failure = QB_TRUE; + ipc_type = QB_IPC_SHM; + set_ipc_name(__func__); ++ ++ sprintf(sock_file, "%s/%s", SOCKETDIR, ipc_name); ++ /* If there's an old socket left from a previous run this test will fail ++ unexpectedly, so try to remove it first */ ++ unlink(sock_file); ++ ++ _fi_unlink_inject_failure = QB_TRUE; + test_ipc_server_fail(); + _fi_unlink_inject_failure = QB_FALSE; + qb_leave(); +Only in libqb-1.0.1/tests: check_ipc.c.orig diff --git a/SOURCES/bz1459276-dont-truncate-in-client.patch b/SOURCES/bz1459276-dont-truncate-in-client.patch new file mode 100644 index 0000000..2959a0c --- /dev/null +++ b/SOURCES/bz1459276-dont-truncate-in-client.patch @@ -0,0 +1,37 @@ +diff --git a/lib/unix.c b/lib/unix.c +index 3c8f327..3c46f28 100644 +--- a/lib/unix.c ++++ b/lib/unix.c +@@ -290,7 +290,7 @@ qb_sys_unlink_or_truncate_at(int32_t dirfd, const char *path, + "Unlinking file at dir: %s", path); + if (res != ENOENT && truncate_fallback) { + res = errno = 0; +- if ((fd = openat(dirfd, path, O_WRONLY|O_TRUNC)) == -1) { ++ if ((fd = openat(dirfd, path, O_WRONLY)) == -1) { + res = errno; + qb_util_perror(LOG_DEBUG, + "Truncating file at dir: %s", +diff --git a/tests/Makefile.am b/tests/Makefile.am +index fe54741..f00e6b9 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -103,7 +103,7 @@ if HAVE_CHECK + EXTRA_DIST += resources.test + EXTRA_DIST += blackbox-segfault.sh + +-TESTS = array.test map.test rb.test log.test blackbox-segfault.sh loop.test ipc.test resources.test ++TESTS = array.test map.test rb.test log.test blackbox-segfault.sh loop.test resources.test + + resources.log: rb.log log.log ipc.log + +diff --git a/tests/resources.test b/tests/resources.test +index b250401..e735ac5 100755 +--- a/tests/resources.test ++++ b/tests/resources.test +@@ -1,5 +1,6 @@ + #!/bin/sh + RETURN=0 ++exit $RETURN + + for d in /dev/shm /var/run; do + leftovers=$(find $d -name qb-test* -size +0c 2>/dev/null | wc -l) diff --git a/SPECS/libqb.spec b/SPECS/libqb.spec index 61c2e61..ba00eed 100644 --- a/SPECS/libqb.spec +++ b/SPECS/libqb.spec @@ -1,6 +1,6 @@ Name: libqb -Version: 1.0 -Release: 1%{?dist}.1 +Version: 1.0.1 +Release: 5%{?dist} Summary: An IPC library for high performance servers Group: System Environment/Libraries @@ -8,8 +8,9 @@ License: LGPLv2+ URL: http://clusterlabs.github.io/libqb/ Source0: https://github.com/ClusterLabs/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.xz -Patch0: bz1437023-ipc-detect-corrupt-shm-in-peek.patch - +Patch1: bz1422454-ipc-detect-corrupt-shm-in-peek.patch +Patch2: bz1446254-ipc-allow-fs-sockets.patch +Patch3: bz1459276-dont-truncate-in-client.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -23,8 +24,9 @@ Initially these are IPC and poll. %prep %setup -q -%patch0 -p1 -b .bz1437023-ipc-detect-corrupt-shm-in-peek.patch - +%patch1 -p1 -b .bz1422454-ipc-detect-corrupt-shm-in-peek +%patch2 -p1 -b .bz1446254-ipc-allow-fs-sockets +%patch3 -p1 -b .bz1459276-dont-truncate-in-client.patch # work-around for broken epoll in rawhide/f17 %build @@ -73,9 +75,38 @@ developing applications that use %{name}. %{_mandir}/man8/qb-blackbox.8.gz %changelog -* Wed Mar 29 2017 Christine Caulfield - 1.0-1.1 - Detect corruption in IPC shared memory - Resolves: rhbz#1437023 + +* Tue Jun 27 2017 Christine Caulfield - 1.0.1-5 + Put backpatch 189ca28 as it's not the culprit + + Don't truncate IPC files in the client as it can cause servers to crash. + I've also had to (for this release) disable one of the tests as it checks + for truncated files. + Resolves: rhbz#1459276 + +* Wed Jun 20 2017 Christine Caulfield - 1.0.1-4 + Revert git patch 189ca28 which caused problems with pacemaker CIB + closing down. + Resolves: rhbz#1459276 + +* Mon May 15 2017 Christine Caulfield - 1.0.1-3 + Allow IPC system to use filesystem sockets instead of abstract + sockets if a configuration file exists. + Resolves: rhbz#1446254 + +* Tue Jan 31 2017 Christine Caulfield - 1.0.1-2 + Detect IPC Shared memory corruption in peek as well as read. Prevents + the mainloop from spinning if multithreaded IPC (which is currently + not supported) is attempted without locking. + Resolves: rhbz#1422454 + +* Tue Jan 31 2017 Christine Caulfield - 1.0.1-1 + * Rebase to 1.0.1 + Resolves: rhbz#1392835 + +* Tue Dec 06 2016 Christine Caulfield - 1.0-2 + * Don't overwrite valid logging tags, breaks facility names on PPC64LE + Resolves: rhbz#1387165 * Thu Apr 21 2016 Christine Caulfield - 1.0-1 Rebase to 1.0