Bug#761603: libhdf4: wrong endianness on s390x/mips

Rebecca Palmer rebecca_palmer at zoho.com
Sun Sep 14 21:53:43 UTC 2014


Package: libhdf4-0
Version: 4.2.10~1exp1
Control: tags -1 patch

(from debian/patches/hdfi.h )
> --- a/HDF4/hdf/src/hconv.h
> +++ b/HDF4/hdf/src/hconv.h
> @@ -59,7 +59,7 @@
>  /* CONSTANT DEFINITIONS                                                      */
>  /*****************************************************************************/
>  /* Generally Big-Endian machines */
> -#if !defined(INTEL86) && !defined(MIPSEL) && !defined(DEC_ALPHA) && !defined(I860) && !defined(SUN386) && !(defined(__ia64) && !(defined(hpux) || defined(__hpux))) && !defined(__x86_64__)
> +#if !defined(INTEL86) && !defined(MIPSEL) && !defined(DEC_ALPHA) && !defined(I860) && !defined(SUN386) && !(defined(__ia64) && !(defined(hpux) || defined(__hpux))) && !defined(__x86_64__) && (defined(__powerpc__) && !defined(__LITTLE_ENDIAN__)) && !defined(__aarch64__) && !defined(__ARM_EABI__)

That treats anything that isn't powerpc as little-endian, which is wrong 
for s390x and mips.

The result of this appears to be that while the data itself gets put the 
right way round, the array size metadata doesn't:

# t100x100 is the test file from 
http://sources.debian.net/src/libhdf4/4.2.10-1%7Eexp1/hdf/util/testfiles/fp2hdf/t100x100/
amd64$ hdfimport t100x100 -o test_amd64.hdf
qemu-s390x$ hdfimport t100x100 -o test_s390x.hdf
$ cmp test_s390x.hdf test_amd64.hdf -l
41095 144   0
41098   0 144
41192 144   0
41195   0 144
41293   0 102
41294   0 310
41295 310   0
41296 102   0
42044  62  63
amd64$ hdiff test_amd64.hdf test_s390x.hdf
Comparison not supported
<DataSet> has rank 2, dimensions [ 100 100 ]
<DataSet> has rank 2, dimensions [ 1677721600 1677721600 ]
# 1677721600 = 100 << 24
qemu-s390x$ hdiff test_amd64.hdf test_s390x.hdf
Comparison not supported
<DataSet> has rank 2, dimensions [ 1677721600 1677721600 ]
<DataSet> has rank 2, dimensions [ 100 100 ]
qemu-s390x$ hdp dumpsds test_s390x.hdf
File name: test_s390x.hdf

Variable Name = DataSet
	 Index = 0
	 Type= 32-bit floating point
	 Ref. = 2
	 Compression method = NONE
	 Rank = 2
	 Number of attributes = 1
	 Dim0: Name=fakeDim0
		 Size = 100
		 Scale Type = 32-bit floating point
		 Number of attributes = 0
	 Dim1: Name=fakeDim1
		 Size = 100
		 Scale Type = 32-bit floating point
		 Number of attributes = 0
	 Attr0: Name = valid_range
		 Type = 32-bit floating point
		 Count= 2
		 Value = 0.000000 100.000000
	 Data :
[...large array...]
amd64$ hdp dumpsds test_s390x.hdf
File name: test_s390x.hdf

Variable Name = DataSet
	 Index = 0
	 Type= 32-bit floating point
	 Ref. = 2
	 Compression method = NONE
	 Rank = 2
	 Number of attributes = 1
	 Dim0: Name=fakeDim0
		 Size = 1677721600
		 Scale Type = 32-bit floating point
		 Number of attributes = 0
	 Dim1: Name=fakeDim1
		 Size = 1677721600
		 Scale Type = 32-bit floating point
		 Number of attributes = 0
	 Attr0: Name = valid_range
		 Type = 32-bit floating point
		 Count= 2
		 Value = 0.000000 0.000000
	 Data :
in sdsdumpfull: space allocation for buf failed.  Terminated!

If you want to keep this (weird, and fragile in that it silently treats 
anything it doesn't recognise as big-endian) form use

+#if !defined(INTEL86) && !defined(MIPSEL) && !defined(DEC_ALPHA) && 
!defined(I860) && !defined(SUN386) && !(defined(__ia64) && 
!(defined(hpux) || defined(__hpux))) && !defined(__x86_64__) && 
!(defined(__powerpc__) && defined(__LITTLE_ENDIAN__)) && 
!defined(__aarch64__) && !defined(__ARM_EABI__)

Fortunately, nothing outside libhdf4 uses this header (according to 
codesearch.debian.net), so nothing else should need recompiling.



More information about the Pkg-grass-devel mailing list