Module Name: src Committed By: mrg Date: Tue Aug 1 08:47:25 UTC 2023
Modified Files: src/bin/rcp: rcp.c src/crypto/external/bsd/openssh/dist: scp.c src/lib/libc/net: getaddrinfo.c src/lib/libc/resolv: res_debug.c res_query.c src/usr.sbin/edquota: edquota.c src/usr.sbin/ypserv/common: ypdb.c Log Message: convert explicit length check before unchecked snprintf() with just a overflow checked snprintf(). for res_debug.c and res_query.c, convert from sprintf() to snprintf(). tested scp and rcp fail properly with too-long paths. tested getaddrinfo fails as expected for too-long domains. tested dig and ping for similar (res_debug.c/res_query.c). created a temporary fs with quotas to test edquota with a long EDITOR. did not test ypserv directly, but it's the same pattern. avoids GCC 12 snprintf() warnings, and reduces total code size. To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.53 src/bin/rcp/rcp.c cvs rdiff -u -r1.38 -r1.39 src/crypto/external/bsd/openssh/dist/scp.c cvs rdiff -u -r1.123 -r1.124 src/lib/libc/net/getaddrinfo.c cvs rdiff -u -r1.16 -r1.17 src/lib/libc/resolv/res_debug.c \ src/lib/libc/resolv/res_query.c cvs rdiff -u -r1.53 -r1.54 src/usr.sbin/edquota/edquota.c cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/ypserv/common/ypdb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/rcp/rcp.c diff -u src/bin/rcp/rcp.c:1.52 src/bin/rcp/rcp.c:1.53 --- src/bin/rcp/rcp.c:1.52 Mon Jul 18 13:01:59 2022 +++ src/bin/rcp/rcp.c Tue Aug 1 08:47:24 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: rcp.c,v 1.52 2022/07/18 13:01:59 rin Exp $ */ +/* $NetBSD: rcp.c,v 1.53 2023/08/01 08:47:24 mrg Exp $ */ /* * Copyright (c) 1983, 1990, 1992, 1993 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19 #if 0 static char sccsid[] = "@(#)rcp.c 8.2 (Berkeley) 4/2/94"; #else -__RCSID("$NetBSD: rcp.c,v 1.52 2022/07/18 13:01:59 rin Exp $"); +__RCSID("$NetBSD: rcp.c,v 1.53 2023/08/01 08:47:24 mrg Exp $"); #endif #endif /* not lint */ @@ -466,11 +466,11 @@ rsource(char *name, struct stat *statp) continue; if (!strcmp(dp->d_name, dot) || !strcmp(dp->d_name, "..")) continue; - if (strlen(name) + 1 + strlen(dp->d_name) >= MAXPATHLEN - 1) { + if (snprintf(path, sizeof(path), "%s/%s", name, dp->d_name) >= + sizeof(path)) { run_err("%s/%s: name too long", name, dp->d_name); continue; } - (void)snprintf(path, sizeof(path), "%s/%s", name, dp->d_name); vect[0] = path; source(1, vect); } Index: src/crypto/external/bsd/openssh/dist/scp.c diff -u src/crypto/external/bsd/openssh/dist/scp.c:1.38 src/crypto/external/bsd/openssh/dist/scp.c:1.39 --- src/crypto/external/bsd/openssh/dist/scp.c:1.38 Fri Jul 28 04:40:54 2023 +++ src/crypto/external/bsd/openssh/dist/scp.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: scp.c,v 1.38 2023/07/28 04:40:54 rin Exp $ */ +/* $NetBSD: scp.c,v 1.39 2023/08/01 08:47:25 mrg Exp $ */ /* $OpenBSD: scp.c,v 1.253 2023/03/03 03:12:24 dtucker Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which @@ -73,7 +73,7 @@ */ #include "includes.h" -__RCSID("$NetBSD: scp.c,v 1.38 2023/07/28 04:40:54 rin Exp $"); +__RCSID("$NetBSD: scp.c,v 1.39 2023/08/01 08:47:25 mrg Exp $"); #include <sys/param.h> /* roundup MAX */ #include <sys/types.h> @@ -1476,11 +1476,11 @@ rsource(char *name, struct stat *statp) continue; if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue; - if (strlen(name) + 1 + strlen(dp->d_name) >= sizeof(path) - 1) { + if ((size_t)snprintf(path, sizeof path, "%s/%s", + name, dp->d_name) >= sizeof path) { run_err("%s/%s: name too long", name, dp->d_name); continue; } - (void) snprintf(path, sizeof path, "%s/%s", name, dp->d_name); vect[0] = path; source(1, vect); } Index: src/lib/libc/net/getaddrinfo.c diff -u src/lib/libc/net/getaddrinfo.c:1.123 src/lib/libc/net/getaddrinfo.c:1.124 --- src/lib/libc/net/getaddrinfo.c:1.123 Tue Apr 19 20:32:15 2022 +++ src/lib/libc/net/getaddrinfo.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: getaddrinfo.c,v 1.123 2022/04/19 20:32:15 rillig Exp $ */ +/* $NetBSD: getaddrinfo.c,v 1.124 2023/08/01 08:47:25 mrg Exp $ */ /* $KAME: getaddrinfo.c,v 1.29 2000/08/31 17:26:57 itojun Exp $ */ /* @@ -55,7 +55,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: getaddrinfo.c,v 1.123 2022/04/19 20:32:15 rillig Exp $"); +__RCSID("$NetBSD: getaddrinfo.c,v 1.124 2023/08/01 08:47:25 mrg Exp $"); #endif /* LIBC_SCCS and not lint */ #ifndef RUMP_ACTION @@ -2820,7 +2820,7 @@ res_querydomainN(const char *name, const { char nbuf[MAXDNAME]; const char *longname = nbuf; - size_t n, d; + size_t n; _DIAGASSERT(name != NULL); /* XXX: target may be NULL??? */ @@ -2841,18 +2841,15 @@ res_querydomainN(const char *name, const return -1; } if (n > 0 && name[--n] == '.') { - strncpy(nbuf, name, n); - nbuf[n] = '\0'; + snprintf(nbuf, sizeof(nbuf), "%*s", (int)n, name); } else longname = name; } else { - n = strlen(name); - d = strlen(domain); - if (n + 1 + d + 1 > sizeof(nbuf)) { + if ((size_t)snprintf(nbuf, sizeof(nbuf), "%s.%s", + name, domain) >= sizeof(nbuf)) { h_errno = NO_RECOVERY; return -1; } - snprintf(nbuf, sizeof(nbuf), "%s.%s", name, domain); } return res_queryN(longname, target, res); } Index: src/lib/libc/resolv/res_debug.c diff -u src/lib/libc/resolv/res_debug.c:1.16 src/lib/libc/resolv/res_debug.c:1.17 --- src/lib/libc/resolv/res_debug.c:1.16 Thu Sep 16 20:17:46 2021 +++ src/lib/libc/resolv/res_debug.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: res_debug.c,v 1.16 2021/09/16 20:17:46 andvar Exp $ */ +/* $NetBSD: res_debug.c,v 1.17 2023/08/01 08:47:25 mrg Exp $ */ /* * Portions Copyright (C) 2004, 2005, 2008, 2009 Internet Systems Consortium, Inc. ("ISC") @@ -97,7 +97,7 @@ static const char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; static const char rcsid[] = "Id: res_debug.c,v 1.19 2009/02/26 11:20:20 tbox Exp"; #else -__RCSID("$NetBSD: res_debug.c,v 1.16 2021/09/16 20:17:46 andvar Exp $"); +__RCSID("$NetBSD: res_debug.c,v 1.17 2023/08/01 08:47:25 mrg Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -1183,9 +1183,13 @@ p_secstodate (u_long secs) { #endif mytime->tm_year += 1900; mytime->tm_mon += 1; - sprintf(output, "%04d%02d%02d%02d%02d%02d", - mytime->tm_year, mytime->tm_mon, mytime->tm_mday, - mytime->tm_hour, mytime->tm_min, mytime->tm_sec); + if ((size_t)snprintf(output, sizeof p_secstodate_output, + "%04d%02d%02d%02d%02d%02d", + mytime->tm_year, mytime->tm_mon, mytime->tm_mday, + mytime->tm_hour, mytime->tm_min, mytime->tm_sec) > + sizeof p_secstodate_output) { + output[sizeof(p_secstodate_output) - 1] = 0; + } return (output); } Index: src/lib/libc/resolv/res_query.c diff -u src/lib/libc/resolv/res_query.c:1.16 src/lib/libc/resolv/res_query.c:1.17 --- src/lib/libc/resolv/res_query.c:1.16 Tue Feb 24 17:56:20 2015 +++ src/lib/libc/resolv/res_query.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: res_query.c,v 1.16 2015/02/24 17:56:20 christos Exp $ */ +/* $NetBSD: res_query.c,v 1.17 2023/08/01 08:47:25 mrg Exp $ */ /* * Portions Copyright (C) 2004, 2005, 2008 Internet Systems Consortium, Inc. ("ISC") @@ -89,7 +89,7 @@ static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93"; static const char rcsid[] = "Id: res_query.c,v 1.11 2008/11/14 02:36:51 marka Exp"; #else -__RCSID("$NetBSD: res_query.c,v 1.16 2015/02/24 17:56:20 christos Exp $"); +__RCSID("$NetBSD: res_query.c,v 1.17 2023/08/01 08:47:25 mrg Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -398,7 +398,7 @@ res_nquerydomain(res_state statp, { char nbuf[MAXDNAME]; const char *longname = nbuf; - size_t n, d; + size_t n; #ifdef DEBUG if (statp->options & RES_DEBUG) @@ -416,18 +416,15 @@ res_nquerydomain(res_state statp, return (-1); } if (n && name[--n] == '.') { - strncpy(nbuf, name, n); - nbuf[n] = '\0'; + snprintf(nbuf, sizeof(nbuf), "%*s", (int)n, name); } else longname = name; } else { - n = strlen(name); - d = strlen(domain); - if (n + d + 1 >= MAXDNAME) { + if ((size_t)snprintf(nbuf, sizeof(nbuf), "%s.%s", + name, domain) >= sizeof(nbuf)) { RES_SET_H_ERRNO(statp, NO_RECOVERY); return (-1); } - sprintf(nbuf, "%s.%s", name, domain); } return (res_nquery(statp, longname, class, type, answer, anslen)); } Index: src/usr.sbin/edquota/edquota.c diff -u src/usr.sbin/edquota/edquota.c:1.53 src/usr.sbin/edquota/edquota.c:1.54 --- src/usr.sbin/edquota/edquota.c:1.53 Tue Nov 9 09:21:31 2021 +++ src/usr.sbin/edquota/edquota.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: edquota.c,v 1.53 2021/11/09 09:21:31 nia Exp $ */ +/* $NetBSD: edquota.c,v 1.54 2023/08/01 08:47:25 mrg Exp $ */ /* * Copyright (c) 1980, 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -41,7 +41,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19 #if 0 static char sccsid[] = "from: @(#)edquota.c 8.3 (Berkeley) 4/27/95"; #else -__RCSID("$NetBSD: edquota.c,v 1.53 2021/11/09 09:21:31 nia Exp $"); +__RCSID("$NetBSD: edquota.c,v 1.54 2023/08/01 08:47:25 mrg Exp $"); #endif #endif /* not lint */ @@ -752,10 +752,10 @@ top: setuid(getuid()); if ((ed = getenv("EDITOR")) == (char *)0) ed = _PATH_VI; - if (strlen(ed) + strlen(ltmpfile) + 2 >= MAX_TMPSTR) { + if ((size_t)snprintf(p, sizeof(p), "%s %s", ed, ltmpfile) >= + sizeof(p)) { errx(1, "%s", "editor or filename too long"); } - snprintf(p, sizeof(p), "%s %s", ed, ltmpfile); execlp(_PATH_BSHELL, _PATH_BSHELL, "-c", p, NULL); err(1, "%s", ed); default: Index: src/usr.sbin/ypserv/common/ypdb.c diff -u src/usr.sbin/ypserv/common/ypdb.c:1.12 src/usr.sbin/ypserv/common/ypdb.c:1.13 --- src/usr.sbin/ypserv/common/ypdb.c:1.12 Tue Jan 10 21:06:17 2017 +++ src/usr.sbin/ypserv/common/ypdb.c Tue Aug 1 08:47:25 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: ypdb.c,v 1.12 2017/01/10 21:06:17 christos Exp $ */ +/* $NetBSD: ypdb.c,v 1.13 2023/08/01 08:47:25 mrg Exp $ */ /* * Copyright (c) 1990, 1993 @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ypdb.c,v 1.12 2017/01/10 21:06:17 christos Exp $"); +__RCSID("$NetBSD: ypdb.c,v 1.13 2023/08/01 08:47:25 mrg Exp $"); #endif #include <sys/param.h> @@ -82,11 +82,11 @@ ypdb_open(const char *file) suffix = ""; else suffix = YPDB_SUFFIX; - if (strlen(file) + strlen(suffix) > (sizeof(path) - 1)) { + if ((size_t)snprintf(path, sizeof(path), "%s%s", file, suffix) > + sizeof(path)) { warnx("File name `%s' is too long", file); - return (NULL); + return NULL; } - snprintf(path, sizeof(path), "%s%s", file, suffix); return _ypdb_dbopen(path, O_RDONLY, 0444); }