pxnpm 4.1.2 → 4.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,6 +48,7 @@ const crypto = require('crypto')
48
48
  const getFlag = require('./get-write-flag.js')
49
49
  const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
50
50
  const isWindows = platform === 'win32'
51
+ const DEFAULT_MAX_DEPTH = 1024
51
52
 
52
53
  // Unlinks on Windows are not atomic.
53
54
  //
@@ -181,6 +182,12 @@ class Unpack extends Parser {
181
182
  this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ?
182
183
  process.getgid() : null
183
184
 
185
+ // prevent excessively deep nesting of subfolders
186
+ // set to `Infinity` to remove this restriction
187
+ this.maxDepth = typeof opt.maxDepth === 'number'
188
+ ? opt.maxDepth
189
+ : DEFAULT_MAX_DEPTH
190
+
184
191
  // mostly just for testing, but useful in some cases.
185
192
  // Forcibly trigger a chown on every entry, no matter what
186
193
  this.forceChown = opt.forceChown === true
@@ -238,13 +245,13 @@ class Unpack extends Parser {
238
245
  }
239
246
 
240
247
  [CHECKPATH] (entry) {
248
+ const p = normPath(entry.path)
249
+ const parts = p.split('/')
250
+
241
251
  if (this.strip) {
242
- const parts = normPath(entry.path).split('/')
243
252
  if (parts.length < this.strip) {
244
253
  return false
245
254
  }
246
- entry.path = parts.slice(this.strip).join('/')
247
-
248
255
  if (entry.type === 'Link') {
249
256
  const linkparts = normPath(entry.linkpath).split('/')
250
257
  if (linkparts.length >= this.strip) {
@@ -253,11 +260,21 @@ class Unpack extends Parser {
253
260
  return false
254
261
  }
255
262
  }
263
+ parts.splice(0, this.strip)
264
+ entry.path = parts.join('/')
265
+ }
266
+
267
+ if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {
268
+ this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {
269
+ entry,
270
+ path: p,
271
+ depth: parts.length,
272
+ maxDepth: this.maxDepth,
273
+ })
274
+ return false
256
275
  }
257
276
 
258
277
  if (!this.preservePaths) {
259
- const p = normPath(entry.path)
260
- const parts = p.split('/')
261
278
  if (parts.includes('..') || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) {
262
279
  this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
263
280
  entry,
@@ -2,7 +2,7 @@
2
2
  "author": "GitHub Inc.",
3
3
  "name": "tar",
4
4
  "description": "tar for node",
5
- "version": "6.2.0",
5
+ "version": "6.2.1",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/isaacs/node-tar.git"