!20 [sync] PR-18: 修复hdf5修漏洞导致的h5py构建失败

From: @openeuler-sync-bot 
Reviewed-by: @hubin95 
Signed-off-by: @hubin95
This commit is contained in:
openeuler-ci-bot 2024-11-07 12:13:41 +00:00 committed by Gitee
commit 9e520322aa
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 256 additions and 1 deletions

View File

@ -0,0 +1,150 @@
From 8b3cfbbd5565efc27124e5ddccc6b9d5e9b5d443 Mon Sep 17 00:00:00 2001
From: Aleksandar Jelenak <ajelenak@hdfgroup.org>
Date: Sat, 17 Dec 2022 22:19:13 -0500
Subject: [PATCH] Add new H5FD_class_value_t typedef
---
h5py/api_types_hdf5.pxd | 126 +++++++++++++++++++++++++++++-----------
1 file changed, 93 insertions(+), 33 deletions(-)
diff --git a/h5py/api_types_hdf5.pxd b/h5py/api_types_hdf5.pxd
index 6977f1a7..7861f848 100644
--- a/h5py/api_types_hdf5.pxd
+++ b/h5py/api_types_hdf5.pxd
@@ -235,40 +235,100 @@ cdef extern from "hdf5.h":
H5FD_MPIO_INDEPENDENT = 0,
H5FD_MPIO_COLLECTIVE
+ # File driver identifier type and values
+ IF HDF5_VERSION >= (1, 14, 0):
+ ctypedef int H5FD_class_value_t
+
+ H5FD_class_value_t H5_VFD_INVALID # -1
+ H5FD_class_value_t H5_VFD_SEC2 # 0
+ H5FD_class_value_t H5_VFD_CORE # 1
+ H5FD_class_value_t H5_VFD_LOG # 2
+ H5FD_class_value_t H5_VFD_FAMILY # 3
+ H5FD_class_value_t H5_VFD_MULTI # 4
+ H5FD_class_value_t H5_VFD_STDIO # 5
+ H5FD_class_value_t H5_VFD_SPLITTER # 6
+ H5FD_class_value_t H5_VFD_MPIO # 7
+ H5FD_class_value_t H5_VFD_DIRECT # 8
+ H5FD_class_value_t H5_VFD_MIRROR # 9
+ H5FD_class_value_t H5_VFD_HDFS # 10
+ H5FD_class_value_t H5_VFD_ROS3 # 11
+ H5FD_class_value_t H5_VFD_SUBFILING # 12
+ H5FD_class_value_t H5_VFD_IOC # 13
+ H5FD_class_value_t H5_VFD_ONION # 14
+
# Class information for each file driver
- ctypedef struct H5FD_class_t:
- const char *name
- haddr_t maxaddr
- H5F_close_degree_t fc_degree
- herr_t (*terminate)()
- hsize_t (*sb_size)(H5FD_t *file)
- herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p)
- herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p)
- size_t fapl_size
- void * (*fapl_get)(H5FD_t *file)
- void * (*fapl_copy)(const void *fapl)
- herr_t (*fapl_free)(void *fapl)
- size_t dxpl_size
- void * (*dxpl_copy)(const void *dxpl)
- herr_t (*dxpl_free)(void *dxpl)
- H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)
- herr_t (*close)(H5FD_t *file)
- int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)
- herr_t (*query)(const H5FD_t *f1, unsigned long *flags)
- herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map)
- haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
- herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
- haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type)
- herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
- haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type)
- herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle)
- herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer)
- herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer)
- herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
- herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
- herr_t (*lock)(H5FD_t *file, hbool_t rw)
- herr_t (*unlock)(H5FD_t *file)
- H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES]
+ IF HDF5_VERSION < (1, 14, 0):
+ ctypedef struct H5FD_class_t:
+ const char *name
+ haddr_t maxaddr
+ H5F_close_degree_t fc_degree
+ herr_t (*terminate)()
+ hsize_t (*sb_size)(H5FD_t *file)
+ herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p)
+ herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p)
+ size_t fapl_size
+ void * (*fapl_get)(H5FD_t *file)
+ void * (*fapl_copy)(const void *fapl)
+ herr_t (*fapl_free)(void *fapl)
+ size_t dxpl_size
+ void * (*dxpl_copy)(const void *dxpl)
+ herr_t (*dxpl_free)(void *dxpl)
+ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)
+ herr_t (*close)(H5FD_t *file)
+ int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)
+ herr_t (*query)(const H5FD_t *f1, unsigned long *flags)
+ herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map)
+ haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+ herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type)
+ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type)
+ herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle)
+ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer)
+ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer)
+ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+ herr_t (*lock)(H5FD_t *file, hbool_t rw)
+ herr_t (*unlock)(H5FD_t *file)
+ H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES]
+ ELSE:
+ unsigned H5FD_CLASS_VERSION # File driver struct version
+
+ ctypedef struct H5FD_class_t:
+ unsigned version # File driver class struct version number
+ H5FD_class_value_t value
+ const char *name
+ haddr_t maxaddr
+ H5F_close_degree_t fc_degree
+ herr_t (*terminate)()
+ hsize_t (*sb_size)(H5FD_t *file)
+ herr_t (*sb_encode)(H5FD_t *file, char *name, unsigned char *p)
+ herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p)
+ size_t fapl_size
+ void * (*fapl_get)(H5FD_t *file)
+ void * (*fapl_copy)(const void *fapl)
+ herr_t (*fapl_free)(void *fapl)
+ size_t dxpl_size
+ void * (*dxpl_copy)(const void *dxpl)
+ herr_t (*dxpl_free)(void *dxpl)
+ H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)
+ herr_t (*close)(H5FD_t *file)
+ int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)
+ herr_t (*query)(const H5FD_t *f1, unsigned long *flags)
+ herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map)
+ haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
+ herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size)
+ haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type)
+ herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
+ haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type)
+ herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle)
+ herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, void *buffer)
+ herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, size_t size, const void *buffer)
+ herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+ herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
+ herr_t (*lock)(H5FD_t *file, hbool_t rw)
+ herr_t (*unlock)(H5FD_t *file)
+ H5FD_mem_t fl_map[<int>H5FD_MEM_NTYPES]
# The main datatype for each driver
ctypedef struct H5FD_t:
--
2.39.2 (Apple Git-143)

