# HG changeset patch # User Valentin Bartenev # Date 1401383719 -14400 # Node ID 34d460c5d186cac3bc56cb0bcfbb3fd5835f2f39 # Parent 790ba7484bb67d2a1e1a4ce55eeb0fe149ebd176 SPDY: fixed operator precedence in uint16/uint32 write macros. 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. diff --git a/src/http/ngx_http_spdy.h b/src/http/ngx_http_spdy.h --- a/src/http/ngx_http_spdy.h +++ b/src/http/ngx_http_spdy.h @@ -230,13 +230,16 @@ ngx_int_t ngx_http_spdy_send_output_queu #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