diff options
| author | Lexi Winter <ivy@FreeBSD.org> | 2026-08-03 14:04:16 +0000 |
|---|---|---|
| committer | Lexi Winter <ivy@FreeBSD.org> | 2026-08-03 14:04:16 +0000 |
| commit | cb2daf8ce116d475597d7ab95f2454ea54c968e6 (patch) | |
| tree | dd431dbb7e48c82350b9b085a2c1b8c4866f9e08 | |
| parent | f1d98862044f7748c6f930e9d4339abc166a5b16 (diff) | |
rpcgen: Const correctness for C23
On some platforms, e.g. Linux Clang 22.1.8 / glibc 2.43, strchr()
now implements the C23 behaviour where passing a const pointer to
strchr() also returns a const pointer. This breaks rpcgen during
the bootstrap build, since it assumes the return value is always
a mutable pointer.
For mkfile_output(), the pointed-to value is never modified, so
fix this by making the pointer const as well.
For open_log_file(), the current code modifies the supposedly const
value in-place to remove the filename suffix, which happens to work
but is wrong even in older versions of C. Change the code to use a
printf "%.*s" format specifier to strip the suffix instead.
MFC after: 1 week
Reviewed by: brooks
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D58489
| -rw-r--r-- | usr.bin/rpcgen/rpc_main.c | 3 | ||||
| -rw-r--r-- | usr.bin/rpcgen/rpc_svcout.c | 19 |
2 files changed, 15 insertions, 7 deletions
diff --git a/usr.bin/rpcgen/rpc_main.c b/usr.bin/rpcgen/rpc_main.c index 8d5afad86cff..4c69be1ed333 100644 --- a/usr.bin/rpcgen/rpc_main.c +++ b/usr.bin/rpcgen/rpc_main.c @@ -868,7 +868,8 @@ static void mkfile_output(struct commandline *cmd) { const char *mkfilename, *clientname, *clntname, *xdrname, *hdrname; const char *servername, *svcname, *servprogname, *clntprogname; - char *temp, *mkftemp; + const char *temp; + char *mkftemp; svcname = file_name(cmd->infile, "_svc.c"); clntname = file_name(cmd->infile, "_clnt.c"); diff --git a/usr.bin/rpcgen/rpc_svcout.c b/usr.bin/rpcgen/rpc_svcout.c index 2c6849714d75..bbeed976c2d2 100644 --- a/usr.bin/rpcgen/rpc_svcout.c +++ b/usr.bin/rpcgen/rpc_svcout.c @@ -31,6 +31,7 @@ * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler * Copyright (C) 1987, Sun Microsystems, Inc. */ +#include <limits.h> #include <stdio.h> #include <string.h> #include "rpc_parse.h" @@ -931,14 +932,20 @@ write_rpc_svc_fg(const char *infile, const char *sp) static void open_log_file(const char *infile, const char *sp) { - char *s; + const char *s; s = strrchr(infile, '.'); - if (s) - *s = '\0'; - f_print(fout, "%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile); - if (s) - *s = '.'; + if (s) { + size_t len; + + len = s - infile; + if (len > INT_MAX) + len = INT_MAX; + f_print(fout, "%sopenlog(\"%.*s\", LOG_PID, LOG_DAEMON);\n", + sp, (int)len, infile); + } else + f_print(fout, "%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", + sp, infile); } |
