Set retval on PyOS_string_to_double failure.
diff --git a/Python/marshal.c b/Python/marshal.c
index 865a0c8..c7015d2 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -699,8 +699,10 @@
 			}
 			buf[n] = '\0';
 			dx = PyOS_string_to_double(buf, NULL, NULL);
-			if (dx == -1.0 && PyErr_Occurred())
+			if (dx == -1.0 && PyErr_Occurred()) {
+				retval = NULL;
 				break;
+			}
 			retval = PyFloat_FromDouble(dx);
 			break;
 		}
@@ -738,8 +740,10 @@
 			}
 			buf[n] = '\0';
 			c.real = PyOS_string_to_double(buf, NULL, NULL);
-			if (c.real == -1.0 && PyErr_Occurred())
+			if (c.real == -1.0 && PyErr_Occurred()) {
+				retval = NULL;
 				break;
+			}
 			n = r_byte(p);
 			if (n == EOF || r_string(buf, (int)n, p) != n) {
 				PyErr_SetString(PyExc_EOFError,
@@ -749,8 +753,10 @@
 			}
 			buf[n] = '\0';
 			c.imag = PyOS_string_to_double(buf, NULL, NULL);
-			if (c.imag == -1.0 && PyErr_Occurred())
+			if (c.imag == -1.0 && PyErr_Occurred()) {
+				retval = NULL;
 				break;
+			}
 			retval = PyComplex_FromCComplex(c);
 			break;
 		}