Processed: Re: Bug#944648: sagemath FTBFS on i386

2019-11-28 Thread Debian Bug Tracking System
Processing control commands:

> forwarded 944648 https://trac.sagemath.org/ticket/28795
Bug #944648 [src:sagemath] sagemath FTBFS on i386
Set Bug forwarded-to-address to 'https://trac.sagemath.org/ticket/28795'.

-- 
944648: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=944648
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems



Bug#944648: sagemath FTBFS on i386

2019-11-28 Thread Tobias Hansen
Control: forwarded 944648 https://trac.sagemath.org/ticket/28795

On 11/28/19 2:09 AM, peter green wrote:
>> All three failures give the error message
>>
>> OverflowError: Python int too large to convert to C long
>>
>> from
>>
>> File "sage/rings/polynomial/polynomial_integer_dense_flint.pyx", line 284, 
>> in 
>> sage.rings.polynomial.polynomial_integer_dense_flint.Polynomial_integer_dense_flint.__init__
>>  
>> (build/cythonized/sage/rings/polynomial/polynomial_integer_dense_flint.cpp:6548)
>> fmpz_poly_set_coeff_si(self.__poly, i, a)
>>
>> Help on finding a fix would be appreciated.
> On line 282 of that file (assuming the version at 
> https://github.com/sagemath/sage/blob/master/src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx
>  is the same as the one in the Debian package).
> 
> "if type(a) is int:"
> 
> If that conditional is true then the code takes a fast path, which assumes 
> that the value of "a" fits in a C long.
> 
> In python 2 "int" was a type limited to the size of a c long, so the check 
> was appropriate. However in python 3 "int" is an arbitrary precision type, so 
> we need to check if it will fit in the range of a C long.
> 
> There are several other conditionals on types being "int" in the file that 
> presumably need fixing in the same way. I also spotted a "isinstance(x0, 
> long):" which i'm pretty sure will fail in python 3 as there is no type long 
> in python 3.
> 
> I have attached a completely untested patch.
> 

Thanks, that helped a lot. Knowing this I was able to find the upstream ticket 
were this was fixed only 3 days ago:
https://trac.sagemath.org/ticket/28795

I'll apply that upstream patch soon. Sagemath 9.0 will be the first release 
with Python 3 as default so I hope it will have less problems than 8.9.

Best,

Tobias



Bug#944648: sagemath FTBFS on i386

2019-11-27 Thread peter green

All three failures give the error message

OverflowError: Python int too large to convert to C long

from

File "sage/rings/polynomial/polynomial_integer_dense_flint.pyx", line 284, in 
sage.rings.polynomial.polynomial_integer_dense_flint.Polynomial_integer_dense_flint.__init__
 (build/cythonized/sage/rings/polynomial/polynomial_integer_dense_flint.cpp:6548)
 fmpz_poly_set_coeff_si(self.__poly, i, a)

Help on finding a fix would be appreciated.

On line 282 of that file (assuming the version at 
https://github.com/sagemath/sage/blob/master/src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx
 is the same as the one in the Debian package).

"if type(a) is int:"

If that conditional is true then the code takes a fast path, which assumes that the value 
of "a" fits in a C long.

In python 2 "int" was a type limited to the size of a c long, so the check was 
appropriate. However in python 3 "int" is an arbitrary precision type, so we need to 
check if it will fit in the range of a C long.

There are several other conditionals on types being "int" in the file that presumably 
need fixing in the same way. I also spotted a "isinstance(x0, long):" which i'm pretty 
sure will fail in python 3 as there is no type long in python 3.

I have attached a completely untested patch.

Description: fix python integer type checks in polynomial_integer_dense_flint.pyx
 python 3 changes the standard integer types, in python2 a python "int" was
 equivilent to a C "long" and a python "long" was an arbitary precision type.
 
 In python 3 a python "int" is now an arbitary precision type and a python
 "long" does not exist any more.
 
 This patch adds additional checks that a python int will fit in the range of
 a C long before passing it to routines that require it to fit in one. It also
 locally defines long=int on python 3 so that isinstance(x0,long) will correctly
 test for an arbitary precision python integer.
