Skip to content

Commit 8080a9b

Browse files
mscdexBethGriggs
authored andcommittedMar 11, 2019
http: fix error check in Execute()
Refs: #24738 Fixes: #25858 PR-URL: #25939 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Beth Griggs <Bethany.Griggs@uk.ibm.com>
1 parent b5d4649 commit 8080a9b

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed
 

‎src/node_http_parser.cc

+28-2
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,28 @@ class Parser : public AsyncWrap {
610610
size_t nparsed =
611611
http_parser_execute(&parser_, &settings, data, len);
612612

613-
Save();
613+
enum http_errno err = HTTP_PARSER_ERRNO(&parser_);
614+
615+
// Finish()
616+
if (data == nullptr) {
617+
// `http_parser_execute()` returns either `0` or `1` when `len` is 0
618+
// (part of the finishing sequence).
619+
CHECK_EQ(len, 0);
620+
switch (nparsed) {
621+
case 0:
622+
err = HPE_OK;
623+
break;
624+
case 1:
625+
nparsed = 0;
626+
break;
627+
default:
628+
UNREACHABLE();
629+
}
630+
631+
// Regular Execute()
632+
} else {
633+
Save();
634+
}
614635

615636
// Unassign the 'buffer_' variable
616637
current_buffer_.Clear();
@@ -624,7 +645,7 @@ class Parser : public AsyncWrap {
624645
Local<Integer> nparsed_obj = Integer::New(env()->isolate(), nparsed);
625646
// If there was a parse error in one of the callbacks
626647
// TODO(bnoordhuis) What if there is an error on EOF?
627-
if (!parser_.upgrade && nparsed != len) {
648+
if (!parser_.upgrade && err != HPE_OK) {
628649
enum http_errno err = HTTP_PARSER_ERRNO(&parser_);
629650

630651
Local<Value> e = Exception::Error(env()->parse_error_string());
@@ -635,6 +656,11 @@ class Parser : public AsyncWrap {
635656

636657
return scope.Escape(e);
637658
}
659+
660+
// No return value is needed for `Finish()`
661+
if (data == nullptr) {
662+
return scope.Escape(Local<Value>());
663+
}
638664
return scope.Escape(nparsed_obj);
639665
}
640666

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
require('../common');
3+
const common = require('../common');
44
const assert = require('assert');
55
const { spawnSync } = require('child_process');
66
const http = require('http');
@@ -9,3 +9,16 @@ assert.strictEqual(http.maxHeaderSize, 8 * 1024);
99
const child = spawnSync(process.execPath, ['--max-http-header-size=10', '-p',
1010
'http.maxHeaderSize']);
1111
assert.strictEqual(+child.stdout.toString().trim(), 10);
12+
13+
{
14+
const server = http.createServer(common.mustNotCall());
15+
server.listen(0, common.mustCall(() => {
16+
http.get({
17+
port: server.address().port,
18+
headers: { foo: 'x'.repeat(http.maxHeaderSize + 1) }
19+
}, common.mustNotCall()).once('error', common.mustCall((err) => {
20+
assert.strictEqual(err.code, 'ECONNRESET');
21+
server.close();
22+
}));
23+
}));
24+
}

0 commit comments

Comments
 (0)
Please sign in to comment.