@@ -2675,8 +2675,22 @@ bool HDF5Array::IRead(const GUInt64 *arrayStartIdx, const size_t *count,
2675
2675
pDstBuffer);
2676
2676
}
2677
2677
2678
+ bool strideOK = true ;
2679
+ GPtrDiff_t nExpectedBufferStride = 1 ;
2680
+ for (size_t i = nDims; i != 0 ;)
2681
+ {
2682
+ --i;
2683
+ if (count[i] != 1 && bufferStride[i] != nExpectedBufferStride)
2684
+ {
2685
+ strideOK = false ;
2686
+ break ;
2687
+ }
2688
+ nExpectedBufferStride *= count[i];
2689
+ }
2690
+
2678
2691
hid_t hBufferType = H5I_INVALID_HID;
2679
2692
GByte *pabyTemp = nullptr ;
2693
+ bool bUseTmpBuffer = false ;
2680
2694
if (m_dt.GetClass () == GEDTC_STRING)
2681
2695
{
2682
2696
if (bufferDataType.GetClass () != GEDTC_STRING)
@@ -2693,7 +2707,7 @@ bool HDF5Array::IRead(const GUInt64 *arrayStartIdx, const size_t *count,
2693
2707
return false ;
2694
2708
}
2695
2709
}
2696
- else if (bufferDataType.GetClass () == GEDTC_NUMERIC &&
2710
+ else if (strideOK && bufferDataType.GetClass () == GEDTC_NUMERIC &&
2697
2711
m_dt.GetClass () == GEDTC_NUMERIC &&
2698
2712
!GDALDataTypeIsComplex (m_dt.GetNumericDataType ()) &&
2699
2713
!GDALDataTypeIsComplex (bufferDataType.GetNumericDataType ()))
@@ -2715,14 +2729,7 @@ bool HDF5Array::IRead(const GUInt64 *arrayStartIdx, const size_t *count,
2715
2729
hBufferType = H5Tcopy (m_hNativeDT);
2716
2730
if (m_dt != bufferDataType)
2717
2731
{
2718
- const size_t nDataTypeSize = H5Tget_size (m_hNativeDT);
2719
- pabyTemp = static_cast <GByte *>(
2720
- VSI_MALLOC2_VERBOSE (nDataTypeSize, nEltCount));
2721
- if (pabyTemp == nullptr )
2722
- {
2723
- H5Tclose (hBufferType);
2724
- return false ;
2725
- }
2732
+ bUseTmpBuffer = true ;
2726
2733
}
2727
2734
}
2728
2735
H5Tclose (hParent);
@@ -2733,24 +2740,33 @@ bool HDF5Array::IRead(const GUInt64 *arrayStartIdx, const size_t *count,
2733
2740
bufferDataType);
2734
2741
if (hBufferType == H5I_INVALID_HID)
2735
2742
{
2736
- VSIFree (pabyTemp);
2737
2743
return false ;
2738
2744
}
2739
2745
}
2740
2746
}
2741
- else
2747
+ else if (strideOK)
2742
2748
{
2743
2749
hBufferType = H5Tcopy (m_hNativeDT);
2744
2750
if (m_dt != bufferDataType || m_bHasString || m_bHasNonNativeDataType)
2745
2751
{
2746
- const size_t nDataTypeSize = H5Tget_size (m_hNativeDT);
2747
- pabyTemp = static_cast <GByte *>(
2748
- VSI_MALLOC2_VERBOSE (nDataTypeSize, nEltCount));
2749
- if (pabyTemp == nullptr )
2750
- {
2751
- H5Tclose (hBufferType);
2752
- return false ;
2753
- }
2752
+ bUseTmpBuffer = true ;
2753
+ }
2754
+ }
2755
+ else
2756
+ {
2757
+ hBufferType = H5Tcopy (m_hNativeDT);
2758
+ bUseTmpBuffer = true ;
2759
+ }
2760
+
2761
+ if (bUseTmpBuffer)
2762
+ {
2763
+ const size_t nDataTypeSize = H5Tget_size (hBufferType);
2764
+ pabyTemp =
2765
+ static_cast <GByte *>(VSI_MALLOC2_VERBOSE (nDataTypeSize, nEltCount));
2766
+ if (pabyTemp == nullptr )
2767
+ {
2768
+ H5Tclose (hBufferType);
2769
+ return false ;
2754
2770
}
2755
2771
}
2756
2772
0 commit comments