Adding _GL_ATTRIBUTE_* declarations to xgetdomainname.h leads to a compilation error. The cause is that xgetdomainname.c does not include <config.h>. But adding '#include <config.h>' would then cause <config.h> to be included twice in the same compilation unit, which may have bad effects.
So, this situation needs to cleaned up first. 2021-08-07 Bruno Haible <[email protected]> xgetdomainname: Improve GCC 11 allocation-deallocation checking. * lib/xgetdomainname.h: Include <stdlib.h>. (xgetdomainname): Declare that deallocation must happen through 'free'. 2021-08-07 Bruno Haible <[email protected]> xgetdomainname: Ensure .c file starts with '#include <config.h>'. * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. * lib/xgetdomainname.c: Include <config.h>. Include xgetaname-impl.h instead of xgethostname.c. * modules/xgethostname (Files): Add lib/xgetaname-impl.h. * modules/xgetdomainname (Files): Likewise. (Depends-on): Remove xgethostname. Add free-posix, xalloc.
>From 9af2d6c99c9353a4160c99d84134330c1beab246 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Sat, 7 Aug 2021 23:30:53 +0200 Subject: [PATCH 1/2] xgetdomainname: Ensure .c file starts with '#include <config.h>'. * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. * lib/xgetdomainname.c: Include <config.h>. Include xgetaname-impl.h instead of xgethostname.c. * modules/xgethostname (Files): Add lib/xgetaname-impl.h. * modules/xgetdomainname (Files): Likewise. (Depends-on): Remove xgethostname. Add free-posix, xalloc. --- ChangeLog | 11 +++++++++ lib/xgetaname-impl.h | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/xgetdomainname.c | 5 +++- lib/xgethostname.c | 52 ++++------------------------------------- modules/xgetdomainname | 4 +++- modules/xgethostname | 1 + 6 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 lib/xgetaname-impl.h diff --git a/ChangeLog b/ChangeLog index 8e3707f..9073c37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2021-08-07 Bruno Haible <[email protected]> + xgetdomainname: Ensure .c file starts with '#include <config.h>'. + * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. + * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. + * lib/xgetdomainname.c: Include <config.h>. Include xgetaname-impl.h + instead of xgethostname.c. + * modules/xgethostname (Files): Add lib/xgetaname-impl.h. + * modules/xgetdomainname (Files): Likewise. + (Depends-on): Remove xgethostname. Add free-posix, xalloc. + +2021-08-07 Bruno Haible <[email protected]> + xstrndup: Improve GCC 11 allocation-deallocation checking. * lib/xstrndup.h: Include <stdlib.h> instead of <stddef.h>. (xstrndup): Declare that deallocation must happen through 'free'. diff --git a/lib/xgetaname-impl.h b/lib/xgetaname-impl.h new file mode 100644 index 0000000..ce62000 --- /dev/null +++ b/lib/xgetaname-impl.h @@ -0,0 +1,63 @@ +/* xgetaname-impl.c -- common implementation of xgethostname and xgetdomainname + + Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2021 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +/* written by Jim Meyering and Paul Eggert */ + +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> + +#include "xalloc.h" + +/* Return the current host or domain name in malloc'd storage. + If malloc fails, exit. + Upon any other failure, return NULL and set errno. */ +char * +XGETANAME (void) +{ + char buf[100]; + idx_t size = sizeof buf; + char *name = buf; + char *alloc = NULL; + + while (1) + { + /* Use SIZE_1 here rather than SIZE to work around the bug in + SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME + even when the name is as long as the supplied buffer. */ + idx_t size_1 = size - 1; + name[size_1] = '\0'; + errno = 0; + if (GETANAME (name, size_1) == 0) + { + /* Check whether the name was possibly truncated; POSIX does not + specify whether a truncated name is null-terminated. */ + idx_t actual_size = strlen (name) + 1; + if (actual_size < size_1) + return alloc ? alloc : ximemdup (name, actual_size); + errno = 0; + } + free (alloc); + if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL + /* macOS/Darwin does this when SIZE_1 is too small. */ + && errno != ENOMEM) + return NULL; + name = alloc = xpalloc (NULL, &size, 1, -1, 1); + } +} diff --git a/lib/xgetdomainname.c b/lib/xgetdomainname.c index c854dd3..08ba7fa 100644 --- a/lib/xgetdomainname.c +++ b/lib/xgetdomainname.c @@ -15,8 +15,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +#include <config.h> + +/* Specification. */ #include "xgetdomainname.h" #define GETANAME getdomainname #define XGETANAME xgetdomainname -#include "xgethostname.c" +#include "xgetaname-impl.h" diff --git a/lib/xgethostname.c b/lib/xgethostname.c index 84c2f27..69dd857 100644 --- a/lib/xgethostname.c +++ b/lib/xgethostname.c @@ -20,53 +20,9 @@ #include <config.h> -#ifndef GETANAME /* Specification. */ -# include "xgethostname.h" -# define GETANAME gethostname -# define XGETANAME xgethostname -#endif +#include "xgethostname.h" -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <unistd.h> - -#include "xalloc.h" - -/* Return the current host or domain name in malloc'd storage. - If malloc fails, exit. - Upon any other failure, return NULL and set errno. */ -char * -XGETANAME (void) -{ - char buf[100]; - idx_t size = sizeof buf; - char *name = buf; - char *alloc = NULL; - - while (1) - { - /* Use SIZE_1 here rather than SIZE to work around the bug in - SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME - even when the name is as long as the supplied buffer. */ - idx_t size_1 = size - 1; - name[size_1] = '\0'; - errno = 0; - if (GETANAME (name, size_1) == 0) - { - /* Check whether the name was possibly truncated; POSIX does not - specify whether a truncated name is null-terminated. */ - idx_t actual_size = strlen (name) + 1; - if (actual_size < size_1) - return alloc ? alloc : ximemdup (name, actual_size); - errno = 0; - } - free (alloc); - if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL - /* macOS/Darwin does this when SIZE_1 is too small. */ - && errno != ENOMEM) - return NULL; - name = alloc = xpalloc (NULL, &size, 1, -1, 1); - } -} +#define GETANAME gethostname +#define XGETANAME xgethostname +#include "xgetaname-impl.h" diff --git a/modules/xgetdomainname b/modules/xgetdomainname index c1417c8..ec68362 100644 --- a/modules/xgetdomainname +++ b/modules/xgetdomainname @@ -4,10 +4,12 @@ Return machine's domainname, without size limitations. Files: lib/xgetdomainname.h lib/xgetdomainname.c +lib/xgetaname-impl.h Depends-on: +free-posix getdomainname -xgethostname +xalloc configure.ac: diff --git a/modules/xgethostname b/modules/xgethostname index 846df1c..ec25db0 100644 --- a/modules/xgethostname +++ b/modules/xgethostname @@ -4,6 +4,7 @@ Return machine's hostname, without size limitations. Files: lib/xgethostname.h lib/xgethostname.c +lib/xgetaname-impl.h Depends-on: free-posix -- 2.7.4
>From 4c424dc470b6ec000c0a10bb649f07358813f842 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Sat, 7 Aug 2021 23:36:42 +0200 Subject: [PATCH 2/2] xgetdomainname: Improve GCC 11 allocation-deallocation checking. * lib/xgetdomainname.h: Include <stdlib.h>. (xgetdomainname): Declare that deallocation must happen through 'free'. --- ChangeLog | 6 ++++++ lib/xgetdomainname.h | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 9073c37..0cb5d61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2021-08-07 Bruno Haible <[email protected]> + xgetdomainname: Improve GCC 11 allocation-deallocation checking. + * lib/xgetdomainname.h: Include <stdlib.h>. + (xgetdomainname): Declare that deallocation must happen through 'free'. + +2021-08-07 Bruno Haible <[email protected]> + xgetdomainname: Ensure .c file starts with '#include <config.h>'. * lib/xgetaname-impl.h: New file, based on lib/xgethostname.c. * lib/xgethostname.c: Move implementation to lib/xgetaname-impl.h. diff --git a/lib/xgetdomainname.h b/lib/xgetdomainname.h index 2ac9819..389a9fc 100644 --- a/lib/xgetdomainname.h +++ b/lib/xgetdomainname.h @@ -18,6 +18,8 @@ #ifndef _XGETDOMAINNAME_H #define _XGETDOMAINNAME_H +#include <stdlib.h> + /* Return the NIS domain name of the machine, in malloc'd storage. WARNING! The NIS domain name is unrelated to the fully qualified host name of the machine. It is also unrelated to email addresses. @@ -25,6 +27,7 @@ not using NIS. If malloc fails, exit. Upon any other failure, set errno and return NULL. */ -extern char *xgetdomainname (void); +extern char *xgetdomainname (void) + _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE; #endif /* _XGETDOMAINNAME_H */ -- 2.7.4
