Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Jun 2017 15:30:41 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r319751 - head/cddl/contrib/opensolaris/lib/libzfs/common
Message-ID:  <201706091530.v59FUfuW041498@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Fri Jun  9 15:30:41 2017
New Revision: 319751
URL: https://svnweb.freebsd.org/changeset/base/319751

Log:
  MFV r319740: 8168 NULL pointer dereference in zfs_create()
  
  illumos/illumos-gate@690031d326342fa4ea28b5e80f1ad6a16281519d
  https://github.com/illumos/illumos-gate/commit/690031d326342fa4ea28b5e80f1ad6a16281519d
  
  https://www.illumos.org/issues/8168
    If we manage to export the pool on which we are creating a dataset (filesystem
    or zvol) between entering libzfs`zfs_create() and libzfs`zpool_open() call (for
    which we never check the return value) we end up dereferencing a NULL pointer
    in libzfs`zpool_close().
    This was discovered on ZFS on Linux. The same issue can be reproduced on
    Illumos running in parallel:
      while :; do zpool import -d /tmp testpool ; zpool export testpool ; done
      while :; do zfs create testpool/fs; zfs destroy testpool/fs ; done
    Eventually this will result in several core dumps like this one:
    [root@52-54-00-d3-7a-01 /cores]# mdb core.zfs.4244
    Loading modules: [ libumem.so.1 libc.so.1 libtopo.so.1 libavl.so.1
    libnvpair.so.1 ld.so.1 ]
    > ::stack
    libzfs.so.1`zpool_close+0x17(0, 0, 0, 8047450)
    libzfs.so.1`zfs_create+0x1bb(8090548, 8047e6f, 1, 808cba8)
    zfs_do_create+0x545(2, 8047d74, 80778a0, 801, 0, 3)
    main+0x22c(8047d2c, fef5c6e8, 8047d64, 8055a17, 3, 8047d70)
    _start+0x83(3, 8047e64, 8047e68, 8047e6f, 0, 8047e7b)
    >
    Fix and reproducer (systemtap): https://github.com/zfsonlinux/zfs/pull/6096
  
  Reviewed by: Matt Ahrens <mahrens@delphix.com>
  Approved by: Robert Mustacchi <rm@joyent.com>
  Author: loli10K <ezomori.nozomu@gmail.com>
  MFC after:	2 weeks

Modified:
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Fri Jun  9 15:28:57 2017	(r319750)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c	Fri Jun  9 15:30:41 2017	(r319751)
@@ -3316,6 +3316,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs
 	char errbuf[1024];
 	uint64_t zoned;
 	enum lzc_dataset_type ost;
+	zpool_handle_t *zpool_handle;
 
 	(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
 	    "cannot create '%s'"), path);
@@ -3355,7 +3356,8 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs
 	if (p != NULL)
 		*p = '\0';
 
-	zpool_handle_t *zpool_handle = zpool_open(hdl, pool_path);
+	if ((zpool_handle = zpool_open(hdl, pool_path)) == NULL)
+		return (-1);
 
 	if (props && (props = zfs_valid_proplist(hdl, type, props,
 	    zoned, NULL, zpool_handle, errbuf)) == 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201706091530.v59FUfuW041498>