]> git.kaiwu.me - nginx.git/commitdiff
SPDY: fixed operator precedence in uint16/uint32 write macros.
authorValentin Bartenev <vbart@nginx.com>
Thu, 29 May 2014 17:15:19 +0000 (21:15 +0400)
committerValentin Bartenev <vbart@nginx.com>
Thu, 29 May 2014 17:15:19 +0000 (21:15 +0400)
Since the type cast has precedence higher than the bit shift operator,
all values were truncated to 8 bits.

These macros are used to construct header block for SYN_REPLY frame on
platforms with strict alignment requirements.  As a result, any response
that contains a header with name or value longer than 255 bytes was
corrupted on such platforms.

src/http/ngx_http_spdy.h

index 55aceda89996ebf9a86f549bce4c1c75ecffdb2d..df24495a14eece60048631855302e372699b2204 100644 (file)
@@ -230,13 +230,16 @@ ngx_int_t ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc);
 #else
 
 #define ngx_spdy_frame_write_uint16(p, s)                                     \
-    ((p)[0] = (u_char) (s) >> 8, (p)[1] = (u_char) (s), (p) + sizeof(uint16_t))
+    ((p)[0] = (u_char) ((s) >> 8),                                            \
+     (p)[1] = (u_char)  (s),                                                  \
+     (p) + sizeof(uint16_t))
 
 #define ngx_spdy_frame_write_uint32(p, s)                                     \
-    ((p)[0] = (u_char) (s) >> 24,                                             \
-    (p)[1] = (u_char) (s) >> 16,                                              \
-    (p)[2] = (u_char) (s) >> 8,                                               \
-    (p)[3] = (u_char) (s), (p) + sizeof(uint32_t))
+    ((p)[0] = (u_char) ((s) >> 24),                                           \
+     (p)[1] = (u_char) ((s) >> 16),                                           \
+     (p)[2] = (u_char) ((s) >> 8),                                            \
+     (p)[3] = (u_char)  (s),                                                  \
+     (p) + sizeof(uint32_t))
 
 #endif