Merge pull request #2711 in HDFFV/hdf5 from bmr-HDFFV-11120 to develop
Fix HDFFV-11120 and HDFFV-11121 (CVE-2018-13870 and CVE-2018-13869) * commit '707e30c6be1954c0027374124207e46caae68cbc': Fixed typos in error messages. Fix HDFFV-11120 and HDFFV-11121 (CVE-2018-13870 and CVE-2018-13869)
This commit is contained in:
@@ -656,6 +656,17 @@ Bug Fixes since HDF5-1.10.3 release
|
|||||||
|
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
- Fixed issues CVE-2018-13870 and CVE-2018-13869
|
||||||
|
|
||||||
|
When a buffer overflow occurred because a name length was corrupted
|
||||||
|
and became very large, h5dump crashed on memory access violation.
|
||||||
|
|
||||||
|
A check for reading pass the end of the buffer was added to multiple
|
||||||
|
locations to prevent the crashes and h5dump now simply fails with an
|
||||||
|
error message when this error condition occurs.
|
||||||
|
|
||||||
|
(BMR - 2020/7/22, HDFFV-11120 and HDFFV-11121)
|
||||||
|
|
||||||
- Fixed the segmentation fault when reading attributes with multiple threads
|
- Fixed the segmentation fault when reading attributes with multiple threads
|
||||||
|
|
||||||
It was reported that the reading of attributes with variable length string
|
It was reported that the reading of attributes with variable length string
|
||||||
|
|||||||
@@ -119,11 +119,12 @@ H5FL_DEFINE_STATIC(H5O_link_t);
|
|||||||
static void *
|
static void *
|
||||||
H5O__link_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
H5O__link_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
||||||
unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags,
|
unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags,
|
||||||
size_t H5_ATTR_UNUSED p_size, const uint8_t *p)
|
size_t p_size, const uint8_t *p)
|
||||||
{
|
{
|
||||||
H5O_link_t *lnk = NULL; /* Pointer to link message */
|
H5O_link_t *lnk = NULL; /* Pointer to link message */
|
||||||
size_t len = 0; /* Length of a string in the message */
|
size_t len = 0; /* Length of a string in the message */
|
||||||
unsigned char link_flags; /* Flags for encoding link info */
|
unsigned char link_flags; /* Flags for encoding link info */
|
||||||
|
const uint8_t *p_end = p + p_size; /* End of the p buffer */
|
||||||
void *ret_value = NULL; /* Return value */
|
void *ret_value = NULL; /* Return value */
|
||||||
|
|
||||||
FUNC_ENTER_STATIC
|
FUNC_ENTER_STATIC
|
||||||
@@ -199,6 +200,11 @@ H5O__link_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
|||||||
if(len == 0)
|
if(len == 0)
|
||||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid name length")
|
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid name length")
|
||||||
|
|
||||||
|
/* Make sure that length doesn't exceed buffer size, which could occur
|
||||||
|
when the file is corrupted */
|
||||||
|
if(p + len > p_end)
|
||||||
|
HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "name length causes read past end of buffer")
|
||||||
|
|
||||||
/* Get the link's name */
|
/* Get the link's name */
|
||||||
if(NULL == (lnk->name = (char *)H5MM_malloc(len + 1)))
|
if(NULL == (lnk->name = (char *)H5MM_malloc(len + 1)))
|
||||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||||
@@ -218,6 +224,12 @@ H5O__link_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
|||||||
UINT16DECODE(p, len)
|
UINT16DECODE(p, len)
|
||||||
if(len == 0)
|
if(len == 0)
|
||||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid link length")
|
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid link length")
|
||||||
|
|
||||||
|
/* Make sure that length doesn't exceed buffer size, which could occur
|
||||||
|
when the file is corrupted */
|
||||||
|
if(p + len > p_end)
|
||||||
|
HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "name length causes read past end of buffer")
|
||||||
|
|
||||||
if(NULL == (lnk->u.soft.name = (char *)H5MM_malloc((size_t)len + 1)))
|
if(NULL == (lnk->u.soft.name = (char *)H5MM_malloc((size_t)len + 1)))
|
||||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||||
H5MM_memcpy(lnk->u.soft.name, p, len);
|
H5MM_memcpy(lnk->u.soft.name, p, len);
|
||||||
@@ -238,6 +250,11 @@ H5O__link_decode(H5F_t *f, H5O_t H5_ATTR_UNUSED *open_oh,
|
|||||||
lnk->u.ud.size = len;
|
lnk->u.ud.size = len;
|
||||||
if(len > 0)
|
if(len > 0)
|
||||||
{
|
{
|
||||||
|
/* Make sure that length doesn't exceed buffer size, which could
|
||||||
|
occur when the file is corrupted */
|
||||||
|
if(p + len > p_end)
|
||||||
|
HGOTO_ERROR(H5E_OHDR, H5E_OVERFLOW, NULL, "name length causes read past end of buffer")
|
||||||
|
|
||||||
if(NULL == (lnk->u.ud.udata = H5MM_malloc((size_t)len)))
|
if(NULL == (lnk->u.ud.udata = H5MM_malloc((size_t)len)))
|
||||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||||
H5MM_memcpy(lnk->u.ud.udata, p, len);
|
H5MM_memcpy(lnk->u.ud.udata, p, len);
|
||||||
|
|||||||
Reference in New Issue
Block a user