@@ -295,21 +295,28 @@ exports.extract = function (cwd, opts) {
295295 } , stat )
296296 }
297297
298- mkdirfix ( path . dirname ( name ) , {
299- fs : xfs , own : own , uid : header . uid , gid : header . gid
300- } , function ( err ) {
298+ var dir = path . dirname ( name )
299+
300+ validate ( xfs , dir , path . join ( cwd , '.' ) , function ( err , valid ) {
301301 if ( err ) return next ( err )
302+ if ( ! valid ) return next ( new Error ( dir + ' is not a valid path' ) )
302303
303- switch ( header . type ) {
304- case 'file' : return onfile ( )
305- case 'link' : return onlink ( )
306- case 'symlink' : return onsymlink ( )
307- }
304+ mkdirfix ( dir , {
305+ fs : xfs , own : own , uid : header . uid , gid : header . gid
306+ } , function ( err ) {
307+ if ( err ) return next ( err )
308308
309- if ( strict ) return next ( new Error ( 'unsupported type for ' + name + ' (' + header . type + ')' ) )
309+ switch ( header . type ) {
310+ case 'file' : return onfile ( )
311+ case 'link' : return onlink ( )
312+ case 'symlink' : return onsymlink ( )
313+ }
310314
311- stream . resume ( )
312- next ( )
315+ if ( strict ) return next ( new Error ( 'unsupported type for ' + name + ' (' + header . type + ')' ) )
316+
317+ stream . resume ( )
318+ next ( )
319+ } )
313320 } )
314321 } )
315322
@@ -318,6 +325,15 @@ exports.extract = function (cwd, opts) {
318325 return extract
319326}
320327
328+ function validate ( fs , name , root , cb ) {
329+ if ( name === root ) return cb ( null , true )
330+ fs . lstat ( name , function ( err , st ) {
331+ if ( err && err . code !== 'ENOENT' ) return cb ( err )
332+ if ( err || st . isDirectory ( ) ) return validate ( fs , path . join ( name , '..' ) , root , cb )
333+ cb ( null , false )
334+ } )
335+ }
336+
321337function mkdirfix ( name , opts , cb ) {
322338 mkdirp ( name , { fs : opts . xfs } , function ( err , made ) {
323339 if ( ! err && made && opts . own ) {
0 commit comments