It looks like setting the 2nd arg of realpath() to NULL is not a portable way to cause it to be strdup()'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"><<a href="mailto:ajb@cbnl.com">ajb@cbnl.com</a>></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't navigate to the full path. As a result the strdup<br>
would fail.<br>
<br>
Unfortunatly this change broke rrdcached's automatic creation of it'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 'j':<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, "Failed to create journal directory '%s': %s\n",<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, "Must specify a writable directory with -j! (%s)\n",<br>
- errno ? rrd_strerror(errno) : "");<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, "Failed to create journal directory '%s': %s\n",<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, "Must specify a writable directory with -j! (%s)\n",<br>
+ errno ? rrd_strerror(errno) : "");<br>
+ return 6;<br>
+ }<br>
+ } else {<br>
+ fprintf(stderr, "Unable to resolve journal path (%s,%s)\n", optarg,<br>
+ errno ? rrd_strerror(errno) : "");<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>