View File

@ -0,0 +1,73 @@
From eea4cbc6a4b6333182c8d9b43276f8269c49d980 Mon Sep 17 00:00:00 2001
From: Aleksandar Jelenak <ajelenak@hdfgroup.org>
Date: Wed, 3 Apr 2024 11:29:22 -0400
Subject: [PATCH] Add page buffer and fix file locking tests
---
h5py/tests/test_file.py | 36 ++++++++++++++++++++++++++++++++++--
1 file changed, 34 insertions(+), 2 deletions(-)
diff --git a/h5py/tests/test_file.py b/h5py/tests/test_file.py
index 1aa38731..0ceddc37 100644
--- a/h5py/tests/test_file.py
+++ b/h5py/tests/test_file.py
@@ -213,6 +213,8 @@ class TestPageBuffering(TestCase):
fapl = f.id.get_access_plist()
self.assertEqual(fapl.get_page_buffer_size(), (pbs, mm, mr))
+ @pytest.mark.skipif(h5py.version.hdf5_version_tuple > (1, 14, 3),
+ reason='Requires HDF5 <= 1.14.3')
def test_too_small_pbs(self):
"""Page buffer size must be greater than file space page size."""
fname = self.mktemp()
@@ -222,6 +224,30 @@ class TestPageBuffering(TestCase):
with self.assertRaises(OSError):
File(fname, mode="r", page_buf_size=fsp-1)
+ @pytest.mark.skipif(h5py.version.hdf5_version_tuple < (1, 14, 4),
+ reason='Requires HDF5 >= 1.14.4')
+ def test_open_nonpage_pbs(self):
+ """Open non-PAGE file with page buffer set."""
+ fname = self.mktemp()
+ fsp = 16 * 1024
+ with File(fname, mode='w'):
+ pass
+ with File(fname, mode='r', page_buf_size=fsp) as f:
+ fapl = f.id.get_access_plist()
+ assert fapl.get_page_buffer_size()[0] == 0
+
+ @pytest.mark.skipif(h5py.version.hdf5_version_tuple < (1, 14, 4),
+ reason='Requires HDF5 >= 1.14.4')
+ def test_smaller_pbs(self):
+ """Adjust page buffer size automatically when smaller than file page."""
+ fname = self.mktemp()
+ fsp = 16 * 1024
+ with File(fname, mode='w', fs_strategy='page', fs_page_size=fsp):
+ pass
+ with File(fname, mode='r', page_buf_size=fsp-100) as f:
+ fapl = f.id.get_access_plist()
+ assert fapl.get_page_buffer_size()[0] == fsp
+
def test_actual_pbs(self):
"""Verify actual page buffer size."""
fname = self.mktemp()
@@ -923,8 +949,14 @@ class TestFileLocking:
with h5py.File(fname, mode="r", locking=True) as h5f_read:
pass
- with h5py.File(fname, mode="r", locking='best-effort') as h5f_read:
- pass
+ if h5py.version.hdf5_version_tuple < (1, 14, 4):
+ with h5py.File(fname, mode="r", locking='best-effort') as h5f_read:
+ pass
+ else:
+ with pytest.raises(OSError):
+ with h5py.File(fname, mode="r", locking='best-effort') as h5f_read:
+ pass
+
def test_unsupported_locking(self, tmp_path):
"""Test with erroneous file locking value"""
--
2.39.2 (Apple Git-143)

