[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#984501: unblock: libqb/2.0.3-1



Control: tags -1 confirmed

On 2021-03-04 11:59:35 +0100, Ferenc Wágner wrote:
> Package: release.debian.org
> Severity: normal
> User: release.debian.org@packages.debian.org
> Usertags: unblock
> 
> Please unblock package libqb
> 
> Dear Release Team,
> 
> Upstream made a new minor release of libqb yesterday.  Since a new
> upload wouldn't migrate before the hard freeze with the current 10 day
> delay, I'm asking for an unblock in advance.
> 
> 2.0.3 contains a single new feature extending the API and ABI in a
> backwards-compatible way with a message-id parameter, which isn't the
> main reason for this request.
> 
> Included are two doxygen2man fixes, one of them already present in the
> current 2.0.2-1 package as a Debian patch, and another fixing a groff
> error in libqb's own manual pages.
> 
> The really interesting stuff is a memory safety fix in the internal
> strlcpy() implementation and a more thorough cleanup procedure, which
> avoids filling up /dev/shm with stale files in certain error and
> recovery conditions.
> 
> Locking errors (insufficient locking) are also fixed in the timer code,
> and the unit tests are extended appropriately.
> 
> The last fix corrects another unit test but entails no change in
> behaviour.
> 
> It would be possible to cherry pick the fix commits into Debian patches
> leaving out the final one adding the new API, but I'd prefer the
> cleaner solution of uploading 2.0.3 at this stage.

The changes look ok. Under the assumption that the upload happens soon,
please go ahead.

Cheers

> 
> debdiff against the package in testing:
> 
> diff -Nru libqb-2.0.2/ChangeLog libqb-2.0.3/ChangeLog
> --- libqb-2.0.2/ChangeLog	2020-12-03 14:07:32.000000000 +0100
> +++ libqb-2.0.3/ChangeLog	2021-03-03 09:34:26.000000000 +0100
> @@ -1,3 +1,57 @@
> +2021-03-03  Christine Caulfield  <ccaulfie@redhat.com>
> +
> +	release: bump library version for 2.0.3 release
> +
> +2021-03-01  Aleksei Burlakov  <alex_burlakov@gmx.de>
> +	    root  <Aleksei Burlakov>
> +
> +	syslog: Add a message-id parameter for messages (#433)
> +	The message-id parameter will enable systemd catalogs.
> +	To enable message-id's the libqb should be configured with the
> +	 --enable-systemd-journal option.
> +
> +2021-02-08  Chrissie Caulfield  <ccaulfie@redhat.com>
> +
> +	tests: Fix up resources.test (#435)
> +	resources.test has not checked the right filenames for a while.
> +	Fix this, and also make sure we don't count (but remove) the dlock
> +	test files.
> +
> +	timers: Add some locking (#436)
> +	Fix several locking issues reported by helgrind
> +
> +2021-01-25  Chrissie Caulfield  <ccaulfie@redhat.com>
> +
> +	ipcc: Have a few goes at tidying up after a dead server (#434)
> +	This is an attempt to make sure that /dev/shm is cleaned up when a
> +	server exits unexpectedly. Normally it's the server's responsibility
> +	to tidy up sockets, but if it crashes or is killed with SIGKILL then
> +	the client (us) makes a reasonable attempt to tidy up the server sockets
> +	we have connected. The extra delay here just gives the server chance to
> +	disappear fully. As a client we can get here pretty quickly but shutting
> +	down a large server may take a little longer even when SIGKILLed.
> +	The 1/100th of a second is an arbitrary delay (of course) but seems to
> +	catch most servers in 2 tries or less.
> +
> +2021-01-13  Chrissie Caulfield  <ccaulfie@redhat.com>
> +
> +	strlcpy: Check for maxlen underflow (#432)
> +	* strlcpy: Check for maxlen underflow
> +	https://github.com/ClusterLabs/libqb/issues/429
> +	* Always terminate the string if maxlen is > 0
> +
> +2021-01-07  Chrissie Caulfield  <ccaulfie@redhat.com>
> +
> +	doxygen2man: fix printing of lines starting with '.' (#431)
> +	if a line starts with a '.' (eg the '...' in qbarray.h) then
> +	nroff thinks it's looking for a macro called '..'.
> +	The easiest solution is to add a dummy format at the start of the line
> +	(just adding \ seems not to work).
> +
> +2021-01-04  wferi  <wferi@debian.org>
> +
> +	doxygen2man: ignore all-whitespace brief descriptions (#430)
> +
>  2020-12-03  Christine Caulfield  <ccaulfie@redhat.com>
>  
>  	lib: Update library version for 2.0.2 release
> diff -Nru libqb-2.0.2/configure libqb-2.0.3/configure
> --- libqb-2.0.2/configure	2020-12-03 14:07:14.000000000 +0100
> +++ libqb-2.0.3/configure	2021-03-03 09:34:07.000000000 +0100
> @@ -1,6 +1,6 @@
>  #! /bin/sh
>  # Guess values for system-dependent variables and create Makefiles.
> -# Generated by GNU Autoconf 2.69 for libqb 2.0.2.
> +# Generated by GNU Autoconf 2.69 for libqb 2.0.3.
>  #
>  # Report bugs to <developers@clusterlabs.org>.
>  #
> @@ -590,8 +590,8 @@
>  # Identity of this package.
>  PACKAGE_NAME='libqb'
>  PACKAGE_TARNAME='libqb'
> -PACKAGE_VERSION='2.0.2'
> -PACKAGE_STRING='libqb 2.0.2'
> +PACKAGE_VERSION='2.0.3'
> +PACKAGE_STRING='libqb 2.0.3'
>  PACKAGE_BUGREPORT='developers@clusterlabs.org'
>  PACKAGE_URL=''
>  
> @@ -1426,7 +1426,7 @@
>    # Omit some internal or obsolete options to make the list less imposing.
>    # This message is too long to be a string in the A/UX 3.1 sh.
>    cat <<_ACEOF
> -\`configure' configures libqb 2.0.2 to adapt to many kinds of systems.
> +\`configure' configures libqb 2.0.3 to adapt to many kinds of systems.
>  
>  Usage: $0 [OPTION]... [VAR=VALUE]...
>  
> @@ -1496,7 +1496,7 @@
>  
>  if test -n "$ac_init_help"; then
>    case $ac_init_help in
> -     short | recursive ) echo "Configuration of libqb 2.0.2:";;
> +     short | recursive ) echo "Configuration of libqb 2.0.3:";;
>     esac
>    cat <<\_ACEOF
>  
> @@ -1649,7 +1649,7 @@
>  test -n "$ac_init_help" && exit $ac_status
>  if $ac_init_version; then
>    cat <<\_ACEOF
> -libqb configure 2.0.2
> +libqb configure 2.0.3
>  generated by GNU Autoconf 2.69
>  
>  Copyright (C) 2012 Free Software Foundation, Inc.
> @@ -2426,7 +2426,7 @@
>  This file contains any messages produced by compilers while
>  running configure, to aid debugging if configure makes a mistake.
>  
> -It was created by libqb $as_me 2.0.2, which was
> +It was created by libqb $as_me 2.0.3, which was
>  generated by GNU Autoconf 2.69.  Invocation command line was
>  
>    $ $0 $@
> @@ -4666,7 +4666,7 @@
>  
>  # Define the identity of the package.
>   PACKAGE='libqb'
> - VERSION='2.0.2'
> + VERSION='2.0.3'
>  
>  
>  cat >>confdefs.h <<_ACEOF
> @@ -23074,7 +23074,7 @@
>  # report actual input values of CONFIG_FILES etc. instead of their
>  # values after options handling.
>  ac_log="
> -This file was extended by libqb $as_me 2.0.2, which was
> +This file was extended by libqb $as_me 2.0.3, which was
>  generated by GNU Autoconf 2.69.  Invocation command line was
>  
>    CONFIG_FILES    = $CONFIG_FILES
> @@ -23140,7 +23140,7 @@
>  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
>  ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
>  ac_cs_version="\\
> -libqb config.status 2.0.2
> +libqb config.status 2.0.3
>  configured by $0, generated by GNU Autoconf 2.69,
>    with options \\"\$ac_cs_config\\"
>  
> diff -Nru libqb-2.0.2/debian/changelog libqb-2.0.3/debian/changelog
> --- libqb-2.0.2/debian/changelog	2020-12-26 16:07:32.000000000 +0100
> +++ libqb-2.0.3/debian/changelog	2021-03-04 06:11:31.000000000 +0100
> @@ -1,3 +1,11 @@
> +libqb (2.0.3-1) unstable; urgency=medium
> +
> +  * [f0b428b] New upstream release (2.0.3)
> +  * [ff0eed7] Delete upstream patch, refresh the rest
> +  * [bee0959] Acknowledge new symbols
> +
> + -- Ferenc Wágner <wferi@debian.org>  Thu, 04 Mar 2021 06:11:31 +0100
> +
>  libqb (2.0.2-1) unstable; urgency=medium
>  
>    * [afb0870] libqb-tools took over qb-blackbox from libqb-dev (<< 2)
> diff -Nru libqb-2.0.2/debian/libqb100.symbols libqb-2.0.3/debian/libqb100.symbols
> --- libqb-2.0.2/debian/libqb100.symbols	2020-12-25 16:19:24.000000000 +0100
> +++ libqb-2.0.3/debian/libqb100.symbols	2021-03-04 06:10:02.000000000 +0100
> @@ -91,6 +91,7 @@
>   qb_log_blackbox_open@Base 2.0.1
>   qb_log_blackbox_print_from_file@Base 2.0.1
>   qb_log_blackbox_write_to_file@Base 2.0.1
> + qb_log_callsite_get2@Base 2.0.3
>   qb_log_callsite_get@Base 2.0.1
>   qb_log_callsites_dump@Base 2.0.1
>   qb_log_callsites_register@Base 2.0.1
> @@ -114,6 +115,7 @@
>   qb_log_format_init@Base 2.0.1
>   qb_log_format_set@Base 2.0.1
>   qb_log_from_external_source@Base 2.0.1
> + qb_log_from_external_source_va2@Base 2.0.3
>   qb_log_from_external_source_va@Base 2.0.1
>   qb_log_init@Base 2.0.1
>   qb_log_priority2str@Base 2.0.1
> diff -Nru libqb-2.0.2/debian/patches/doxygen2man-ignore-all-whitespace-brief-description.patch libqb-2.0.3/debian/patches/doxygen2man-ignore-all-whitespace-brief-description.patch
> --- libqb-2.0.2/debian/patches/doxygen2man-ignore-all-whitespace-brief-description.patch	2020-12-26 16:07:22.000000000 +0100
> +++ libqb-2.0.3/debian/patches/doxygen2man-ignore-all-whitespace-brief-description.patch	1970-01-01 01:00:00.000000000 +0100
> @@ -1,21 +0,0 @@
> -From: =?utf-8?q?Ferenc_W=C3=A1gner?= <wferi@debian.org>
> -Date: Sat, 26 Dec 2020 16:06:28 +0100
> -Subject: doxygen2man: ignore all-whitespace brief description
> -
> ----
> - doxygen2man/doxygen2man.c | 2 +-
> - 1 file changed, 1 insertion(+), 1 deletion(-)
> -
> -diff --git a/doxygen2man/doxygen2man.c b/doxygen2man/doxygen2man.c
> -index f7973fd..c1cb438 100644
> ---- a/doxygen2man/doxygen2man.c
> -+++ b/doxygen2man/doxygen2man.c
> -@@ -756,7 +756,7 @@ static void print_manpage(char *name, char *def, char *brief, char *args, char *
> - 	fprintf(manfile, ".TH %s %s %s \"%s\" \"%s\"\n", allcaps(name), man_section, dateptr, package_name, header);
> - 
> - 	fprintf(manfile, ".SH NAME\n");
> --	if (brief) {
> -+	if (brief && not_all_whitespace(brief)) {
> - 		fprintf(manfile, "%s \\- %s\n", name, brief);
> - 	} else {
> - 		fprintf(manfile, "%s\n", name);
> diff -Nru libqb-2.0.2/debian/patches/Fix-typos-and-inconsistencies-in-doxygen2man-help-text.patch libqb-2.0.3/debian/patches/Fix-typos-and-inconsistencies-in-doxygen2man-help-text.patch
> --- libqb-2.0.2/debian/patches/Fix-typos-and-inconsistencies-in-doxygen2man-help-text.patch	2020-12-26 16:06:56.000000000 +0100
> +++ libqb-2.0.3/debian/patches/Fix-typos-and-inconsistencies-in-doxygen2man-help-text.patch	2021-03-04 05:50:39.000000000 +0100
> @@ -7,10 +7,10 @@
>   1 file changed, 9 insertions(+), 9 deletions(-)
>  
>  diff --git a/doxygen2man/doxygen2man.c b/doxygen2man/doxygen2man.c
> -index d794b78..f7973fd 100644
> +index dc96deb..4af9d38 100644
>  --- a/doxygen2man/doxygen2man.c
>  +++ b/doxygen2man/doxygen2man.c
> -@@ -1109,7 +1109,7 @@ static void usage(char *name)
> +@@ -1116,7 +1116,7 @@ static void usage(char *name)
>   	printf(" using the name of the generated .xml file. This file will usually be called\n");
>   	printf(" something like <include-file>_8h.xml, eg qbipcs_8h.xml\n");
>   	printf("\n");
> @@ -19,7 +19,7 @@
>   	printf(" would do with any other man page.\n");
>   	printf("\n");
>   	printf("       -a            Print ASCII dump of man pages to stdout\n");
> -@@ -1117,18 +1117,18 @@ static void usage(char *name)
> +@@ -1124,18 +1124,18 @@ static void usage(char *name)
>   	printf("       -P            Print PARAMS section\n");
>   	printf("       -g            Print general man page for the whole header file\n");
>   	printf("       -c            Use the Copyright date from the header file (if one can be found)\n");
> diff -Nru libqb-2.0.2/debian/patches/series libqb-2.0.3/debian/patches/series
> --- libqb-2.0.2/debian/patches/series	2020-12-26 16:07:22.000000000 +0100
> +++ libqb-2.0.3/debian/patches/series	2021-03-04 05:50:39.000000000 +0100
> @@ -3,4 +3,3 @@
>  tests-always-run-the-SHM-suite-just-expect-failures.patch
>  hurd-the-socket-tests-are-expected-to-fail.patch
>  Fix-typos-and-inconsistencies-in-doxygen2man-help-text.patch
> -doxygen2man-ignore-all-whitespace-brief-description.patch
> diff -Nru libqb-2.0.2/doxygen2man/doxygen2man.c libqb-2.0.3/doxygen2man/doxygen2man.c
> --- libqb-2.0.2/doxygen2man/doxygen2man.c	2020-11-13 16:31:46.000000000 +0100
> +++ libqb-2.0.3/doxygen2man/doxygen2man.c	2021-01-07 10:09:05.000000000 +0100
> @@ -222,7 +222,14 @@
>  			buffer = cstring_append_chars(buffer, " ");
>  		}
>  		if (strcmp((char*)sub_tag->name, "text") == 0) {
> -			buffer = cstring_append_chars(buffer, (char*)sub_tag->content);
> +			// If the line starts with a dot then escape the first one to
> +			// stop nroff thinking it's a macro
> +			char *tmp = (char*)sub_tag->content;
> +			if (tmp[0] == '.') {
> +				buffer = cstring_append_chars(buffer, (char*)"\\[char46]");
> +				tmp += 1;
> +			}
> +			buffer = cstring_append_chars(buffer, tmp);
>  		}
>  		if (strcmp((char*)sub_tag->name, "ref") == 0) {
>  			// Handled by the child recusion below
> @@ -756,7 +763,7 @@
>  	fprintf(manfile, ".TH %s %s %s \"%s\" \"%s\"\n", allcaps(name), man_section, dateptr, package_name, header);
>  
>  	fprintf(manfile, ".SH NAME\n");
> -	if (brief) {
> +	if (brief && not_all_whitespace(brief)) {
>  		fprintf(manfile, "%s \\- %s\n", name, brief);
>  	} else {
>  		fprintf(manfile, "%s\n", name);
> diff -Nru libqb-2.0.2/include/qb/qbconfig.h libqb-2.0.3/include/qb/qbconfig.h
> --- libqb-2.0.2/include/qb/qbconfig.h	2020-12-03 14:07:31.000000000 +0100
> +++ libqb-2.0.3/include/qb/qbconfig.h	2021-03-03 09:34:24.000000000 +0100
> @@ -36,7 +36,7 @@
>     but that was only introduced after v1.0.2 */
>  #define QB_VER_MAJOR 2
>  #define QB_VER_MINOR 0
> -#define QB_VER_MICRO 2
> +#define QB_VER_MICRO 3
>  #define QB_VER_REST ""
>  
>  #define QB_VER_STR   \
> diff -Nru libqb-2.0.2/include/qb/qblog.h libqb-2.0.3/include/qb/qblog.h
> --- libqb-2.0.2/include/qb/qblog.h	2020-10-14 11:43:49.000000000 +0200
> +++ libqb-2.0.3/include/qb/qblog.h	2021-03-01 16:59:42.000000000 +0100
> @@ -249,6 +249,7 @@
>  
>  /**
>   * An instance of this structure is created for each log message
> + * with the message-id
>   */
>  struct qb_log_callsite {
>  	const char *function;
> @@ -258,6 +259,7 @@
>  	uint32_t lineno;
>  	uint32_t targets;
>  	uint32_t tags;
> +	const char *message_id;
>  } __attribute__((aligned(8)));
>  
>  typedef void (*qb_log_filter_fn)(struct qb_log_callsite * cs);
> @@ -319,6 +321,39 @@
>  					    uint32_t lineno,
>  					    uint32_t tags);
>  
> +/**
> + * Get or create a callsite at the given position.
> + * The same that qb_log_callsite_get but with the
> + * message_id parameter.
> + *
> + * The result can then be passed into qb_log_real_()
> + *
> + * @param message_id in the systemd catalog or NULL
> + * @param function originating function name
> + * @param filename originating filename
> + * @param format format string
> + * @param priority this takes syslog priorities.
> + * @param lineno file line number
> + * @param tags the tag
> + */
> +struct qb_log_callsite* qb_log_callsite_get2(const char *message_id,
> +					    const char *function,
> +					    const char *filename,
> +					    const char *format,
> +					    uint8_t priority,
> +					    uint32_t lineno,
> +					    uint32_t tags);
> +
> +void qb_log_from_external_source_va2(const char *message_id,
> +				    const char *function,
> +				    const char *filename,
> +				    const char *format,
> +				    uint8_t priority,
> +				    uint32_t lineno,
> +				    uint32_t tags,
> +				    va_list ap)
> +	__attribute__ ((format (printf, 4, 0)));
> +
>  void qb_log_from_external_source_va(const char *function,
>  				    const char *filename,
>  				    const char *format,
> @@ -332,6 +367,7 @@
>   * This is the function to generate a log message if you want to
>   * manually add tags.
>   *
> + * @param message_id in the systemd catalog or NULL
>   * @param priority this takes syslog priorities.
>   * @param tags this is a uint32_t that you can use with
>   *             qb_log_tags_stringify_fn_set() to "tag" a log message
> @@ -340,13 +376,37 @@
>   * @param fmt usual printf style format specifiers
>   * @param args usual printf style args
>   */
> -#define qb_logt(priority, tags, fmt, args...) do {	\
> +#define qb_logt2(message_id, priority, tags, fmt, args...) do {	\
>  	struct qb_log_callsite* descriptor_pt =		\
> -	qb_log_callsite_get(__func__, __FILE__, fmt,	\
> +	qb_log_callsite_get2(message_id, __func__, __FILE__, fmt,	\
>  			    priority, __LINE__, tags);	\
>  	qb_log_real_(descriptor_pt, ##args);		\
>      } while(0)
>  
> +/**
> + * This is the function to generate a log message if you want to
> + * manually add tags.
> + *
> + * @param priority this takes syslog priorities.
> + * @param tags this is a uint32_t that you can use with
> + *             qb_log_tags_stringify_fn_set() to "tag" a log message
> + *             with a feature or sub-system then you can use "%g"
> + *             in the format specifer to print it out.
> + * @param fmt usual printf style format specifiers
> + * @param args usual printf style args
> + */
> +#define qb_logt(priority, tags, fmt, args...) qb_logt2(NULL, priority, tags, fmt, ##args)
> +
> +
> +/**
> + * This is the main function to generate a log message.
> + *
> + * @param message_id in the systemd catalog or NULL
> + * @param priority this takes syslog priorities.
> + * @param fmt usual printf style format specifiers
> + * @param args usual printf style args
> + */
> +#define qb_log2(message_id, priority, fmt, args...) qb_logt2(message_id, priority, 0, fmt, ##args)
>  
>  /**
>   * This is the main function to generate a log message.
> diff -Nru libqb-2.0.2/include/tlist.h libqb-2.0.3/include/tlist.h
> --- libqb-2.0.2/include/tlist.h	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/include/tlist.h	2021-02-08 12:01:42.000000000 +0100
> @@ -36,6 +36,7 @@
>  
>  struct timerlist {
>  	struct qb_list_head timer_head;
> +	pthread_mutex_t list_mutex;
>  };
>  
>  struct timerlist_timer {
> @@ -50,16 +51,20 @@
>  static inline void timerlist_init(struct timerlist *timerlist)
>  {
>  	qb_list_init(&timerlist->timer_head);
> +	pthread_mutex_init(&timerlist->list_mutex, NULL);
>  	timerlist_hertz = qb_util_nano_monotonic_hz();
>  }
>  
> -static inline void timerlist_add(struct timerlist *timerlist,
> +static inline int32_t timerlist_add(struct timerlist *timerlist,
>  				 struct timerlist_timer *timer)
>  {
>  	struct qb_list_head *timer_list = 0;
>  	struct timerlist_timer *timer_from_list;
>  	int32_t found = QB_FALSE;
>  
> +	if (pthread_mutex_lock(&timerlist->list_mutex)) {
> +		return -errno;
> +	}
>  	qb_list_for_each(timer_list, &timerlist->timer_head) {
>  
>  		timer_from_list = qb_list_entry(timer_list,
> @@ -74,6 +79,8 @@
>  	if (found == QB_FALSE) {
>  		qb_list_add_tail(&timer->list, &timerlist->timer_head);
>  	}
> +	pthread_mutex_unlock(&timerlist->list_mutex);
> +	return 0;
>  }
>  
>  static inline int32_t timerlist_add_duration(struct timerlist *timerlist,
> @@ -82,6 +89,7 @@
>  					 uint64_t nano_duration,
>  					 timer_handle * handle)
>  {
> +	int res;
>  	struct timerlist_timer *timer;
>  
>  	timer =
> @@ -95,7 +103,11 @@
>  	timer->data = data;
>  	timer->timer_fn = timer_fn;
>  	timer->handle_addr = handle;
> -	timerlist_add(timerlist, timer);
> +	res = timerlist_add(timerlist, timer);
> +	if (res) {
> +		free(timer);
> +		return res;
> +	}
>  
>  	*handle = timer;
>  	return (0);
> diff -Nru libqb-2.0.2/lib/ipc_shm.c libqb-2.0.3/lib/ipc_shm.c
> --- libqb-2.0.2/lib/ipc_shm.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/ipc_shm.c	2021-01-25 13:19:22.000000000 +0100
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (C) 2010 Red Hat, Inc.
> + * Copyright (C) 2010-2021 Red Hat, Inc.
>   *
>   * Author: Angus Salkeld <asalkeld@redhat.com>
>   *
> @@ -39,12 +39,43 @@
>  qb_ipcc_shm_disconnect(struct qb_ipcc_connection *c)
>  {
>  	void (*rb_destructor)(struct qb_ringbuffer_s *);
> -
>  	rb_destructor = qb_rb_close;
> -	if (!c->is_connected && (!c->server_pid || (kill(c->server_pid, 0) == -1 && errno == ESRCH))) {
> +
> +	/* This is an attempt to make sure that /dev/shm is cleaned up when a
> +	 * server exits unexpectedly. Normally it's the server's responsibility
> +	 * to tidy up sockets, but if it crashes or is killed with SIGKILL then
> +	 * the client (us) makes a reasonable attempt to tidy up the server sockets
> +	 * we have connected. The extra delay here just gives the server chance to
> +	 * disappear fully. As a client we can get here pretty quickly but shutting
> +	 * down a large server may take a little longer even when SIGKILLed.
> +	 * The 1/100th of a second is an arbitrary delay (of course) but seems to
> +	 * catch most servers in 2 tries or less.
> +	 */
> +	if (!c->is_connected && c->server_pid) {
> +		int attempt = 0;
> +		while (attempt++ <= 3 && rb_destructor == qb_rb_close) {
> +			if (kill(c->server_pid, 0) == -1 && errno == ESRCH) {
> +				rb_destructor = qb_rb_force_close;
> +			} else {
> +				struct timespec ts = {0, 10*QB_TIME_NS_IN_MSEC};
> +				struct timespec ts_left = {0, 0};
> +				nanosleep(&ts, &ts_left);
> +			}
> +		}
> +	}
> +	/*
> +	 * On FreeBSD we don't have a server PID so tidy up anyway. The
> +	 * server traps SIGBUS when cleaning up so will cope fine.
> +	 */
> +	if (!c->is_connected && !c->server_pid) {
>  		rb_destructor = qb_rb_force_close;
>  	}
>  
> +	if (rb_destructor == qb_rb_force_close) {
> +		qb_util_log(LOG_DEBUG,
> +			    "FORCE closing server sockets\n");
> +	}
> +
>  	qb_ipcc_us_sock_close(c->setup.u.us.sock);
>  
>  	rb_destructor(qb_rb_lastref_and_ret(&c->request.u.shm.rb));
> diff -Nru libqb-2.0.2/lib/log.c libqb-2.0.3/lib/log.c
> --- libqb-2.0.2/lib/log.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/log.c	2021-03-01 16:59:42.000000000 +0100
> @@ -317,7 +317,8 @@
>  }
>  
>  struct qb_log_callsite*
> -qb_log_callsite_get(const char *function,
> +qb_log_callsite_get2(const char *message_id,
> +		    const char *function,
>  		    const char *filename,
>  		    const char *format,
>  		    uint8_t priority,
> @@ -335,8 +336,9 @@
>  		return NULL;
>  	}
>  
> -	cs = qb_log_dcs_get(&new_dcs, function, filename,
> -			    format, priority, lineno, tags);
> +	cs = qb_log_dcs_get(&new_dcs, message_id, function, filename,
> + 			    format, priority, lineno, tags);
> +
>  	if (cs == NULL) {
>  		return NULL;
>  	}
> @@ -380,8 +382,21 @@
>  	return cs;
>  }
>  
> +struct qb_log_callsite*
> +qb_log_callsite_get(const char *function,
> +		    const char *filename,
> +		    const char *format,
> +		    uint8_t priority,
> +		    uint32_t lineno,
> +		    uint32_t tags)
> +{
> +	return qb_log_callsite_get2(NULL, function, filename, format,
> +				    priority, lineno, tags);
> +}
> +
>  void
> -qb_log_from_external_source_va(const char *function,
> +qb_log_from_external_source_va2(const char *message_id,
> +			       const char *function,
>  			       const char *filename,
>  			       const char *format,
>  			       uint8_t priority,
> @@ -393,12 +408,23 @@
>  		return;
>  	}
>  
> -	cs = qb_log_callsite_get(function, filename,
> +	cs = qb_log_callsite_get2(message_id, function, filename,
>  				 format, priority, lineno, tags);
>  	qb_log_real_va_(cs, ap);
>  }
>  
>  void
> +qb_log_from_external_source_va(const char *function,
> +			       const char *filename,
> +			       const char *format,
> +			       uint8_t priority,
> +			       uint32_t lineno, uint32_t tags, va_list ap)
> +{
> +	qb_log_from_external_source_va2(NULL, function, filename,
> +				   format, priority, lineno, tags, ap);
> +}
> +
> +void
>  qb_log_from_external_source(const char *function,
>  			    const char *filename,
>  			    const char *format,
> diff -Nru libqb-2.0.2/lib/log_dcs.c libqb-2.0.3/lib/log_dcs.c
> --- libqb-2.0.2/lib/log_dcs.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/log_dcs.c	2021-03-01 16:59:42.000000000 +0100
> @@ -58,7 +58,8 @@
>  }
>  
>  static struct qb_log_callsite *
> -_log_dcs_new_cs(const char *function,
> +_log_dcs_new_cs(const char *message_id,
> +		const char *function,
>  		const char *filename,
>  		const char *format,
>  		uint8_t priority, uint32_t lineno, uint32_t tags)
> @@ -70,6 +71,7 @@
>  	assert(rc == 0);
>  	assert(cs != NULL);
>  
> +	cs->message_id = message_id ? strdup(message_id) : NULL;
>  	cs->function = strdup(function);
>  	cs->filename = strdup(filename);
>  	cs->format = strdup(format);
> @@ -82,6 +84,7 @@
>  
>  struct qb_log_callsite *
>  qb_log_dcs_get(int32_t * newly_created,
> +	       const char *message_id,
>  	       const char *function,
>  	       const char *filename,
>  	       const char *format,
> @@ -120,6 +123,7 @@
>  	(void)qb_thread_lock(arr_next_lock);
>  	if (csl_head->cs &&
>  		priority == csl_head->cs->priority &&
> +		(message_id ? (strcmp(message_id, csl_head->cs->message_id) == 0) : 1) &&
>  		strcmp(safe_filename, csl_head->cs->filename) == 0 &&
>  		strcmp(safe_format, csl_head->cs->format) == 0) {
>  		(void)qb_thread_unlock(arr_next_lock);
> @@ -130,7 +134,8 @@
>  	 * so we will either have to create it or go through a list
>  	 */
>  	if (csl_head->cs == NULL) {
> -		csl_head->cs = _log_dcs_new_cs(safe_function, safe_filename, safe_format,
> +		csl_head->cs = _log_dcs_new_cs(message_id, safe_function,
> +					       safe_filename, safe_format,
>  					       priority, lineno, tags);
>  		cs = csl_head->cs;
>  		csl_head->next = NULL;
> @@ -152,7 +157,8 @@
>  			if (csl == NULL) {
>  				goto cleanup;
>  			}
> -			csl->cs = _log_dcs_new_cs(safe_function, safe_filename, safe_format,
> +			csl->cs = _log_dcs_new_cs(message_id, safe_function,
> +						  safe_filename, safe_format,
>  						  priority, lineno, tags);
>  			csl->next = NULL;
>  			csl_last->next = csl;
> diff -Nru libqb-2.0.2/lib/log_int.h libqb-2.0.3/lib/log_int.h
> --- libqb-2.0.2/lib/log_int.h	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/log_int.h	2021-03-01 16:59:42.000000000 +0100
> @@ -125,6 +125,7 @@
>  void qb_log_dcs_init(void);
>  void qb_log_dcs_fini(void);
>  struct qb_log_callsite *qb_log_dcs_get(int32_t *newly_created,
> +				       const char *message_id,
>  				       const char *function,
>  				       const char *filename,
>  				       const char *format,
> diff -Nru libqb-2.0.2/lib/log_syslog.c libqb-2.0.3/lib/log_syslog.c
> --- libqb-2.0.2/lib/log_syslog.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/log_syslog.c	2021-03-01 16:59:42.000000000 +0100
> @@ -64,13 +64,24 @@
>  	}
>  #ifdef USE_JOURNAL
>  	if (t->use_journal) {
> -		sd_journal_send("PRIORITY=%d", final_priority,
> +		if (cs->message_id) {
> +			sd_journal_send("MESSAGE_ID=%s", cs->message_id,
> +				"PRIORITY=%d", final_priority,
>  				"CODE_LINE=%d", cs->lineno,
>  				"CODE_FILE=%s", cs->filename,
>  				"CODE_FUNC=%s", cs->function,
>  				"SYSLOG_IDENTIFIER=%s", t->name,
>  				"MESSAGE=%s", output_buffer,
>  				NULL);
> +		} else {
> +			sd_journal_send("PRIORITY=%d", final_priority,
> +				"CODE_LINE=%d", cs->lineno,
> +				"CODE_FILE=%s", cs->filename,
> +				"CODE_FUNC=%s", cs->function,
> +				"SYSLOG_IDENTIFIER=%s", t->name,
> +				"MESSAGE=%s", output_buffer,
> +				NULL);
> +		}
>  	} else {
>  #endif
>  		syslog(final_priority, "%s", output_buffer);
> diff -Nru libqb-2.0.2/lib/loop_timerlist.c libqb-2.0.3/lib/loop_timerlist.c
> --- libqb-2.0.2/lib/loop_timerlist.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/loop_timerlist.c	2021-02-08 12:01:42.000000000 +0100
> @@ -44,6 +44,7 @@
>  	struct timerlist timerlist;
>  	qb_array_t *timers;
>  	size_t timer_entry_count;
> +	pthread_mutex_t lock;
>  };
>  
>  static void
> @@ -104,6 +105,7 @@
>  	timerlist_init(&my_src->timerlist);
>  	my_src->timers = qb_array_create_2(16, sizeof(struct qb_loop_timer), 16);
>  	my_src->timer_entry_count = 0;
> +	pthread_mutex_init(&my_src->lock, NULL);
>  
>  	return (struct qb_loop_source *)my_src;
>  }
> @@ -192,6 +194,9 @@
>  	}
>  	my_src = (struct qb_timer_source *)l->timer_source;
>  
> +	if (pthread_mutex_lock(&my_src->lock)) {
> +		return -errno;
> +	}
>  	i = _get_empty_array_position_(my_src);
>  	assert(qb_array_index(my_src->timers, i, (void **)&t) >= 0);
>  	t->state = QB_POLL_ENTRY_ACTIVE;
> @@ -202,6 +207,9 @@
>  	t->p = p;
>  	qb_list_init(&t->item.list);
>  
> +	/* Unlock here to stop anyone else changing the state while we're initializing */
> +	pthread_mutex_unlock(&my_src->lock);
> +
>  	/*
>  	 * Make sure just positive integers are used for the integrity(?)
>  	 * checks within 2^32 address space, if we miss 200 times in a row
> diff -Nru libqb-2.0.2/lib/Makefile.am libqb-2.0.3/lib/Makefile.am
> --- libqb-2.0.2/lib/Makefile.am	2020-12-03 14:04:26.000000000 +0100
> +++ libqb-2.0.3/lib/Makefile.am	2021-03-03 09:26:31.000000000 +0100
> @@ -30,7 +30,7 @@
>  
>  lib_LTLIBRARIES		= libqb.la
>  
> -libqb_la_LDFLAGS	= -version-info 101:0:1
> +libqb_la_LDFLAGS	= -version-info 102:0:2
>  
>  source_to_lint		= util.c hdb.c ringbuffer.c ringbuffer_helper.c \
>  			  array.c loop.c loop_poll.c loop_job.c \
> diff -Nru libqb-2.0.2/lib/Makefile.in libqb-2.0.3/lib/Makefile.in
> --- libqb-2.0.2/lib/Makefile.in	2020-12-03 14:07:18.000000000 +0100
> +++ libqb-2.0.3/lib/Makefile.in	2021-03-03 09:34:10.000000000 +0100
> @@ -465,7 +465,7 @@
>  
>  AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
>  lib_LTLIBRARIES = libqb.la
> -libqb_la_LDFLAGS = -version-info 101:0:1
> +libqb_la_LDFLAGS = -version-info 102:0:2
>  source_to_lint = util.c hdb.c ringbuffer.c ringbuffer_helper.c \
>  			  array.c loop.c loop_poll.c loop_job.c \
>  			  loop_timerlist.c ipcc.c ipcs.c ipc_shm.c \
> diff -Nru libqb-2.0.2/lib/strlcpy.c libqb-2.0.3/lib/strlcpy.c
> --- libqb-2.0.2/lib/strlcpy.c	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/lib/strlcpy.c	2021-01-13 15:12:21.000000000 +0100
> @@ -33,8 +33,12 @@
>  	size_t	srclen = strlen(src);
>  	size_t	len2cpy = QB_MIN(maxlen-1, srclen);
>  
> -	if (len2cpy > 0) {
> -		strncpy(dest, src, len2cpy+1);
> +	/* check maxlen separately as it could have underflowed from 0 above. */
> +	if (maxlen) {
> +		if (len2cpy > 0) {
> +			strncpy(dest, src, len2cpy+1);
> +		}
> +		/* Always terminate, even if its empty */
>  		dest[len2cpy] = '\0';
>  	}
>  	return srclen;
> diff -Nru libqb-2.0.2/source_epoch libqb-2.0.3/source_epoch
> --- libqb-2.0.2/source_epoch	2020-12-03 14:07:32.000000000 +0100
> +++ libqb-2.0.3/source_epoch	2021-03-03 09:34:26.000000000 +0100
> @@ -1 +1 @@
> -1607000743
> +1614760329
> diff -Nru libqb-2.0.2/.tarball-version libqb-2.0.3/.tarball-version
> --- libqb-2.0.2/.tarball-version	2020-12-03 14:07:32.000000000 +0100
> +++ libqb-2.0.3/.tarball-version	2021-03-03 09:34:26.000000000 +0100
> @@ -1 +1 @@
> -2.0.2
> +2.0.3
> diff -Nru libqb-2.0.2/tests/check_log.c libqb-2.0.3/tests/check_log.c
> --- libqb-2.0.2/tests/check_log.c	2020-11-18 13:45:20.000000000 +0100
> +++ libqb-2.0.3/tests/check_log.c	2021-03-01 16:59:42.000000000 +0100
> @@ -1021,12 +1021,13 @@
>  	pid_t log_pid;
>  	sd_journal *jnl;
>  	int count = 0;
> +	const char *msgid="f77379a8490b408bbe5f6940505a777b";
>  
>  	qb_log_init("check_log", LOG_USER, LOG_DEBUG);
>  	qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE);
>  	rc = qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_USE_JOURNAL, 1);
>  	ck_assert_int_eq(rc, 0);
> -	qb_log(LOG_ERR, "Test message 1 from libqb");
> +	qb_log2(msgid, LOG_ERR, "Test message 1 from libqb");
>  
>  	qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
>  	rc = qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_USE_JOURNAL, 1);
> @@ -1046,6 +1047,9 @@
>  	    if (log_pid == getpid()) {
>  	        rc = sd_journal_get_data(jnl, "MESSAGE", (const void **)&msg, &len);
>  		ck_assert_int_eq(rc, 0);
> +	        rc = sd_journal_get_data(jnl, "MESSAGE_ID", (const void **)&msg, &len);
> +		ck_assert_int_eq(rc, 0);
> +		ck_assert_str_eq(msg+11, msgid);
>  		break;
>  	    }
>  	    if (++count > 20) {
> diff -Nru libqb-2.0.2/tests/check_loop.c libqb-2.0.3/tests/check_loop.c
> --- libqb-2.0.2/tests/check_loop.c	2020-12-03 11:49:29.000000000 +0100
> +++ libqb-2.0.3/tests/check_loop.c	2021-02-08 12:01:42.000000000 +0100
> @@ -439,6 +439,56 @@
>  }
>  END_TEST
>  
> +static void *loop_timer_thread(void *arg)
> +{
> +	int res;
> +	qb_loop_t *l = (qb_loop_t *)arg;
> +	qb_loop_timer_handle test_tht;
> +
> +	res = qb_loop_timer_add(l, QB_LOOP_LOW, 5*QB_TIME_NS_IN_MSEC, l, one_shot_tmo, &test_tht);
> +	ck_assert_int_eq(res, 0);
> +
> +	res = qb_loop_timer_is_running(l, test_th);
> +	ck_assert_int_eq(res, QB_TRUE);
> +
> +	sleep(5);
> +
> +	return (void *)0;
> +}
> +
> +/* This test will probably never fail (unless something
> +   really bad happens) but is useful for running under
> +   helgrind to find threading issues */
> +START_TEST(test_loop_timer_threads)
> +{
> +	int32_t res;
> +	pthread_t thr;
> +	qb_loop_t *l = qb_loop_create();
> +	ck_assert(l != NULL);
> +
> +	res = pthread_create(&thr, NULL, loop_timer_thread, l);
> +
> +	res = qb_loop_timer_add(l, QB_LOOP_LOW, 7*QB_TIME_NS_IN_MSEC, l, reset_one_shot_tmo, &reset_th);
> +	ck_assert_int_eq(res, 0);
> +
> +	res = qb_loop_timer_add(l, QB_LOOP_HIGH, 20*QB_TIME_NS_IN_MSEC, l, check_time_left, &test_th2);
> +	ck_assert_int_eq(res, 0);
> +
> +	res = qb_loop_timer_add(l, QB_LOOP_LOW, 60*QB_TIME_NS_IN_MSEC, l, job_stop, &test_th);
> +	ck_assert_int_eq(res, 0);
> +
> +	qb_loop_run(l);
> +
> +	ck_assert_int_eq(reset_timer_step, 2);
> +
> +	pthread_join(thr, NULL);
> +	qb_loop_destroy(l);
> +}
> +END_TEST
> +
> +
> +
> +
>  struct qb_stop_watch {
>  	uint64_t start;
>  	uint64_t end;
> @@ -742,6 +792,7 @@
>  	add_tcase(s, tc, test_loop_timer_basic, 30);
>  	add_tcase(s, tc, test_loop_timer_precision, 30);
>  	add_tcase(s, tc, test_loop_timer_expire_leak, 30);
> +	add_tcase(s, tc, test_loop_timer_threads, 30);
>  
>  	return s;
>  }
> diff -Nru libqb-2.0.2/tests/resources.test libqb-2.0.3/tests/resources.test
> --- libqb-2.0.2/tests/resources.test	2020-10-14 11:43:50.000000000 +0200
> +++ libqb-2.0.3/tests/resources.test	2021-02-08 12:01:42.000000000 +0100
> @@ -1,17 +1,31 @@
>  #!/bin/sh
>  RETURN=0
> +SOCKS_PER_PROCESS=3
>  
>  IPC_NAME=`cat ipc-test-name 2>/dev/null`
>  for d in /dev/shm /var/run $SOCKETDIR; do
> -	leftovers=$(find $d -name qb-test*${IPC_NAME}* -size +0c 2>/dev/null | wc -l)
> +
> +	# Tidy up the deadlock checker sockets first
> +	dlocks=$(find $d -name qb-*-test_*dlock*${IPC_NAME}* -size +0c 2>/dev/null)
> +	if [ `echo $dlocks|wc -w` -eq $(($SOCKS_PER_PROCESS * 6)) ]; then
> +		rm $dlocks
> +	elif [ -n "${dlocks}" ]; then
> +		echo
> +		echo "Error: dlock shared memory segments not closed/unlinked"
> +		echo
> +		RETURN=1
> +	fi
> +
> +	# Now look for other leftovers
> +	leftovers=$(find $d -name qb-*-test_*${IPC_NAME}* -size +0c 2>/dev/null | wc -l)
>  	if [ "${leftovers}" -gt 0 ]; then
>  		echo
>  		echo "Error: shared memory segments not closed/unlinked"
>  		echo
>  		RETURN=1
>  	fi
> -	leftovers="$(find $d -name qb-test*${IPC_NAME}* -size 0c 2>/dev/null)"
> -	if [ "$(printf '%s\n' "${leftovers}" | wc -l)" -eq 6 ]; then
> +	leftovers="$(find $d -name qb-*-test_*${IPC_NAME}* -size 0c 2>/dev/null)"
> +	if [ "$(printf '%s\n' "${leftovers}" | wc -l)" -eq $(($SOCKS_PER_PROCESS * 2)) ]; then
>  		echo
>  		echo "There were some empty leftovers (expected), removing them"
>  		echo "${leftovers}" | tee /dev/stderr | xargs rm
> diff -Nru libqb-2.0.2/.version libqb-2.0.3/.version
> --- libqb-2.0.2/.version	2020-12-03 14:07:31.000000000 +0100
> +++ libqb-2.0.3/.version	2021-03-03 09:34:25.000000000 +0100
> @@ -1 +1 @@
> -2.0.2
> +2.0.3
> 
> unblock libqb/2.0.3-1
> -- 
> Thanks,
> Feri.

-- 
Sebastian Ramacher

Attachment: signature.asc
Description: PGP signature


Reply to: