1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-15 11:41:13 +03:00

Avoid pointer aliasing in the allocSpace() routine in vdbeaux.c.

FossilOrigin-Name: d6ae27512229d95502c584b17bb2cbdba401f80a
This commit is contained in:
drh
2009-12-08 15:35:22 +00:00
parent 1e15c031ca
commit 4800b2ee95
3 changed files with 35 additions and 32 deletions

View File

@@ -1,8 +1,8 @@
-----BEGIN PGP SIGNED MESSAGE----- -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1 Hash: SHA1
C Begin\supdating\sAPI\sdocumentation\sto\suse\sthe\snew\sMD5-hash\sbased\s\nautomatic\srequirements\snumbering.\s\sComment\schanges\sonly.\s\sMany\ssimilar\nchanges\swill\sfollow. C Avoid\spointer\saliasing\sin\sthe\sallocSpace()\sroutine\sin\svdbeaux.c.
D 2009-12-08T15:16:54 D 2009-12-08T15:35:23
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in c5827ead754ab32b9585487177c93bb00b9497b3 F Makefile.in c5827ead754ab32b9585487177c93bb00b9497b3
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -216,7 +216,7 @@ F src/vdbe.c 5ed06318aac5d57849170a8bf39e807c22c5fedd
F src/vdbe.h bea1f0cd530775bdb58a340265f3cf3ee920e9b2 F src/vdbe.h bea1f0cd530775bdb58a340265f3cf3ee920e9b2
F src/vdbeInt.h d7ea821ac7813c9bea0fe87558c35e07b2c7c44d F src/vdbeInt.h d7ea821ac7813c9bea0fe87558c35e07b2c7c44d
F src/vdbeapi.c bb128b819b9ef1a2ce211a36a6cb70a1643fa239 F src/vdbeapi.c bb128b819b9ef1a2ce211a36a6cb70a1643fa239
F src/vdbeaux.c 6b9da05a16fbb52afd2bf0b3080087afdf16b6eb F src/vdbeaux.c 86d43cdf9615235e1def993a945dfaabc20ab079
F src/vdbeblob.c 84f924700a7a889152aeebef77ca5f4e3875ffb4 F src/vdbeblob.c 84f924700a7a889152aeebef77ca5f4e3875ffb4
F src/vdbemem.c 1e16e3a16e55f4c3452834f0e041726021aa66e0 F src/vdbemem.c 1e16e3a16e55f4c3452834f0e041726021aa66e0
F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
@@ -780,14 +780,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 7b1cfd65a6f7c85ef8f6e4622973457cff9d007c P 973c5c86eed31dcce54d14e71938f2e255f5f1c7
R bc9b0ca13c1d42e3ef0f31c3eafc2706 R c570a97b0ffcfd39f4ed66f9f0662c03
U drh U drh
Z d3399929cb27f5d1d2ae1fd2280572aa Z ee7e56c2d879987294a2e31ad1fde920
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux) Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFLHm3toxKgR168RlERAqh0AJ42+WxiDaf+yXW7XeNGamk5NI4QnQCcD5Ck iD8DBQFLHnI+oxKgR168RlERAn/LAJ9meRPYFG8kZK/fIyNChkghTUHQWgCdGqla
Um9oKXZSMb+HswKtI2ZkMrA= K42FnTiSLRLIME8ykgShkdk=
=dxuM =3fbN
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View File

@@ -1 +1 @@
973c5c86eed31dcce54d14e71938f2e255f5f1c7 d6ae27512229d95502c584b17bb2cbdba401f80a

View File

@@ -1254,11 +1254,15 @@ void sqlite3VdbeIOTraceSql(Vdbe *p){
#endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */
/* /*
** Allocate space from a fixed size buffer. Make *pp point to the ** Allocate space from a fixed size buffer and return a pointer to
** allocated space. (Note: pp is a char* rather than a void** to ** that space. If insufficient space is available, return NULL.
** work around the pointer aliasing rules of C.) *pp should initially **
** be zero. If *pp is not zero, that means that the space has already ** The pBuf parameter is the initial value of a pointer which will
** been allocated and this routine is a noop. ** receive the new memory. pBuf is normally NULL. If pBuf is not
** NULL, it means that memory space has already been allocated and that
** this routine should not allocate any new memory. When pBuf is not
** NULL simply return pBuf. Only allocate new memory space when pBuf
** is NULL.
** **
** nByte is the number of bytes of space needed. ** nByte is the number of bytes of space needed.
** **
@@ -1269,23 +1273,23 @@ void sqlite3VdbeIOTraceSql(Vdbe *p){
** to allocate. If there is insufficient space in *ppFrom to satisfy the ** to allocate. If there is insufficient space in *ppFrom to satisfy the
** request, then increment *pnByte by the amount of the request. ** request, then increment *pnByte by the amount of the request.
*/ */
static void allocSpace( static void *allocSpace(
char *pp, /* IN/OUT: Set *pp to point to allocated buffer */ void *pBuf, /* Where return pointer will be stored */
int nByte, /* Number of bytes to allocate */ int nByte, /* Number of bytes to allocate */
u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */ u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */
u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */ u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */
int *pnByte /* If allocation cannot be made, increment *pnByte */ int *pnByte /* If allocation cannot be made, increment *pnByte */
){ ){
assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) ); assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) );
if( (*(void**)pp)==0 ){ if( pBuf ) return pBuf;
nByte = ROUND8(nByte); nByte = ROUND8(nByte);
if( &(*ppFrom)[nByte] <= pEnd ){ if( &(*ppFrom)[nByte] <= pEnd ){
*(void**)pp = (void *)*ppFrom; pBuf = (void*)*ppFrom;
*ppFrom += nByte; *ppFrom += nByte;
}else{ }else{
*pnByte += nByte; *pnByte += nByte;
}
} }
return pBuf;
} }
/* /*
@@ -1358,13 +1362,12 @@ void sqlite3VdbeMakeReady(
do { do {
nByte = 0; nByte = 0;
allocSpace((char*)&p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte); p->aMem = allocSpace(p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte);
allocSpace((char*)&p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte); p->aVar = allocSpace(p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte);
allocSpace((char*)&p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte); p->apArg = allocSpace(p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte);
allocSpace((char*)&p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte); p->azVar = allocSpace(p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte);
allocSpace((char*)&p->apCsr, p->apCsr = allocSpace(p->apCsr, nCursor*sizeof(VdbeCursor*),
nCursor*sizeof(VdbeCursor*), &zCsr, zEnd, &nByte &zCsr, zEnd, &nByte);
);
if( nByte ){ if( nByte ){
p->pFree = sqlite3DbMallocZero(db, nByte); p->pFree = sqlite3DbMallocZero(db, nByte);
} }