libqb/06-Low-fix-internal-object-symbol-s-leak-expose-run-tim.patch
Jan Pokorný 1799fc0be2
1.0.2-14 - Evolution of the previous (rhbz#1478089)
- Make -devel package dependency on the main package arch-qualified

Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
2017-11-15 18:32:21 +01:00

198 lines
7.7 KiB
Diff

From 8ae46f6c7a2e9c518fec635b8f7afb1b1dbc710f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= <jpokorny@redhat.com>
Date: Fri, 6 Oct 2017 17:17:26 +0200
Subject: [PATCH 6/6] Low: fix internal object symbol's leak & expose run-time
lib version
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The object in question has never been published through the header file,
hence it's presumably safe to make it static as it's meant to be.
On the other hand, QB_LOG_INIT_DATA macro from qblog.h has already
started to depend on that symbol so as to locate the library handle
for libqb itself correctly. This is trivially fixed by finally exposing
library versioning info in run-time ("online") as a structure with
members corresponding to compile-time ("offline") counterparts from
qbconfig.h header file, which are admittedly of very limited use
as opposed to the newly introduced dynamic info, plus lower-cased
equivalent of QB_VER_STR. Better than to roll out a futile data object
serving as an artificial anchor for the above purpose, and this was
due for a while, afterall.
In turn, also bump "current" and "age" of fields of the libtool's
"-version-info" versioning system.
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
---
include/qb/qbconfig.h.in | 7 ++++++-
include/qb/qblog.h | 8 +++++---
include/qb/qbutil.h | 11 +++++++++++
lib/Makefile.am | 2 +-
lib/log.c | 10 ++++++----
lib/log_format.c | 2 +-
lib/util.c | 10 ++++++++++
tests/functional/log_client.c | 5 +++++
tests/functional/log_test_client.err | 2 +-
9 files changed, 46 insertions(+), 11 deletions(-)
diff --git a/include/qb/qbconfig.h.in b/include/qb/qbconfig.h.in
index c1852e1..9094dc7 100644
--- a/include/qb/qbconfig.h.in
+++ b/include/qb/qbconfig.h.in
@@ -30,7 +30,12 @@
/* Enabling code using __attribute__((section)) */
#undef QB_HAVE_ATTRIBUTE_SECTION
-/* versioning info: MAJOR, MINOR, MICRO, and REST components */
+/* versioning info: MAJOR, MINOR, MICRO, and REST components;
+ note that static compile-time info is not that useful as consulting
+ the respectively named members of qb_version struct constant under
+ @c qb_ver identifier (or @c qb_ver_str equivalent of the local
+ upper-cased value) directly from libqb in run-time (see qbutil.h),
+ but that was only introduced after v1.0.2 */
#undef QB_VER_MAJOR
#undef QB_VER_MINOR
#undef QB_VER_MICRO
diff --git a/include/qb/qblog.h b/include/qb/qblog.h
index 00adb3a..059d633 100644
--- a/include/qb/qblog.h
+++ b/include/qb/qblog.h
@@ -299,9 +299,11 @@ extern struct qb_log_callsite QB_ATTR_SECTION_STOP[];
#define QB_NONAPI_LOG_INIT_DATA_EXTRA_(name) \
{ Dl_info work_dli; \
/* libqb sanity (locating libqb by it's relatively unique \
- -- and currently only such per-linkage global one -- \
- non-functional symbol, due to possible confusion otherwise) */ \
- if (dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli) \
+ non-functional symbols -- the two are mutually exclusive, the \
+ ordinarily latter was introduced by accident, the former is \
+ intentional -- due to possible confusion otherwise) */ \
+ if ((dladdr(dlsym(RTLD_DEFAULT, "qb_ver_str"), &work_dli) \
+ || dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli)) \
&& (work_handle = dlopen(work_dli.dli_fname, \
RTLD_LOCAL|RTLD_LAZY)) != NULL) { \
work_s1 = (struct qb_log_callsite *) \
diff --git a/include/qb/qbutil.h b/include/qb/qbutil.h
index bfce349..b02ce8d 100644
--- a/include/qb/qbutil.h
+++ b/include/qb/qbutil.h
@@ -289,6 +289,17 @@ uint64_t
qb_util_stopwatch_time_split_get(qb_util_stopwatch_t *sw,
uint32_t receint, uint32_t older);
+/** Structured library versioning info */
+extern const struct qb_version {
+ uint8_t major; /**< Major component */
+ uint8_t minor; /**< Minor component */
+ uint8_t micro; /**< Micro component */
+ const char *rest; /**< Rest (pertaining the mid-release-point) */
+} qb_ver;
+
+/** Complete library versioning info as a string */
+extern const char *const qb_ver_str;
+
/* *INDENT-OFF* */
#ifdef __cplusplus
}
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 1572cff..6ca6b15 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -30,7 +30,7 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
lib_LTLIBRARIES = libqb.la
-libqb_la_LDFLAGS = -version-info 18:2:18
+libqb_la_LDFLAGS = -version-info 19:0:19
source_to_lint = util.c hdb.c ringbuffer.c ringbuffer_helper.c \
array.c loop.c loop_poll.c loop_job.c \
diff --git a/lib/log.c b/lib/log.c
index 290f29f..cbad262 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -892,10 +892,12 @@ qb_log_init(const char *name, int32_t facility, uint8_t priority)
#ifdef QB_HAVE_ATTRIBUTE_SECTION
/* sanity check that target chain supplied QB_ATTR_SECTION_ST{ART,OP}
symbols and hence the local references to them are not referencing
- the proper libqb's ones (locating libqb-self by it's relatively
- unique -- and currently only such per-linkage global one --
- non-functional symbol, due to possible confusion otherwise) */
- if (dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli)
+ the proper libqb's ones (locating libqb by it's relatively unique
+ non-functional symbols -- the two are mutually exclusive, the
+ ordinarily latter was introduced by accident, the former is
+ intentional -- due to possible confusion otherwise) */
+ if ((dladdr(dlsym(RTLD_DEFAULT, "qb_ver_str"), &work_dli)
+ || dladdr(dlsym(RTLD_DEFAULT, "facilitynames"), &work_dli))
&& (work_handle = dlopen(work_dli.dli_fname,
RTLD_LOCAL|RTLD_LAZY)) != NULL) {
work_s1 = (struct qb_log_callsite *)
diff --git a/lib/log_format.c b/lib/log_format.c
index 712f447..e7e1f40 100644
--- a/lib/log_format.c
+++ b/lib/log_format.c
@@ -49,7 +49,7 @@ static struct syslog_names prioritynames[] = {
{NULL, -1}
};
-struct syslog_names facilitynames[] = {
+static struct syslog_names facilitynames[] = {
{"auth", LOG_AUTH},
#if defined(LOG_AUTHPRIV)
{"authpriv", LOG_AUTHPRIV},
diff --git a/lib/util.c b/lib/util.c
index 6181a25..a510bd1 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -23,6 +23,7 @@
#include "util_int.h"
#include <pthread.h>
#include <sys/stat.h>
+#include <qb/qbconfig.h>
#include <qb/qbdefs.h>
#include <qb/qbutil.h>
@@ -372,3 +373,12 @@ qb_util_stopwatch_time_split_get(qb_util_stopwatch_t *sw,
}
return (time_start - time_end) / QB_TIME_NS_IN_USEC;
}
+
+const struct qb_version qb_ver = {
+ .major = QB_VER_MAJOR,
+ .minor = QB_VER_MINOR,
+ .micro = QB_VER_MICRO,
+ .rest = QB_VER_REST,
+};
+
+const char *const qb_ver_str = QB_VER_STR;
diff --git a/tests/functional/log_client.c b/tests/functional/log_client.c
index c60d657..d5d8089 100644
--- a/tests/functional/log_client.c
+++ b/tests/functional/log_client.c
@@ -53,6 +53,11 @@ main(int32_t argc, char *argv[])
qb_log_tags_stringify_fn_set(my_tags_stringify);
qb_log_format_set(QB_LOG_STDERR, "[%5g|%p] %f:%l:%b");
+#if 0
+ printf("\n==%s consists of: %d, %d, %d, %s==\n\n", qb_ver_str,
+ qb_ver.major, qb_ver.minor, qb_ver.micro, qb_ver.rest);
+#endif
+
#if 0
printf("--\n");
qb_log_callsites_dump();
diff --git a/tests/functional/log_test_client.err b/tests/functional/log_test_client.err
index 19fca2c..98df44c 100644
--- a/tests/functional/log_test_client.err
+++ b/tests/functional/log_test_client.err
@@ -1,2 +1,2 @@
-[MAIN |debug] ../log_client.c:64:hello
+[MAIN |debug] ../log_client.c:69:hello
[libqb|error] log_blackbox.c:196:qb_log_blackbox_print_from_file:
--
2.15.0