diff options
| -rwxr-xr-x | configure | 20 | ||||
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | doc/changelog.rst | 17 | ||||
| -rw-r--r-- | include/libHX/libxml_helper.h | 2 | ||||
| -rw-r--r-- | src/format.c | 5 | ||||
| -rw-r--r-- | src/io.c | 3 | ||||
| -rw-r--r-- | src/map.c | 2 | ||||
| -rw-r--r-- | src/proc.c | 2 | ||||
| -rw-r--r-- | src/socket.c | 7 | ||||
| -rw-r--r-- | src/tc-socket.c | 31 | ||||
| -rw-r--r-- | src/tc-string.c | 4 | 
11 files changed, 77 insertions, 18 deletions
| @@ -1,6 +1,6 @@  #! /bin/sh  # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for libHX 4.12. +# Generated by GNU Autoconf 2.71 for libHX 4.14.  #  #  # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, @@ -618,8 +618,8 @@ MAKEFLAGS=  # Identity of this package.  PACKAGE_NAME='libHX'  PACKAGE_TARNAME='libhx' -PACKAGE_VERSION='4.12' -PACKAGE_STRING='libHX 4.12' +PACKAGE_VERSION='4.14' +PACKAGE_STRING='libHX 4.14'  PACKAGE_BUGREPORT=''  PACKAGE_URL='' @@ -1375,7 +1375,7 @@ if test "$ac_init_help" = "long"; then    # 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 4.12 to adapt to many kinds of systems. +\`configure' configures libHX 4.14 to adapt to many kinds of systems.  Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1446,7 +1446,7 @@ fi  if test -n "$ac_init_help"; then    case $ac_init_help in -     short | recursive ) echo "Configuration of libHX 4.12:";; +     short | recursive ) echo "Configuration of libHX 4.14:";;     esac    cat <<\_ACEOF @@ -1561,7 +1561,7 @@ fi  test -n "$ac_init_help" && exit $ac_status  if $ac_init_version; then    cat <<\_ACEOF -libHX configure 4.12 +libHX configure 4.14  generated by GNU Autoconf 2.71  Copyright (C) 2021 Free Software Foundation, Inc. @@ -2195,7 +2195,7 @@ cat >config.log <<_ACEOF  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 4.12, which was +It was created by libHX $as_me 4.14, which was  generated by GNU Autoconf 2.71.  Invocation command line was    $ $0$ac_configure_args_raw @@ -3684,7 +3684,7 @@ fi  # Define the identity of the package.   PACKAGE='libhx' - VERSION='4.12' + VERSION='4.14'  printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -18771,7 +18771,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1  # 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 4.12, which was +This file was extended by libHX $as_me 4.14, which was  generated by GNU Autoconf 2.71.  Invocation command line was    CONFIG_FILES    = $CONFIG_FILES @@ -18839,7 +18839,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1  ac_cs_config='$ac_cs_config_escaped'  ac_cs_version="\\ -libHX config.status 4.12 +libHX config.status 4.14  configured by $0, generated by GNU Autoconf 2.71,    with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index f569ade..92c72c7 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([libHX], [4.12]) +AC_INIT([libHX], [4.14])  AC_CONFIG_AUX_DIR([build-aux])  AC_CONFIG_HEADERS([config.h])  AC_CONFIG_MACRO_DIR([m4]) diff --git a/doc/changelog.rst b/doc/changelog.rst index 30f2d28..26c4d06 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -1,3 +1,20 @@ +v4.14 (2023-07-14) +================== + +Fixes: + +* socket: make HX_addrport_split work on portless bracketed hostspec + + +v4.13 (2023-06-21) +================== + +Fixes: + +* io: do not fail HX_mkdir when a component is a symlink to a directory +* xml_helper: fix infinite recursion in xml_getnsprop + +  v4.12 (2023-02-27)  ================== diff --git a/include/libHX/libxml_helper.h b/include/libHX/libxml_helper.h index 08a0a07..5a02bf0 100644 --- a/include/libHX/libxml_helper.h +++ b/include/libHX/libxml_helper.h @@ -118,7 +118,7 @@ static __inline__ const char *xml_getprop(const xmlNode *node, const char *attr)  static __inline__ char *xml_getnsprop(const xmlNode *node, const char *nsprefix,      const char *attr)  { -	return xml_getnsprop(const_cast<const xmlNode *>(node), nsprefix, attr); +	return xml_getnsprop(const_cast<xmlNode *>(node), nsprefix, attr);  }  #endif diff --git a/src/format.c b/src/format.c index 25c09d6..e924c6a 100644 --- a/src/format.c +++ b/src/format.c @@ -7,6 +7,7 @@   *	General Public License as published by the Free Software Foundation;   *	either version 2.1 or (at your option) any later version.   */ +#include <assert.h>  #include <errno.h>  #include <stdbool.h>  #include <stddef.h> @@ -681,6 +682,7 @@ EXPORT_SYMBOL ssize_t HXformat3_aprintf(const struct HXformat_map *blk,   out:  	ret = -errno;  	HXmc_free(out); +	*resultp = nullptr;  	return ret;  } @@ -716,7 +718,7 @@ EXPORT_SYMBOL int HXformat_sprintf(const struct HXformat_map *ftable,  EXPORT_SYMBOL ssize_t HXformat3_sprintf(const struct HXformat_map *ftable,      char *dest, size_t size, const char *fmt)  { -	hxmc_t *str; +	hxmc_t *str = nullptr;  	ssize_t ret;  	if ((ret = HXformat_aprintf(ftable, &str, fmt)) < 0) @@ -725,6 +727,7 @@ EXPORT_SYMBOL ssize_t HXformat3_sprintf(const struct HXformat_map *ftable,  		*dest = '\0';  		return 0;  	} +	assert(str != nullptr);  	strncpy(dest, str, size);  	size_t xl = strlen(dest);  	HXmc_free(str); @@ -66,7 +66,7 @@ static int mkdir_gen(const char *d, unsigned int mode)  		return 1;  	if (errno != EEXIST)  		return -errno; -	if (lstat(d, &sb) == 0) { +	if (stat(d, &sb) == 0) {  #if defined(_WIN32)  		if (sb.st_mode & S_IFDIR)  #else @@ -424,6 +424,7 @@ HX_realpath_symres(struct HX_realpath_state *state, const char *path)  		return -ELOOP;  #endif +	assert(state->link_target != nullptr);  	if (*state->link_target == '/') {  		*state->dest = '\0';  		if (HXmc_setlen(&state->dest, 0) == NULL) @@ -1145,7 +1145,7 @@ static const struct HXmap_node *HXumap_traverse(struct HXumap_trav *trav)  	while (trav->head == &hmap->bk_array[trav->bk_current]) {  		if (++trav->bk_current >= HXhash_primes[hmap->power]) -			return false; +			return NULL;  		trav->head = hmap->bk_array[trav->bk_current].next;  	} @@ -69,7 +69,7 @@ static int HXproc_switch_group(const struct passwd *pw, const char *group)  	return HXproc_switch_gid(pw, gr->gr_gid);  } -EXPORT_SYMBOL int HXproc_switch_user(const char *user, const char *group) +EXPORT_SYMBOL enum HXproc_su_status HXproc_switch_user(const char *user, const char *group)  {  	const struct passwd *pw = NULL;  	if (user != NULL && *user != '\0') { diff --git a/src/socket.c b/src/socket.c index 9b5d78a..0b6f674 100644 --- a/src/socket.c +++ b/src/socket.c @@ -86,8 +86,11 @@ int HX_addrport_split(const char *spec, char *host,  		unsigned long hlen = end - spec;  		if (hlen >= hbufsz)  			return -E2BIG; -		if (*++end == '\0') +		if (*++end == '\0') { +			memmove(host, spec, hlen); +			host[hlen] = '\0';  			return 1; +		}  		if (*end++ != ':')  			return -EINVAL;  		char *nend = nullptr; @@ -146,6 +149,8 @@ int HX_inet_connect(const char *host, uint16_t port, unsigned int oflags)  	struct addrinfo *aires = nullptr;  	int ret = HX_inet_lookup(host, port, AI_ADDRCONFIG, &aires);  	int saved_errno = 0; +	if (ret != 0) +		;  	for (const struct addrinfo *r = aires; r != nullptr; r = r->ai_next) {  		int fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol);  		if (fd < 0) { diff --git a/src/tc-socket.c b/src/tc-socket.c index 9904ba8..3cdeb90 100644 --- a/src/tc-socket.c +++ b/src/tc-socket.c @@ -12,12 +12,30 @@  #ifndef AI_V4MAPPED  #	define AI_V4MAPPED 0  #endif +#include "internal.h" -int main(void) +static int t_parse(void) +{ +	char host[32] = "bogus"; +	if (HX_addrport_split("[::1]", host, sizeof(host), nullptr) != 1 || +	    strcmp(host, "::1") != 0) +		return 1; +	if (HX_addrport_split("[]", host, sizeof(host), nullptr) != 1 || +	    strcmp(host, "") != 0) +		return 1; +	if (HX_addrport_split("", host, sizeof(host), nullptr) != 1 || +	    strcmp(host, "") != 0) +		return 1; +	return 0; +} + +static int t_local(void)  {  	static const char *addrs[] = {  		"::1", "::2", "::ffff:127.0.0.1", "::", +		"[::1]", "[::2]", "[::ffff:127.0.0.1]", "[::]",  		"127.0.0.1", "127.0.0.2", "1.1.1.1", "255.255.255.255", +		"[127.0.0.1]", "[127.0.0.2]", "[1.1.1.1]", "[255.255.255.255]",  	};  	for (size_t i = 0; i < ARRAY_SIZE(addrs); ++i) {  		char host[32] = {}; @@ -73,3 +91,14 @@ int main(void)  	}  	return EXIT_SUCCESS;  } + +int main(void) +{ +	int ret = t_parse(); +	if (ret != 0) +		return ret; +	ret = t_local(); +	if (ret != EXIT_SUCCESS) +		return ret; +	return EXIT_SUCCESS; +} diff --git a/src/tc-string.c b/src/tc-string.c index 77235c2..9bf668b 100644 --- a/src/tc-string.c +++ b/src/tc-string.c @@ -84,12 +84,16 @@ static void t_strncat(void)  {  	char data[5] = "DATA"; +#ifndef __clang__  #pragma GCC diagnostic push  #pragma GCC diagnostic ignored "-Wformat-truncation" +#endif  	if (snprintf(data, sizeof(data), "12345678") >=  	    static_cast(ssize_t, sizeof(data)))  		printf("Not enough space\n"); +#ifndef __clang__  #pragma GCC diagnostic pop +#endif  	printf("String: >%s<\n", data);  	HX_strlcat(data, "pqrstuv__", 2); | 
