Skip to content

Commit 3c2f56a

Browse files
committed
BUG: guard against i < -len(series) in get_value_box fast code path. re: #3168
1 parent 77e2455 commit 3c2f56a

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

pandas/tests/test_series.py

+18-11
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
from pandas.util.py3compat import StringIO
2626
from pandas.util import py3compat
27-
from pandas.util.testing import (assert_series_equal,
28-
assert_almost_equal,
27+
from pandas.util.testing import (assert_series_equal,
28+
assert_almost_equal,
2929
ensure_clean)
3030
import pandas.util.testing as tm
3131

@@ -126,6 +126,13 @@ def test_getitem_setitem_ellipsis(self):
126126
s[...] = 5
127127
self.assert_((result == 5).all())
128128

129+
def test_getitem_negative_out_of_bounds(self):
130+
s = Series([tm.rands(5) for _ in xrange(10)],
131+
index=[tm.rands(10) for _ in xrange(10)])
132+
133+
self.assertRaises(IndexError, s.__getitem__, -11)
134+
self.assertRaises(IndexError, s.__setitem__, -11, 'foo')
135+
129136
def test_multilevel_name_print(self):
130137
index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
131138
['one', 'two', 'three']],
@@ -1781,7 +1788,7 @@ def test_operators_timedelta64(self):
17811788
expected = Series([timedelta(days=4017+i) for i in range(3)])
17821789
assert_series_equal(result,expected)
17831790
self.assert_(result.dtype=='m8[ns]')
1784-
1791+
17851792
result = df['A'] + datetime(2001,1,1)
17861793
expected = Series([timedelta(days=26663+i) for i in range(3)])
17871794
assert_series_equal(result,expected)
@@ -1790,7 +1797,7 @@ def test_operators_timedelta64(self):
17901797
d = datetime(2001,1,1,3,4)
17911798
resulta = df['A'] - d
17921799
self.assert_(resulta.dtype=='m8[ns]')
1793-
1800+
17941801
resultb = df['A'] + d
17951802
self.assert_(resultb.dtype=='m8[ns]')
17961803

@@ -1840,7 +1847,7 @@ def test_timedelta64_functions(self):
18401847
self.assert_(result == 2)
18411848

18421849
# GH 2982
1843-
# with NaT
1850+
# with NaT
18441851
td[0] = np.nan
18451852

18461853
result = td.idxmin()
@@ -1870,13 +1877,13 @@ def test_timedelta64_functions(self):
18701877
expected = Series([timedelta(1)],dtype='timedelta64[ns]')
18711878
assert_series_equal(result,expected)
18721879

1873-
def test_sub_of_datetime_from_TimeSeries(self):
1880+
def test_sub_of_datetime_from_TimeSeries(self):
18741881
from pandas.core import common as com
1875-
from datetime import datetime
1876-
a = Timestamp(datetime(1993,01,07,13,30,00))
1877-
b = datetime(1993, 6, 22, 13, 30)
1882+
from datetime import datetime
1883+
a = Timestamp(datetime(1993,01,07,13,30,00))
1884+
b = datetime(1993, 6, 22, 13, 30)
18781885
a = Series([a])
1879-
result = com._possibly_cast_to_timedelta(np.abs(a - b))
1886+
result = com._possibly_cast_to_timedelta(np.abs(a - b))
18801887
self.assert_(result.dtype == 'timedelta64[ns]')
18811888

18821889
def test_timedelta64_nan(self):
@@ -2586,7 +2593,7 @@ def test_from_csv(self):
25862593
ts = Series.from_csv(path)
25872594
assert_series_equal(self.ts, ts)
25882595
self.assertTrue(ts.index.name is None)
2589-
2596+
25902597
self.series.to_csv(path)
25912598
series = Series.from_csv(path)
25922599
self.assert_(series.name is None)

pandas/tslib.pyx

+2-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ cpdef object get_value_box(ndarray arr, object loc):
369369

370370
if i < 0 and sz > 0:
371371
i += sz
372-
elif i >= sz or sz == 0:
372+
373+
if i >= sz or sz == 0 or i < 0:
373374
raise IndexError('index out of bounds')
374375

375376
if arr.descr.type_num == NPY_DATETIME:

0 commit comments

Comments
 (0)