| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent fc2956d commit 2fe88d2
12 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -65,7 +65,6 @@ const internalUtil = require('internal/util'); | |||
| 65 | 65 | const { | |
| 66 | 66 | copyObject, | |
| 67 | 67 | getOptions, | |
| 68 | - modeNum, | ||
| 69 | 68 | nullCheck, | |
| 70 | 69 | preprocessSymlinkDestination, | |
| 71 | 70 | Stats, | |
@@ -85,6 +84,7 @@ const { | |||
| 85 | 84 | } = require('internal/constants'); | |
| 86 | 85 | const { | |
| 87 | 86 | isUint32, | |
| 87 | + validateAndMaskMode, | ||
| 88 | 88 | validateInteger, | |
| 89 | 89 | validateUint32 | |
| 90 | 90 | } = require('internal/validators'); | |
@@ -549,32 +549,36 @@ fs.closeSync = function(fd) { | |||
| 549 | 549 | handleErrorFromBinding(ctx); | |
| 550 | 550 | }; | |
| 551 | 551 | ||
| 552 | - fs.open = function(path, flags, mode, callback_) { | ||
| 553 | - var callback = makeCallback(arguments[arguments.length - 1]); | ||
| 554 | - mode = modeNum(mode, 0o666); | ||
| 555 | - | ||
| 552 | + fs.open = function(path, flags, mode, callback) { | ||
| 556 | 553 | path = getPathFromURL(path); | |
| 557 | 554 | validatePath(path); | |
| 558 | - validateUint32(mode, 'mode'); | ||
| 555 | + const flagsNumber = stringToFlags(flags); | ||
| 556 | + if (arguments.length < 4) { | ||
| 557 | + callback = makeCallback(mode); | ||
| 558 | + mode = 0o666; | ||
| 559 | + } else { | ||
| 560 | + mode = validateAndMaskMode(mode, 'mode', 0o666); | ||
| 561 | + callback = makeCallback(callback); | ||
| 562 | + } | ||
| 559 | 563 | ||
| 560 | 564 | const req = new FSReqWrap(); | |
| 561 | 565 | req.oncomplete = callback; | |
| 562 | 566 | ||
| 563 | 567 | binding.open(pathModule.toNamespacedPath(path), | |
| 564 | - stringToFlags(flags), | ||
| 568 | + flagsNumber, | ||
| 565 | 569 | mode, | |
| 566 | 570 | req); | |
| 567 | 571 | }; | |
| 568 | 572 | ||
| 569 | 573 | fs.openSync = function(path, flags, mode) { | |
| 570 | - mode = modeNum(mode, 0o666); | ||
| 571 | 574 | path = getPathFromURL(path); | |
| 572 | 575 | validatePath(path); | |
| 573 | - validateUint32(mode, 'mode'); | ||
| 576 | + const flagsNumber = stringToFlags(flags); | ||
| 577 | + mode = validateAndMaskMode(mode, 'mode', 0o666); | ||
| 574 | 578 | ||
| 575 | 579 | const ctx = { path }; | |
| 576 | 580 | const result = binding.open(pathModule.toNamespacedPath(path), | |
| 577 | - stringToFlags(flags), mode, | ||
| 581 | + flagsNumber, mode, | ||
| 578 | 582 | undefined, ctx); | |
| 579 | 583 | handleErrorFromBinding(ctx); | |
| 580 | 584 | return result; | |
@@ -849,12 +853,16 @@ fs.fsyncSync = function(fd) { | |||
| 849 | 853 | }; | |
| 850 | 854 | ||
| 851 | 855 | fs.mkdir = function(path, mode, callback) { | |
| 852 | - if (typeof mode === 'function') callback = mode; | ||
| 853 | - callback = makeCallback(callback); | ||
| 854 | 856 | path = getPathFromURL(path); | |
| 855 | 857 | validatePath(path); | |
| 856 | - mode = modeNum(mode, 0o777); | ||
| 857 | - validateUint32(mode, 'mode'); | ||
| 858 | + | ||
| 859 | + if (arguments.length < 3) { | ||
| 860 | + callback = makeCallback(mode); | ||
| 861 | + mode = 0o777; | ||
| 862 | + } else { | ||
| 863 | + callback = makeCallback(callback); | ||
| 864 | + mode = validateAndMaskMode(mode, 'mode', 0o777); | ||
| 865 | + } | ||
| 858 | 866 | ||
| 859 | 867 | const req = new FSReqWrap(); | |
| 860 | 868 | req.oncomplete = callback; | |
@@ -864,8 +872,7 @@ fs.mkdir = function(path, mode, callback) { | |||
| 864 | 872 | fs.mkdirSync = function(path, mode) { | |
| 865 | 873 | path = getPathFromURL(path); | |
| 866 | 874 | validatePath(path); | |
| 867 | - mode = modeNum(mode, 0o777); | ||
| 868 | - validateUint32(mode, 'mode'); | ||
| 875 | + mode = validateAndMaskMode(mode, 'mode', 0o777); | ||
| 869 | 876 | const ctx = { path }; | |
| 870 | 877 | binding.mkdir(pathModule.toNamespacedPath(path), mode, undefined, ctx); | |
| 871 | 878 | handleErrorFromBinding(ctx); | |
@@ -1047,25 +1054,18 @@ fs.unlinkSync = function(path) { | |||
| 1047 | 1054 | }; | |
| 1048 | 1055 | ||
| 1049 | 1056 | fs.fchmod = function(fd, mode, callback) { | |
| 1050 | - mode = modeNum(mode); | ||
| 1051 | 1057 | validateUint32(fd, 'fd'); | |
| 1052 | - validateUint32(mode, 'mode'); | ||
| 1053 | - // Values for mode < 0 are already checked via the validateUint32 function | ||
| 1054 | - if (mode > 0o777) | ||
| 1055 | - throw new ERR_OUT_OF_RANGE('mode', undefined, mode); | ||
| 1058 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 1059 | + callback = makeCallback(callback); | ||
| 1056 | 1060 | ||
| 1057 | 1061 | const req = new FSReqWrap(); | |
| 1058 | - req.oncomplete = makeCallback(callback); | ||
| 1062 | + req.oncomplete = callback; | ||
| 1059 | 1063 | binding.fchmod(fd, mode, req); | |
| 1060 | 1064 | }; | |
| 1061 | 1065 | ||
| 1062 | 1066 | fs.fchmodSync = function(fd, mode) { | |
| 1063 | - mode = modeNum(mode); | ||
| 1064 | 1067 | validateUint32(fd, 'fd'); | |
| 1065 | - validateUint32(mode, 'mode'); | ||
| 1066 | - // Values for mode < 0 are already checked via the validateUint32 function | ||
| 1067 | - if (mode > 0o777) | ||
| 1068 | - throw new ERR_OUT_OF_RANGE('mode', undefined, mode); | ||
| 1068 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 1069 | 1069 | const ctx = {}; | |
| 1070 | 1070 | binding.fchmod(fd, mode, undefined, ctx); | |
| 1071 | 1071 | handleErrorFromBinding(ctx); | |
@@ -1106,11 +1106,10 @@ if (O_SYMLINK !== undefined) { | |||
| 1106 | 1106 | ||
| 1107 | 1107 | ||
| 1108 | 1108 | fs.chmod = function(path, mode, callback) { | |
| 1109 | - callback = makeCallback(callback); | ||
| 1110 | 1109 | path = getPathFromURL(path); | |
| 1111 | 1110 | validatePath(path); | |
| 1112 | - mode = modeNum(mode); | ||
| 1113 | - validateUint32(mode, 'mode'); | ||
| 1111 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 1112 | + callback = makeCallback(callback); | ||
| 1114 | 1113 | ||
| 1115 | 1114 | const req = new FSReqWrap(); | |
| 1116 | 1115 | req.oncomplete = callback; | |
@@ -1120,8 +1119,8 @@ fs.chmod = function(path, mode, callback) { | |||
| 1120 | 1119 | fs.chmodSync = function(path, mode) { | |
| 1121 | 1120 | path = getPathFromURL(path); | |
| 1122 | 1121 | validatePath(path); | |
| 1123 | - mode = modeNum(mode); | ||
| 1124 | - validateUint32(mode, 'mode'); | ||
| 1122 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 1123 | + | ||
| 1125 | 1124 | const ctx = { path }; | |
| 1126 | 1125 | binding.chmod(pathModule.toNamespacedPath(path), mode, undefined, ctx); | |
| 1127 | 1126 | handleErrorFromBinding(ctx); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -12,16 +12,14 @@ const { Buffer, kMaxLength } = require('buffer'); | |||
| 12 | 12 | const { | |
| 13 | 13 | ERR_FS_FILE_TOO_LARGE, | |
| 14 | 14 | ERR_INVALID_ARG_TYPE, | |
| 15 | - ERR_METHOD_NOT_IMPLEMENTED, | ||
| 16 | - ERR_OUT_OF_RANGE | ||
| 15 | + ERR_METHOD_NOT_IMPLEMENTED | ||
| 17 | 16 | } = require('internal/errors').codes; | |
| 18 | 17 | const { getPathFromURL } = require('internal/url'); | |
| 19 | 18 | const { isUint8Array } = require('internal/util/types'); | |
| 20 | 19 | const { | |
| 21 | 20 | copyObject, | |
| 22 | 21 | getOptions, | |
| 23 | 22 | getStatsFromBinding, | |
| 24 | - modeNum, | ||
| 25 | 23 | nullCheck, | |
| 26 | 24 | preprocessSymlinkDestination, | |
| 27 | 25 | stringToFlags, | |
@@ -33,6 +31,7 @@ const { | |||
| 33 | 31 | validatePath | |
| 34 | 32 | } = require('internal/fs/utils'); | |
| 35 | 33 | const { | |
| 34 | + validateAndMaskMode, | ||
| 36 | 35 | validateInteger, | |
| 37 | 36 | validateUint32 | |
| 38 | 37 | } = require('internal/validators'); | |
@@ -190,10 +189,9 @@ async function copyFile(src, dest, flags) { | |||
| 190 | 189 | // Note that unlike fs.open() which uses numeric file descriptors, | |
| 191 | 190 | // fsPromises.open() uses the fs.FileHandle class. | |
| 192 | 191 | async function open(path, flags, mode) { | |
| 193 | - mode = modeNum(mode, 0o666); | ||
| 194 | 192 | path = getPathFromURL(path); | |
| 195 | 193 | validatePath(path); | |
| 196 | - validateUint32(mode, 'mode'); | ||
| 194 | + mode = validateAndMaskMode(mode, 'mode', 0o666); | ||
| 197 | 195 | return new FileHandle( | |
| 198 | 196 | await binding.openFileHandle(pathModule.toNamespacedPath(path), | |
| 199 | 197 | stringToFlags(flags), | |
@@ -286,10 +284,9 @@ async function fsync(handle) { | |||
| 286 | 284 | } | |
| 287 | 285 | ||
| 288 | 286 | async function mkdir(path, mode) { | |
| 289 | - mode = modeNum(mode, 0o777); | ||
| 290 | 287 | path = getPathFromURL(path); | |
| 291 | 288 | validatePath(path); | |
| 292 | - validateUint32(mode, 'mode'); | ||
| 289 | + mode = validateAndMaskMode(mode, 'mode', 0o777); | ||
| 293 | 290 | return binding.mkdir(pathModule.toNamespacedPath(path), mode, kUsePromises); | |
| 294 | 291 | } | |
| 295 | 292 | ||
@@ -360,19 +357,15 @@ async function unlink(path) { | |||
| 360 | 357 | } | |
| 361 | 358 | ||
| 362 | 359 | async function fchmod(handle, mode) { | |
| 363 | - mode = modeNum(mode); | ||
| 364 | 360 | validateFileHandle(handle); | |
| 365 | - validateUint32(mode, 'mode'); | ||
| 366 | - if (mode > 0o777) | ||
| 367 | - throw new ERR_OUT_OF_RANGE('mode', undefined, mode); | ||
| 361 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 368 | 362 | return binding.fchmod(handle.fd, mode, kUsePromises); | |
| 369 | 363 | } | |
| 370 | 364 | ||
| 371 | 365 | async function chmod(path, mode) { | |
| 372 | 366 | path = getPathFromURL(path); | |
| 373 | 367 | validatePath(path); | |
| 374 | - mode = modeNum(mode); | ||
| 375 | - validateUint32(mode, 'mode'); | ||
| 368 | + mode = validateAndMaskMode(mode, 'mode'); | ||
| 376 | 369 | return binding.chmod(pathModule.toNamespacedPath(path), mode, kUsePromises); | |
| 377 | 370 | } | |
| 378 | 371 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -70,21 +70,6 @@ function getOptions(options, defaultOptions) { | |||
| 70 | 70 | return options; | |
| 71 | 71 | } | |
| 72 | 72 | ||
| 73 | - function modeNum(m, def) { | ||
| 74 | - if (typeof m === 'number') | ||
| 75 | - return m; | ||
| 76 | - if (typeof m === 'string') { | ||
| 77 | - const parsed = parseInt(m, 8); | ||
| 78 | - if (Number.isNaN(parsed)) | ||
| 79 | - return m; | ||
| 80 | - return parsed; | ||
| 81 | - } | ||
| 82 | - // TODO(BridgeAR): Only return `def` in case `m == null` | ||
| 83 | - if (def !== undefined) | ||
| 84 | - return def; | ||
| 85 | - return m; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | 73 | // Check if the path contains null types if it is a string nor Uint8Array, | |
| 89 | 74 | // otherwise return silently. | |
| 90 | 75 | function nullCheck(path, propName, throwError = true) { | |
@@ -391,7 +376,6 @@ module.exports = { | |||
| 391 | 376 | assertEncoding, | |
| 392 | 377 | copyObject, | |
| 393 | 378 | getOptions, | |
| 394 | - modeNum, | ||
| 395 | 379 | nullCheck, | |
| 396 | 380 | preprocessSymlinkDestination, | |
| 397 | 381 | realpathCacheKey: Symbol('realpathCacheKey'), | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | 3 | const { | |
| 4 | 4 | ERR_INVALID_ARG_TYPE, | |
| 5 | + ERR_INVALID_ARG_VALUE, | ||
| 5 | 6 | ERR_OUT_OF_RANGE | |
| 6 | 7 | } = require('internal/errors').codes; | |
| 7 | 8 | ||
@@ -13,6 +14,40 @@ function isUint32(value) { | |||
| 13 | 14 | return value === (value >>> 0); | |
| 14 | 15 | } | |
| 15 | 16 | ||
| 17 | + const octalReg = /^[0-7]+$/; | ||
| 18 | + const modeDesc = 'must be a 32-bit unsigned integer or an octal string'; | ||
| 19 | + // Validator for mode_t (the S_* constants). Valid numbers or octal strings | ||
| 20 | + // will be masked with 0o777 to be consistent with the behavior in POSIX APIs. | ||
| 21 | + function validateAndMaskMode(value, name, def) { | ||
| 22 | + if (isUint32(value)) { | ||
| 23 | + return value & 0o777; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + if (typeof value === 'number') { | ||
| 27 | + if (!Number.isInteger(value)) { | ||
| 28 | + throw new ERR_OUT_OF_RANGE(name, 'an integer', value); | ||
| 29 | + } else { | ||
| 30 | + // 2 ** 32 === 4294967296 | ||
| 31 | + throw new ERR_OUT_OF_RANGE(name, '>= 0 && < 4294967296', value); | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + if (typeof value === 'string') { | ||
| 36 | + if (!octalReg.test(value)) { | ||
| 37 | + throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc); | ||
| 38 | + } | ||
| 39 | + const parsed = parseInt(value, 8); | ||
| 40 | + return parsed & 0o777; | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + // TODO(BridgeAR): Only return `def` in case `value == null` | ||
| 44 | + if (def !== undefined) { | ||
| 45 | + return def; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc); | ||
| 49 | + } | ||
| 50 | + | ||
| 16 | 51 | function validateInteger(value, name) { | |
| 17 | 52 | let err; | |
| 18 | 53 | ||
@@ -67,6 +102,7 @@ function validateUint32(value, name, positive) { | |||
| 67 | 102 | module.exports = { | |
| 68 | 103 | isInt32, | |
| 69 | 104 | isUint32, | |
| 105 | + validateAndMaskMode, | ||
| 70 | 106 | validateInteger, | |
| 71 | 107 | validateInt32, | |
| 72 | 108 | validateUint32 | |
| Back | FazBrowse Home | New Git URL |
0 commit comments