nscd: Define nscd_ssize_t as int32_t unconditionally

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>
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Magnus Lindholm
2026-08-12 15:08:02 -03:00
committed by Adhemerval Zanella
parent 91d60ade97
commit b9ff43bdfe
3 changed files with 3 additions and 43 deletions
+3 -1
View File
@@ -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
-21
View File
@@ -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;
-21
View File
@@ -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;