util.c: Augment `convu64' to collect its argument via `kludge64'.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 19 Oct 2019 18:59:59 +0000 (19:59 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 17 Nov 2019 01:41:01 +0000 (01:41 +0000)
Otherwise integers too large for `unsigned long' get rejected with an
error, even though they ought to be acceptable as a `uint64'.

util.c

diff --git a/util.c b/util.c
index 7118bfb..cfd4115 100644 (file)
--- a/util.c
+++ b/util.c
@@ -99,15 +99,32 @@ end:
   return (0);
 }
 
+#ifdef HAVE_UINT64
+#  define CONVu64(n) do {                                              \
+     kludge64 k;                                                       \
+     uint64 t;                                                         \
+     if (!convk64(o, &k)) goto end;                                    \
+     t = GET64(uint64, k);                                             \
+     if (t > MASK##n) VALERR("out of range");                          \
+     *p = t;                                                           \
+   } while (0)
+#else
+#  define CONVu64(n) assert(!"shouldn't be possible")
+#endif
+
 #define CONVU_(n)                                                      \
   int convu##n(PyObject *o, void *pp)                                  \
   {                                                                    \
     unsigned long u;                                                   \
     uint##n *p = pp;                                                   \
                                                                        \
-    if (!convulong(o, &u)) goto end;                                   \
-    if (u > MASK##n) VALERR("out of range");                           \
-    *p = u;                                                            \
+    if (MASK##n > ULONG_MAX)                                           \
+      CONVu64(n);                                                      \
+    else {                                                             \
+      if (!convulong(o, &u)) goto end;                                 \
+      if (u > MASK##n) VALERR("out of range");                         \
+      *p = u;                                                          \
+    }                                                                  \
     return (1);                                                                \
   end:                                                                 \
     return (0);                                                                \