@@ -11,10 +11,10 @@ function assertPath(path) {
1111// Resolves . and .. elements in a path with directory names
1212function normalizeStringWin32 ( path , allowAboveRoot ) {
1313 var res = '' ;
14+ var lastSegmentLength = 0 ;
1415 var lastSlash = - 1 ;
1516 var dots = 0 ;
1617 var code ;
17- var isAboveRoot = false ;
1818 for ( var i = 0 ; i <= path . length ; ++ i ) {
1919 if ( i < path . length )
2020 code = path . charCodeAt ( i ) ;
@@ -26,7 +26,7 @@ function normalizeStringWin32(path, allowAboveRoot) {
2626 if ( lastSlash === i - 1 || dots === 1 ) {
2727 // NOOP
2828 } else if ( lastSlash !== i - 1 && dots === 2 ) {
29- if ( res . length < 2 || ! isAboveRoot ||
29+ if ( res . length < 2 || lastSegmentLength !== 2 ||
3030 res . charCodeAt ( res . length - 1 ) !== 46 /*.*/ ||
3131 res . charCodeAt ( res . length - 2 ) !== 46 /*.*/ ) {
3232 if ( res . length > 2 ) {
@@ -37,20 +37,22 @@ function normalizeStringWin32(path, allowAboveRoot) {
3737 break ;
3838 }
3939 if ( j !== start ) {
40- if ( j === - 1 )
40+ if ( j === - 1 ) {
4141 res = '' ;
42- else
42+ lastSegmentLength = 0 ;
43+ } else {
4344 res = res . slice ( 0 , j ) ;
45+ lastSegmentLength = j ;
46+ }
4447 lastSlash = i ;
4548 dots = 0 ;
46- isAboveRoot = false ;
4749 continue ;
4850 }
4951 } else if ( res . length === 2 || res . length === 1 ) {
5052 res = '' ;
53+ lastSegmentLength = 0 ;
5154 lastSlash = i ;
5255 dots = 0 ;
53- isAboveRoot = false ;
5456 continue ;
5557 }
5658 }
@@ -59,14 +61,14 @@ function normalizeStringWin32(path, allowAboveRoot) {
5961 res += '\\..' ;
6062 else
6163 res = '..' ;
62- isAboveRoot = true ;
64+ lastSegmentLength = 2 ;
6365 }
6466 } else {
6567 if ( res . length > 0 )
6668 res += '\\' + path . slice ( lastSlash + 1 , i ) ;
6769 else
6870 res = path . slice ( lastSlash + 1 , i ) ;
69- isAboveRoot = false ;
71+ lastSegmentLength = i - lastSlash - 1 ;
7072 }
7173 lastSlash = i ;
7274 dots = 0 ;
@@ -82,10 +84,10 @@ function normalizeStringWin32(path, allowAboveRoot) {
8284// Resolves . and .. elements in a path with directory names
8385function normalizeStringPosix ( path , allowAboveRoot ) {
8486 var res = '' ;
87+ var lastSegmentLength = 0 ;
8588 var lastSlash = - 1 ;
8689 var dots = 0 ;
8790 var code ;
88- var isAboveRoot = false ;
8991 for ( var i = 0 ; i <= path . length ; ++ i ) {
9092 if ( i < path . length )
9193 code = path . charCodeAt ( i ) ;
@@ -97,7 +99,7 @@ function normalizeStringPosix(path, allowAboveRoot) {
9799 if ( lastSlash === i - 1 || dots === 1 ) {
98100 // NOOP
99101 } else if ( lastSlash !== i - 1 && dots === 2 ) {
100- if ( res . length < 2 || ! isAboveRoot ||
102+ if ( res . length < 2 || lastSegmentLength !== 2 ||
101103 res . charCodeAt ( res . length - 1 ) !== 46 /*.*/ ||
102104 res . charCodeAt ( res . length - 2 ) !== 46 /*.*/ ) {
103105 if ( res . length > 2 ) {
@@ -108,20 +110,22 @@ function normalizeStringPosix(path, allowAboveRoot) {
108110 break ;
109111 }
110112 if ( j !== start ) {
111- if ( j === - 1 )
113+ if ( j === - 1 ) {
112114 res = '' ;
113- else
115+ lastSegmentLength = 0 ;
116+ } else {
114117 res = res . slice ( 0 , j ) ;
118+ lastSegmentLength = j ;
119+ }
115120 lastSlash = i ;
116121 dots = 0 ;
117- isAboveRoot = false ;
118122 continue ;
119123 }
120124 } else if ( res . length === 2 || res . length === 1 ) {
121125 res = '' ;
126+ lastSegmentLength = 0 ;
122127 lastSlash = i ;
123128 dots = 0 ;
124- isAboveRoot = false ;
125129 continue ;
126130 }
127131 }
@@ -130,14 +134,14 @@ function normalizeStringPosix(path, allowAboveRoot) {
130134 res += '/..' ;
131135 else
132136 res = '..' ;
133- isAboveRoot = true ;
137+ lastSegmentLength = 2 ;
134138 }
135139 } else {
136140 if ( res . length > 0 )
137141 res += '/' + path . slice ( lastSlash + 1 , i ) ;
138142 else
139143 res = path . slice ( lastSlash + 1 , i ) ;
140- isAboveRoot = false ;
144+ lastSegmentLength = i - lastSlash - 1 ;
141145 }
142146 lastSlash = i ;
143147 dots = 0 ;
0 commit comments