@@ -130,30 +130,24 @@ def _validate_member(
130130
131131 target_path = self ._get_safe_path (member , extract_path )
132132
133- # Check for path traversal
133+ # Check for path traversal using Path.relative_to()
134134 try :
135135 target_abs = target_path .resolve ()
136136 extract_abs = extract_path .resolve ()
137- if os .path .commonpath ([str (target_abs ), str (extract_abs )]) != str (extract_abs ):
138- raise UnsafeTarError (
139- f"Path traversal detected: { member .name } -> { target_path } "
140- )
141- except (OSError , RuntimeError ):
142- target_str = str (target_path .absolute ())
143- extract_str = str (extract_path .absolute ())
144- try :
145- if os .path .commonpath ([target_str , extract_str ]) != extract_str :
146- raise UnsafeTarError (
147- f"Path traversal detected: { member .name } -> { target_path } "
148- )
149- except ValueError :
150- raise UnsafeTarError (
151- f"Path traversal detected (different drives): { member .name } -> { target_path } "
152- )
153- except ValueError :
154- # os.path.commonpath raises ValueError on Windows for different drives
137+ target_abs .relative_to (extract_abs )
138+ except (ValueError , OSError , RuntimeError ):
155139 raise UnsafeTarError (
156- f"Path traversal detected (different drives): { member .name } -> { target_path } "
140+ f"Path traversal detected: { member .name } -> { target_path } "
141+ )
142+
143+ if target_path .exists () and not overwrite :
144+ raise UnsafeTarError (
145+ f"File already exists and overwrite=False: { target_path } "
146+ )
147+
148+ if member .type in self .blocked_types :
149+ raise UnsafeTarError (
150+ f"Blocked file type for { member .name } : { member .type } "
157151 )
158152
159153 if target_path .exists () and not overwrite :
0 commit comments