Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Lib/test/test_os.py
Original file line number Diff line number Diff line change
Expand Up @@ -3957,6 +3957,11 @@ async def test_invalid_offset(self):
await self.async_sendfile(self.sockno, self.fileno, -1, 4096)
self.assertEqual(cm.exception.errno, errno.EINVAL)

async def test_invalid_count(self):
with self.assertRaises(ValueError, msg="count cannot be negative"):
await self.sendfile_wrapper(self.sockno, self.fileno, offset=0,
count=-1)

async def test_keywords(self):
# Keyword arguments should be supported
await self.async_sendfile(out_fd=self.sockno, in_fd=self.fileno,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add missing validation of argument ``count`` in ``os.sendfile`` to be
non-negative.
12 changes: 11 additions & 1 deletion Modules/clinic/posixmodule.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 14 additions & 4 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -11874,7 +11874,7 @@ os.sendfile
out_fd: int
in_fd: int
offset: Py_off_t
count: Py_ssize_t
count: Py_ssize_t(allow_negative=False)
headers: object(c_default="NULL") = ()
trailers: object(c_default="NULL") = ()
flags: int = 0
Expand All @@ -11886,28 +11886,38 @@ static PyObject *
os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset,
Py_ssize_t count, PyObject *headers, PyObject *trailers,
int flags)
/*[clinic end generated code: output=329ea009bdd55afc input=338adb8ff84ae8cd]*/
/*[clinic end generated code: output=329ea009bdd55afc input=dcb026b94effa922]*/
#else
/*[clinic input]
os.sendfile

out_fd: int
in_fd: int
offset as offobj: object
count: Py_ssize_t
count: Py_ssize_t(allow_negative=False)

Copy count bytes from file descriptor in_fd to file descriptor out_fd.
[clinic start generated code]*/

static PyObject *
os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj,
Py_ssize_t count)
/*[clinic end generated code: output=ae81216e40f167d8 input=76d64058c74477ba]*/
/*[clinic end generated code: output=ae81216e40f167d8 input=424df0949059ea5b]*/
#endif
{
Py_ssize_t ret;
int async_err = 0;

#ifdef __APPLE__
if(sbytes < 0) {
PyErr_SetString(PyExc_ValueError,
"count cannot be negative");
return NULL;
}
#else
assert(count >= 0);
#endif

#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__)
#ifndef __APPLE__
off_t sbytes;
Expand Down
Loading