[gdal-dev] OGRFree(pszSrcWKT) can crash Matlab

jluis at ualg.pt jluis at ualg.pt
Sat Jan 23 12:47:53 EST 2010


Quoting Even Rouault <even.rouault at mines-paris.org>:

> Joaquim,
>
> you don't provide enough code to really see what's wrong, but my  
> guess is that you misuse GDAL API.

Even

Quite possible the first and I was trying to summarize what happens


>
> If you get pszSrcWKT, with
>
> pszSrcWKT = GDALGetProjectionRef(hDS);


No, I got it from oSrcSRS.exportToWkt( &pszSrcWKT );

See lines 325 & 329 of

code.google.com/p/mirone/source/browse/trunk/mex/gdalwarp_mex.cpp

Joaquim


>
> The pszSrcWKT string is owned by the hDS object, so as soon as you  
> destroy the hDS object with GDALClose(), the pointer becomes invalid  
> and points to arbitrary data.
>
> For the same reason, you should never free the string returned by  
> GDALGetProjectionRef() with OGRFree() or any other free() call.
>
> See http://gdal.org/classGDALDataset.html :
>
> GDALDataset::GetProjectionRef() :
>
> returns:
> a pointer to an internal reference string. It should not be altered,  
> freed or expected to last for long.
>
> Best regards,
>
> Even
>
> Le Saturday 23 January 2010 16:04:58 jluis at ualg.pt, vous avez écrit :
>> Hi,
>>
>> I have a serious crash in one of my Matlab MEXs caused by a call to
>> OGRFree() with an argument of size one (possibly the  null terminator).
>> This happens on OSX SL (64 bits) but not on Windows (where I still
>> build at 32 bits)
>>
>> Here is, as far as I could trace it, what is happening (SVN version of
>> the same age as GDAL1.7RC1)
>>
>> mexPrintf("---- %s\n%s\n", pszSrcWKT,pszDstWKT);
>>
>> That prints
>>
>> ---- GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS
>> 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],
>> AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNI
>> T["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","43
>> 26"]] PROJCS["UTM Zone 29, Northern Hemisphere",GEOGCS["WGS
>> 84",DATUM["WGS_1984",SPHEROID["WGS
>> 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],
>> AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNI
>> T["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","43
>> 26"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PA
>> RAMETER["central_meridian",-9],PARAMETER["scale_factor",0.9996],PARAMETER["f
>> alse_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
>>
>>
>> Next the code does:
>>
>> 	GDALClose( hSrcDS );
>> mexPrintf("---- %s\n%s\n", pszSrcWKT,pszDstWKT);
>>
>> and now pszSrcWKT is empty. See
>>
>> ---- 
>> PROJCS["UTM Zone 29, Northern Hemisphere",GEOGCS["WGS
>> 84",DATUM["WGS_1984",SPHEROID["WGS
>> 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],
>> AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNI
>> T["degree",0.0174532925199433,AUTHORITY["EPSG","9108"]],AUTHORITY["EPSG","43
>> 26"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PA
>> RAMETER["central_meridian",-9],PARAMETER["scale_factor",0.9996],PARAMETER["f
>> alse_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
>>
>> If I make it print the size of pszSrcWKT  with strlen(pszSrcWKT) the
>> answer is 1 and finally the MEX (and the entire MATLAB) crash on the
>> call
>>
>> OGRFree(pszSrcWKT);
>>
>>
>> Joaquim Luis
>>
>> ----------------------------------------------------------------
>> This message was sent using IMP, the Internet Messaging Program.
>>
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
>
>



----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



More information about the gdal-dev mailing list