From a6b5c54d053f10245f5a815045ac36a0365956f1 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 19 Oct 2019 19:59:59 +0100 Subject: [PATCH] util.c: Augment `convu64' to collect its argument via `kludge64'. Otherwise integers too large for `unsigned long' get rejected with an error, even though they ought to be acceptable as a `uint64'. --- util.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/util.c b/util.c index 7118bfb..cfd4115 100644 --- 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); \ -- 2.11.0