Description: Fix overflow errors with 64-bit IVs The perl 5.12 packages are compiled with -Duse64bitint, which means that IVs are 64-bits even on 32-bit architectures. When converting IVs, SWIG assumes that an IV is the same size as a long, which causes OverflowErrors with unsigned longs when the value is greater than 2^31. . This patch should remove those assumptions by using the "IV" type defined by the perl headers, and explicitly checking the values are within the correct range for the type being converted. Author: Chris Butler Bug-Debian: http://bugs.debian.org/579540 Forwarded: no --- a/Lib/perl5/perlprimtypes.swg +++ b/Lib/perl5/perlprimtypes.swg @@ -56,8 +56,13 @@ SWIG_AsVal_dec(long)(SV *obj, long* val) { if (SvIOK(obj)) { - if (val) *val = SvIV(obj); - return SWIG_OK; + IV v = SvIV(obj); + if (v >= LONG_MIN && v <= LONG_MAX) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); @@ -108,11 +113,16 @@ SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val) { if (SvUOK(obj)) { - if (val) *val = SvUV(obj); - return SWIG_OK; + UV v = SvUV(obj); + if (v >= 0 && v <= ULONG_MAX) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } } else if (SvIOK(obj)) { - long v = SvIV(obj); - if (v >= 0) { + IV v = SvIV(obj); + if (v >= 0 && v <= ULONG_MAX) { if (val) *val = v; return SWIG_OK; } else { @@ -179,8 +189,13 @@ SWIG_AsVal_dec(long long)(SV *obj, long long *val) { if (SvIOK(obj)) { - if (val) *val = SvIV(obj); - return SWIG_OK; + IV v = SvIV(obj); + if (v >= LLONG_MIN && v <= LLONG_MAX) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); @@ -246,8 +261,8 @@ if (val) *val = SvUV(obj); return SWIG_OK; } else if (SvIOK(obj)) { - long v = SvIV(obj); - if (v >= 0) { + IV v = SvIV(obj); + if (v >= 0 && v <= ULLONG_MAX) { if (val) *val = v; return SWIG_OK; } else {