It looks like setting the 2nd arg of realpath() to NULL is not a portable way to cause it to be strdup()&#39;ed.  i.e. on Solaris 2.8:<div><br></div><div><div>     EINVAL</div><div>           Either the file_name or resolved_name  argument  is  a</div>

<div>           null pointer.</div><div><br></div><div>So perhaps keeping the original strdup(realpath()) would make more sense.</div><div><br></div><div>Also, checking specifically for error of realpath() and returning on error might shrink the diff.  Style change only.</div>

<div><br></div><div>-kb</div><br><div class="gmail_quote">On Sat, Nov 13, 2010 at 4:47 AM, Alex Bennee <span dir="ltr">&lt;<a href="mailto:ajb@cbnl.com">ajb@cbnl.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

When the realpath() change was introduced it failed to take account of the potential<br>
for a failure of realpath if it can&#39;t navigate to the full path. As a result the strdup<br>
would fail.<br>
<br>
Unfortunatly this change broke rrdcached&#39;s automatic creation of it&#39;s journal path (although<br>
in my case this is handled by packaging). However we still make the call to rrd_mkdir_p to<br>
trap other cases like existing non-dirs. It also removes the strdup as realpath will allocate<br>
a buffer for you if you ask.<br>
---<br>
 src/rrd_daemon.c |   40 ++++++++++++++++++++++------------------<br>
 1 files changed, 22 insertions(+), 18 deletions(-)<br>
<br>
diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c<br>
index 2209320..5e3f89e 100644<br>
--- a/src/rrd_daemon.c<br>
+++ b/src/rrd_daemon.c<br>
@@ -3278,24 +3278,28 @@ static int read_options (int argc, char **argv) /* {{{ */<br>
<br>
       case &#39;j&#39;:<br>
       {<br>
-        char journal_dir_actual[PATH_MAX];<br>
-        const char *dir;<br>
-        dir = journal_dir = strdup(realpath((const char *)optarg, journal_dir_actual));<br>
-<br>
-        status = rrd_mkdir_p(dir, 0777);<br>
-        if (status != 0)<br>
-        {<br>
-          fprintf(stderr, &quot;Failed to create journal directory &#39;%s&#39;: %s\n&quot;,<br>
-              dir, rrd_strerror(errno));<br>
-          return 6;<br>
-        }<br>
-<br>
-        if (access(dir, R_OK|W_OK|X_OK) != 0)<br>
-        {<br>
-          fprintf(stderr, &quot;Must specify a writable directory with -j! (%s)\n&quot;,<br>
-                  errno ? rrd_strerror(errno) : &quot;&quot;);<br>
-          return 6;<br>
-        }<br>
+       journal_dir = realpath((const char *)optarg, NULL);<br>
+       if (journal_dir)<br>
+       {<br>
+         // a resolved realpath implies existing path, however rrd_mkdir_p also runs checks<br>
+         status = rrd_mkdir_p(journal_dir, 0777);<br>
+         if (status != 0)<br>
+         {<br>
+           fprintf(stderr, &quot;Failed to create journal directory &#39;%s&#39;: %s\n&quot;,<br>
+                   journal_dir, rrd_strerror(errno));<br>
+           return 6;<br>
+         }<br>
+         if (access(journal_dir, R_OK|W_OK|X_OK) != 0)<br>
+         {<br>
+           fprintf(stderr, &quot;Must specify a writable directory with -j! (%s)\n&quot;,<br>
+                   errno ? rrd_strerror(errno) : &quot;&quot;);<br>
+           return 6;<br>
+         }<br>
+       } else {<br>
+         fprintf(stderr, &quot;Unable to resolve journal path (%s,%s)\n&quot;, optarg,<br>
+                 errno ? rrd_strerror(errno) : &quot;&quot;);<br>
+         return 6;<br>
+       }<br>
       }<br>
       break;<br>
<font color="#888888"><br>
--<br>
1.7.3.2<br>
<br>
_______________________________________________<br>
rrd-developers mailing list<br>
<a href="mailto:rrd-developers@lists.oetiker.ch">rrd-developers@lists.oetiker.ch</a><br>
<a href="https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers" target="_blank">https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers</a><br>
</font></blockquote></div><br><br clear="all"><br>-- <br> kevin brintnall =~ /<a href="http://kbrint@rufus.net/">kbrint@rufus.net/</a><br><br>
</div>