From nobody Sat May 6 19:11:58 2023 X-Original-To: dev-commits-src-main@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 4QDHH24n6Pz490P4; Sat, 6 May 2023 19:11: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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QDHH24LVWz3khg; Sat, 6 May 2023 19:11:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683400318; 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=5n2lsTTo7hG9z0UWpt7ALreJgDojxmYhJIrAwIZRN2c=; b=OwNxVncZzLi1je4BtHDP1C45efyupez4cnsCqs8jZsD6GXsR0b9CtJgauKdjfJtiq+2zch mWRuIOUkwrNNNgV6RGefuO49E7XQuF86EDVXgjL/VRx6wOHDuVCvW4PKNaqUaxizBJpbqE 684qgV4UOy9ZzXi2zKovddjXvp83R6O993WRrttnT8+Ll5Rv0IHGWyz+RHgxHh3A6aGx5Q wiPFymoW8K2H6ipn0Mki0rC0nJU8jcTDdONorJuBKpUpcO1bt1zg9fJok/jNcv8Dnqdqil KEICpcISjeQ2CP+rb8HXRtqbZF5LaPpNiriAYo0JV8gTz3+KaECnGMCK8SS8yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683400318; 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=5n2lsTTo7hG9z0UWpt7ALreJgDojxmYhJIrAwIZRN2c=; b=CSiZLcgQ6ABe6DJF4q04tnRlMucJnp0alw9hgxPrDFxPK+JZazT3zdbwM3tntbUFR4dSie gayuOhifKKqViVLMnfRXc83h2/76AFe6D6toqQmXrQ0ikGPvFVZG1Gbverj+zB9qwF6cGT ntnMi40pLATVFB84TkAIUQMOIAuAxjY8EmphQKNy6niOA+IZXES1v3Dxp3DWQ1TSnyb2Kc TqJnhGnP9ujlzOXHnRlts9NyIfztMM8X+V+5i2n5MAOTUQxEle678oJn6IaPm4x3FR1nQs vOr3c+TT1UOFJrw4/Ji2KefbCf4Yxj6d4jk/VYOfrJ87bM/Nb2GthfgHfD8UNw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683400318; a=rsa-sha256; cv=none; b=m8E9e2mV2YNWbDMehD9m41p74RzeDwyxiLJ5omBBQMJd+K2ZCAaxaWaAUEG55RM61Q3Udr v2lA7eZXXNOFsYWEvJi/Ikrzq4qAp/iPGlBrnYgirN7LXXoRhKFsg10YWYU9dVjmk2CGUL PP3mmHr6vBbxlWKauB3jILCAVv/qYaGD/DdklrlD8koVS0MfdhOQjH8R0mZ8W7iBhTRABF 4XNfyXEJI58/wDXLEZeIhPidC0KwLdptM1mbLq9F+QyS0wSHiMguX2KEL3mdAFaMfqqoie 33NYeyPcqIrI6tbxaTstK/CjbNOLpBQnxDso+emKf0Lx3AipdLdjNDd8Q2NeLA== 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 4QDHH23P1pzpM6; Sat, 6 May 2023 19:11:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 346JBw3T064881; Sat, 6 May 2023 19:11:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 346JBw5L064880; Sat, 6 May 2023 19:11:58 GMT (envelope-from git) Date: Sat, 6 May 2023 19:11:58 GMT Message-Id: <202305061911.346JBw5L064880@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alexander Motin Subject: git: 572b77f8da5e - main - mountd: Improve error message for exports lines List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mav X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 572b77f8da5e93ad8f42dbce90b5bfc18d507169 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by mav: URL: https://cgit.FreeBSD.org/src/commit/?id=572b77f8da5e93ad8f42dbce90b5bfc18d507169 commit 572b77f8da5e93ad8f42dbce90b5bfc18d507169 Author: Alexander Motin AuthorDate: 2023-05-06 18:57:14 +0000 Commit: Alexander Motin CommitDate: 2023-05-06 19:02:08 +0000 mountd: Improve error message for exports lines Currently mountd print error message "symbolic link in export path or statfs failed" in case some path component in an exports line fails validation. This revision improves the error message by giving more information about the precise error as well as the path component that caused the issue. Submitted by: Andrew Walker Reviewed by: mav, rmacklem Differential Revision: https://reviews.freebsd.org/D39840 --- usr.sbin/mountd/mountd.c | 87 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 15 deletions(-) diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c index d985dd00acf8..f64505f8602f 100644 --- a/usr.sbin/mountd/mountd.c +++ b/usr.sbin/mountd/mountd.c @@ -210,7 +210,9 @@ static void add_dlist(struct dirlist **, struct dirlist *, struct grouplist *, int, struct exportlist *, struct expcred *, uint64_t); static void add_mlist(char *, char *); -static int check_dirpath(char *); +static int check_path_component(const char *, char **); +static int check_dirpath(char *, char **); +static int check_statfs(const char *, struct statfs *, char **); static int check_options(struct dirlist *); static int checkmask(struct sockaddr *sa); static int chk_host(struct dirlist *, struct sockaddr *, int *, int *, @@ -1557,6 +1559,7 @@ get_exportlist_one(int passno) struct statfs fsb; struct expcred anon; char *cp, *endcp, *dirp, *hst, *usr, *dom, savedc; + char *err_msg = NULL; int len, has_host, got_nondir, dirplen, netgrp; uint64_t exflags; @@ -1635,8 +1638,8 @@ get_exportlist_one(int passno) goto nextline; } } - if (check_dirpath(cp) && - statfs(cp, &fsb) >= 0) { + if (check_dirpath(cp, &err_msg) && + check_statfs(cp, &fsb, &err_msg)) { if ((fsb.f_flags & MNT_AUTOMOUNTED) != 0) syslog(LOG_ERR, "Warning: exporting of " "automounted fs %s not supported", cp); @@ -1701,8 +1704,15 @@ get_exportlist_one(int passno) dirplen = len; } } else { - getexp_err(ep, tgrp, - "symbolic link in export path or statfs failed"); + if (err_msg != NULL) { + getexp_err(ep, tgrp, err_msg); + free(err_msg); + err_msg = NULL; + } else { + getexp_err(ep, tgrp, + "symbolic link in export path or " + "statfs failed"); + } goto nextline; } *endcp = savedc; @@ -3786,29 +3796,76 @@ check_options(struct dirlist *dp) return (0); } +static int +check_path_component(const char *path, char **err) +{ + struct stat sb; + + if (lstat(path, &sb)) { + asprintf(err, "%s: lstat() failed: %s.\n", + path, strerror(errno)); + return (0); + } + + switch (sb.st_mode & S_IFMT) { + case S_IFDIR: + return (1); + case S_IFLNK: + asprintf(err, "%s: path is a symbolic link.\n", path); + break; + case S_IFREG: + asprintf(err, "%s: path is a file rather than a directory.\n", + path); + break; + default: + asprintf(err, "%s: path is not a directory.\n", path); + } + + return (0); +} + /* - * Check an absolute directory path for any symbolic links. Return true + * Check each path component for the presence of symbolic links. Return true */ static int -check_dirpath(char *dirp) +check_dirpath(char *dirp, char **err) { char *cp; - int ret = 1; - struct stat sb; cp = dirp + 1; - while (*cp && ret) { + while (*cp) { if (*cp == '/') { *cp = '\0'; - if (lstat(dirp, &sb) < 0 || !S_ISDIR(sb.st_mode)) - ret = 0; + + if (!check_path_component(dirp, err)) { + *cp = '/'; + return (0); + } + *cp = '/'; } cp++; } - if (lstat(dirp, &sb) < 0 || !S_ISDIR(sb.st_mode)) - ret = 0; - return (ret); + + if (!check_path_component(dirp, err)) + return (0); + + return (1); +} + +/* + * Populate statfs information. Return true on success. + */ +static int +check_statfs(const char *dirp, struct statfs *fsb, char **err) +{ + if (statfs(dirp, fsb)) { + asprintf(err, "%s: statfs() failed: %s\n", dirp, + strerror(errno)); + return (0); + } + + return (1); } /*