Skip to content

Commit 7399f63

Browse files
committed
BUG: fix integer overflow possibility in python parser. close #2601
1 parent 016b320 commit 7399f63

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

pandas/io/tests/test_parsers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,16 @@ def test_header_names_backward_compat(self):
14921492
header=0)
14931493
tm.assert_frame_equal(result, expected)
14941494

1495+
def test_integer_overflow_bug(self):
1496+
# #2601
1497+
data = "65248E10 11\n55555E55 22\n"
1498+
1499+
result = self.read_csv(StringIO(data), header=None, sep=' ')
1500+
self.assertTrue(result[0].dtype == np.float64)
1501+
1502+
result = self.read_csv(StringIO(data), header=None, sep='\s+')
1503+
self.assertTrue(result[0].dtype == np.float64)
1504+
14951505

14961506
class TestPythonParser(ParserTests, unittest.TestCase):
14971507

pandas/lib.pyx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ from util cimport is_array, _checknull, _checknan
4141

4242
cdef extern from "headers/stdint.h":
4343
enum: UINT8_MAX
44+
enum: INT64_MAX
45+
enum: INT64_MIN
4446

4547

4648
cdef extern from "math.h":

pandas/src/inference.pyx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ def is_period_array(ndarray[object] values):
298298
cdef extern from "parse_helper.h":
299299
inline int floatify(object, double *result) except -1
300300

301+
cdef double fINT64_MAX = <double> INT64_MAX
302+
cdef double fINT64_MIN = <double> INT64_MIN
301303

302304
def maybe_convert_numeric(ndarray[object] values, set na_values,
303305
convert_empty=True):
@@ -351,8 +353,10 @@ def maybe_convert_numeric(ndarray[object] values, set na_values,
351353
seen_float = 1
352354
elif 'inf' in val: # special case to handle +/-inf
353355
seen_float = 1
354-
else:
356+
elif fval < fINT64_MAX and fval > fINT64_MIN:
355357
ints[i] = <int64_t> fval
358+
else:
359+
seen_float = 1
356360

357361
if seen_complex:
358362
return complexes

0 commit comments

Comments
 (0)