#34026: WKBReader Type Error
------------------------------+--------------------------------------
Reporter: Benoît Vinot | Owner: nobody
Type: Bug | Status: new
Component: GIS | Version: 4.1
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
------------------------------+--------------------------------------
Description changed by Benoît Vinot:
Old description:
> 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'
> _WKBReader().read(wkb)
> }}}
>
> This code works fine:
>
> {{{
> from django.contrib.gis.geos.prototypes.io import _WKBReader
> wkb='0101000020E6100000C07DD40B0FA8F5BF8794C5DD53DD4740'
> _WKBReader().read(wkb.encode())
> }}}
>
> I suggest to replace 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
> }}}
New description:
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
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/34026#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/010701835f92b756-6383d949-ce9a-4986-9431-9a88af4bc61d-000000%40eu-central-1.amazonses.com.