mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Avoid stack overflow due to unbounded recursion in safe_walk
This commit is contained in:
parent
e6657d999a
commit
513f9a3a30
@ -34,8 +34,10 @@ def debug_print(*args):
|
|||||||
prints('DEBUG: %6.1f'%(time.time()-BASE_TIME), *args)
|
prints('DEBUG: %6.1f'%(time.time()-BASE_TIME), *args)
|
||||||
|
|
||||||
|
|
||||||
def safe_walk(top, topdown=True, onerror=None, followlinks=False):
|
def safe_walk(top, topdown=True, onerror=None, followlinks=False, maxdepth=128):
|
||||||
' A replacement for os.walk that does not die when it encounters undecodeable filenames in a linux filesystem'
|
' A replacement for os.walk that does not die when it encounters undecodeable filenames in a linux filesystem'
|
||||||
|
if maxdepth < 0:
|
||||||
|
return
|
||||||
islink, join, isdir = os.path.islink, os.path.join, os.path.isdir
|
islink, join, isdir = os.path.islink, os.path.join, os.path.isdir
|
||||||
|
|
||||||
# We may not have read permission for top, in which case we can't
|
# We may not have read permission for top, in which case we can't
|
||||||
@ -45,7 +47,7 @@ def safe_walk(top, topdown=True, onerror=None, followlinks=False):
|
|||||||
# left to visit. That logic is copied here.
|
# left to visit. That logic is copied here.
|
||||||
try:
|
try:
|
||||||
names = os.listdir(top)
|
names = os.listdir(top)
|
||||||
except os.error as err:
|
except OSError as err:
|
||||||
if onerror is not None:
|
if onerror is not None:
|
||||||
onerror(err)
|
onerror(err)
|
||||||
return
|
return
|
||||||
@ -68,7 +70,7 @@ def safe_walk(top, topdown=True, onerror=None, followlinks=False):
|
|||||||
for name in dirs:
|
for name in dirs:
|
||||||
new_path = join(top, name)
|
new_path = join(top, name)
|
||||||
if followlinks or not islink(new_path):
|
if followlinks or not islink(new_path):
|
||||||
for x in safe_walk(new_path, topdown, onerror, followlinks):
|
for x in safe_walk(new_path, topdown, onerror, followlinks, maxdepth-1):
|
||||||
yield x
|
yield x
|
||||||
if not topdown:
|
if not topdown:
|
||||||
yield top, dirs, nondirs
|
yield top, dirs, nondirs
|
||||||
|
Loading…
x
Reference in New Issue
Block a user