]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix 'zfs send -D' segfault
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 9 Jun 2011 20:41:55 +0000 (13:41 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 9 Jun 2011 20:58:48 +0000 (13:58 -0700)
Sending pools with dedup results in a segfault due to a Solaris
portability issue.  Under Solaris the pipe(2) library call
creates a bidirectional data channel.  Unfortunately, on Linux
pipe(2) call creates unidirection data channel.  The fix is to
use the socketpair(2) function to create the expected
bidirectional channel.

Seth Heeren did the original leg work on this issue for zfs-fuse.
We finally just rediscovered the same portability issue and
dfurphy was able to point me at the original issue for the fix.

Closes #268

lib/libzfs/libzfs_sendrecv.c

index 94e64e63f9d9a14332545ba313930a24ed12ea5e..7a95de0755d6ff071696b7f6097cb4afbb9f591b 100644 (file)
@@ -50,6 +50,7 @@
 #include "libzfs_impl.h"
 #include <sys/zio_checksum.h>
 #include <sys/ddt.h>
+#include <sys/socket.h>
 
 /* in libzfs_dataset.c */
 extern void zfs_setprop_error(libzfs_handle_t *, zfs_prop_t, int, char *);
@@ -1300,7 +1301,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
        if (flags.dedup) {
                featureflags |= (DMU_BACKUP_FEATURE_DEDUP |
                    DMU_BACKUP_FEATURE_DEDUPPROPS);
-               if ((err = pipe(pipefd))) {
+               if ((err = socketpair(AF_UNIX, SOCK_STREAM, 0, pipefd))) {
                        zfs_error_aux(zhp->zfs_hdl, strerror(errno));
                        return (zfs_error(zhp->zfs_hdl, EZFS_PIPEFAILED,
                            errbuf));