hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
src/pcre2_intmodedep.h: fix alignment of fields in struct heapframe
 
pcre2_intmodedep.h has a check to verify that the size of the struct
heapframe is a multiple of 4 bytes. On most architectures this works
fine, but not on m68k. Indeed, when building the 16-bit variant of
pcre2, the heapframe structure contains:
 
 PCRE2_UCHAR occu[2];
 PCRE2_SPTR  eptr;
 
Where PCRE2_UCHAR is a 16-bit data type, and PCRE2_SPTR is a
pointer. The occu[] array starts at byte 0x32, so not aligned on a
32-bit boundary. With 2 x 16-bit, the occur[] array ends at byte 0x36.
 
Now, on most architectures, the alignment required for a pointer will
make the eptr field start at 0x38 (on 32 bit architectures). However,
on m68k, it is fine to have a pointer aligned only on a 16-bit
boundary, and the eptr pointer will be at offset 0x36.
 
This doesn't cause a problem per-se, but breaks the check that
heapframe should be a multiple of 4 bytes.
 
To fix this, we make sure eptr is aligned by introducing an unused
field of 16 bits after the occu[] array (in the 16-bit variant) or
after the occu[] array (in the 32-bit variant). These choices have
been made to keep the structure layout unchanged.
 
Fixes the following build failure on m68k:
 
src/pcre2_intmodedep.h:818:14: error: size of array 'check_heapframe_size' is negative
 typedef char check_heapframe_size[
              ^~~~~~~~~~~~~~~~~~~~
 
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Upstream: https://bugs.exim.org/show_bug.cgi?id=2247
 
Index: src/pcre2_intmodedep.h
===================================================================
--- a/src/pcre2_intmodedep.h    (revision 923)
+++ b/src/pcre2_intmodedep.h    (working copy)
@@ -797,7 +797,9 @@
   PCRE2_UCHAR occu[6];       /* Used for other case code units */
 #elif PCRE2_CODE_UNIT_WIDTH == 16
   PCRE2_UCHAR occu[2];       /* Used for other case code units */
+  uint8_t     unused[2];     /* Ensure 32 bit alignment */
 #else
+  uint8_t     unused[2];     /* Ensure 32 bit alignment */
   PCRE2_UCHAR occu[1];       /* Used for other case code units */
 #endif