summaryrefslogtreecommitdiffstats
path: root/src/H5Olayout.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Olayout.c')
-rw-r--r--src/H5Olayout.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index ed69fb1..0c5c993 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -639,13 +639,27 @@ H5O__layout_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh, unsigned H5_ATTR_UNU
heap_block_p += tmp_size;
/* Source selection */
- if (H5S_SELECT_DESERIALIZE(&mesg->storage.u.virt.list[i].source_select,
- &heap_block_p) < 0)
+ avail_buffer_space = heap_block_p_end - heap_block_p + 1;
+
+ if (avail_buffer_space <= 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_OVERFLOW, NULL,
+ "buffer overflow while decoding layout")
+
+ if (H5S_SELECT_DESERIALIZE(&mesg->storage.u.virt.list[i].source_select, &heap_block_p,
+ (size_t)(avail_buffer_space)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode source space selection")
/* Virtual selection */
+
+ /* Buffer space must be updated after previous deserialization */
+ avail_buffer_space = heap_block_p_end - heap_block_p + 1;
+
+ if (avail_buffer_space <= 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_OVERFLOW, NULL,
+ "buffer overflow while decoding layout")
+
if (H5S_SELECT_DESERIALIZE(&mesg->storage.u.virt.list[i].source_dset.virtual_select,
- &heap_block_p) < 0)
+ &heap_block_p, (size_t)(avail_buffer_space)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL,
"can't decode virtual space selection")