Use strerror() not strerror_r()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 28 Jan 2013 17:53:51 +0000 (09:53 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 28 Jan 2013 18:02:38 +0000 (10:02 -0800)
The differ() function used strerror_r() instead of strerror() because
it allowed the error message to be directly copied in to a buffer.
This causes two issues under Linux.

* There are two versions of strerror_r() available an XSI-compliant
  version which returns an 'int' error code.  And a GNU-specific
  version which return a 'char *' to the resulting error string.

    int strerror_r(int errnum, char *buf, size_t buflen);   /* XSI */
    char *strerror_r(int errnum, char *buf, size_t buflen); /* GNU */

* The most recent versions of strerror_r() are annotated with the
  warn_unused_result attribute.  This causes the following warning
  since the upstream implementation casts the result to void.

    warning: ignoring return value of 'strerror_r', declared with
    attribute warn_unused_result [-Wunused-result]

The cleanest way to resolve both of these problems is just to use
strerror() and make a copy of the result in to the buffer.  This
resolves both issues and this is the only instance of strerror_r()
in the code base.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1231

lib/libzfs/libzfs_diff.c

index eb05f4d..77d5a09 100644 (file)
@@ -430,7 +430,7 @@ differ(void *arg)
 
        if ((ofp = fdopen(di->outputfd, "w")) == NULL) {
                di->zerr = errno;
-               (void) strerror_r(errno, di->errbuf, sizeof (di->errbuf));
+               strncpy(di->errbuf, strerror(errno), sizeof (di->errbuf));
                (void) close(di->datafd);
                return ((void *)-1);
        }