]> granicus.if.org Git - python/commitdiff
socketmodule.c: error if option larger than INT_MAX
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 23 Mar 2016 20:35:29 +0000 (21:35 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 23 Mar 2016 20:35:29 +0000 (21:35 +0100)
On Windows, socket.setsockopt() raises an OverflowError if the socket option is
larger than INT_MAX bytes.

Modules/socketmodule.c

index ba3cefd177ac37810ad1818001cd1ee9eca6c02a..8df735d2044a12f97bfc852de760eb99fbe718cd 100644 (file)
@@ -2458,13 +2458,26 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args)
         if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
                               &level, &optname, &optval))
             return NULL;
+#ifdef MS_WINDOWS
+        if (optval.len > INT_MAX) {
+            PyBuffer_Release(&optval);
+            PyErr_Format(PyExc_OverflowError,
+                         "socket option is larger than %i bytes",
+                         INT_MAX);
+            return NULL;
+        }
+        res = setsockopt(s->sock_fd, level, optname,
+                         optval.buf, (int)optval.len);
+#else
         res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
+#endif
         PyBuffer_Release(&optval);
     }
-    if (res < 0)
+    if (res < 0) {
         return s->errorhandler();
-    Py_INCREF(Py_None);
-    return Py_None;
+    }
+
+    Py_RETURN_NONE;
 }
 
 PyDoc_STRVAR(setsockopt_doc,