From nobody Wed Oct 22 18:01:58 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4csH6t41KXz6D2B4; Wed, 22 Oct 2025 18:01:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4csH6t2pG1z3xR6; Wed, 22 Oct 2025 18:01:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1761156118; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=M6kQwMQKYZm1+ly3e3s+W6EdvCnjU2seXKmqbL2Z6D0=; b=He+yFK4v6EmqgQxuHNDz+/XIZXXM378MC9eqnhE6EtUMUVEtz4hs4ZE77y6x1P95cR0uUs s1pNB7LoGg8g/VuFBPe/3XLDyPpHFNQ+bgR+c0ygpkHjKdY2LH8VCG5ec7seWDkIa+kT7B GpPvNtz2gN/Fr6keYnOb9EjrjvhNCEHMNWKsmiep/ti562oTJzuCF44raYMfqsUyKWMInp NJIniUEMbHIcFHRQI2K68QdA2Hy78+CVmqiO/mIjFzYd7rdjWSQiPaviS7YQ/YBKIBP8eR JeS88idmA9dOyibMC34Z6Uxi8oVywAaCzeaMCjWxGDKvrvJ0Lu01dt8sgCdUUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1761156118; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=M6kQwMQKYZm1+ly3e3s+W6EdvCnjU2seXKmqbL2Z6D0=; b=tSzZPftimBUHIUJKRDomJcTp2ySuGyCikrF6ossED7JoldzVuIUT2FbTj3EbA6QkegtriD jDLaU1+Fbo9t5EZ8+sEjHw8NF4ohBl1xmgfg/AYFFdEo9THeYrWfu6anZGvSqmay6pd0f8 PwmUaN//WB5fflvuAE8m9qNzONS/qQeYqn2tE/uq6OUsuLBTHI8bMH2630SYzd5LgBcB1y 4qzCYCPNWzowrR0uW86gUYxqkhp3w8g+u5xKoyrHe5s4x1zRrO7LaIvbEZW4Mk57GK64pb +zZGYPdswwhbrl5QKUnHHMU4OTq0jL2e9hRZVS5FmjF0uPe9Q2DtG2ERBilCow== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1761156118; a=rsa-sha256; cv=none; b=cpWPC+caS2KeTt/tT1XCxlBC6zAIrlB9nIyu8/24i7R6nsYOp4PusO/xaYEvl85QqP0vsP c5lIscRrd9l06rc2PMuXXWAlnYQnvVJPpvlpBgwpxMVdA7paYsQ89qYDkcv9BBP2uAmbIL ia7VP+PhUv4hXcb9Bk6atlBMMMdXI/RxOD+2EpkHg7amjr5GpN8BEhVaQzvJovH5SsSlVN q5hHHaL5VlanWCMgZ4t/cmxc9+Y/syY/dovnU4f3It42tLTmGQvfHKQbjPok+q2mgNIawJ EG6iN8n8Q1Okn4lx50dPKAIBY5tr3XAl7BHSjvAn5N0m0rYGDxH0ebWRZ1dmwQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4csH6t2Nbnzgcg; Wed, 22 Oct 2025 18:01:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 59MI1wNJ085940; Wed, 22 Oct 2025 18:01:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 59MI1ww3085937; Wed, 22 Oct 2025 18:01:58 GMT (envelope-from git) Date: Wed, 22 Oct 2025 18:01:58 GMT Message-Id: <202510221801.59MI1ww3085937@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Kirk McKusick Subject: git: 99bf680a8499 - main - Fix getmntpoint(3) to operate as it is documented in its manual page. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mckusick X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 99bf680a8499dea71db5da705dfe41f4bb5e00ab Auto-Submitted: auto-generated The branch main has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=99bf680a8499dea71db5da705dfe41f4bb5e00ab commit 99bf680a8499dea71db5da705dfe41f4bb5e00ab Author: Kirk McKusick AuthorDate: 2025-10-22 18:01:03 +0000 Commit: Kirk McKusick CommitDate: 2025-10-22 18:01:37 +0000 Fix getmntpoint(3) to operate as it is documented in its manual page. The -libutil function getmntpoint(3) is documented as accepting a device name “with or without /dev/ prepended to it” but did not attempt to prepend /dev/. This patch corrects the problem by prepending /dev/ to names that do not begin with a '/'. Reported-by: Dag-Erling Smørgrav Differential Revision: https://reviews.freebsd.org/D53185 MFC-after: 1 week Sponsored-by: Netflix --- lib/libutil/mntopts.c | 53 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/lib/libutil/mntopts.c b/lib/libutil/mntopts.c index 07d3dd6d98a3..4a064a086fd5 100644 --- a/lib/libutil/mntopts.c +++ b/lib/libutil/mntopts.c @@ -145,6 +145,18 @@ checkpath_allow_file(const char *path, char *resolved) return (0); } +static char * +prependdevtopath(const char *path, char *buf, u_long buflen) +{ + u_long len; + + if ((len = strlen(_PATH_DEV) + strlen(path) + 1) > buflen) + return NULL; + strncpy(buf, _PATH_DEV, len); + strncat(buf, path, len - sizeof(_PATH_DEV)); + return (buf); +} + /* * Get the mount point information for name. Name may be mount point name * or device name (with or without /dev/ preprended). @@ -153,19 +165,27 @@ struct statfs * getmntpoint(const char *name) { struct stat devstat, mntdevstat; - char device[sizeof(_PATH_DEV) - 1 + MNAMELEN]; - char *ddevname; + char *devname; struct statfs *mntbuf, *statfsp; - int i, mntsize, isdev; - u_long len; + int i, len, isdev, mntsize, mntfromnamesize; + char device[sizeof(_PATH_DEV) - 1 + MNAMELEN]; + u_long devlen; - if (stat(name, &devstat) != 0) + devlen = sizeof(device); + /* + * Note that stat(NULL, &statbuf) returns -1 (EBADF) which will + * cause us to return NULL if prependdevtopath() returns NULL. + */ + if (stat(name, &devstat) != 0 && + (name[0] != '/' && + stat(prependdevtopath(name, device, devlen), &devstat) != 0)) return (NULL); if (S_ISCHR(devstat.st_mode) || S_ISBLK(devstat.st_mode)) isdev = 1; else isdev = 0; mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + mntfromnamesize = sizeof(statfsp->f_mntfromname); for (i = 0; i < mntsize; i++) { statfsp = &mntbuf[i]; if (isdev == 0) { @@ -173,19 +193,20 @@ getmntpoint(const char *name) continue; return (statfsp); } - ddevname = statfsp->f_mntfromname; - if (*ddevname != '/') { - if ((len = strlen(_PATH_DEV) + strlen(ddevname) + 1) > - sizeof(statfsp->f_mntfromname) || - len > sizeof(device)) + devname = statfsp->f_mntfromname; + if (*devname == '/') { + if (stat(devname, &mntdevstat) != 0) + continue; + } else { + devname = prependdevtopath(devname, device, devlen); + if (devname == NULL || + (len = strlen(devname)) > mntfromnamesize) + continue; + if (stat(devname, &mntdevstat) != 0) continue; - strncpy(device, _PATH_DEV, len); - strncat(device, ddevname, len); - if (stat(device, &mntdevstat) == 0) - strncpy(statfsp->f_mntfromname, device, len); + strncpy(statfsp->f_mntfromname, devname, len); } - if (stat(ddevname, &mntdevstat) == 0 && - S_ISCHR(mntdevstat.st_mode) && + if (S_ISCHR(mntdevstat.st_mode) && mntdevstat.st_rdev == devstat.st_rdev) return (statfsp); }