Avoid misaligned-pointer-use

...after d0ee08cfbf12145027eee7ad46448a8734693c06 "oox: export embedded font
used in a presentation document" caused CppunitTest_vcl_font_ttf_structure_test
to fail with

> vcl/qa/cppunit/font/TTFStructureTest.cxx:47:5: runtime error: member call on misaligned address 0x7de9211e0262 for type 'o3tl::sal_uInt32_BE', which requires 4 byte alignment
> 0x7de9211e0262: note: pointer points here
>  00 00  00 00 80 00 00 af 10 00  20 48 00 00 00 00 00 00  00 00 57 33 43 00 00 40  00 20 f0 02 03 20
>               ^
>  #0 in (anonymous namespace)::testReadTTFStructure::TestBody() at vcl/qa/cppunit/font/TTFStructureTest.cxx:47:5

Change-Id: I4d46decd497fccf7eecdb38764ac82ed2a68b5d6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184829
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
This commit is contained in:
Stephan Bergmann 2025-04-30 14:14:14 +02:00
parent 2753c21abe
commit fd8b519023
2 changed files with 10 additions and 15 deletions

View File

@ -11,49 +11,43 @@
#include <sal/config.h> #include <sal/config.h>
#include <sal/types.h> #include <sal/types.h>
#include <osl/endian.h>
namespace o3tl namespace o3tl
{ {
/** 16-bit unsigned integer type that can be used in a struct to read from data that is big endian. /** 16-bit unsigned integer type that can be used in a struct to read from data that is big endian
and potentially misaligned.
* *
* Type can't be instantiated but only used in a struct which is reinterpret_cast from bytes. * Type can't be instantiated but only used in a struct which is reinterpret_cast from bytes.
*/ */
class sal_uInt16_BE class sal_uInt16_BE
{ {
private: private:
sal_uInt16 mnValue; sal_uInt8 mnValue[2];
sal_uInt16_BE() = delete; sal_uInt16_BE() = delete;
public: public:
constexpr operator sal_uInt16() const constexpr operator sal_uInt16() const
{ {
#ifdef OSL_LITENDIAN return sal_uInt32(mnValue[1]) | (sal_uInt32(mnValue[0]) << 8);
return OSL_SWAPWORD(mnValue);
#else
return mnValue;
#endif
} }
}; };
/** 32-bit unsigned integer type that can be used in a struct to read from data that is big endian. /** 32-bit unsigned integer type that can be used in a struct to read from data that is big endian
and potentially misaligned.
* *
* Type can't be instantiated but only used in a struct which is reinterpret_cast from bytes. * Type can't be instantiated but only used in a struct which is reinterpret_cast from bytes.
*/ */
class sal_uInt32_BE class sal_uInt32_BE
{ {
private: private:
sal_uInt32 mnValue; sal_uInt8 mnValue[4];
sal_uInt32_BE() = delete; sal_uInt32_BE() = delete;
public: public:
constexpr operator sal_uInt32() const constexpr operator sal_uInt32() const
{ {
#ifdef OSL_LITENDIAN return sal_uInt32(mnValue[3]) | (sal_uInt32(mnValue[2]) << 8)
return OSL_SWAPDWORD(mnValue); | (sal_uInt32(mnValue[1]) << 16) | (sal_uInt32(mnValue[0]) << 24);
#else
return mnValue;
#endif
} }
}; };

View File

@ -13,6 +13,7 @@
#include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/HelperMacros.h>
#include <o3tl/BigEndianTypes.hxx> #include <o3tl/BigEndianTypes.hxx>
#include <osl/endian.h>
#include <array> #include <array>
namespace namespace