Skip to content

Commit

Permalink
Fixed GEOS & GDAL C function prototypes to explicitly use a subclass …
Browse files Browse the repository at this point in the history
…of `c_char_p` as the return type on routines that return strings. This prevents crashes on some 64-bit platforms, like FreeBSD. Thanks to wilsaj for discovering the problem. Refs #9747.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@11205 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jbronn committed Jul 9, 2009
1 parent 4532cf6 commit 55968a6
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
9 changes: 6 additions & 3 deletions django/contrib/gis/gdal/prototypes/generation.py
Expand Up @@ -8,6 +8,9 @@
check_arg_errcode, check_errcode, check_geom, check_geom_offset, \
check_pointer, check_srs, check_str_arg, check_string, check_const_string

class gdal_char_p(c_char_p):
pass

def double_output(func, argtypes, errcheck=False, strarg=False):
"Generates a ctypes function that returns a double value."
func.argtypes = argtypes
Expand Down Expand Up @@ -77,9 +80,9 @@ def string_output(func, argtypes, offset=-1, str_result=False):
"""
func.argtypes = argtypes
if str_result:
# String is the result, don't explicitly define
# the argument type so we can get the pointer.
pass
# Use subclass of c_char_p so the error checking routine
# can free the memory at the pointer's address.
func.restype = gdal_char_p
else:
# Error code is returned
func.restype = c_int
Expand Down
2 changes: 2 additions & 0 deletions django/contrib/gis/geos/prototypes/topology.py
Expand Up @@ -10,6 +10,7 @@
from ctypes import c_char_p, c_double, c_int
from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR, GEOS_PREPARE
from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_string
from django.contrib.gis.geos.prototypes.geom import geos_char_p

def topology(func, *args):
"For GEOS unary topology functions."
Expand Down Expand Up @@ -38,6 +39,7 @@ def topology(func, *args):
# GEOSRelate returns a string, not a geometry.
geos_relate = lgeos.GEOSRelate
geos_relate.argtypes = [GEOM_PTR, GEOM_PTR]
geos_relate.restype = geos_char_p
geos_relate.errcheck = check_string

# Routines only in GEOS 3.1+
Expand Down

0 comments on commit 55968a6

Please sign in to comment.