@@ -174,60 +174,46 @@ FS.staticInit();
174
174
path = PATH_FS . resolve ( path ) ;
175
175
176
176
if ( ! path ) return { path : '' , node : null } ;
177
+ opts . follow_mount ??= true
177
178
178
- var defaults = {
179
- follow_mount : true ,
180
- recurse_count : 0
181
- } ;
182
- opts = Object . assign ( defaults , opts )
183
-
184
- if ( opts . recurse_count > 8 ) { // max recursive lookup of 8
185
- throw new FS . ErrnoError ( { { { cDefs. ELOOP } } } ) ;
186
- }
179
+ // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
180
+ linkloop : for ( var nlinks = 0 ; nlinks < 40 ; nlinks ++ ) {
181
+ // split the absolute path
182
+ var parts = path . split ( '/' ) . filter ( ( p ) => ! ! p ) ;
187
183
188
- // split the absolute path
189
- var parts = path . split ( '/' ) . filter ( ( p ) => ! ! p ) ;
184
+ // start at the root
185
+ var current = FS . root ;
186
+ var current_path = '/' ;
190
187
191
- // start at the root
192
- var current = FS . root ;
193
- var current_path = '/' ;
194
-
195
- for ( var i = 0 ; i < parts . length ; i ++ ) {
196
- var islast = ( i === parts . length - 1 ) ;
197
- if ( islast && opts . parent ) {
198
- // stop resolving
199
- break;
200
- }
188
+ for ( var i = 0 ; i < parts . length ; i ++ ) {
189
+ var islast = ( i === parts . length - 1 ) ;
190
+ if ( islast && opts . parent ) {
191
+ // stop resolving
192
+ break;
193
+ }
201
194
202
- current = FS . lookupNode ( current , parts [ i ] ) ;
203
- current_path = PATH . join2 ( current_path , parts [ i ] ) ;
195
+ current = FS . lookupNode ( current , parts [ i ] ) ;
196
+ current_path = PATH . join2 ( current_path , parts [ i ] ) ;
204
197
205
- // jump to the mount's root node if this is a mountpoint
206
- if ( FS . isMountpoint ( current ) ) {
207
- if ( ! islast || ( islast && opts . follow_mount ) ) {
198
+ // jump to the mount's root node if this is a mountpoint
199
+ if ( FS . isMountpoint ( current ) && ( ! islast || opts . follow_mount ) ) {
208
200
current = current . mounted . root ;
209
201
}
210
- }
211
-
212
- // by default, lookupPath will not follow a symlink if it is the final path component.
213
- // setting opts.follow = true will override this behavior.
214
- if ( ! islast || opts . follow ) {
215
- var count = 0 ;
216
- while ( FS . isLink ( current . mode ) ) {
217
- var link = FS . readlink ( current_path ) ;
218
- current_path = PATH_FS . resolve ( PATH . dirname ( current_path ) , link ) ;
219
202
220
- var lookup = FS . lookupPath ( current_path , { recurse_count : opts . recurse_count + 1 } ) ;
221
- current = lookup . node ;
222
-
223
- if ( count ++ > 40 ) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX).
224
- throw new FS . ErrnoError ( { { { cDefs. ELOOP } } } ) ;
203
+ // by default, lookupPath will not follow a symlink if it is the final path component.
204
+ // setting opts.follow = true will override this behavior.
205
+ if ( FS . isLink ( current . mode ) && ( ! islast || opts . follow ) ) {
206
+ if ( ! current . node_ops . readlink ) {
207
+ throw new FS . ErrnoError ( { { { cDefs . ENOSYS } } } ) ;
225
208
}
209
+ var link = current . node_ops . readlink ( current ) ;
210
+ path = PATH_FS . resolve ( PATH . dirname ( current_path ) , link , ...parts . slice ( i + 1 ) ) ;
211
+ continue linkloop ;
226
212
}
227
213
}
214
+ return { path : current_path , node : current } ;
228
215
}
229
-
230
- return { path : current_path , node : current } ;
216
+ throw new FS . ErrnoError ( { { { cDefs. ELOOP } } } ) ;
231
217
} ,
232
218
getPath ( node ) {
233
219
var path ;
0 commit comments