[rrd-developers] [PATCH] rrd_daemon: pay attention to the return value of realpath
Tobias Oetiker
tobi at oetiker.ch
Tue Dec 21 17:20:52 CET 2010
Hi Alex,
Nov 22 kevin brintnall wrote:
> Alex, realpath(x,NULL) is not portable. I think keeping the temporary
> buffer is best. Ideas?
I have included the patch without the realpath(...,NULL) but a
delayed strdup instead ... r2153
cheers
tobi
>
> -kb
>
> On Mon, Nov 22, 2010 at 9:17 AM, <kernel-hacker at bennee.com> wrote:
>
> > From: Alex Bennee <ajb at cbnl.com>
> >
> > When the realpath() change was introduced it failed to take account of the
> > potential
> > for a failure of realpath if it can't navigate to the full path. As a
> > result the strdup
> > would fail.
> >
> > Unfortunatly this change broke rrdcached's automatic creation of it's
> > journal path (although
> > in my case this is handled by packaging). However we still make the call to
> > rrd_mkdir_p to
> > trap other cases like existing non-dirs. It also removes the strdup as
> > realpath will allocate
> > a buffer for you if you ask.
> > ---
> > src/rrd_daemon.c | 40 ++++++++++++++++++++++------------------
> > 1 files changed, 22 insertions(+), 18 deletions(-)
> >
> > diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c
> > index 2209320..5e3f89e 100644
> > --- a/src/rrd_daemon.c
> > +++ b/src/rrd_daemon.c
> > @@ -3278,24 +3278,28 @@ static int read_options (int argc, char **argv) /*
> > {{{ */
> >
> > case 'j':
> > {
> > - char journal_dir_actual[PATH_MAX];
> > - const char *dir;
> > - dir = journal_dir = strdup(realpath((const char *)optarg,
> > journal_dir_actual));
> > -
> > - status = rrd_mkdir_p(dir, 0777);
> > - if (status != 0)
> > - {
> > - fprintf(stderr, "Failed to create journal directory '%s': %s\n",
> > - dir, rrd_strerror(errno));
> > - return 6;
> > - }
> > -
> > - if (access(dir, R_OK|W_OK|X_OK) != 0)
> > - {
> > - fprintf(stderr, "Must specify a writable directory with -j!
> > (%s)\n",
> > - errno ? rrd_strerror(errno) : "");
> > - return 6;
> > - }
> > + journal_dir = realpath((const char *)optarg, NULL);
> > + if (journal_dir)
> > + {
> > + // a resolved realpath implies existing path, however rrd_mkdir_p
> > also runs checks
> > + status = rrd_mkdir_p(journal_dir, 0777);
> > + if (status != 0)
> > + {
> > + fprintf(stderr, "Failed to create journal directory '%s':
> > %s\n",
> > + journal_dir, rrd_strerror(errno));
> > + return 6;
> > + }
> > + if (access(journal_dir, R_OK|W_OK|X_OK) != 0)
> > + {
> > + fprintf(stderr, "Must specify a writable directory with -j!
> > (%s)\n",
> > + errno ? rrd_strerror(errno) : "");
> > + return 6;
> > + }
> > + } else {
> > + fprintf(stderr, "Unable to resolve journal path (%s,%s)\n",
> > optarg,
> > + errno ? rrd_strerror(errno) : "");
> > + return 6;
> > + }
> > }
> > break;
> >
> > --
> > 1.7.3.2
> >
> > _______________________________________________
> > rrd-developers mailing list
> > rrd-developers at lists.oetiker.ch
> > https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers
> >
>
>
>
>
--
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland
http://it.oetiker.ch tobi at oetiker.ch ++41 62 775 9902 / sb: -9900
More information about the rrd-developers
mailing list