Andy Fiddaman wrote:
On Mon, 17 Sep 2007, Ken Murchison wrote:
; Good point. I'm wondering if we need the struct at all, and can just use a
; union.
You're right, I've just tested the following and it works fine:
#define ALIGNBUF(buf, size) \
union { \
bit64 align8; \
char buf[(size)]; \
} align8buf; \
char *buf = align8buf.buf
I didn't like the way that the macro looked in the code, so I just
typedef'd it instead. Here is my current patch. If it works, I'll
commit it.
--
Kenneth Murchison
Systems Programmer
Project Cyrus Developer/Maintainer
Carnegie Mellon University
Index: annotate.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/annotate.c,v
retrieving revision 1.37
diff -u -r1.37 annotate.c
--- annotate.c 5 Sep 2007 17:26:26 -0000 1.37
+++ annotate.c 17 Sep 2007 17:44:56 -0000
@@ -306,11 +306,12 @@
static int split_attribs(const char *data, int datalen __attribute__((unused)),
struct annotation_data *attrib)
{
- unsigned long tmp;
+ unsigned long tmp; /* for alignment */
/* xxx use datalen? */
/* xxx sanity check the data? */
- attrib->size = (size_t) ntohl(*(unsigned long *) data);
+ memcpy(&tmp, data, sizeof(unsigned long));
+ attrib->size = (size_t) ntohl(tmp);
data += sizeof(unsigned long); /* skip to value */
attrib->value = data;
Index: mailbox.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/mailbox.c,v
retrieving revision 1.170
diff -u -r1.170 mailbox.c
--- mailbox.c 13 Sep 2007 20:49:53 -0000 1.170
+++ mailbox.c 17 Sep 2007 17:44:57 -0000
@@ -1291,8 +1291,9 @@
*/
int mailbox_write_index_header(struct mailbox *mailbox)
{
- char buf[INDEX_HEADER_SIZE];
- unsigned long header_size = sizeof(buf);
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
+ unsigned long header_size = INDEX_HEADER_SIZE;
int n;
assert(mailbox->index_lock_count != 0);
@@ -1396,7 +1397,8 @@
int sync)
{
int n;
- char buf[INDEX_RECORD_SIZE];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
mailbox_index_record_to_buf(record, buf);
@@ -1530,9 +1532,8 @@
unsigned long exists;
unsigned msgno;
bit32 oldstart_offset, oldrecord_size, recsize_diff;
- char buf[INDEX_HEADER_SIZE > INDEX_RECORD_SIZE ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE];
- char *bufp;
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf, *bufp;
int quota_offset = 0;
int calculate_flagcounts = 0;
bit32 numansweredflag = 0;
@@ -1859,8 +1860,8 @@
mailbox_decideproc_t *decideproc, void *deciderock,
int expunge_flags)
{
- char buf[INDEX_HEADER_SIZE > INDEX_RECORD_SIZE ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
unsigned msgno;
unsigned newexpunged;
unsigned newexists;
@@ -2052,8 +2053,8 @@
unsigned newanswered;
unsigned newflagged;
- char buf[INDEX_HEADER_SIZE > INDEX_RECORD_SIZE ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
unsigned msgno;
struct stat sbuf;
struct txn *tid = NULL;
Index: mailbox.h
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/mailbox.h,v
retrieving revision 1.84
diff -u -r1.84 mailbox.h
--- mailbox.h 5 Sep 2007 17:26:27 -0000 1.84
+++ mailbox.h 17 Sep 2007 17:44:57 -0000
@@ -267,6 +267,17 @@
extern const struct mailbox_header_cache mailbox_cache_headers[];
extern const int MAILBOX_NUM_CACHE_HEADERS;
+/* Aligned buffer for manipulating index header/record fields */
+typedef union {
+ char buf[INDEX_HEADER_SIZE > INDEX_RECORD_SIZE ?
+ INDEX_HEADER_SIZE : INDEX_RECORD_SIZE];
+#ifdef HAVE_LONG_LONG_INT
+ bit64 align8; /* align on 8-byte boundary */
+#else
+ bit32 align4; /* align on 4-byte boundary */
+#endif
+} indexbuffer_t;
+
/* Bitmasks for expunging */
enum {
EXPUNGE_FORCE = (1<<0),
Index: reconstruct.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/reconstruct.c,v
retrieving revision 1.96
diff -u -r1.96 reconstruct.c
--- reconstruct.c 13 Sep 2007 20:21:38 -0000 1.96
+++ reconstruct.c 17 Sep 2007 17:44:57 -0000
@@ -450,8 +450,8 @@
char newfnamebuf[MAX_MAILBOX_PATH+1];
struct stat sbuf;
- char buf[((INDEX_HEADER_SIZE > INDEX_RECORD_SIZE) ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE)];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
int expunge_fd;
FILE *fexpunge;
@@ -704,8 +704,8 @@
*/
int reconstruct(char *name, struct discovered *found)
{
- char buf[((INDEX_HEADER_SIZE > INDEX_RECORD_SIZE) ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE)];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
char quota_root[MAX_MAILBOX_PATH+1];
bit32 valid_user_flags[MAX_USER_FLAGS/32];
Index: unexpunge.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/unexpunge.c,v
retrieving revision 1.5
diff -u -r1.5 unexpunge.c
--- unexpunge.c 30 Mar 2007 18:40:21 -0000 1.5
+++ unexpunge.c 17 Sep 2007 17:44:57 -0000
@@ -168,8 +168,8 @@
{
int r = 0;
const char *irec;
- char buf[INDEX_HEADER_SIZE > INDEX_RECORD_SIZE ?
- INDEX_HEADER_SIZE : INDEX_RECORD_SIZE];
+ indexbuffer_t ibuf;
+ char *buf = ibuf.buf;
char *path, fnamebuf[MAX_MAILBOX_PATH+1], fnamebufnew[MAX_MAILBOX_PATH+1];
FILE *newindex = NULL, *newexpungeindex = NULL;
unsigned emsgno, imsgno;
----
Cyrus Home Page: http://cyrusimap.web.cmu.edu/
Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html