summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2019-10-16 14:10:31 +0300
committerToomas Soome <tsoome@me.com>2019-10-29 18:56:23 +0200
commit042b56085944fdf280ee8e4a93b329c206054f88 (patch)
treeffe24c370f4d6ed669c8ddf55e65436e20326694
parentb12258b69ac245658b0ca5ae070b3ff004186148 (diff)
downloadillumos-joyent-042b56085944fdf280ee8e4a93b329c206054f88.tar.gz
11882 loader: rs_alloc() may return NULL
Reviewed by: Andy Fiddaman <andy@omniosce.org> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/boot/Makefile.version2
-rw-r--r--usr/src/boot/lib/libstand/zfs/zfsimpl.c27
2 files changed, 23 insertions, 6 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version
index 612360ac32..30e5014dea 100644
--- a/usr/src/boot/Makefile.version
+++ b/usr/src/boot/Makefile.version
@@ -33,4 +33,4 @@ LOADER_VERSION = 1.1
# Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes.
# The version is processed from left to right, the version number can only
# be increased.
-BOOT_VERSION = $(LOADER_VERSION)-2019.10.19.1
+BOOT_VERSION = $(LOADER_VERSION)-2019.10.26.1
diff --git a/usr/src/boot/lib/libstand/zfs/zfsimpl.c b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
index 458fc1ec1e..9958d5ea4b 100644
--- a/usr/src/boot/lib/libstand/zfs/zfsimpl.c
+++ b/usr/src/boot/lib/libstand/zfs/zfsimpl.c
@@ -838,12 +838,17 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
list_t stack;
spa_t *spa = vd->spa;
zio_t *zio = arg;
+ remap_segment_t *rs;
list_create(&stack, sizeof (remap_segment_t),
offsetof(remap_segment_t, rs_node));
- for (remap_segment_t *rs = rs_alloc(vd, offset, asize, 0);
- rs != NULL; rs = list_remove_head(&stack)) {
+ rs = rs_alloc(vd, offset, asize, 0);
+ if (rs == NULL) {
+ printf("vdev_indirect_remap: out of memory.\n");
+ zio->io_error = ENOMEM;
+ }
+ for ( ; rs != NULL; rs = list_remove_head(&stack)) {
vdev_t *v = rs->rs_vd;
uint64_t num_entries = 0;
/* vdev_indirect_mapping_t *vim = v->v_mapping; */
@@ -851,6 +856,9 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
vdev_indirect_mapping_duplicate_adjacent_entries(v,
rs->rs_offset, rs->rs_asize, &num_entries);
+ if (num_entries == 0)
+ zio->io_error = ENOMEM;
+
for (uint64_t i = 0; i < num_entries; i++) {
vdev_indirect_mapping_entry_phys_t *m = &mapping[i];
uint64_t size = DVA_GET_ASIZE(&m->vimep_dst);
@@ -863,9 +871,18 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, void *arg)
vdev_t *dst_v = vdev_lookup_top(spa, dst_vdev);
if (dst_v->v_read == vdev_indirect_read) {
- list_insert_head(&stack,
- rs_alloc(dst_v, dst_offset + inner_offset,
- inner_size, rs->rs_split_offset));
+ remap_segment_t *o;
+
+ o = rs_alloc(dst_v, dst_offset + inner_offset,
+ inner_size, rs->rs_split_offset);
+ if (o == NULL) {
+ printf("vdev_indirect_remap: "
+ "out of memory.\n");
+ zio->io_error = ENOMEM;
+ break;
+ }
+
+ list_insert_head(&stack, o);
}
vdev_indirect_gather_splits(rs->rs_split_offset, dst_v,
dst_offset + inner_offset,