On Apr 2, 2010, at 8:34 AM, Daniel Lin wrote:

> Let me describe the situation which I found:
>
> line 741 calculated as 17 bytes.
> line 746 memcpy the zP4's original allocated size is 16 bytes only.
>
> So, on line 746, it will copy one byte unknown data on last byte to  
> the new buffer.

http://www.sqlite.org/src/ci/937b931a7c

>
> Or, this problem is occurs by the line 741, it calculate the wrong  
> number?
>
> On Fri, Apr 2, 2010 at 19:52, D. Richard Hipp <d...@hwaci.com> wrote:
>
> On Apr 2, 2010, at 6:15 AM, Daniel Lin wrote:
>
> I've read the test page which you provide.
> But, I still think I'm right.  Because Borland C++ Builder's Code  
> Guard detect by following method:
>
> 1. Make special tag on 'malloc'  memory boundry.
> 2. Check the memcpy is overrun the previous malloc boundry.
>
> I've traced back the callee & caller's code,  I'm 80% sure your code  
> seems wrong on that line.
>
> That's why I still think your code has problem on that line.
> And I still don't know why my modification will cause malfunction.   
> Is there any sample could show the malfunction?
>
> Maybe dmalloc could also help the checking issue. (But, I'm not sure  
> it could help on this overrun problem.)
>
> 0708 void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4,  
> int n){
>     ...
> 0736   }else if( n==P4_KEYINFO ){
> 0737     KeyInfo *pKeyInfo;
> 0738     int nField, nByte;
> 0739
> 0740     nField = ((KeyInfo*)zP4)->nField;
> 0741     nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo- 
> >aColl[0]) + nField;
> 0742     pKeyInfo = sqlite3Malloc( nByte );
> 0743     pOp->p4.pKeyInfo = pKeyInfo;
> 0744     if( pKeyInfo ){
> 0745       u8 *aSortOrder;
> 0746       memcpy((char*)pKeyInfo, zP4, nByte);
> 0747       aSortOrder = pKeyInfo->aSortOrder;
> 0748       if( aSortOrder ){
> 0749         pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo- 
> >aColl[nField];
> 0750         memcpy(pKeyInfo->aSortOrder, aSortOrder, nField);
> 0751       }
> 0752       pOp->p4type = P4_KEYINFO;
> 0753     }else{
> 0754       p->db->mallocFailed = 1;
> 0755       pOp->p4type = P4_NOTUSED;
> 0756     }
>
> A pointer to the object to be copied is passed in as parameter zP4.   
> The size of the object is computed on line 741.  Sufficient space to  
> copy the object is allocated on line 742.  The copy occurs on line  
> 746.  Lines 747 through 751 copy over some auxiliary information  
> into the tail the same memory allocation as is used by the original  
> object.  The code is correct is stands.
>
> To see why your change will cause a malfunction, all you have to do  
> is run the test suite.
>
> Further discussion to sqlite-users@sqlite.org, please.
>
>
>
>
>
> On Fri, Apr 2, 2010 at 11:34, D. Richard Hipp <d...@hwaci.com> wrote:
>
> On Apr 1, 2010, at 9:34 PM, Daniel Lin wrote:
>
> Hi, Richard,
>
> Still not got your reply.
> I've changed the line, and it works well.
> So, I don't know when will the malfunction will occur.
>
> Have you ever used the codeguard like utility to check the sqlite at  
> runtime?
>
>
> http://valgrind.org/
> http://www.sqlite.org/testing.html
>
>
>
> On Thu, Mar 25, 2010 at 08:47, Daniel Lin <dlin...@gmail.com> wrote:
> Why, I found the nByte which calculated is 17 bytes.
> But the data structure which come from is only 16 bytes.
>
> That let the code guard noticed me it maybe wrong.
>
>
> On Wed, Mar 24, 2010 at 19:57, D. Richard Hipp <d...@hwaci.com> wrote:
>
> On Mar 24, 2010, at 7:11 AM, Daniel Lin wrote:
>
> About this bug, I found change the code to following will let it  
> workable.
> But, I require your confirm.
>
> memcpy(pKeyInfo, zP4, sizeof(*pKeyInfo));
>
> The SQLite code is correct as written.  Your change will cause  
> SQLite to malfunction.
>
> Check-in http://www.sqlite.org/src/ci/be27897991 is an attempt to  
> suppress the warning from code guard.  But as I have no way of  
> testing to see if the change obtained that goal.
>
>
>
>
> On Wed, Mar 24, 2010 at 19:04, Daniel Lin <dlin...@gmail.com> wrote:
> Dear Dr.,
>
> I use Borland C++ Builder with code guard checking function enabled  
> mode . (on 32 bits Windows XP)
>
> I found in an amalgamation sqlite.c may cause memory overrun.
>
> SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const  
> char *zP4, int n){
> ...
>  pOp->p4.pKeyInfo = pKeyInfo;
>  if (pKeyInfo ){
>    u8 *aSortOrder;
>    memcpy(pKeyInfo, zP4, nByte);   /* this line force copy 17 bytes  
> from 16 bytes structure */
>    aSortOrder = pKeyInfo->aSortOrder;
>    if( aSortOrder ){
>      pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo->aColl[nField];
>      memcpy(pKeyInfo->aSortOrder, aSortOrder, nField);
>    }
>    pOp->p4type = P4_KEYINFO;
>
>
> D. Richard Hipp
> d...@hwaci.com
>
>
>
>
>
>
> D. Richard Hipp
> d...@hwaci.com
>
>
>
>
>
> D. Richard Hipp
> d...@hwaci.com
>
>
>
>

D. Richard Hipp
d...@hwaci.com



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

Reply via email to