View File

@ -0,0 +1,24 @@
From dbb202c14f91fd3d70735ffd6ef5737c12e88f4e Mon Sep 17 00:00:00 2001
From: Aleksandar Jelenak <ajelenak@hdfgroup.org>
Date: Sat, 17 Dec 2022 22:19:56 -0500
Subject: [PATCH] Fix wrong file driver version error
---
h5py/h5fd.pyx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/h5py/h5fd.pyx b/h5py/h5fd.pyx
index 04aff077..e9746057 100644
--- a/h5py/h5fd.pyx
+++ b/h5py/h5fd.pyx
@@ -216,5 +216,7 @@ info.fl_map = [H5FD_MEM_SUPER, # default
H5FD_MEM_SUPER, # lheap
H5FD_MEM_SUPER # ohdr
]
+IF HDF5_VERSION >= (1, 14, 0):
+ info.version = H5FD_CLASS_VERSION
fileobj_driver = H5FDregister(&info)
--
2.39.2 (Apple Git-143)

View File

@ -3,11 +3,15 @@
Summary: A high- and low-level interface to the HDF5 library from Python
Name: python-h5py
Version: 3.6.0
Release: 2
Release: 3
License: BSD
URL: http://www.h5py.org/
Source0: https://github.com/h5py/h5py/archive/refs/tags/%{version}.tar.gz
Patch1: Add-new-H5FD_class_value_t-typedef.patch
Patch2: Add-page-buffer-and-fix-file-locking-tests.patch
Patch3: Fix-wrong-file-driver-version-error.patch
BuildRequires: gcc
BuildRequires: hdf5-devel
BuildRequires: python3-devel
@ -34,6 +38,7 @@ A high- and low-level interface to the HDF5 library from Python3
%prep
%setup -q -n %{modname}-%{version}
%autopatch -p1
%{__python3} api_gen.py
%build
@ -52,6 +57,9 @@ A high- and low-level interface to the HDF5 library from Python3
%{python3_sitearch}/%{modname}-%{version}-*.egg-info
%changelog
* Thu Nov 7 2024 caixiaomeng <caixiaomeng2@huawei.com> - 3.6.0-3
- fix build error due to hdf5 upgrade
* Wed Nov 23 2022 yanglongkang <yanglongkang@h-partners.com> - 3.6.0-2
- fix Source incorrect in spec file