Index: Lib/ctypes/test/test_parameters.py =================================================================== --- Lib/ctypes/test/test_parameters.py (revision 74272) +++ Lib/ctypes/test/test_parameters.py (working copy) @@ -97,7 +97,7 @@ self.assertEqual(x.contents.value, 42) self.assertEqual(LPINT(c_int(42)).contents.value, 42) - self.assertEqual(LPINT.from_param(None), 0) + self.assertEqual(LPINT.from_param(None), None) if c_int != c_long: self.assertRaises(TypeError, LPINT.from_param, pointer(c_long(42))) Index: Modules/_ctypes/_ctypes.c =================================================================== --- Modules/_ctypes/_ctypes.c (revision 74272) +++ Modules/_ctypes/_ctypes.c (working copy) @@ -972,8 +972,11 @@ { StgDictObject *typedict; - if (value == Py_None) - return PyInt_FromLong(0); /* NULL pointer */ + if (value == Py_None) { + /* ConvParam will convert to a NULL pointer later */ + Py_INCREF(value); + return value; + } typedict = PyType_stgdict(type); assert(typedict); /* Cannot be NULL for pointer types */ Index: Modules/_ctypes/callproc.c =================================================================== --- Modules/_ctypes/callproc.c (revision 74272) +++ Modules/_ctypes/callproc.c (working copy) @@ -542,6 +542,7 @@ * C function call. * * 1. Python integers are converted to C int and passed by value. + * Py_None is converted to a C NULL pointer. * * 2. 3-tuples are expected to have a format character in the first * item, which must be 'i', 'f', 'd', 'q', or 'P'.