SQLite

Check-in [cb0f1658d3]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix a segfault that can occur in the RowSet object following a malloc failure. (CVS 5978)
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: cb0f1658d3db7ccf80843d66fa85af8de44710d0
User & Date: drh 2008-12-04 22:17:56.000
Context
2008-12-05
00:00
Expand table.* properly on a USING or a NATURAL join. Ticket #3522. (CVS 5979) (check-in: 06d206ef7d user: drh tags: trunk)
2008-12-04
22:17
Fix a segfault that can occur in the RowSet object following a malloc failure. (CVS 5978) (check-in: cb0f1658d3 user: drh tags: trunk)
20:40
Replace the VDBE Fifo object with the new RowSet object. (CVS 5977) (check-in: 39a0750b49 user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/vdbe.c.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
**
** Various scripts scan this source file in order to generate HTML
** documentation, headers files, or other derived files.  The formatting
** of the code in this file is, therefore, important.  See other comments
** in this file for details.  If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
** $Id: vdbe.c,v 1.790 2008/12/04 20:40:10 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
#include "vdbeInt.h"

/*
** The following global variable is incremented every time a cursor







|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
**
** Various scripts scan this source file in order to generate HTML
** documentation, headers files, or other derived files.  The formatting
** of the code in this file is, therefore, important.  See other comments
** in this file for details.  If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
** $Id: vdbe.c,v 1.791 2008/12/04 22:17:56 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
#include "vdbeInt.h"

/*
** The following global variable is incremented every time a cursor
4298
4299
4300
4301
4302
4303
4304

4305
4306
4307
4308
4309
4310
4311
  assert( pOp->p1>0 && pOp->p1<=p->nMem );
  pIdx = &p->aMem[pOp->p1];
  assert( pOp->p2>0 && pOp->p2<=p->nMem );
  pVal = &p->aMem[pOp->p2];
  assert( (pVal->flags & MEM_Int)!=0 );
  if( (pIdx->flags & MEM_RowSet)==0 ){
    sqlite3VdbeMemSetRowSet(pIdx);

  }
  sqlite3RowSetInsert(pIdx->u.pRowSet, pVal->u.i);
  break;
}

/* Opcode: RowSetRead P1 P2 P3 * *
**







>







4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
  assert( pOp->p1>0 && pOp->p1<=p->nMem );
  pIdx = &p->aMem[pOp->p1];
  assert( pOp->p2>0 && pOp->p2<=p->nMem );
  pVal = &p->aMem[pOp->p2];
  assert( (pVal->flags & MEM_Int)!=0 );
  if( (pIdx->flags & MEM_RowSet)==0 ){
    sqlite3VdbeMemSetRowSet(pIdx);
    if( (pIdx->flags & MEM_RowSet)==0 ) goto no_mem;
  }
  sqlite3RowSetInsert(pIdx->u.pRowSet, pVal->u.i);
  break;
}

/* Opcode: RowSetRead P1 P2 P3 * *
**
Changes to src/vdbemem.c.
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
*************************************************************************
**
** This file contains code use to manipulate "Mem" structure.  A "Mem"
** stores a single value in the VDBE.  Mem is an opaque structure visible
** only within the VDBE.  Interface routines refer to a Mem using the
** name sqlite_value
**
** $Id: vdbemem.c,v 1.127 2008/12/04 20:40:10 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
#include "vdbeInt.h"

/*
** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*)







|







11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
*************************************************************************
**
** This file contains code use to manipulate "Mem" structure.  A "Mem"
** stores a single value in the VDBE.  Mem is an opaque structure visible
** only within the VDBE.  Interface routines refer to a Mem using the
** name sqlite_value
**
** $Id: vdbemem.c,v 1.128 2008/12/04 22:17:56 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
#include "vdbeInt.h"

/*
** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*)
506
507
508
509
510
511
512
513


514
515
516
517
518
519
520
521
522
523
524
525
  assert( db!=0 );
  if( pMem->flags & MEM_RowSet ){
    sqlite3RowSetClear(pMem->u.pRowSet);
  }else{
    sqlite3VdbeMemRelease(pMem);
    pMem->zMalloc = sqlite3DbMallocRaw(db, 32);
  }
  if( !db->mallocFailed ){


    assert( pMem->zMalloc );
    pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc, 
                                       sqlite3DbMallocSize(db, pMem->zMalloc));
    assert( pMem->u.pRowSet!=0 );
    pMem->flags = MEM_RowSet|MEM_Dyn;
  }
}

/*
** Return true if the Mem object contains a TEXT or BLOB that is
** too large - whose size exceeds SQLITE_MAX_LENGTH.
*/







|
>
>




|







506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
  assert( db!=0 );
  if( pMem->flags & MEM_RowSet ){
    sqlite3RowSetClear(pMem->u.pRowSet);
  }else{
    sqlite3VdbeMemRelease(pMem);
    pMem->zMalloc = sqlite3DbMallocRaw(db, 32);
  }
  if( db->mallocFailed ){
    pMem->flags = MEM_Null;
  }else{
    assert( pMem->zMalloc );
    pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc, 
                                       sqlite3DbMallocSize(db, pMem->zMalloc));
    assert( pMem->u.pRowSet!=0 );
    pMem->flags = MEM_RowSet;
  }
}

/*
** Return true if the Mem object contains a TEXT or BLOB that is
** too large - whose size exceeds SQLITE_MAX_LENGTH.
*/