Comments (5)
Can you check what sizeof(http_parser)
is (and why)?
from http-parser.
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.
With a small patch to show some offsets
diff -ur source/test.c source-debug/test.c
--- source/test.c 1970-01-01 00:00:01.000000000 +0000
+++ source-debug/test.c 2020-04-29 18:31:08.678915685 +0000
@@ -4221,6 +4221,12 @@
printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version);
printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser));
+ printf("sizeof(void *) = %u\n", (unsigned int)sizeof(void*));
+ printf("offsetof(http_parser, nread) = %u\n", (unsigned int)offsetof(http_parser, nread));
+ printf("offsetof(http_parser, content_length) = %u\n", (unsigned int)offsetof(http_parser, content_length));
+ printf("offsetof(http_parser, http_major) = %u\n", (unsigned int)offsetof(http_parser, http_major));
+ printf("offsetof(http_parser, http_minor) = %u\n", (unsigned int)offsetof(http_parser, http_minor));
+ printf("offsetof(http_parser, data) = %u\n", (unsigned int)offsetof(http_parser, data));
assert(sizeof(http_parser) == 4 + 4 + 8 + 2 + 2 + 4 + sizeof(void *));
from http-parser.
That makes sense, thanks. #510 should fix it.
from http-parser.
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)
from http-parser.
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.
from http-parser.
Related Issues (20)
- After upgrade it stoped working HOT 10
- Handle URLs with a colon after host but no port HOT 8
- 2.9.3 breaks ABI compatibility with 2.9.2 with no corresponding SONAME change HOT 6
- An http-parser update broke etherpad HOT 4
- Suggestion for making F_SKIPBODY more useful
- Documentation update request: (0 if no Content-Length header) is incorrect HOT 2
- Fix -Wsign-compare warning
- Chunked may not be final in transfer encoding list HOT 8
- Request with Transfer-Encoding: chunked and Content-Length is valid per RFC, but rejected with HPE_UNEXPECTED_CONTENT_LENGTH HOT 18
- Parse Error: Invalid header value char HOT 2
- Maintainer notice
- Have "Invalid header value char" error message more explicit HOT 1
- Test for the size of struct http_parser fails on 32 bit systems where there is padding/alignment for void* HOT 6
- libhttp-parser-ext.bundle, 5): no suitable image found HOT 4
- if I put two http request buf, function http_context_parser will crash,why???
- Examples HOT 6
- Rename primary branch to main HOT 2
- Incremental builds with no changes still trigger refactoring
- https://github.com/nodejs/help.wiki.git
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from http-parser.