On Mon, Jan 10, 2011 at 11:55 AM, <youfei.c...@emc.com> wrote:

> Hi Richard,
>
> I don't know if I have collected accurate and enough information for you,
> please check and let me know.
>
> As you said, I'm calling sqlite apis to add callbacks, without any kind of
> changes to sourcecode. The routine I'm using:
>
> 1. implement my own separate function, let's say, MY_FUNC.
> 2. call " sqlite3_create_function" to put it in
> 3. pass a querry like "select MY_FUNC(field1, field2) from table" to the db
> by calling " execQuery", field1 and field2 are both in text
> 4. MY_FUNC will get called, use "sqlite3_value_text(argv[0])" and
> "sqlite3_value_text(argv[1])" to read field1 and field2, and database blows
> up right there.
>

I am unable to reproduce the problem.  Can you provide more hints?


>
> From your reply, one thing is unclear. It doesn't crash on the line 453,
> but 458. "isLookaside" does return a false when p == 0 && db is valid, so it
> jumps to line 458 and somehow couldn't even step into sqlite3MemSize before
> the exception was thrown out.
>
> "
> if( p==0 ){
>        return 0;
> }
> "
>
> Above added lines did fix it, though I don't know why you took it out in
> 3.7.4.
>
> Thanks,
> Youfei
>
>
>
>
> -----Original Message-----
> From: drhsql...@gmail.com [mailto:drhsql...@gmail.com] On Behalf Of
> Richard Hipp
> Sent: Saturday, January 08, 2011 8:07 AM
> To: General Discussion of SQLite Database; Chen, Youfei
> Subject: Re: [sqlite] a bug report
>
> The relevant code in 3.7.4 (with assert() statements removed) is as
> follows (line numbers o the left):
>
> 434 static int isLookaside(sqlite3 *db, void *p){
> 435   return p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
> 436 }
> 450 int sqlite3DbMallocSize(sqlite3 *db, void *p){
> 452   if( db && isLookaside(db, p) ){
> 453     return db->lookaside.sz;
> 454   }else{
> 458     return sqlite3GlobalConfig.m.xSize(p);
> 459   }
> 460 }
>
> The isLookaside() function should return false if p==0.   So I do not
> see how you might have segfaulted on the db->lookaside.sz expression
> of line 453.  And even then, I don't see how such a segfault is
> possible if db is still a valid pointer.
>
> Can you please send a stack trace from the point where the original
> 3.7.4 segfaults?
>
> Also:  What do you mean when you say "I added callback function
> pointers to my sqlite database"?  Have you modified the code
> someplace?  Or are you using one of the many SQLite APIs that sets
> callback functions?  If the latter, can you please tell us which
> routines you are using?
>
>
> On Fri, Jan 7, 2011 at 6:00 PM, <youfei.c...@emc.com> wrote:
> >
> > Hi SQLite Team
> >
> >
> >
> > I added callback function pointers for my sqlite database and the
> > program crashed in the function sqlite3DbMallocSize. Same code works
> > fine with older release such as 3.6.15.
> >
> >
> >
> > I debugged and got the place where the exception was thrown.
> >
> >
> >
> > in 3.7.4
> >
> > SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
> >
> >            assert( db==0 || sqlite3_mutex_held(db->mutex) );
> >
> >            else if( db && isLookaside(db, p) ){
> >
> >                        return db->lookaside.sz;
> >
> >            }else{
> >
> >                        assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
> >
> >                        assert( sqlite3MemdebugHasType(p,
> > MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
> >
> >                        assert( db!=0 || sqlite3MemdebugNoType(p,
> > MEMTYPE_LOOKASIDE) );
> >
> >                        return sqlite3GlobalConfig.m.xSize(p);
> >
> >            }
> >
> > }
> >
> >
> >
> > while in 3.6.15 it was implemented as
> >
> >
> >
> > SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
> >
> >  assert( db==0 || sqlite3_mutex_held(db->mutex) );
> >
> >  if( p==0 ){
> >
> >    return 0;
> >
> >  }else if( isLookaside(db, p) ){
> >
> >    return db->lookaside.sz;
> >
> >  }else{
> >
> >    return sqlite3GlobalConfig.m.xSize(p);
> >
> >  }
> >
> > }
> >
> >
> >
> > So, in order to get my app fly, I modified 3.7.4 sqlite code by adding a
> > few more lines (in red):
> >
> >
> >
> > SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
> >
> >            assert( db==0 || sqlite3_mutex_held(db->mutex) );
> >
> >            if( p == 0 ) // youfei fixed to prevent  illegal memory
> > access when callbacks get called
> >
> >            {
> >
> >                        return 0;
> >
> >            }
> >
> >            else if( db && isLookaside(db, p) ){
> >
> >                        return db->lookaside.sz;
> >
> >            }else{
> >
> >                        assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
> >
> >                        assert( sqlite3MemdebugHasType(p,
> > MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
> >
> >                        assert( db!=0 || sqlite3MemdebugNoType(p,
> > MEMTYPE_LOOKASIDE) );
> >
> >                        return sqlite3GlobalConfig.m.xSize(p);
> >
> >            }
> >
> > }
> >
> >
> >
> > In my code, *p is 0 when sqlite3DbMallocSize gets called, so a memory
> > access violation exception is thrown by "return
> > sqlite3GlobalConfig.m.xSize(p);". Previous release covers it well while
> > the latest does not. After the modification my program gets back to
> > work. Please verify my change and let me know if it's a bug missed by
> > you experts?
> >
> >
> >
> > Thanks,
> >
> > Youfei
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > Youfei Chen | EMC Corporation <http://www.emc.com/>  | 176 South Street
> > Hopkinton, MA 01748
> > <http://maps.google.com/maps?f=q&hl=en&geocode=&q=176+South+Street+Hopki
> > nton,+MA+01748>  | Direct #: (508)293-6402 | Extension: 76402 | Email:
> > youfei.c...@emc.com <mailto:chen_you...@emc.com>
> >
> >
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
>
>


-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to