Skip to content

Commit

Permalink
http: refactor to avoid unsafe array iteration
Browse files Browse the repository at this point in the history
PR-URL: #37124
Reviewed-By: Zijian Liu <lxxyxzj@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
aduh95 authored and targos committed Feb 2, 2021
1 parent e712650 commit 7196ac1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 13 deletions.
21 changes: 14 additions & 7 deletions lib/_http_agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,9 @@ function maybeEnableKeylog(eventName) {
agent.emit('keylog', keylog, this);
};
// Existing sockets will start listening on keylog now.
for (const socket of ObjectValues(this.sockets)) {
socket.on('keylog', this[kOnKeylog]);
const sockets = ObjectValues(this.sockets);
for (let i = 0; i < sockets.length; i++) {
sockets[i].on('keylog', this[kOnKeylog]);
}
}
}
Expand Down Expand Up @@ -424,7 +425,9 @@ Agent.prototype.removeSocket = function removeSocket(s, options) {
if (!s.writable)
ArrayPrototypePush(sets, this.freeSockets);

for (const sockets of sets) {
for (let sk = 0; sk < sets.length; sk++) {
const sockets = sets[sk];

if (sockets[name]) {
const index = ArrayPrototypeIndexOf(sockets[name], s);
if (index !== -1) {
Expand Down Expand Up @@ -490,10 +493,14 @@ Agent.prototype.reuseSocket = function reuseSocket(socket, req) {
};

Agent.prototype.destroy = function destroy() {
for (const set of [this.freeSockets, this.sockets]) {
for (const key of ObjectKeys(set)) {
for (const setName of set[key]) {
setName.destroy();
const sets = [this.freeSockets, this.sockets];
for (let s = 0; s < sets.length; s++) {
const set = sets[s];
const keys = ObjectKeys(set);
for (let v = 0; v < keys.length; v++) {
const setName = set[keys[v]];
for (let n = 0; n < setName.length; n++) {
setName[n].destroy();
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

const {
ArrayIsArray,
ArrayPrototypeForEach,
ArrayPrototypeJoin,
ArrayPrototypePush,
ArrayPrototypeUnshift,
Expand Down Expand Up @@ -390,9 +391,9 @@ function _storeHeader(firstLine, headers) {
}
} else if (ArrayIsArray(headers)) {
if (headers.length && ArrayIsArray(headers[0])) {
for (const entry of headers) {
processHeader(this, state, entry[0], entry[1], true);
}
ArrayPrototypeForEach(headers, (entry) =>
processHeader(this, state, entry[0], entry[1], true)
);
} else {
if (headers.length % 2 !== 0) {
throw new ERR_INVALID_ARG_VALUE('headers', headers);
Expand Down
6 changes: 3 additions & 3 deletions lib/_http_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

const {
ArrayIsArray,
ArrayPrototypeForEach,
ArrayPrototypePush,
ArrayPrototypeShift,
Error,
Expand Down Expand Up @@ -417,9 +418,8 @@ Server.prototype[EE.captureRejectionSymbol] = function(err, event, ...args) {
const [ , res] = args;
if (!res.headersSent && !res.writableEnded) {
// Don't leak headers.
for (const name of res.getHeaderNames()) {
res.removeHeader(name);
}
ArrayPrototypeForEach(res.getHeaderNames(),
(name) => res.removeHeader(name));
res.statusCode = 500;
res.end(STATUS_CODES[500]);
} else {
Expand Down

0 comments on commit 7196ac1

Please sign in to comment.