Skip to content

Insufficient validation of Canvas.line input lengths #1159

@ianthomas23

Description

@ianthomas23

The sizes of the possible inputs to Canvas.line() are not sufficiently validated. Consider this example of LinesAxis1XConstant which accepts a numpy array for the x values and a number of columns of a pandas.DataFrame for the y values:

import datashader as ds
import numpy as np
import pandas as pd

# LinesAxis1XConstant
x = np.arange(1)  # Incorrect size, should have length of 2.
df = pd.DataFrame(dict(y_from = [0, 1, 0, 1, 0.0], y_to = [0, 1, 1, 0, 0.5]))

canvas = ds.Canvas()
agg = canvas.line(source=df, x=x, y=["y_from", "y_to"], axis=1, agg=ds.count())

Here there is only a single x coordinate when there should be two to match the y coordinates. If this example is run normally then no error is reported. If it is run with numba jitting disabled, i.e. NUMBA_DISABLE_JIT=1 python test.py then an out of bounds error is reported as follows:

Traceback (most recent call last):
  File "/Users/iant/github_temp/datashader_temp/issue1159.py", line 13, in <module>
    agg = canvas.line(source=df, x=x, y=["y_from", "y_to"], axis=1, agg=ds.count())
  File "/Users/iant/github/datashader/datashader/core.py", line 450, in line
    return bypixel(source, self, glyph, agg, antialias=glyph.antialiased)
  File "/Users/iant/github/datashader/datashader/core.py", line 1258, in bypixel
    return bypixel.pipeline(source, schema, canvas, glyph, agg, antialias=antialias)
  File "/Users/iant/github/datashader/datashader/utils.py", line 109, in __call__
    return lk[typ](head, *rest, **kwargs)
  File "/Users/iant/github/datashader/datashader/data_libraries/pandas.py", line 17, in pandas_pipeline
    return glyph_dispatch(glyph, df, schema, canvas, summary, antialias=antialias)
  File "/Users/iant/github/datashader/datashader/utils.py", line 112, in __call__
    return lk[cls](head, *rest, **kwargs)
  File "/Users/iant/github/datashader/datashader/data_libraries/pandas.py", line 48, in default
    extend(bases, source, x_st + y_st, x_range + y_range)
  File "/Users/iant/github/datashader/datashader/glyphs/line.py", line 382, in extend
    do_extend(
  File "/Users/iant/github/datashader/datashader/glyphs/line.py", line 1306, in extend_cpu
    perform_extend_line(
  File "/Users/iant/github/datashader/datashader/glyphs/line.py", line 1278, in perform_extend_line
    x1 = xs[j + 1]
IndexError: index 1 is out of bounds for axis 0 with size 1

There should be an explicit check that the coordinates have compatible lengths and an appropriate error reported, regardless of whether numba jitting is enabled or not.

This is using the latest commit (a1d9513915a) of the main branch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions