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

Xin LI delphij at FreeBSD.org
Sun Sep 7 12:13:50 UTC 2014


Author: delphij
Date: Sun Sep  7 12:13:49 2014
New Revision: 271224
URL: http://svnweb.freebsd.org/changeset/base/271224

Log:
  5116 zpool history -i goes into infinite loop
  Reviewed by: Christopher Siden <christopher.siden at delphix.com>
  Reviewed by: Dan Kimmel <dan.kimmel at delphix.com>
  Reviewed by: George Wilson <george.wilson at delphix.com>
  Reviewed by: Richard Elling <richard.elling at gmail.com>
  Reviewed by: Boris Protopopov <boris.protopopov at me.com>
  Approved by: Dan McDonald <danmcd at omniti.com>
  Author: Matthew Ahrens <mahrens at delphix.com>
  
  illumos/illumos-gate at 3339867a862f63acdad71abd574d5d79e18d8579

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

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c	Sun Sep  7 12:07:26 2014	(r271223)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c	Sun Sep  7 12:13:49 2014	(r271224)
@@ -3698,22 +3698,24 @@ zpool_history_unpack(char *buf, uint64_t
 	return (0);
 }
 
-#define	HIS_BUF_LEN	(128*1024)
-
 /*
  * Retrieve the command history of a pool.
  */
 int
 zpool_get_history(zpool_handle_t *zhp, nvlist_t **nvhisp)
 {
-	char buf[HIS_BUF_LEN];
+	char *buf;
+	int buflen = 128 * 1024;
 	uint64_t off = 0;
 	nvlist_t **records = NULL;
 	uint_t numrecords = 0;
 	int err, i;
 
+	buf = malloc(buflen);
+	if (buf == NULL)
+		return (ENOMEM);
 	do {
-		uint64_t bytes_read = sizeof (buf);
+		uint64_t bytes_read = buflen;
 		uint64_t leftover;
 
 		if ((err = get_history(zhp, buf, &off, &bytes_read)) != 0)
@@ -3727,10 +3729,23 @@ zpool_get_history(zpool_handle_t *zhp, n
 		    &leftover, &records, &numrecords)) != 0)
 			break;
 		off -= leftover;
+		if (leftover == bytes_read) {
+			/*
+			 * no progress made, because buffer is not big enough
+			 * to hold this record; resize and retry.
+			 */
+			buflen *= 2;
+			free(buf);
+			buf = malloc(buflen);
+			if (buf == NULL)
+				return (ENOMEM);
+		}
 
 		/* CONSTCOND */
 	} while (1);
 
+	free(buf);
+
 	if (!err) {
 		verify(nvlist_alloc(nvhisp, NV_UNIQUE_NAME, 0) == 0);
 		verify(nvlist_add_nvlist_array(*nvhisp, ZPOOL_HIST_RECORD,


More information about the svn-src-vendor mailing list