Author: Peter Michael Green 

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: , 
Bug: 
Bug-Debian: https://bugs.debian.org/
Bug-Ubuntu: https://launchpad.net/bugs/
Forwarded: 
Reviewed-By: 
Last-Update: 2019-11-28

--- sagemath-8.9.orig/sage/src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx
+++ sagemath-8.9/sage/src/sage/rings/polynomial/polynomial_integer_dense_flint.pyx
@@ -36,12 +36,21 @@ from __future__ import absolute_import,
 from cysignals.memory cimport sig_free
 from cysignals.signals cimport sig_on, sig_off
 
+from libc.limits cimport LONG_MIN
+from libc.limits cimport LONG_MAX
+
 include "sage/libs/ntl/decl.pxi"
 
 from cpython.int cimport PyInt_AS_LONG
 from sage.libs.gmp.mpz cimport *
 from sage.arith.long cimport pyobject_to_long
 
+import sys
+#we use this later in an isinstance test to detect a python arbitary precision
+#integer
+if sys.version_info.major > 3:
+long = int
+
 from sage.rings.polynomial.polynomial_element cimport Polynomial
 from sage.structure.element cimport ModuleElement, Element
 from sage.structure.element import coerce_binop
@@ -241,7 +250,7 @@ cdef class Polynomial_integer_dense_flin
 # now fill them in
 for ii, a in x:
 i = ii[0] if type(ii) is tuple else ii
-if type(a) is int:
+if (type(a) is int) and (LONG_MIN <= a <= LONG_MAX):
 sig_on()
 fmpz_poly_set_coeff_si(self.__poly, i, a)
 sig_off()
@@ -279,7 +288,7 @@ cdef class Polynomial_integer_dense_flin
 sig_off()
 for i from 0 <= i < len(x):
 a = x[i]
-if type(a) is int:
+if (type(a) is int) && (LONG_MIN <= a <= LONG_MAX):
 sig_on()
 fmpz_poly_set_coeff_si(self.__poly, i, a)
 sig_off()
@@ -398,7 +407,7 @@ cdef class Polynomial_integer_dense_flin
 ( x0).__poly)
 sig_off()
 return f
-if isinstance(x0, int):
+if isinstance(x0, int) and (LONG_MIN <= x0 <= LONG_MAX):
 z = Integer.__new__(Integer)
 sig_on()
 fmpz_init(a_fmpz)
@@ -1287,7 +1296,7 @@ cdef class Polynomial_integer_dense_flin
 """
 if n < 0:
 raise IndexError("n must be >= 0")
-if isinstance(value, int):
+if isinstance(value, int) and (LONG_MIN <= value <= LONG_MAX):
 sig_on()
 fmpz_poly_set_coeff_si(self.__poly, n, value)
 sig_off()


Bug#944648: sagemath FTBFS on i386

2019-11-13 Thread Tobias Hansen
Source: sagemath
Version: 8.9-2
Severity: serious

Since the switch to Python 3 in 8.9~beta9-1, sagemath fails to build from 
source on i386. The reason are segmentation faults in the following three tests:

sage -t --long src/sage/schemes/elliptic_curves/isogeny_small_degree.py  # 
Killed due to segmentation fault
sage -t --long src/sage/schemes/elliptic_curves/ell_number_field.py  # Killed 
due to abort
sage -t --long src/sage/schemes/elliptic_curves/ell_field.py  # Killed due to 
segmentation fault

All three failures give the error message

OverflowError: Python int too large to convert to C long

from

File "sage/rings/polynomial/polynomial_integer_dense_flint.pyx", line 284, in 
sage.rings.polynomial.polynomial_integer_dense_flint.Polynomial_integer_dense_flint.__init__
 
(build/cythonized/sage/rings/polynomial/polynomial_integer_dense_flint.cpp:6548)
fmpz_poly_set_coeff_si(self.__poly, i, a)

Help on finding a fix would be appreciated.

Best,
Tobias