Opened 19 years ago
Last modified 13 years ago
#1446 closed defect
Cannot draw() a MyGIS layer more than once — at Initial Version
Reported by: | Owned by: | sdlime | |
---|---|---|---|
Priority: | high | Milestone: | |
Component: | MapServer C Library | Version: | 4.6 |
Severity: | normal | Keywords: | |
Cc: |
Description
When rendering layers that are sourced from a MyGIS (mysql) source, draw() cannot be called more than once. Doing so results in a Segmentation Fault. This phenomenon occurs because of the way MySQL connection parameters are parsed from the layer's 'connection' property. An examination of the code (around line 374 in mapmygis.c) shows that the connection parameters are parsed by this code: (1) delim = strdup(":"); (2) DB_HOST = strdup(strtok(layer->connection, delim)); (3) DB_USER = strdup(strtok(NULL, delim)); (4) DB_PASSWD = strdup(strtok(NULL, delim)); (5) DB_DATABASE = strdup(strtok(NULL, delim)); (6) DB_DATATYPE = strdup(strtok(NULL, delim)); This code works fine the first time draw() is called, however subsequent calls results in a SIGSEGV being thrown at line (3). This occurs because strtok() modifies its first argument (per the strtok() man page), resulting in layer- >connection being truncated at the first colon. When line (3) is encountered the SIGSEV in generated from libc because strtok() presumably returns NULL. Since the connection string is modified by the first run through this routine, subsequent calls fail. There are a variety of potential fixes, however, this is what I did: char* tempcon; ... ... delim = strdup(":"); tempcon=strdup(layer->connection); DB_HOST = strdup(strtok(tempcon, delim)); DB_USER = strdup(strtok(NULL, delim)); DB_PASSWD = strdup(strtok(NULL, delim)); DB_DATABASE = strdup(strtok(NULL, delim)); DB_DATATYPE = strdup(strtok(NULL, delim)); As a quickie solution I simply strdup() the layer->connection string to a temporary location then tokenize from there. This prevents corruption of the original connection string so that subsequent calls do not fail. Thank you to all of the developers for your hard work on this remarkable product. - Rob Parsons
Note:
See TracTickets
for help on using tickets.