svn commit: r319740 - vendor/illumos/dist/lib/libzfs/common

Andriy Gapon avg at FreeBSD.org
Fri Jun 9 15:00:14 UTC 2017


Author: avg
Date: Fri Jun  9 15:00:13 2017
New Revision: 319740
URL: https://svnweb.freebsd.org/changeset/base/319740

Log:
  8168 NULL pointer dereference in zfs_create()
  
  illumos/illumos-gate at 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 at 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 at delphix.com>
  Approved by: Robert Mustacchi <rm at joyent.com>
  Author: loli10K <ezomori.nozomu at gmail.com>

Modified:
  vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c	Fri Jun  9 14:58:51 2017	(r319739)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c	Fri Jun  9 15:00:13 2017	(r319740)
@@ -3271,6 +3271,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);
@@ -3310,7 +3311,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) {


More information about the svn-src-all mailing list