summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2023-04-05 16:26:32 +0100
committerRobin Watts <Robin.Watts@artifex.com>2023-04-05 18:00:49 +0100
commitfaf9c9b57b9d8a8e3f24fc83eb65ab740c2c0702 (patch)
tree8f670e4f80b49205ead8ee8ff5c0605a3c5ee2f9
parent81eedb262e019faf2819cff89b23bc57fe776c21 (diff)
downloadghostpdl-faf9c9b57b9d8a8e3f24fc83eb65ab740c2c0702.tar.gz
Memento: Ensure that Memento_BlkHeader is a multiple of 32 bytes.
This is so that Memento wrapped blocks get the same alignment % 32 as the underlying malloc blocks. This is important for setjmp buffer usage on Windows (at least, probably linux too).
-rw-r--r--base/memento.c65
1 files changed, 43 insertions, 22 deletions
diff --git a/base/memento.c b/base/memento.c
index ea809a51c..aa60999bb 100644
--- a/base/memento.c
+++ b/base/memento.c
@@ -385,33 +385,54 @@ struct Memento_BlkDetails
typedef struct Memento_BlkHeader Memento_BlkHeader;
-struct Memento_BlkHeader
-{
- size_t rawsize;
- int sequence;
- int lastCheckedOK;
- int flags;
+#ifdef MEMENTO_DETAILS
+#define MEMENTO_DETAIL_FIELDS \
+ Memento_BlkDetails *details;\
+ Memento_BlkDetails **details_tail;
+#else
+#define MEMENTO_DETAIL_FIELDS
+#endif
- const char *label;
+#define MEMENTO_BLKHEADER_FIELDS \
+ size_t rawsize; \
+ int sequence; \
+ int lastCheckedOK; \
+ int flags; \
+ \
+ const char *label; \
+ \
+ /* Blocks are held in a linked list for LRU */ \
+ Memento_BlkHeader *next; \
+ /* Reused as 'parent' when printing nested list */ \
+ Memento_BlkHeader *prev; \
+ \
+ /* Blocks are held in a splay tree for position. */ \
+ Memento_BlkHeader *parent; \
+ Memento_BlkHeader *left; \
+ Memento_BlkHeader *right; \
+ \
+ /* Entries for nesting display calculations. Set \
+ * to magic values at all other time. */ \
+ Memento_BlkHeader *child; \
+ Memento_BlkHeader *sibling; \
+ \
+ MEMENTO_DETAIL_FIELDS
- /* Blocks are held in a linked list for LRU */
- Memento_BlkHeader *next;
- Memento_BlkHeader *prev; /* Reused as 'parent' when printing nested list */
+typedef struct
+{
+ MEMENTO_BLKHEADER_FIELDS
+} Memento_BlkHeader_unpadded;
- /* Blocks are held in a splay tree for position. */
- Memento_BlkHeader *parent;
- Memento_BlkHeader *left;
- Memento_BlkHeader *right;
+#define MEMENTO_BLKHEADER_UNPADDED_SIZE (sizeof(Memento_BlkHeader_unpadded)+Memento_PreSize)
- /* Entries for nesting display calculations. Set to magic
- * values at all other time. */
- Memento_BlkHeader *child;
- Memento_BlkHeader *sibling;
+struct Memento_BlkHeader
+{
+ MEMENTO_BLKHEADER_FIELDS
-#ifdef MEMENTO_DETAILS
- Memento_BlkDetails *details;
- Memento_BlkDetails **details_tail;
-#endif
+ /* Ensure that Memento_BlkHeader is a multiple of 32. This is required
+ * for setjmp/longjmp etc on many platforms. We want to ensure that
+ * we preserve the relative 32byte alignment to the underlying malloc. */
+ char alignment_padding[32-(MEMENTO_BLKHEADER_UNPADDED_SIZE & 31)];
char preblk[Memento_PreSize];
};