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....@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  <ccaul...@redhat.com>
> +
> +     release: bump library version for 2.0.3 release
> +
> +2021-03-01  Aleksei Burlakov  <alex_burla...@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  <ccaul...@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  <ccaul...@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  <ccaul...@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  <ccaul...@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  <wf...@debian.org>
> +
> +     doxygen2man: ignore all-whitespace brief descriptions (#430)
> +
>  2020-12-03  Christine Caulfield  <ccaul...@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 <develop...@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='develop...@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 <wf...@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?= <wf...@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 <asalk...@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 via email to