From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 6/7] mkfs: consolidate and streamline config opening function
Date: Tue, 12 Jun 2018 17:01:05 -0700 [thread overview]
Message-ID: <20180613000105.GU22045@magnolia> (raw)
In-Reply-To: <20180612222116.GR22045@magnolia>
On Tue, Jun 12, 2018 at 03:21:16PM -0700, Darrick J. Wong wrote:
> On Tue, Jun 12, 2018 at 02:31:22PM -0500, Eric Sandeen wrote:
> > There was a lot of duplication between open_cli_config and open_config_file
> > which was unnecessary. Collapse all the logic into one function.
> >
> > Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> > Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
> > ---
> > mkfs/config.c | 148 +++++++++++++++++++++-----------------------------------
> > mkfs/xfs_mkfs.c | 1 -
> > 2 files changed, 56 insertions(+), 93 deletions(-)
> >
> > diff --git a/mkfs/config.c b/mkfs/config.c
> > index 940a055..173ab9a 100644
> > --- a/mkfs/config.c
> > +++ b/mkfs/config.c
> > @@ -523,60 +523,6 @@ config_stat_check(
> > return 0;
> > }
> >
> > -/*
> > - * If the file is not found -1 is returned and errno set. Otherwise
> > - * the file descriptor is returned.
> > - */
> > -int
> > -open_cli_config(
> > - int dirfd,
> > - const char *cli_config_file,
> > - char **fpath)
> > -{
> > - int fd = -1, len, ret;
> > - struct stat st;
> > -
> > - fd = openat(AT_FDCWD, cli_config_file, O_NOFOLLOW, O_RDONLY);
> > - if (fd < 0) {
> > - len = snprintf(*fpath, PATH_MAX, "%s/%s", MKFS_XFS_CONF_DIR,
> > - cli_config_file);
> > - /* Indicates truncation */
> > - if (len >= PATH_MAX) {
> > - errno = ENAMETOOLONG;
> > - goto out;
> > - }
> > -
> > - fd = openat(dirfd, cli_config_file, O_NOFOLLOW, O_RDONLY);
> > - if (fd < 0)
> > - goto out;
> > -
> > - ret = fstat(fd, &st);
> > - if (ret != 0)
> > - goto err_out_close;
> > -
> > - ret = config_stat_check(&st);
> > - if (ret != 0)
> > - goto err_out_close;
> > -
> > - goto out;
> > - }
> > -
> > - memcpy(*fpath, cli_config_file, strlen(cli_config_file));
> > -
> > - ret = fstat(fd, &st);
> > - if (ret != 0)
> > - goto err_out_close;
> > -
> > - ret = config_stat_check(&st);
> > - if (ret != 0)
> > - goto err_out_close;
> > -out:
> > - return fd;
> > -err_out_close:
> > - close(fd);
> > - return -1;
> > -}
> > -
> > #ifndef O_PATH
> > #if defined __alpha__
> > #define O_PATH 040000000
> > @@ -589,13 +535,26 @@ err_out_close:
> > #endif
> > #endif /* O_PATH */
> >
> > +/*
> > + * Try to open a config file, either cli-specified, or default.
> > + *
> > + * If specified on commandline, search relative to pwd or absolute path.
> > + * If not specified or if above fails, try either cli-spec'd file or "default"
> > + * in MKFS_XFS_CONF_DIR.
> > + *
> > + * If any config file is successfully opened, dft->type is set to reflect the
> > + * source.
> > + *
> > + * If a cli-specified file is not found -1 is returned and errno set. Otherwise
> > + * the file descriptor is returned.
> > + */
> > int
> > open_config_file(
> > - const char *cli_config_file,
> > + const char *config_file,
> > struct mkfs_default_params *dft,
> > - char **fpath) /* path where config is found */
> > + char **fpath) /* path where we found config */
>
> Move the comment to the pre-function comment and who is expected to get
> rid of it?
>
> "If a config file is found, its path is returned in **fpath. This
> memory must be free()'d by the caller."
>
> Otherwise seems fine so far...
>
> --D
>
> > {
> > - int dirfd, fd = -1, len, ret;
> > + int dirfd = -1, fd = -1, len, ret = 0;
> > struct stat st;
> >
> > *fpath = malloc(PATH_MAX);
> > @@ -604,57 +563,62 @@ open_config_file(
> >
> > memset(*fpath, 0, PATH_MAX);
> >
> > - dirfd = open(MKFS_XFS_CONF_DIR, O_PATH|O_NOFOLLOW|O_DIRECTORY);
> > -
> > - if (cli_config_file) {
> > - if (strlen(cli_config_file) > PATH_MAX) {
> > + /* first try relative to pwd or absolute path to cli configfile */
> > + if (config_file) {
> > + dft->type = DEFAULTS_CLI_CONFIG;
> > + if (strlen(config_file) > PATH_MAX) {
> > errno = ENAMETOOLONG;
> > goto out;
> > }
> > - fd = open_cli_config(dirfd, cli_config_file, fpath);
> > - goto out;
> > + memcpy(*fpath, config_file, strlen(config_file));
> > + fd = openat(AT_FDCWD, config_file, O_NOFOLLOW, O_RDONLY);
> > }
> >
> > - fd = openat(dirfd, "default", O_NOFOLLOW, O_RDONLY);
> > - if (fd < 0)
> > - goto out;
> > -
> > - dft->type = DEFAULTS_CONFIG;
> > -
> > - len = snprintf(*fpath, PATH_MAX, "%s/%s", MKFS_XFS_CONF_DIR, "default");
> > - /* Indicates truncation */
> > - if (len >= PATH_MAX) {
> > - errno = ENAMETOOLONG;
> > - goto err_out_close;
> > + /* on failure search for cli config or default file in sysconfdir */
> > + if (fd < 0) {
> > + if (!config_file)
> > + config_file = "default";
>
> Use a symbolic constant instead of "default" here (and elsewhere)?
Fix this up, and
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> > + len = snprintf(*fpath, PATH_MAX, "%s/%s", MKFS_XFS_CONF_DIR,
> > + config_file);
> > + /* Indicates truncation */
> > + if (len >= PATH_MAX) {
> > + errno = ENAMETOOLONG;
> > + goto out;
> > + }
> > + dirfd = open(MKFS_XFS_CONF_DIR, O_PATH|O_NOFOLLOW|O_DIRECTORY);
> > + if (dirfd < 0)
> > + goto out;
> > + fd = openat(dirfd, config_file, O_NOFOLLOW, O_RDONLY);
> > + if (fd < 0)
> > + goto out;
> > + if (!strcmp(config_file, "default"))
> > + dft->type = DEFAULTS_CONFIG;
> > }
> >
> > ret = fstat(fd, &st);
> > if (ret != 0)
> > - goto err_out_close;
> > -
> > + goto out;
> > ret = config_stat_check(&st);
> > if (ret != 0)
> > - goto err_out_close;
> > -
> > + goto out;
> > +
> > out:
> > - if (fd < 0) {
> > - if (dft->type != DEFAULTS_BUILTIN) {
> > - fprintf(stderr,
> > + /* stat check is always fatal; missing is fatal only if cli-specified */
> > + if (ret ||
> > + (fd < 0 && dft->type == DEFAULTS_CLI_CONFIG)) {
> > + fprintf(stderr,
> > _("Unable to open %s config file: %s : %s\n"),
> > - default_type_str(dft->type), *fpath,
> > - strerror(errno));
> > - free(*fpath);
> > - exit(1);
> > - }
> > + default_type_str(dft->type), *fpath,
> > + strerror(errno));
> > + free(*fpath);
> > + exit(1);
> > }
> > +
> > + if (ret && fd >= 0)
> > + close(fd);
> > if (dirfd >= 0)
> > close(dirfd);
> > - return fd;
> > -
> > -err_out_close:
> > - close(fd);
> > - fd = -1;
> > - goto out;
> > + return ret ? ret : fd;
> > }
> >
> > /*
> > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> > index be3094b..acd98f6 100644
> > --- a/mkfs/xfs_mkfs.c
> > +++ b/mkfs/xfs_mkfs.c
> > @@ -3785,7 +3785,6 @@ _("respecification of configuration not allowed\n"));
> > exit(1);
> > }
> > cli_config_file = optarg;
> > - dft.type = DEFAULTS_CLI_CONFIG;
> > break;
> > default:
> > continue;
> > --
> > 1.8.3.1
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2018-06-13 0:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-12 19:31 [PATCH 0/7] mkfs config support cleanups Eric Sandeen
2018-06-12 19:31 ` [PATCH 1/7] mkfs: document the config file option Eric Sandeen
2018-06-12 22:13 ` Darrick J. Wong
2018-06-12 19:31 ` [PATCH 2/7] mkfs: move mkfs.xfs.8 to an .in file Eric Sandeen
2018-06-12 19:45 ` Eric Sandeen
2018-06-12 22:10 ` Darrick J. Wong
2018-06-12 23:15 ` Eric Sandeen
2018-06-12 19:31 ` [PATCH 3/7] mkfs: parameterize sysconfdir in mkfs.xfs.8 Eric Sandeen
2018-06-12 22:09 ` Darrick J. Wong
2018-06-12 19:31 ` [PATCH 4/7] mkfs: tidy up whitespace in mkfs/config.c Eric Sandeen
2018-06-12 22:09 ` Darrick J. Wong
2018-06-12 19:31 ` [PATCH 5/7] mkfs: properly fix TOCTOU open/stat race in config file handling Eric Sandeen
2018-06-12 22:14 ` Darrick J. Wong
2018-06-12 19:31 ` [PATCH 6/7] mkfs: consolidate and streamline config opening function Eric Sandeen
2018-06-12 22:21 ` Darrick J. Wong
2018-06-13 0:01 ` Darrick J. Wong [this message]
2018-06-12 19:31 ` [PATCH 7/7] mkfs: remove gotos in parse_defaults_file Eric Sandeen
2018-06-12 22:23 ` Darrick J. Wong
2018-06-12 22:27 ` [PATCH 0/7] mkfs config support cleanups Darrick J. Wong
2018-06-12 23:17 ` Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180613000105.GU22045@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).