GeezerVison is showing github.com — fs: fix stack overflow in fs.readdirSync · nodejs/node@2995506
File tree
Expand file treeCollapse file tree
Open diff view settings
Expand file treeCollapse file tree
Open diff view settings
Collapse file
Copy file name to clipboardExpand all lines: src/node_file.cc +9-3Lines changed: 9 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -951,14 +951,20 @@ static void ReadDir(const FunctionCallbackInfo<Value>& args) { |
951 | 951 | name_v[name_idx++] = filename.ToLocalChecked(); |
952 | 952 |
|
953 | 953 | if (name_idx >= arraysize(name_v)) { |
954 | | - fn->Call(env->context(), names, name_idx, name_v) |
955 | | - .ToLocalChecked(); |
| 954 | + MaybeLocal<Value> ret = fn->Call(env->context(), names, name_idx, |
| 955 | + name_v); |
| 956 | + if (ret.IsEmpty()) { |
| 957 | + return; |
| 958 | + } |
956 | 959 | name_idx = 0; |
957 | 960 | } |
958 | 961 | } |
959 | 962 |
|
960 | 963 | if (name_idx > 0) { |
961 | | - fn->Call(env->context(), names, name_idx, name_v).ToLocalChecked(); |
| 964 | + MaybeLocal<Value> ret = fn->Call(env->context(), names, name_idx, name_v); |
| 965 | + if (ret.IsEmpty()) { |
| 966 | + return; |
| 967 | + } |
962 | 968 | } |
963 | 969 |
|
964 | 970 | args.GetReturnValue().Set(names); |
|
Collapse file
Copy file name to clipboard +18Lines changed: 18 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const common = require('../common'); |
| 4 | + |
| 5 | +const fs = require('fs'); |
| 6 | + |
| 7 | +function recurse() { |
| 8 | + fs.readdirSync('.'); |
| 9 | + recurse(); |
| 10 | +} |
| 11 | + |
| 12 | +common.expectsError( |
| 13 | + () => recurse(), |
| 14 | + { |
| 15 | + type: RangeError, |
| 16 | + message: 'Maximum call stack size exceeded' |
| 17 | + } |
| 18 | +); |