Commit ac43da84 authored by Tom Lane's avatar Tom Lane

MemSet() must not cast its pointer argument to int32* until after it has

checked that the pointer is actually word-aligned.  Casting a non-aligned
pointer to int32* is technically illegal per the C spec, and some recent
versions of gcc actually generate bad code for the memset() when given
such a pointer.  Per report from Andrew Morrow.
parent d0f312eb
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/c.h,v 1.187 2005/07/02 17:01:52 momjian Exp $ * $PostgreSQL: pgsql/src/include/c.h,v 1.188 2005/07/18 15:53:28 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -630,21 +630,22 @@ typedef NameData *Name; ...@@ -630,21 +630,22 @@ typedef NameData *Name;
#define MemSet(start, val, len) \ #define MemSet(start, val, len) \
do \ do \
{ \ { \
int32 *_start = (int32 *) (start); \ void *_vstart = (void *) (start); \
int _val = (val); \ int _val = (val); \
Size _len = (len); \ Size _len = (len); \
\ \
if ((((long) _start) & INT_ALIGN_MASK) == 0 && \ if ((((long) _vstart) & INT_ALIGN_MASK) == 0 && \
(_len & INT_ALIGN_MASK) == 0 && \ (_len & INT_ALIGN_MASK) == 0 && \
_val == 0 && \ _val == 0 && \
_len <= MEMSET_LOOP_LIMIT) \ _len <= MEMSET_LOOP_LIMIT) \
{ \ { \
int32 *_start = (int32 *) _vstart; \
int32 *_stop = (int32 *) ((char *) _start + _len); \ int32 *_stop = (int32 *) ((char *) _start + _len); \
while (_start < _stop) \ while (_start < _stop) \
*_start++ = 0; \ *_start++ = 0; \
} \ } \
else \ else \
memset(_start, _val, _len); \ memset(_vstart, _val, _len); \
} while (0) } while (0)
#define MEMSET_LOOP_LIMIT 1024 #define MEMSET_LOOP_LIMIT 1024
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment