﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34026	WKBReader.read() crashes on strings.	Benoît Vinot	Leo Tom	"Hi,

There is a potential type error in the implementation of the `read` method of the `WKBReader` class in `contrib.gis`. Here is a small example to create the problem:


{{{
from django.contrib.gis.geos.prototypes.io import _WKBReader
wkb='0101000020E6100000C07DD40B0FA8F5BF8794C5DD53DD4740' # <-- string
_WKBReader().read(wkb)
}}}

This code works fine:

{{{
from django.contrib.gis.geos.prototypes.io import _WKBReader
wkb='0101000020E6100000C07DD40B0FA8F5BF8794C5DD53DD4740'
_WKBReader().read(wkb.encode()) # <--- Converted into bytes
}}}

I suggest replacing the current implementation of this method by:

{{{
    def read(self, wkb):
        ""Return a _pointer_ to C GEOS Geometry object from the given WKB.""
        if isinstance(wkb, memoryview):
            wkb_s = bytes(wkb)
            return wkb_reader_read(self.ptr, wkb_s, len(wkb_s))
        elif isinstance(wkb, bytes):
            return wkb_reader_read_hex(self.ptr, wkb, len(wkb))
        elif isinstance(wkb, str):
            wkb_s = wkb.encode() # <------------------- Ensure bytes
            return wkb_reader_read_hex(self.ptr, wkb_s, len(wkb_s))
        else:
            raise TypeError
}}}
"	Bug	closed	GIS	4.1	Normal	fixed			Ready for checkin	1	0	0	0	1	0
