Closed ignatenkobrain closed 4 years ago
Can you check what sizeof(http_parser)
is (and why)?
The assertion is not applying padding rules. The difference between sizeof(http_parser)=32
and offsetof(http_parser, data)=24
shows a 4-byte pointer and 4-bytes of padding after it. I haven't found a succinct source, but a stack overflow post on Structure padding and packing asserts:
For
struct
, other than the alignment need for each individual member, the size of whole struct itself will be aligned to a size divisible by size of largest individual member, by padding at end.
Which is consistent with this struct being padded to a multiple of 8-bytes, since it contains an 8-byte uint64_t content_length
.
./test_g
http_parser v2.9.4 (0x020904)
sizeof(http_parser) = 32
sizeof(void *) = 4
offsetof(http_parser, nread) = 4
offsetof(http_parser, content_length) = 8
offsetof(http_parser, http_major) = 16
offsetof(http_parser, http_minor) = 18
offsetof(http_parser, data) = 24
test_g: test.c:4230: main: Assertion `sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *)' failed.
That makes sense, thanks. #510 should fix it.
I can reproduce this on HP-UX (Itanium machine, ia64).
Using @thefloweringash's modified test.c:
http_parser v2.9.4 (0x020904)
sizeof(http_parser) = 32
sizeof(void *) = 4
offsetof(http_parser, nread) = 4
offsetof(http_parser, content_length) = 8
offsetof(http_parser, http_major) = 16
offsetof(http_parser, http_minor) = 18
offsetof(http_parser, data) = 24
Assertion failed: sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *), file test_g.c, line 4309
Abort(coredump)
I fixed this in 4f15b7d by checking the struct size only for i386 and x86_64, that should hopefully be good enough to catch regressions.
https://github.com/nodejs/http-parser/blob/7af127d3ac497bb036d3ecb4fb24bb5ee7ff4b5b/test.c#L4224
This does not work on armv7hl…