Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

os.makedirs fails on long-path UNC-paths if it is the first sub-folder #85871

Open
Safihre mannequin opened this issue Sep 3, 2020 · 4 comments
Open

os.makedirs fails on long-path UNC-paths if it is the first sub-folder #85871

Safihre mannequin opened this issue Sep 3, 2020 · 4 comments
Labels
OS-windows pending The issue will be closed if no feedback is provided stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error

Comments

@Safihre
Copy link
Mannequin

Safihre mannequin commented Sep 3, 2020

BPO 41705
Nosy @pfmoore, @tjguk, @zware, @eryksun, @zooba, @Safihre

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2020-09-03.19:28:37.918>
labels = ['type-bug', '3.8', 'OS-windows']
title = 'os.makedirs fails on long-path UNC-paths if it is the first sub-folder'
updated_at = <Date 2020-09-03.22:01:32.759>
user = 'https://github.com/Safihre'

bugs.python.org fields:

activity = <Date 2020-09-03.22:01:32.759>
actor = 'eryksun'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Windows']
creation = <Date 2020-09-03.19:28:37.918>
creator = 'Safihre'
dependencies = []
files = []
hgrepos = []
issue_num = 41705
keywords = []
message_count = 2.0
messages = ['376312', '376326']
nosy_count = 6.0
nosy_names = ['paul.moore', 'tim.golden', 'zach.ware', 'eryksun', 'steve.dower', 'Safihre']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue41705'
versions = ['Python 3.8']

@Safihre
Copy link
Mannequin Author

Safihre mannequin commented Sep 3, 2020

It consistently fails on the first directory in a long-path UNC notation server-folder.

>>> os.makedirs(r"\\?\UNC\DiskStation\already_exists", exist_ok=True)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 213, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 213, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 223, in makedirs
    mkdir(name, mode)
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '\\\\?\\UNC\\'

>>> os.makedirs(r"\\?\UNC\DiskStation\already_exists")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 213, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 213, in makedirs
    makedirs(head, exist_ok=exist_ok)
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 223, in makedirs
    mkdir(name, mode)
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '\\\\?\\UNC\\'

The second level directory is working correctly as expected:

>> os.makedirs(r"\\?\UNC\DiskStation\already_exists\new")

>>> os.makedirs(r"\\?\UNC\DiskStation\already_exists\new")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\safihre\AppData\Local\Programs\Python\Python38\lib\os.py", line 223, in makedirs
    mkdir(name, mode)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: '\\\\?\\UNC\\DiskStation\\test_get2\\test2'

Inspecting the code, I think the problem is in the os.path.exists function that is called from within os.makedirs, the line in os.makedirs says:
if head and tail and not path.exists(head):

But:
>>> head, tail = path.split(r"\\?\UNC\DiskStation\already_exists")
('\\\\?\\UNC\\DiskStation', 'already_exists')

>>> os.path.exists(r'\\?\UNC\DiskStation')
False
>>> os.path.exists(r'\\DiskStation')
False

So it wrongly goes ahead and tries to create \\?\UNC\DiskStation

@Safihre Safihre mannequin added 3.8 (EOL) end of life OS-windows type-crash A hard crash of the interpreter, possibly with a core dump labels Sep 3, 2020
@Safihre Safihre mannequin changed the title os.makedirs fails long-path UNC-paths if it is the first sub-folder os.makedirs fails on long-path UNC-paths if it is the first sub-folder Sep 3, 2020
@Safihre Safihre mannequin added the type-crash A hard crash of the interpreter, possibly with a core dump label Sep 3, 2020
@Safihre Safihre mannequin changed the title os.makedirs fails long-path UNC-paths if it is the first sub-folder os.makedirs fails on long-path UNC-paths if it is the first sub-folder Sep 3, 2020
@eryksun
Copy link
Contributor

eryksun commented Sep 3, 2020

This behavior is due to bpo-37609, i.e. ntpath.splitdrive fails for "UNC" device paths.

    >>> ntpath.splitdrive('//?/UNC/server/share')
    ('//?/UNC', '/server/share')

The result should be "//?/UNC/server/share". A path on the "UNC" device requires a share component, on which is mounted a local or remote filesystem directory. It's functionally part of the 'drive' path. Using just the root path or a server path on the "UNC" device is malformed in the context of a normal file API open. The former fails as ERROR_INVALID_NAME (123), and the latter fails as ERROR_BAD_PATHNAME (161).

The incorrect splitdrive result in turn makes ntpath.split misbehave:

    >>> ntpath.split('//?/UNC/server/share')
    ('//?/UNC/server', 'share')
    >>> ntpath.split('//?/UNC/server')
    ('//?/UNC/', 'server')

The correct result should be ('//?/UNC/server/share', '').

@eryksun eryksun added type-bug An unexpected behavior, bug, or error and removed type-crash A hard crash of the interpreter, possibly with a core dump labels Sep 3, 2020
@ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
@Safihre
Copy link

Safihre commented Jun 11, 2022

@barneygale can you confirm if this is also resolved with your patch? The source of the problem is indicated by @eryksun to be in splitdrive.
#85871 (comment)

@iritkatriel iritkatriel added the stdlib Python modules in the Lib dir label Nov 29, 2023
@picnixz
Copy link
Member

picnixz commented Dec 3, 2024

@barneygale friendly ping for confirmation (otherwise, we can close this issue)

@picnixz picnixz added pending The issue will be closed if no feedback is provided and removed 3.8 (EOL) end of life labels Dec 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
OS-windows pending The issue will be closed if no feedback is provided stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

4 participants