[mapserver-dev] fix: shp2img gets double free or corruption

Alan Boudreault aboudreault at mapgears.com
Wed Jul 21 08:09:41 EDT 2010


Hi Wendell,

Please fill a ticket and assign it to "aboudreault". I'm going to take a look 
in the next days.

Thanks,
Alan

On July 20, 2010 05:40:52 pm Wendell Turner wrote:
> I just upgraded from mapserver 5.4.1 to 5.6.5 and now
> shp2img gets this:
> 
>   *** glibc detected *** shp2img: double free or corruption (fasttop):
>  0x095b78b0 *** ======= Backtrace: =========
>   /lib/libc.so.6[0xb550f1]
>   /lib/libc.so.6(cfree+0x90)[0xb58bc0]
>   shp2img[0x8050f06]
>   /lib/libc.so.6(__libc_start_main+0xdc)[0xb01e8c]
>   shp2img[0x8050601]
>   ======= Memory map: ========
>   ...
> 
> It occurs when multiple layers are listed in the mapfile,
> and some (but not all) of those layers are listed in the
> '-l' argument to shp2img.
> 
> It appears that in shp2img.c, while looping through the '-l'
> argument list, the name of a (possibly bad) layer is
> remembered via:
> 
>    invalid_layer = strdup(layers[j]);
> 
> If that layer is found later, the string is freed with:
>         if (invalid_layer)
>           free(invalid_layer);
> 
> which causes the double free error.
> 
> It seems that all the loop needs to do is remember the index
> of the list, not a strdup of the string.  Doing that seems
> to work, and eliminates the double free problem.
> 
> Don't know if this is correct or not, but the patch below
> works for me.
> 
> Wendell
> 
> ===============================================================
> --- shp2img.c-strdup    2009-11-04 13:53:23.000000000 +0000
> +++ shp2img.c   2010-07-20 13:38:39.000000000 +0000
> @@ -43,7 +43,7 @@
>    int num_layers=0;
> 
>    int layer_found=0;
> -  char *invalid_layer=NULL;
> +  int invalid_layer = -1;
> 
>    char *outfile=NULL; /* no -o sends image to STDOUT */
> 
> @@ -263,18 +263,14 @@
>              break;
>            }
>            else {
> -            if (invalid_layer)
> -              free(invalid_layer);
> -            invalid_layer = strdup(layers[j]);
> +            invalid_layer = j;
>            }
>          }
>          if (layer_found==0) {
> -          fprintf(stderr, "Layer (-l) %s not found\n", invalid_layer);
> +          fprintf(stderr, "Layer (-l) %s not found\n",
>  layers[invalid_layer]); msCleanup();
>            exit(0);
>          }
> -        if (invalid_layer)
> -          free(invalid_layer);
>        }
> 
>        for(j=0; j<map->numlayers; j++) {
> ===============================================================
> _______________________________________________
> mapserver-dev mailing list
> mapserver-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
> 

-- 
Alan Boudreault
Mapgears
http://www.mapgears.com


More information about the mapserver-dev mailing list