Hello,

it may be needed for sure for the whole session or at least if you
need the already registered extension to be available at the next db
open attempt.

A deeper look in sqlite3 gave me the sqlite3_shutdown() API that
actually frees the extension attached via
sqlite3_reset_auto_extension() together with various other sqlite3
stuff. I do not see GDAL to call sqlite3_shutdown() anywhere and I
think it is quite reasonable to do it in some GDAL sqlite driver
finalization steps - in the OGRSQLiteBaseDataSource destructor, in the
Close() method after closing db,  etc.

Deyan

On Thu, Feb 6, 2025 at 12:52 PM Even Rouault <even.roua...@spatialys.com> wrote:
>
> Deyan
>
> this sounds more like "still reachable" memory in Valgrind terminology
> (https://valgrind.org/docs/manual/faq.html#faq.deflost), that is memory
> that is allocated by some component, still reachable by it but never
> explicitly freed before the end of the process, and the amount of it
> doesn't grow over time. There are certainly many similar such patterns
> in GDAL or other libraries it uses, and I don't see that as a bug or
> something that requires code changes.
>
> Even
>
> Le 06/02/2025 à 11:34, Deyan Vasilev via gdal-dev a écrit :
> > Hello,
> >
> > I was chasing for a long time a small 8 byte memory leak and was able
> > to identify it in the OGR sqlite extension binding, here's what I
> > observed:
> >
> > A call to OGRSQLiteBaseDataSource::OpenOrCreateDB() would invoke
> > OGR2SQLITE_Register() and then sqlite3_auto_extension(). The latter is
> > a sqlite3 call that would malloc an 8 byte buffer for the extension
> > function entry point if the extension is unknown to sqlite3 (was not
> > previously registered).
> >
> > This allocation seems to be unmanaged neither by sqlite3 nor by OGR
> > later causing an 8 byte memory leak.  I was able to resolve this by
> > adding a OGR2SQLITE_UnRegister() stub in ogrsqlitevirtualogr.cpp that
> > would call in a succession:
> >
> > sqlite3_cancel_auto_extension ((void (*)(void)) OGR2SQLITE_static_register);
> > sqlite3_reset_auto_extension ();
> > <
> >
> > and then have the OGR2SQLITE_UnRegister() stub called in
> > ogrsqlitedatasource.cpp \ OGRSQLiteBaseDataSource::CloseDB() right
> > after closing the database:
> >
> >          sqlite3_close( hDB );
> >          hDB = nullptr;
> >          OGR2SQLITE_UnRegister();
> > <
> >
> > This way the memory leak was gone. My app runs on VS2015/2019 with an
> > older GDAL release (2.4.4.) so the fix will be a bit different in 3.10
> > as the HAVE_SQLITE3EXT_H conditionals were not present in 2.4.4..
> >
> > Best regards,
> > Deyan
> > _______________________________________________
> > gdal-dev mailing list
> > gdal-dev@lists.osgeo.org
> > https://lists.osgeo.org/mailman/listinfo/gdal-dev
>
> --
> http://www.spatialys.com
> My software is free, but my time generally not.
>
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to