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,
--- /dev/null
+Add missing validation of argument ``count`` in :func:`os.sendfile` to be
+non-negative.
goto exit;
}
count = ival;
+ if (count < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "count cannot be negative");
+ goto exit;
+ }
}
if (!noptargs) {
goto skip_optional_pos;
goto exit;
}
count = ival;
+ if (count < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "count cannot be negative");
+ goto exit;
+ }
}
return_value = os_sendfile_impl(module, out_fd, in_fd, offobj, count);
#ifndef OS__EMSCRIPTEN_LOG_METHODDEF
#define OS__EMSCRIPTEN_LOG_METHODDEF
#endif /* !defined(OS__EMSCRIPTEN_LOG_METHODDEF) */
-/*[clinic end generated code: output=77c20b53c34ccae4 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=92662828d49f5d88 input=a9049054013a1b77]*/
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
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;