Hello community, here is the log from the commit of package libHX for openSUSE:Factory checked in at 2020-05-16 22:26:12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libHX (Old) and /work/SRC/openSUSE:Factory/.libHX.new.2738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libHX" Sat May 16 22:26:12 2020 rev:60 rq:805794 version:3.25 Changes: -------- --- /work/SRC/openSUSE:Factory/libHX/libHX.changes 2018-10-25 08:09:04.932316190 +0200 +++ /work/SRC/openSUSE:Factory/.libHX.new.2738/libHX.changes 2020-05-16 22:26:23.229279628 +0200 @@ -1,0 +2,9 @@ +Thu May 14 11:10:45 UTC 2020 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 3.25 + * fix out-of-bounds access when calling HX_strlcpy(x,y,0) + * HX_split4 renamed to HX_split_inplace + * HX_split5 renamed to HX_split_fixed + * remove excess header inclusion + +------------------------------------------------------------------- Old: ---- libHX-3.24.tar.asc libHX-3.24.tar.xz New: ---- libHX-3.25.tar.asc libHX-3.25.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libHX.spec ++++++ --- /var/tmp/diff_new_pack.7INyWX/_old 2020-05-16 22:26:24.417282066 +0200 +++ /var/tmp/diff_new_pack.7INyWX/_new 2020-05-16 22:26:24.421282074 +0200 @@ -1,7 +1,7 @@ # # spec file for package libHX # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,19 +17,18 @@ Name: libHX -%define lname libHX28 +%define lname libHX32 +Version: 3.25 +Release: 0 Summary: Collection of routines for C and C++ programming License: LGPL-2.1-or-later Group: Development/Libraries/C and C++ -Version: 3.24 -Release: 0 -Url: http://libhx.sf.net/ +URL: https://inai.de/projects/libhx/ -Source: http://downloads.sf.net/libhx/libHX-%version.tar.xz -Source2: http://downloads.sf.net/libhx/libHX-%version.tar.asc +Source: https://inai.de/files/libhx/libHX-%version.tar.xz +Source2: https://inai.de/files/libhx/libHX-%version.tar.asc Source3: baselibs.conf Source4: %name.keyring -BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: gcc-c++ BuildRequires: pkg-config BuildRequires: xz @@ -64,7 +63,7 @@ This subpackage contains the header files. %prep -%setup -q +%autosetup -p1 %build mkdir obj @@ -89,11 +88,9 @@ %postun -n %lname -p /sbin/ldconfig %files -n %lname -%defattr(-,root,root) -%_libdir/libHX*.so.28* +%_libdir/libHX*.so.32* %files devel -%defattr(-,root,root) %_docdir/%name/ %_includedir/%name/ %_libdir/libHX*.so ++++++ baselibs.conf ++++++ --- /var/tmp/diff_new_pack.7INyWX/_old 2020-05-16 22:26:24.461282156 +0200 +++ /var/tmp/diff_new_pack.7INyWX/_new 2020-05-16 22:26:24.465282164 +0200 @@ -1,4 +1,4 @@ -libHX28 +libHX32 libHX-devel requires -libHX-<targettype> - requires "libHX28-<targettype> = <version>" + requires "libHX32-<targettype> = <version>" ++++++ libHX-3.24.tar.xz -> libHX-3.25.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/aclocal.m4 new/libHX-3.25/aclocal.m4 --- old/libHX-3.24/aclocal.m4 2018-10-17 21:17:17.442546454 +0200 +++ new/libHX-3.25/aclocal.m4 2020-05-14 11:48:36.967712020 +0200 @@ -591,7 +591,6 @@ AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl -AM_SILENT_RULES([yes]) # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/configure new/libHX-3.25/configure --- old/libHX-3.24/configure 2018-10-17 21:17:18.238548254 +0200 +++ new/libHX-3.25/configure 2020-05-14 11:48:37.391713060 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libHX 3.24. +# Generated by GNU Autoconf 2.69 for libHX 3.25. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -587,8 +587,8 @@ # Identity of this package. PACKAGE_NAME='libHX' PACKAGE_TARNAME='libhx' -PACKAGE_VERSION='3.24' -PACKAGE_STRING='libHX 3.24' +PACKAGE_VERSION='3.25' +PACKAGE_STRING='libHX 3.25' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1342,7 +1342,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 libHX 3.24 to adapt to many kinds of systems. +\`configure' configures libHX 3.25 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1412,7 +1412,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libHX 3.24:";; + short | recursive ) echo "Configuration of libHX 3.25:";; esac cat <<\_ACEOF @@ -1527,7 +1527,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libHX configure 3.24 +libHX configure 3.25 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2253,7 +2253,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libHX $as_me 3.24, which was +It was created by libHX $as_me 3.25, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3119,7 +3119,7 @@ # Define the identity of the package. PACKAGE='libhx' - VERSION='3.24' + VERSION='3.25' cat >>confdefs.h <<_ACEOF @@ -3254,45 +3254,6 @@ -# Check whether --enable-silent-rules was given. -if test "${enable_silent_rules+set}" = set; then : - enableval=$enable_silent_rules; -fi - -case $enable_silent_rules in # ((( - yes) AM_DEFAULT_VERBOSITY=0;; - no) AM_DEFAULT_VERBOSITY=1;; - *) AM_DEFAULT_VERBOSITY=0;; -esac -am_make=${MAKE-make} -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 -$as_echo_n "checking whether $am_make supports nested variables... " >&6; } -if ${am_cv_make_support_nested_variables+:} false; then : - $as_echo_n "(cached) " >&6 -else - if $as_echo 'TRUE=$(BAR$(V)) -BAR0=false -BAR1=true -V=1 -am__doit: - @$(TRUE) -.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then - am_cv_make_support_nested_variables=yes -else - am_cv_make_support_nested_variables=no -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 -$as_echo "$am_cv_make_support_nested_variables" >&6; } -if test $am_cv_make_support_nested_variables = yes; then - AM_V='$(V)' - AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -else - AM_V=$AM_DEFAULT_VERBOSITY - AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY -fi -AM_BACKSLASH='\' - # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile @@ -17720,7 +17681,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libHX $as_me 3.24, which was +This file was extended by libHX $as_me 3.25, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17786,7 +17747,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libHX config.status 3.24 +libHX config.status 3.25 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/configure.ac new/libHX-3.25/configure.ac --- old/libHX-3.24/configure.ac 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/configure.ac 2020-05-14 11:48:30.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([libHX], [3.24]) +AC_INIT([libHX], [3.25]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/doc/api.txt new/libHX-3.25/doc/api.txt --- old/libHX-3.24/doc/api.txt 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/doc/api.txt 2020-05-14 11:48:30.000000000 +0200 @@ -15,6 +15,8 @@ RMV MinVer FirstA Name ---------------------------------------------------------------------- +3.25 3.25 3.25 HX_split_fixed +3.25 3.25 3.25 HX_split_inplace 3.22 3.22 3.22 HXQUOTE_SQLBQUOTE 3.21 3.21 3.21 xml_getnsprop 3.19 3.19 3.19 HXQUOTE_SQLSQUOTE @@ -24,7 +26,6 @@ 3.16 3.16 3.16 container_of 3.16 3.16 3.16 wxCDF 3.16 3.16 3.16 wxDSPAN -3.15 3.15 3.15 FIELD_SIZEOF 3.15 3.15 3.15 HXQUOTE_URIENC 3.15 3.15 3.15 HX_strchr2 3.13 3.13 3.13 DEMOTE_TO_PTR @@ -116,8 +117,6 @@ 3.0 3.0 3.0 HXMAPT_RBTREE 3.0 3.0 3.0 HXMAP_DTRAV 3.0 3.0 3.0 HXMAP_NOREPLACE -3.0 3.0 3.0 HX_diff_timespec -3.0 3.0 3.0 HX_diff_timeval 3.0 3.0 3.0 HXhash_djb2 3.0 3.0 3.0 HXhash_jlookup3 3.0 3.0 3.0 HXhash_jlookup3s @@ -145,7 +144,6 @@ 2.6 2.6 2.6 wxfv8 2.6 2.6 2.6 wxtu8 2.6 2.6 2.6 xml_strcasecmp -2.3 2.0 2.0 offsetof 2.3 1.25 1.25 HXmc_length 2.2 2.2 2.2 HXPROC_A0 2.2 2.2 2.2 HXPROC_EXECV diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/doc/changelog.txt new/libHX-3.25/doc/changelog.txt --- old/libHX-3.24/doc/changelog.txt 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/doc/changelog.txt 2020-05-14 11:48:30.000000000 +0200 @@ -1,4 +1,15 @@ +v3.25 (2020-05-14) +================== +Fixes: +* string: fix out-of-bounds access when calling HX_strlcpy(x,y,0) +Changes: +* string: HX_split4 renamed to HX_split_inplace +* string: HX_split5 renamed to HX_split_fixed +* defs.h: removed partially implementation of FIELD_SIZEOF +* defs.h: removed custom offsetof definition; you will need to include + <stddef.h> or <cstddef> now. + v3.24 (2018-10-17) ================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/doc/generate new/libHX-3.25/doc/generate --- old/libHX-3.24/doc/generate 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/doc/generate 2020-05-14 11:48:30.000000000 +0200 @@ -3,4 +3,17 @@ if [ -z "$srcdir" ]; then srcdir="."; fi; -exec lyx -e pdf2 "$srcdir/libHX_Documentation.lyx"; +rm -f libHX_Documentation.pdf +lyx -e pdf2 "$srcdir/libHX_Documentation.lyx" || : +# lyx-2.3.2 does not work with texlive-babel-2017.135.3 +# """ +# Package babel Error: You haven't specified a language option. +# ...ry to proceed from here, type x to quit.) +# +# You need to specify a language, either as a global option +# or as an optional argument to the \usepackage command; +# You shouldn't try to proceed form here, type x to quit. +# """ +# babel you so stupid for breaking backward comapt. + +test -e libHX_Documentation.pdf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/doc/libHX_Documentation.lyx new/libHX-3.25/doc/libHX_Documentation.lyx --- old/libHX-3.24/doc/libHX_Documentation.lyx 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/doc/libHX_Documentation.lyx 2020-05-14 11:48:30.000000000 +0200 @@ -91,7 +91,7 @@ \begin_body \begin_layout Title -libHX 3.24 +libHX 3.25 \begin_inset Newline newline \end_inset @@ -2620,26 +2620,6 @@ \end_layout \begin_layout LyX-Code - -\series bold -long -\series default - offsetof(type, member); -\begin_inset Index idx -status open - -\begin_layout Plain Layout - -\family typewriter -offsetof -\end_layout - -\end_inset - - -\begin_inset Newline newline -\end_inset - output_type \series bold * @@ -2668,14 +2648,14 @@ \series bold size_t \series default - FIELD_SIZEOF(struct_type, member); + HXsizeof_member(struct_type, member); \begin_inset Index idx status open \begin_layout Plain Layout \family typewriter -FIELD_SIZEOF +HXsizeof_member \end_layout \end_inset @@ -2700,55 +2680,6 @@ \end_layout \begin_layout Standard -In case -\family typewriter -offsetof -\family default - and -\family typewriter -containerof -\family default - have not already defined by inclusion of another header file, libHX's defs.h - will define these accessors. - -\family typewriter -offsetof -\family default - is defined in -\family typewriter -stddef.h -\family default - (for C) or -\family typewriter -cstddef -\family default - (C++), but inclusion of these is not necessary if you have included -\family typewriter -defs.h -\family default -. - -\family typewriter -defs.h -\family default - will use GCC's -\family typewriter -__builtin_\SpecialChar softhyphen -offsetof -\family default - if available, which does some extra sanity checks in C++ mode. -\end_layout - -\begin_layout Standard - -\family typewriter -offsetof -\family default - calculates the offset of the specified member in the type, which needs - to be a struct or union. -\end_layout - -\begin_layout Standard \family typewriter containerof @@ -2831,30 +2762,14 @@ \begin_layout Standard \family typewriter -FIELD_SIZEOF -\family default - (formerly -\family typewriter HXsizeof_member \family default - -\begin_inset Index idx -status open - -\begin_layout Plain Layout - -\family typewriter -HXsizeof_member -\end_layout - -\end_inset - -) and + and \family typewriter HXtypeof_member \family default - are convenient shortcuts to get the size or type of a named member in a - given struct: + are shortcuts (mainly for the C language) to get the size or type of a + named member in a given struct: \end_layout \begin_layout LyX-Code @@ -2869,6 +2784,18 @@ foo, baz)]; \end_layout +\begin_layout Standard +In C++, one can simply use +\family typewriter +sizeof(foo::baz) +\family default + and +\family typewriter +decltype(foo::baz) +\family default +. +\end_layout + \begin_layout Subsection Array size \end_layout @@ -12252,7 +12179,7 @@ \series bold char ** \series default -HX_split4( +HX_split_inplace( \series bold char * \series default @@ -12277,7 +12204,7 @@ \family typewriter \size normal \color none -HX_split4 +HX_split_inplace \end_layout \end_inset @@ -12290,7 +12217,7 @@ \series bold int \series default - HX_split5( + HX_split_fixed( \series bold char * \series default @@ -12306,7 +12233,7 @@ \series bold char ** \series default -stack); +arr); \begin_inset Index idx status open @@ -12315,7 +12242,7 @@ \family typewriter \size normal \color none -HX_split5 +HX_split_fixed \end_layout \end_inset @@ -12456,7 +12383,7 @@ \begin_layout Description \family typewriter -HX_split4 +HX_split_inplace \family default Split the string \family typewriter @@ -12499,7 +12426,7 @@ \begin_layout Description \family typewriter -HX_split5 +HX_split_fixed \family default Split the string \family typewriter @@ -12521,7 +12448,7 @@ The array for the substring pointers must be provided by the user through the \family typewriter -stack +arr \family default argument. @@ -13195,10 +13122,10 @@ \end_layout \begin_layout Subsubsection -Using HX_split5 +Using HX_split_fixed \begin_inset CommandInset label LatexCommand label -name "subsec:string-ex-HX_split5" +name "subsec:string-ex-HX_split_fixed" \end_inset @@ -13208,31 +13135,10 @@ \begin_layout Standard \family typewriter -HX_split5 -\family default -, where the -\begin_inset Quotes eld -\end_inset - -5 -\begin_inset Quotes erd -\end_inset - - should be interpreted (with a bit of imagination and the knowledge of leetspeak -) as an -\begin_inset Quotes eld -\end_inset - -S -\begin_inset Quotes erd -\end_inset - - for stack, as -\family typewriter -HX_split5 +HX_split_fixed \family default - is often used only with on-stack variables and where the field count of - interest is fixed, as the example for parsing + is often used just with scoped automatic-storage variables and where the + field count of interest is fixed, as the example for parsing \family typewriter /etc/passwd \family default @@ -13292,7 +13198,7 @@ \series bold if \series default - (HX_split5(line, ":", ARRAY_SIZE(field), field) < 7) { + (HX_split_fixed(line, ":", ARRAY_SIZE(field), field) < 7) { \begin_inset Newline newline \end_inset @@ -13324,14 +13230,14 @@ \end_layout \begin_layout Subsubsection -Using HX_split4 +Using HX_split_inplace \end_layout \begin_layout Standard Where the number of fields is not previously known and/or estimatable, but the string can be modified in place, one uses \family typewriter -HX_split4 +HX_split_inplace \family default as follows: \end_layout @@ -13377,7 +13283,7 @@ \series bold char ** \series default -field = HX_split4(line, ":", NULL, 0); +field = HX_split_inplace(line, ":", NULL, 0); \begin_inset Newline newline \end_inset Binary files old/libHX-3.24/doc/libHX_Documentation.pdf and new/libHX-3.25/doc/libHX_Documentation.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/include/libHX/defs.h new/libHX-3.25/include/libHX/defs.h --- old/libHX-3.24/include/libHX/defs.h 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/include/libHX/defs.h 2020-05-14 11:48:30.000000000 +0200 @@ -2,23 +2,14 @@ #define _LIBHX_DEFS_H 1 #ifdef __cplusplus -# define FIELD_SIZEOF(type, member) \ - sizeof(static_cast<type *>(NULL)->member) -# define HXsizeof_member(type, member) FIELD_SIZEOF(type, member) -# define HXtypeof_member(type, member) \ - __typeof__(static_cast<type *>(NULL)->member) -# if defined(__GNUC__) && __GNUC__ >= 4 && !defined(offsetof) - /* - * This is here so most programs can skip inclusion - * of stddef.h just to get offsetof. - */ -# define offsetof(type, member) __builtin_offsetof(type, member) -# endif -# ifndef offsetof -# define offsetof(type, member) \ - reinterpret_cast<long>(&(static_cast<type *>(NULL)->member)) +# define HXsizeof_member(type, member) sizeof(type::member) +# if __cplusplus >= 201100L +# define HXtypeof_member(type, member) decltype(type::member) +# else +# define HXtypeof_member(type, member) __typeof__(type::member)) # endif # ifndef containerof +# include <cstddef> # define containerof(var, type, member) reinterpret_cast<type *>( \ reinterpret_cast<char *>(var) - offsetof(type, member)) # endif @@ -139,14 +130,8 @@ # ifndef reinterpret_cast # define reinterpret_cast(type, expr) ((type)(expr)) # endif -# if defined(__GNUC__) && __GNUC__ >= 4 && !defined(offsetof) -# define offsetof(type, member) __builtin_offsetof(type, member) -# endif -# ifndef offsetof -# define offsetof(type, member) \ - reinterpret_cast(long, &(static_cast(type *, NULL)->member)) -# endif # ifndef containerof +# include <stddef.h> # define containerof(var, type, member) reinterpret_cast(type *, \ reinterpret_cast(char *, var) - offsetof(type, member)) # endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/include/libHX/libxml_helper.h new/libHX-3.25/include/libHX/libxml_helper.h --- old/libHX-3.24/include/libHX/libxml_helper.h 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/include/libHX/libxml_helper.h 2020-05-14 11:48:30.000000000 +0200 @@ -6,7 +6,6 @@ #else # include <string.h> #endif -#include <libHX/defs.h> #include <libxml/parser.h> #ifdef __cplusplus diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/include/libHX/misc.h new/libHX-3.25/include/libHX/misc.h --- old/libHX-3.24/include/libHX/misc.h 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/include/libHX/misc.h 2020-05-14 11:48:30.000000000 +0200 @@ -11,8 +11,6 @@ # include <cstdarg> # include <cstdio> #endif -#include <libHX/defs.h> -#include <libHX/io.h> #ifdef __cplusplus extern "C" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/include/libHX/string.h new/libHX-3.25/include/libHX/string.h --- old/libHX-3.24/include/libHX/string.h 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/include/libHX/string.h 2020-05-14 11:48:30.000000000 +0200 @@ -66,8 +66,10 @@ extern hxmc_t *HX_getl(hxmc_t **, FILE *); extern void *HX_memmem(const void *, size_t, const void *, size_t); extern char **HX_split(const char *, const char *, int *, int); -extern char **HX_split4(char *, const char *, int *, int); -extern int HX_split5(char *, const char *, int, char **); +extern int HX_split_fixed(char *, const char *, int, char **); +extern char **HX_split_inplace(char *, const char *, int *, int); +#define HX_split4(a, b, c, d) HX_split_inplace((a), (b), (c), (d)) +#define HX_split5(a, b, c, d) HX_split_fixed((a), (b), (c), (d)) extern char *HX_strbchr(const char *, const char *, char); extern char *HX_strchr2(const char *, const char *); extern char *HX_strclone(char **, const char *); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/Makefile.am new/libHX-3.25/src/Makefile.am --- old/libHX-3.24/src/Makefile.am 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/Makefile.am 2020-05-14 11:48:30.000000000 +0200 @@ -13,7 +13,7 @@ mc.c misc.c opt.c \ rand.c string.c time.c libHX_la_LIBADD = ${libdl_LIBS} ${libpthread_LIBS} ${librt_LIBS} -libHX_la_LDFLAGS = -no-undefined -version-info 31:0:3 +libHX_la_LDFLAGS = -no-undefined -version-info 32:0:0 if WITH_GNU_LD libHX_la_LDFLAGS += -Wl,--version-script=${srcdir}/libHX.map endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/Makefile.in new/libHX-3.25/src/Makefile.in --- old/libHX-3.24/src/Makefile.in 2018-10-17 21:17:19.970552175 +0200 +++ new/libHX-3.25/src/Makefile.in 2020-05-14 11:48:38.439715627 +0200 @@ -738,7 +738,7 @@ libHX_la_SOURCES = deque.c dl.c format.c io.c map.c mc.c misc.c opt.c \ rand.c string.c time.c $(am__append_3) $(am__append_4) libHX_la_LIBADD = ${libdl_LIBS} ${libpthread_LIBS} ${librt_LIBS} -libHX_la_LDFLAGS = -no-undefined -version-info 31:0:3 $(am__append_2) +libHX_la_LDFLAGS = -no-undefined -version-info 32:0:0 $(am__append_2) EXTRA_libHX_la_DEPENDENCIES = libHX.map libHX_rtcheck_la_SOURCES = rtcheck.c libHX_rtcheck_la_LIBADD = ${libdl_LIBS} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/internal.h new/libHX-3.25/src/internal.h --- old/libHX-3.24/src/internal.h 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/internal.h 2020-05-14 11:48:30.000000000 +0200 @@ -54,10 +54,4 @@ extern hxmc_t *HXparse_dequote_fmt(const char *, const char *, const char **); -/* time.c - these are obsolete, but kept for ABI */ -extern void HX_diff_timespec(struct timespec *, const struct timespec *, - const struct timespec *); -extern void HX_diff_timeval(struct timeval *, const struct timeval *, - const struct timeval *); - #endif /* LIBHX_INTERNAL_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/io.c new/libHX-3.25/src/io.c --- old/libHX-3.24/src/io.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/io.c 2020-05-14 11:48:30.000000000 +0200 @@ -13,6 +13,7 @@ #include <limits.h> #include <stdarg.h> #include <stdbool.h> +#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/libHX.map new/libHX-3.25/src/libHX.map --- old/libHX-3.24/src/libHX.map 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/libHX.map 2020-05-14 11:48:30.000000000 +0200 @@ -1,6 +1,7 @@ -LIBHX_1.10.0 { +LIBHX_3.25 { global: HX_basename; + HX_basename_exact; HX_chomp; HX_copy_dir; HX_copy_file; @@ -9,33 +10,65 @@ HX_dlerror; HX_dlopen; HX_dlsym; + HX_drand; + HX_exit; HX_ffs; + HX_fls; + HX_getl; HX_getopt; HX_getopt_help; + HX_getopt_help_cb; HX_getopt_usage; + HX_getopt_usage_cb; + HX_hexdump; + HX_init; HX_irand; + HX_memmem; + HX_mkdir; HX_rand; + HX_readlink; + HX_realpath; HX_rrmdir; HX_shconfig; HX_shconfig_free; + HX_shconfig_map; HX_shconfig_pv; - HX_split5; HX_split; + HX_split_fixed; + HX_split_inplace; + HX_stpltrim; HX_strbchr; + HX_strchr2; HX_strclone; + HX_strdup; + HX_strlcat; + HX_strlcpy; + HX_strlncat; HX_strlower; HX_strltrim; HX_strmid; + HX_strndup; + HX_strnlen; + HX_strquote; HX_strrcspn; HX_strrev; HX_strrtrim; HX_strsep2; HX_strsep; HX_strupper; + HX_time_compare; + HX_timespec_add; + HX_timespec_isneg; + HX_timespec_mul; + HX_timespec_mulf; + HX_timespec_neg; + HX_timespec_sub; + HX_timeval_sub; HX_zvecfree; HXdeque_del; HXdeque_find; HXdeque_free; + HXdeque_genocide2; HXdeque_get; HXdeque_init; HXdeque_move; @@ -47,151 +80,49 @@ HXdir_close; HXdir_open; HXdir_read; -local: - *; -}; - -LIBHX_1.25 { -global: - HX_getl; - HXmc_free; - HXmc_length; - HXmc_memcat; - HXmc_memcpy; - HXmc_memdel; - HXmc_meminit; - HXmc_memins; - HXmc_mempcat; - HXmc_strcat; - HXmc_strcpy; - HXmc_strinit; - HXmc_strins; - HXmc_strpcat; - HXmc_trunc; -} LIBHX_1.10.0; - -LIBHX_1.26 { -global: - HX_hexdump; - HX_time_compare; -} LIBHX_1.25; - -LIBHX_2.0 { -global: - HXmc_setlen; -} LIBHX_1.26; - -LIBHX_2.2 { -global: - HX_split4; - HXproc_run_async; - HXproc_run_sync; - HXproc_wait; -} LIBHX_2.0; - -LIBHX_2.6 { -global: - HX_fls; -} LIBHX_2.2; - -LIBHX_2.9 { -global: - HX_basename_exact; -} LIBHX_2.6; - -LIBHX_3.0 { -global: - HX_diff_timespec; - HX_diff_timeval; HXformat_add; + HXformat_aprintf; + HXformat_fprintf; HXformat_free; HXformat_init; + HXformat_sprintf; HXhash_djb2; HXhash_jlookup3; HXhash_jlookup3s; HXhash_primes; + HXio_fullread; + HXio_fullwrite; HXmap_add; HXmap_del; HXmap_find; HXmap_free; HXmap_get; + HXmap_init5; + HXmap_init; HXmap_keysvalues; HXmap_qfe; HXmap_traverse; HXmap_travfree; HXmap_travinit; -} LIBHX_2.9; - -LIBHX_3.2 { -global: - HX_strquote; -} LIBHX_3.0; - -LIBHX_3.3 { -global: - HX_drand; - HX_shconfig_map; - HXdeque_genocide2; + HXmc_free; + HXmc_length; + HXmc_memcat; + HXmc_memcpy; + HXmc_memdel; + HXmc_meminit; + HXmc_memins; + HXmc_mempcat; + HXmc_setlen; + HXmc_strcat; + HXmc_strcpy; + HXmc_strinit; + HXmc_strins; + HXmc_strpcat; + HXmc_trunc; HXmc_zvecfree; -} LIBHX_3.2; - -LIBHX_3.4 { -global: - HX_exit; - HX_init; - HX_memmem; -} LIBHX_3.3; - -LIBHX_3.9 { -global: - HXio_fullread; - HXio_fullwrite; -} LIBHX_3.4; - -LIBHX_3.10 { -global: - HX_readlink; - HX_realpath; -} LIBHX_3.9; - -LIBHX_3.12 { -global: - HX_getopt_help_cb; - HX_getopt_usage_cb; - HX_mkdir; - HX_strdup; - HX_strlcat; - HX_strlcpy; - HX_strlncat; - HX_strndup; - HX_strnlen; - HXformat_aprintf; - HXformat_fprintf; - HXformat_sprintf; - HXmap_init5; - HXmap_init; -} LIBHX_3.10; - -# ABI 29 -LIBHX_3.13 { -global: - HX_timespec_add; - HX_timespec_isneg; - HX_timespec_mul; - HX_timespec_mulf; - HX_timespec_neg; - HX_timespec_sub; - HX_timeval_sub; -} LIBHX_3.12; - -# ABI 30 -LIBHX_3.15 { -global: - HX_strchr2; -} LIBHX_3.13; - -# ABI 31 -LIBHX_3.18 { -global: - HX_stpltrim; -} LIBHX_3.15; + HXproc_run_async; + HXproc_run_sync; + HXproc_wait; +local: + *; +}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/map.c new/libHX-3.25/src/map.c --- old/libHX-3.24/src/map.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/map.c 2020-05-14 11:48:30.000000000 +0200 @@ -1236,7 +1236,7 @@ } else { /* Search for the specific node to rebegin traversal at. */ const struct HXrbnode *newpath[RBT_MAXDEP]; - unsigned char newdir[RBT_MAXDEP]; + unsigned char newdir[RBT_MAXDEP] = {}; int newdepth = 0, res; bool found = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/misc.c new/libHX-3.25/src/misc.c --- old/libHX-3.24/src/misc.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/misc.c 2020-05-14 11:48:30.000000000 +0200 @@ -82,6 +82,8 @@ EXPORT_SYMBOL void HX_zvecfree(char **args) { char **travp; + if (args == NULL) + return; for (travp = args; *travp != NULL; ++travp) free(*travp); free(args); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/rtcheck.c new/libHX-3.25/src/rtcheck.c --- old/libHX-3.24/src/rtcheck.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/rtcheck.c 2020-05-14 11:48:30.000000000 +0200 @@ -153,12 +153,8 @@ stub2(HX_timespec_neg, (struct timespec *a, const struct timespec *b)); stub3(HX_timespec_sub, (struct timespec *a, const struct timespec *b, const struct timespec *c)); -stub3(HX_diff_timespec, (struct timespec *a, const struct timespec *b, - const struct timespec *c)); stub3(HX_timeval_sub, (struct timeval *a, const struct timeval *b, const struct timeval *c)); -stub3(HX_diff_timeval, (struct timeval *a, const struct timeval *b, - const struct timeval *c)); stub3(HX_time_compare, (const struct stat *a, const struct stat *b, char c)); stub1v(HX_zvecfree, (char **a)); @@ -255,8 +251,8 @@ stub2(HX_getl, (hxmc_t **a, FILE *b)); stub4(HX_memmem, (const void *a, size_t b, const void *c, size_t d)); stub4(HX_split, (const char *a, const char *b, int *c, int d)); -stub4(HX_split4, (char *a, const char *b, int *c, int d)); -stub4(HX_split5, (char *a, const char *b, int c, char **d)); +stub4(HX_split_inplace, (char *a, const char *b, int *c, int d)); +stub4(HX_split_fixed, (char *a, const char *b, int c, char **d)); stub1(HX_stpltrim, (const char *a)); stub1(HX_stprtrim, (char *a)); stub3(HX_strbchr, (const char *a, const char *b, char c)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/string.c new/libHX-3.25/src/string.c --- old/libHX-3.24/src/string.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/string.c 2020-05-14 11:48:30.000000000 +0200 @@ -232,7 +232,7 @@ return ret; } -EXPORT_SYMBOL char **HX_split4(char *s, const char *delim, int *fld, int max) +EXPORT_SYMBOL char **HX_split_inplace(char *s, const char *delim, int *fld, int max) { char **stk; const char *p = s; @@ -248,22 +248,22 @@ if (stk == NULL) return NULL; stk[count] = NULL; - count = HX_split5(s, delim, count, stk); + count = HX_split_fixed(s, delim, count, stk); if (fld != NULL) *fld = count; return stk; } -EXPORT_SYMBOL int HX_split5(char *s, const char *delim, int max, char **stk) +EXPORT_SYMBOL int HX_split_fixed(char *s, const char *delim, int max, char **stk) { /* - * HX_split5 - the "stack split" (we try to avoid using the heap): + * HX_split_fixed - the "stack split" (we try to avoid using the heap): * Split @s (modifies it, so must be writable!) at @delim with at most * @max fields and putting the results into @stk[0..@max-1]. * * Example on @max: * char *stk[max]; - * HX_split5(s, delim, max, stk); + * HX_split_fixed(s, delim, max, stk); */ int i = 0; char *p; @@ -336,6 +336,8 @@ EXPORT_SYMBOL char *HX_strlcpy(char *dest, const char *src, size_t n) { + if (n == 0) + return dest; strncpy(dest, src, n); dest[n-1] = '\0'; return dest; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/tc-dir.c new/libHX-3.25/src/tc-dir.c --- old/libHX-3.24/src/tc-dir.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/tc-dir.c 2020-05-14 11:48:30.000000000 +0200 @@ -13,6 +13,7 @@ # include <cstdlib> #endif #include <libHX/init.h> +#include <libHX/io.h> #include <libHX/misc.h> static void lookatdir(const char *dname) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/tc-link.c new/libHX-3.25/src/tc-link.c --- old/libHX-3.24/src/tc-link.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/tc-link.c 2020-05-14 11:48:30.000000000 +0200 @@ -95,8 +95,8 @@ HX_getl, HX_memmem, HX_split, - HX_split4, - HX_split5, + HX_split_fixed, + HX_split_inplace, HX_stpltrim, HX_strbchr, HX_strchr2, @@ -117,12 +117,6 @@ HX_strsep2, HX_strquote, HX_strupper, -#ifdef HAVE_STRUCT_TIMEVAL_TV_USEC - HX_diff_timeval, -#endif -#ifdef HAVE_STRUCT_TIMESPEC_TV_NSEC - HX_diff_timespec, -#endif HX_time_compare, #ifdef HAVE_STRUCT_TIMESPEC_TV_NSEC HX_timespec_add, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/tc-memmem.c new/libHX-3.25/src/tc-memmem.c --- old/libHX-3.24/src/tc-memmem.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/tc-memmem.c 2020-05-14 11:48:30.000000000 +0200 @@ -9,6 +9,7 @@ #include <stdio.h> #include <stdlib.h> #include <time.h> +#include <libHX/defs.h> #include <libHX/init.h> #include <libHX/misc.h> #include <libHX/string.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/tc-string.c new/libHX-3.25/src/tc-string.c --- old/libHX-3.24/src/tc-string.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/tc-string.c 2020-05-14 11:48:30.000000000 +0200 @@ -160,8 +160,8 @@ memcpy(t2, t1, sizeof(t1)); a0 = HX_split(t1, ":", &f0, 0); - a1 = HX_split4(t1, ":", &f1, 0); - f2 = HX_split5(t2, ":", ARRAY_SIZE(a2), a2); + a1 = HX_split_inplace(t1, ":", &f1, 0); + f2 = HX_split_fixed(t2, ":", ARRAY_SIZE(a2), a2); /* complete allocation */ printf("HX_split1: a0[%p]:", a0); @@ -170,7 +170,7 @@ printf("\n"); /* array allocated */ - printf("HX_split4: a1[%p]:", a1); + printf("HX_split_inplace: a1[%p]:", a1); for (wp = a1; *wp != NULL; ++wp) printf(" %s[%p]", *wp, *wp); printf("\n"); @@ -202,6 +202,8 @@ EXPORT_SYMBOL char *f_strlcpy_str(char *d, const char *s, size_t n) { + if (n == 0) + return d; strncpy(d, s, n); d[n-1] = '\0'; return d; @@ -279,6 +281,13 @@ } } +static void t_strlcpy2(void) +{ + char a[3] = {49, 49, 49}; + HX_strlcpy(&a[1], &a[1], 0); + assert(a[0] == 49 && a[0] == a[1] && a[1] == a[2]); +} + int main(int argc, const char **argv) { hxmc_t *tx = NULL; @@ -308,6 +317,7 @@ t_split(); t_split2(); t_strlcpy(); + t_strlcpy2(); HXmc_free(tx); HX_exit(); return EXIT_SUCCESS; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libHX-3.24/src/time.c new/libHX-3.25/src/time.c --- old/libHX-3.24/src/time.c 2018-10-17 21:15:39.000000000 +0200 +++ new/libHX-3.25/src/time.c 2020-05-14 11:48:30.000000000 +0200 @@ -81,12 +81,6 @@ return HX_timespec_add(r, a, HX_timespec_neg(&b2, b)); } -EXPORT_SYMBOL void HX_diff_timespec(struct timespec *delta, - const struct timespec *future, const struct timespec *past) -{ - HX_timespec_sub(delta, future, past); -} - EXPORT_SYMBOL struct timespec * HX_timespec_mul(struct timespec *r, const struct timespec *a, int f) { @@ -141,12 +135,6 @@ } return delta; } - -EXPORT_SYMBOL void HX_diff_timeval(struct timeval *delta, - const struct timeval *future, const struct timeval *past) -{ - HX_timeval_sub(delta, future, past); -} #endif EXPORT_SYMBOL long HX_time_compare(const struct stat *a, @@ -210,6 +198,17 @@ return a->st_atime - b->st_atime; else if (sel == 'c') return a->st_ctime - b->st_ctime; +#elif defined(HAVE_STRUCT_STAT_ST_MTIM) + if (sel == 'm') + return a->st_mtim - b->st_mtim; +#ifdef HAVE_STRUCT_STAT_ST_OTIM + else if (sel == 'o') + return a->st_otim - b->st_otim; +#endif + else if (sel == 'a') + return a->st_atim - b->st_atim; + else if (sel == 'c') + return a->st_ctim - b->st_ctim; #else # error Tis not ending well. #endif ++++++ libHX.keyring ++++++ --- /var/tmp/diff_new_pack.7INyWX/_old 2020-05-16 22:26:24.725282698 +0200 +++ /var/tmp/diff_new_pack.7INyWX/_new 2020-05-16 22:26:24.729282706 +0200 @@ -1,85 +1,52 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -cCAy -=ePMx +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 +NGTT6x12 +=QLsa -----END PGP PUBLIC KEY BLOCK-----