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

sendfile for sockets neglects pseudo files on Linux #93300

Closed
illia-v opened this issue May 27, 2022 · 3 comments
Closed

sendfile for sockets neglects pseudo files on Linux #93300

illia-v opened this issue May 27, 2022 · 3 comments
Labels
type-bug An unexpected behavior, bug, or error

Comments

@illia-v
Copy link
Contributor

illia-v commented May 27, 2022

Bug report

socket.socket.sendfile and asyncio.base_events.BaseEventLoop.sock_sendfile rely on st_size to determine an amount of bytes to be sent if count is not provided.

But st_size is equal to zero for pseudo files like /proc/cpuinfo on Linux. Therefore, the methods send no data for such files.

Related code

cpython/Lib/socket.py

Lines 355 to 360 in a637c09

try:
fsize = os.fstat(fileno).st_size
except OSError as err:
raise _GiveupOnSendfile(err) # not a regular file
if not fsize:
return 0 # empty file

try:
fsize = os.fstat(fileno).st_size
except OSError:
raise exceptions.SendfileNotAvailableError("not a regular file")
blocksize = count if count else fsize
if not blocksize:
return 0 # empty file

Example

Assuming nc -lkU some.sock and ./python -m asyncio run in the same directory:

>>> import asyncio
>>> import socket
>>> sock = socket.socket(socket.AF_UNIX)
>>> loop = asyncio.get_running_loop()
>>> await loop.sock_connect(sock, "./some.sock")
>>> with open("/proc/cpuinfo", "rb") as cpuinfo_file:
...     os.fstat(cpuinfo_file.fileno()).st_size
...     await loop.sock_sendfile(sock, cpuinfo_file)
...     sock.sendfile(cpuinfo_file)
...     len(cpuinfo_file.read())
... 
0
0
0
18294
@illia-v illia-v added the type-bug An unexpected behavior, bug, or error label May 27, 2022
@kumaraditya303
Copy link
Contributor

Do you have any fix for this or idea of how this could be fixed? Also are there any use-case of sending pseudo files through sendfile ?

@illia-v
Copy link
Contributor Author

illia-v commented Jun 17, 2022

@kumaraditya303 I do not have any use case, and I have not looked for fixing options.

I was exploring peculiarities of using the copy_file_range syscall for a pseudo file, and checked if a similar issue related to pseudo files exists in Python. That is how I found this issue.

@kumaraditya303
Copy link
Contributor

I don't think this is a bug and there is nothing actionable here so closing. However, this can be reopened if required.

@kumaraditya303 kumaraditya303 closed this as not planned Won't fix, can't repro, duplicate, stale Jun 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

2 participants