Thomas Backman wrote: > [root_at_chaos ~]# zfs send -R -I $OLD tank_at_$NOW > diff-snap > [root_at_chaos ~]# cat diff-snap | zfs recv -Fvd slave > Segmentation fault: 11 (core dumped) > > Same kinda backtrace, but what's up with strcmp()? > I suppose the issue stems from libzfs, and is not within libc: Different problem The SIGSEGV is happening in strcmp because it is called with strcmp(0,0) and tries to dereference address -4 (probably another bug itself). This hack gets around the issue but someone familiar with this needs to decide the correct action. The first change is actually unrelated (a sorry attempt at fixing the previous zfs send bug). The last change may be unnecessary as that case may never happen unless the pool can be renamed? Index: cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c =================================================================== --- cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c (revision 190917) +++ cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c (working copy) _at__at_ -240,6 +240,8 _at__at_ zfs_prop_t prop = zfs_name_to_prop(propname); nvlist_t *propnv; + if (prop == ZPROP_INVAL) + continue; if (!zfs_prop_user(propname) && zfs_prop_readonly(prop)) continue; _at__at_ -1126,7 +1128,7 _at__at_ uint64_t originguid = 0; uint64_t stream_originguid = 0; uint64_t parent_fromsnap_guid, stream_parent_fromsnap_guid; - char *fsname, *stream_fsname; + char *fsname, *stream_fsname, *p1, *p2; nextfselem = nvlist_next_nvpair(local_nv, fselem); _at__at_ -1295,10 +1297,12 _at__at_ "parentfromsnap", &stream_parent_fromsnap_guid)); /* check for rename */ + p1 = strrchr(fsname, '/'); + p2 = strrchr(stream_fsname, '/'); if ((stream_parent_fromsnap_guid != 0 && stream_parent_fromsnap_guid != parent_fromsnap_guid) || - strcmp(strrchr(fsname, '/'), - strrchr(stream_fsname, '/')) != 0) { + (p1 != NULL && p2 != NULL && strcmp (p1, p2) != 0) || + ((p1 == NULL) ^ (p2 == NULL))) { nvlist_t *parent; char tryname[ZFS_MAXNAMELEN]; _at__at_ -1317,7 +1321,7 _at__at_ VERIFY(0 == nvlist_lookup_string(parent, "name", &pname)); (void) snprintf(tryname, sizeof (tryname), - "%s%s", pname, strrchr(stream_fsname, '/')); + "%s%s", pname, p2 ? p2 : ""); } else { tryname[0] = '\0'; if (flags.verbose) {Received on Thu May 14 2009 - 20:48:28 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:47 UTC