From: Mark Wooding Date: Sat, 19 Oct 2019 18:59:59 +0000 (+0100) Subject: util.c: Augment `convu64' to collect its argument via `kludge64'. X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/commitdiff_plain/a6b5c54d053f10245f5a815045ac36a0365956f1?hp=aa53a95ff66edd391aa9a5bd6df7ec33a7b5d1b5 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'. --- 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); \