+
+/*
+ * Confirm the signed python integer fits in the C type
+ * correctly. It is subtly different from the unsigned case
+ * above, so while it looks like a duplicate, it is not
+ * actually a duplicate.
+ */
+static inline long long ndr_PyLong_AsCheckedLongLong(PyObject *py_value,
+ size_t target_size)
+{
+ const long long int_max = ndr_sizeof2intmax(target_size);
+ const long long int_min = -int_max - 1;
+ long long ret_value;
+
+ if (PyLong_Check(py_value)) {
+ long long test_var;
+
+ test_var = PyLong_AsLongLong(py_value);
+ if (PyErr_Occurred() != NULL) {
+ return 0;
+ }
+
+ if (test_var < int_min || test_var > int_max) {
+ PyErr_Format(PyExc_OverflowError,
+ \"Expected type %s or %s within range %lld - %lld, got %lld\",
+ PyInt_Type.tp_name, PyLong_Type.tp_name, int_min, int_max, test_var);
+ return 0;
+ }
+
+ ret_value = test_var;
+
+ return ret_value;
+ }
+
+ if (PyInt_Check(py_value)) {
+ long test_var;
+
+ test_var = PyInt_AsLong(py_value);
+ if (test_var < int_min || test_var > int_max) {
+ PyErr_Format(PyExc_OverflowError,
+ \"Expected type %s or %s within range %lld - %lld, got %ld\",
+ PyInt_Type.tp_name, PyLong_Type.tp_name, int_min, int_max, test_var);
+ return 0;
+ }
+
+ ret_value = test_var;
+
+ return ret_value;
+ }
+
+ PyErr_Format(PyExc_TypeError,
+ \"Expected type %s or %s within range %lld - %lld\",
+ PyInt_Type.tp_name, PyLong_Type.tp_name, int_min, int_max);
+ return 0;
+}
+