[PATCH v2] nscd: Define nscd_ssize_t as int32_t unconditionally

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Tue Aug 11 11:54:47 GMT 2026



On 10/08/26 12:49, Magnus Lindholm wrote:
> alpha was the only target that overrode sysdeps/generic/nscd-types.h,
> defining nscd_ssize_t as int64_t rather than int32_t. The file dated back
> to the initial import and had only ever received licence and copyright
> updates.
> 
> nscd's response headers are a wire format, shared between the daemon and
> its clients through a socket and through the persistent cache. A 64-bit
> nscd_ssize_t gives four of them 8-byte alignment while their last member is
> 32 bits, so they acquire four bytes of tail padding: hst_response_header,
> ai_response_header, serv_response_header and innetgroup_response_header.
> 
> For the hosts cache that is fatal. cache_addhst() asserts that the string
> data follows the header with no gap, and on alpha it does not:
> 
>   nscd: hstcache.c:269: cache_addhst: Assertion
>     `(char *) (&dataset->resp.error + 1) == dataset->strdata' failed.
> 
> The daemon aborts, and nscd/tst-nscd-basic fails with 58 errors. With the
> override removed it passes.
> 
> The padding is also never initialised. cache_addhst() assigns the header
> fields individually and nothing clears the record, yet the response is sent
> with writeall (fd, &dataset->resp, ...) covering the full
> sizeof (hst_response_header), so four uninitialised bytes reach every
> client.
> 
> With alpha gone there is no target left overriding the type, so the sysdeps
> indirection has no purpose. Delete both headers and define nscd_ssize_t
> directly in nscd/nscd-client.h alongside the wire format it describes.
> 
> This changes nscd's protocol and persistent cache layout on alpha; the
> daemon and its clients always come from the same build, so the exposure is
> a daemon left running or a cache file left behind across the upgrade.
> 
> Signed-off-by: Magnus Lindholm <linmag7@gmail.com>

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
> v1: https://inbox.sourceware.org/libc-alpha/20260810093459.3283958-1-linmag7@gmail.com/
> v2: also delete sysdeps/generic/nscd-types.h and define nscd_ssize_t
>     directly in nscd/nscd-client.h, per review. Retitled accordingly.
> 
>  nscd/nscd-client.h           |  4 +++-
>  sysdeps/alpha/nscd-types.h   | 21 ---------------------
>  sysdeps/generic/nscd-types.h | 21 ---------------------
>  3 files changed, 3 insertions(+), 43 deletions(-)
>  delete mode 100644 sysdeps/alpha/nscd-types.h
>  delete mode 100644 sysdeps/generic/nscd-types.h
> 
> diff --git a/nscd/nscd-client.h b/nscd/nscd-client.h
> index 0906de2929..33d275f898 100644
> --- a/nscd/nscd-client.h
> +++ b/nscd/nscd-client.h
> @@ -27,10 +27,12 @@
>  #include <time.h>
>  #include <sys/types.h>
>  #include <atomic.h>
> -#include <nscd-types.h>
>  #include <sys/uio.h>
>  
>  
> +/* Type for the size of a record in the data part of a database.  */
> +typedef int32_t nscd_ssize_t;
> +
>  /* Version number of the daemon interface */
>  #define NSCD_VERSION 2
>  
> diff --git a/sysdeps/alpha/nscd-types.h b/sysdeps/alpha/nscd-types.h
> deleted file mode 100644
> index 1b7ab74a41..0000000000
> --- a/sysdeps/alpha/nscd-types.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/* Types for the NSCD implementation.  Alpha version.
> -   Copyright (c) 2000-2026 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library 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
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library.  If not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <stdint.h>
> -
> -typedef int64_t nscd_ssize_t;
> diff --git a/sysdeps/generic/nscd-types.h b/sysdeps/generic/nscd-types.h
> deleted file mode 100644
> index f196175ec3..0000000000
> --- a/sysdeps/generic/nscd-types.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/* Types for the NSCD implementation.  Generic version.
> -   Copyright (c) 2000-2026 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library 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
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library; if not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#include <stdint.h>
> -
> -typedef int32_t nscd_ssize_t;



More information about the Libc-alpha mailing list