Files
Jonathan Hui fdb6f96072 [script] fix socat 1.7.4.4 build with C23 / glibc 2.43 (#13796)
In `socat-1.7.4.4/filan.c`, `printtime()` declares `const char *s`,
assigns `asctime(localtime(&time))` (which returns `char *`), and
strips the trailing newline in place via `*strchr(s, '\n') = '\0'`.
With glibc 2.43 and `-D_GNU_SOURCE` (as on Ubuntu 26.04 with GCC
15.2), `<string.h>` enables ISO C23 qualifier-preserving `_Generic`
macros so `strchr(const char *, int)` returns `const char *`, causing
`make` in `script/install_socat` to fail with `error: assignment of
read-only location` (even if `-std=gnu17` is passed).

This commit patches `printtime()` in `filan.c` after archive
extraction to declare `char *s;` (matching `asctime()`'s `char *`
return type without altering `const char *s;` in `getfiletypestring()`
above it), using a POSIX `sed` + `mv` sequence compatible with both
Linux and macOS.
2026-10-26 22:16:27 +01:00

86 lines
3.3 KiB
Bash

#!/bin/bash
#
# Copyright (c) 2025, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
set -euxo pipefail
TEMP_PATH=$(mktemp -d)
SOCAT="socat-1.7.4.4"
SOCAT_TAR="$SOCAT.tar.bz2"
# Use the Yocto source mirror for HTTPS transport; verify the upstream archive hash below.
SOCAT_URL="https://downloads.yoctoproject.org/mirror/sources/$SOCAT_TAR"
SOCAT_SHA256="fbd42bd2f0e54a3af6d01bdf15385384ab82dbc0e4f1a5e153b3e0be1b6380ac"
trap 'rm -rf "$TEMP_PATH" || sudo rm -rf "$TEMP_PATH"' EXIT
verify_sha256()
{
local actual_sha256
local archive=$1
if command -v sha256sum >/dev/null 2>&1; then
actual_sha256=$(sha256sum "$archive" | awk '{print $1}')
elif command -v shasum >/dev/null 2>&1; then
actual_sha256=$(shasum -a 256 "$archive" | awk '{print $1}')
else
echo "sha256sum or shasum is required to verify $archive" >&2
exit 1
fi
if [[ $actual_sha256 != "$SOCAT_SHA256" ]]; then
echo "SHA-256 mismatch for $archive" >&2
echo "Expected: $SOCAT_SHA256" >&2
echo "Actual: $actual_sha256" >&2
exit 1
fi
}
INSTALL_PREFIX="--prefix=/usr"
if command -v brew >/dev/null 2>&1; then
INSTALL_PREFIX="" # On MacOS, it's not allowed to install to /usr/bin due to System Integrity Protection
fi
cd "$TEMP_PATH"
[[ -f $SOCAT_TAR ]] || wget \
--tries 4 \
--https-only \
--secure-protocol=TLSv1_2 \
--max-redirect=0 \
--output-document="$SOCAT_TAR" \
"$SOCAT_URL"
verify_sha256 "$SOCAT_TAR"
tar -xjf "$SOCAT_TAR"
cd "$SOCAT"
# Fix C23 / glibc 2.43 build failure where const-preserving strchr() rejects
# mutating asctime()'s char * return value through a const char * variable.
sed '/^static int printtime(/,/^}/s/const char \*s;/char *s;/' filan.c >filan.c.tmp
mv filan.c.tmp filan.c
./configure "$INSTALL_PREFIX"
make
sudo make install