[SCTP]: Fix ia64 NaT consumption fault with sctp_sideffect commands.
authorVladislav Yasevich <vladislav.yasevich@hp.com>
Sat, 12 Nov 2005 00:07:40 +0000 (16:07 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Nov 2005 00:07:40 +0000 (16:07 -0800)
On ia64, it is possible to get NaT Consumption Fault and a kernel panic
when initializing sctp sideeffect commands arguments.  The union
sctp_arg_t contains different sized elements and when loading a smaller
sized element (32 or 16 bits), it is possible for a speculative load to
fail and result in a NaT bit set which causes a kernel crash.  The easy
way to get around it is to load the largerst member of the union.

Signed-off-by: Vladislav Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/command.h

index dc107ffad483f0c1863f77a5a415050435c1dd8d..34a1a09e5aeff93927fb058be18e79e6afbf32df 100644 (file)
@@ -120,6 +120,7 @@ typedef union {
        int error;
        sctp_state_t state;
        sctp_event_timeout_t to;
+       unsigned long zero;
        void *ptr;
        struct sctp_chunk *chunk;
        struct sctp_association *asoc;
@@ -148,17 +149,17 @@ static inline sctp_arg_t SCTP_NULL(void)
 }
 static inline sctp_arg_t SCTP_NOFORCE(void)
 {
-       sctp_arg_t retval; retval.i32 = 0; return retval;
+       sctp_arg_t retval = {.zero = 0UL}; retval.i32 = 0; return retval;
 }
 static inline sctp_arg_t SCTP_FORCE(void)
 {
-       sctp_arg_t retval; retval.i32 = 1; return retval;
+       sctp_arg_t retval = {.zero = 0UL}; retval.i32 = 1; return retval;
 }
 
 #define SCTP_ARG_CONSTRUCTOR(name, type, elt) \
 static inline sctp_arg_t       \
 SCTP_## name (type arg)                \
-{ sctp_arg_t retval; retval.elt = arg; return retval; }
+{ sctp_arg_t retval = {.zero = 0UL}; retval.elt = arg; return retval; }
 
 SCTP_ARG_CONSTRUCTOR(I32,      __s32, i32)
 SCTP_ARG_CONSTRUCTOR(U32,      __u32, u32)