[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