rpms/sqlite/devel sqlite-3.6.12-memalign.patch, NONE, 1.1 sqlite.spec, 1.56, 1.57

Dennis Gilmore ausil at fedoraproject.org
Thu Apr 9 14:59:18 UTC 2009


Author: ausil

Update of /cvs/pkgs/rpms/sqlite/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv3857

Modified Files:
	sqlite.spec 
Added Files:
	sqlite-3.6.12-memalign.patch 
Log Message:
fix sparc memory allignment bug https://bugzilla.redhat.com/show_bug.cgi?id=494906


sqlite-3.6.12-memalign.patch:

--- NEW FILE sqlite-3.6.12-memalign.patch ---
---------------------
PatchSet 6171 
Date: 2009/04/05 15:22:09
Author: drh
Branch: HEAD
Tag: (none) 
Branches: 
Log:
Additional code to make sure and to assert that memory allocations have
8-byte alignment.  Ticket #3777.

Members: 
	src/btree.c:1.589->1.590 
	src/memjournal.c:1.10->1.11 
	src/pager.c:1.577->1.578 
	src/sqliteInt.h:1.850->1.851 
	src/vdbeaux.c:1.446->1.447 
	src/vdbemem.c:1.139->1.140 

Index: sqlite/src/btree.c
diff -u sqlite/src/btree.c:1.589 sqlite/src/btree.c:1.590
--- sqlite/src/btree.c:1.589	Thu Apr  2 20:16:59 2009
+++ sqlite/src/btree.c	Sun Apr  5 12:22:09 2009
@@ -5357,13 +5357,13 @@
   }
   szCell = (u16*)&apCell[nMaxCells];
   aCopy[0] = (u8*)&szCell[nMaxCells];
-  assert( ((aCopy[0] - (u8*)0) & 7)==0 ); /* 8-byte alignment required */
+  assert( EIGHT_BYTE_ALIGNMENT(aCopy[0]) );
   for(i=1; i<NB; i++){
     aCopy[i] = &aCopy[i-1][pBt->pageSize+ROUND8(sizeof(MemPage))];
     assert( ((aCopy[i] - (u8*)0) & 7)==0 ); /* 8-byte alignment required */
   }
   aSpace1 = &aCopy[NB-1][pBt->pageSize+ROUND8(sizeof(MemPage))];
-  assert( ((aSpace1 - (u8*)0) & 7)==0 ); /* 8-byte alignment required */
+  assert( EIGHT_BYTE_ALIGNMENT(aSpace1) );
   if( ISAUTOVACUUM ){
     aFrom = &aSpace1[pBt->pageSize];
   }
Index: sqlite/src/memjournal.c
diff -u sqlite/src/memjournal.c:1.10 sqlite/src/memjournal.c:1.11
--- sqlite/src/memjournal.c:1.10	Thu Apr  2 17:22:42 2009
+++ sqlite/src/memjournal.c	Sun Apr  5 12:22:09 2009
@@ -237,6 +237,7 @@
 */
 void sqlite3MemJournalOpen(sqlite3_file *pJfd){
   MemJournal *p = (MemJournal *)pJfd;
+  assert( EIGHT_BYTE_ALIGNMENT(p) );
   memset(p, 0, sqlite3MemJournalSize());
   p->pMethod = &MemJournalMethods;
 }
Index: sqlite/src/pager.c
diff -u sqlite/src/pager.c:1.577 sqlite/src/pager.c:1.578
--- sqlite/src/pager.c:1.577	Sat Apr  4 15:53:48 2009
+++ sqlite/src/pager.c	Sun Apr  5 12:22:09 2009
@@ -3114,9 +3114,9 @@
   ** source file journal.c).
   */
   if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){
-    journalFileSize = sqlite3JournalSize(pVfs);
+    journalFileSize = ROUND8(sqlite3JournalSize(pVfs));
   }else{
-    journalFileSize = sqlite3MemJournalSize();
+    journalFileSize = ROUND8(sqlite3MemJournalSize());
   }
 
   /* Set the output variable to NULL in case an error occurs. */
@@ -3172,23 +3172,25 @@
   **     Journal file name               (nPathname+8+1 bytes)
   */
   pPtr = (u8 *)sqlite3MallocZero(
-    sizeof(*pPager) +           /* Pager structure */
-    pcacheSize      +           /* PCache object */
-    pVfs->szOsFile  +           /* The main db file */
-    journalFileSize * 2 +       /* The two journal files */ 
-    nPathname + 1 +             /* zFilename */
-    nPathname + 8 + 1           /* zJournal */
+    ROUND8(sizeof(*pPager)) +      /* Pager structure */
+    ROUND8(pcacheSize) +           /* PCache object */
+    ROUND8(pVfs->szOsFile) +       /* The main db file */
+    journalFileSize * 2 +          /* The two journal files */ 
+    nPathname + 1 +                /* zFilename */
+    nPathname + 8 + 1              /* zJournal */
   );
+  assert( EIGHT_BYTE_ALIGNMENT(journalFileSize) );
   if( !pPtr ){
     sqlite3_free(zPathname);
     return SQLITE_NOMEM;
   }
   pPager =              (Pager*)(pPtr);
-  pPager->pPCache =    (PCache*)(pPtr += sizeof(*pPager));
-  pPager->fd =   (sqlite3_file*)(pPtr += pcacheSize);
-  pPager->sjfd = (sqlite3_file*)(pPtr += pVfs->szOsFile);
+  pPager->pPCache =    (PCache*)(pPtr += ROUND8(sizeof(*pPager)));
+  pPager->fd =   (sqlite3_file*)(pPtr += ROUND8(pcacheSize));
+  pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile));
   pPager->jfd =  (sqlite3_file*)(pPtr += journalFileSize);
   pPager->zFilename =    (char*)(pPtr += journalFileSize);
+  assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) );
 
   /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */
   if( zPathname ){
Index: sqlite/src/sqliteInt.h
diff -u sqlite/src/sqliteInt.h:1.850 sqlite/src/sqliteInt.h:1.851
--- sqlite/src/sqliteInt.h:1.850	Wed Apr  1 18:03:01 2009
+++ sqlite/src/sqliteInt.h	Sun Apr  5 12:22:09 2009
@@ -456,6 +456,11 @@
 #define ROUNDDOWN8(x) ((x)&~7)
 
 /*
+** Assert that the pointer X is aligned to an 8-byte boundary.
+*/
+#define EIGHT_BYTE_ALIGNMENT(X)   ((((char*)(X) - (char*)0)&7)==0)
+
+/*
 ** An instance of the following structure is used to store the busy-handler
 ** callback for a given sqlite handle. 
 **
Index: sqlite/src/vdbeaux.c
diff -u sqlite/src/vdbeaux.c:1.446 sqlite/src/vdbeaux.c:1.447
--- sqlite/src/vdbeaux.c:1.446	Wed Mar 25 15:43:09 2009
+++ sqlite/src/vdbeaux.c	Sun Apr  5 12:22:09 2009
@@ -1023,6 +1023,7 @@
   u8 *pEnd,            /* Pointer to 1 byte past the end of *ppFrom buffer */
   int *pnByte          /* If allocation cannot be made, increment *pnByte */
 ){
+  assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) );
   if( (*(void**)pp)==0 ){
     nByte = ROUND8(nByte);
     if( (pEnd - *ppFrom)>=nByte ){
@@ -1096,6 +1097,8 @@
     if( isExplain && nMem<10 ){
       nMem = 10;
     }
+    zCsr += (zCsr - (u8*)0)&7;
+    assert( EIGHT_BYTE_ALIGNMENT(zCsr) );
 
     do {
       memset(zCsr, 0, zEnd-zCsr);
Index: sqlite/src/vdbemem.c
diff -u sqlite/src/vdbemem.c:1.139 sqlite/src/vdbemem.c:1.140
--- sqlite/src/vdbemem.c:1.139	Sun Mar 29 15:12:10 2009
+++ sqlite/src/vdbemem.c	Sun Apr  5 12:22:09 2009
@@ -209,6 +209,7 @@
   assert( !(fg&(MEM_Str|MEM_Blob)) );
   assert( fg&(MEM_Int|MEM_Real) );
   assert( (pMem->flags&MEM_RowSet)==0 );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
 
 
   if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
@@ -345,6 +346,7 @@
 i64 sqlite3VdbeIntValue(Mem *pMem){
   int flags;
   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
   flags = pMem->flags;
   if( flags & MEM_Int ){
     return pMem->u.i;
@@ -373,6 +375,7 @@
 */
 double sqlite3VdbeRealValue(Mem *pMem){
   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
   if( pMem->flags & MEM_Real ){
     return pMem->r;
   }else if( pMem->flags & MEM_Int ){
@@ -403,6 +406,7 @@
   assert( pMem->flags & MEM_Real );
   assert( (pMem->flags & MEM_RowSet)==0 );
   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
 
   pMem->u.i = doubleToInt64(pMem->r);
   if( pMem->r==(double)pMem->u.i ){
@@ -416,6 +420,8 @@
 int sqlite3VdbeMemIntegerify(Mem *pMem){
   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
   assert( (pMem->flags & MEM_RowSet)==0 );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
+
   pMem->u.i = sqlite3VdbeIntValue(pMem);
   MemSetTypeFlag(pMem, MEM_Int);
   return SQLITE_OK;
@@ -427,6 +433,8 @@
 */
 int sqlite3VdbeMemRealify(Mem *pMem){
   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
+  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
+
   pMem->r = sqlite3VdbeRealValue(pMem);
   MemSetTypeFlag(pMem, MEM_Real);
   return SQLITE_OK;
diff -u sqlite/src/vdbeaux.c:1.447 sqlite/src/vdbeaux.c:1.448
--- sqlite/src/vdbeaux.c:1.447	Sun Apr  5 12:22:09 2009
+++ sqlite/src/vdbeaux.c	Mon Apr  6 11:11:43 2009
@@ -1099,6 +1099,7 @@
     }
     zCsr += (zCsr - (u8*)0)&7;
     assert( EIGHT_BYTE_ALIGNMENT(zCsr) );
+    if( zEnd<zCsr ) zEnd = zCsr;
 
     do {
       memset(zCsr, 0, zEnd-zCsr);


Index: sqlite.spec
===================================================================
RCS file: /cvs/pkgs/rpms/sqlite/devel/sqlite.spec,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- sqlite.spec	7 Apr 2009 08:35:41 -0000	1.56
+++ sqlite.spec	9 Apr 2009 14:58:48 -0000	1.57
@@ -6,7 +6,7 @@
 Summary: Library that implements an embeddable SQL database engine
 Name: sqlite
 Version: 3.6.12
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: Public Domain
 Group: 	Applications/Databases
 URL: http://www.sqlite.org/
@@ -16,6 +16,7 @@
 # Avoid insecure sprintf(), use a system path for lempar.c, patch from Debian
 Patch2: sqlite-3.6.6.2-lemon-snprintf.patch
 Patch3: sqlite-3.6.12-no-sqlite-doc.patch
+Patch4: sqlite-3.6.12-memalign.patch
 Obsoletes: sqlite3 sqlite3-devel
 BuildRequires: ncurses-devel readline-devel glibc-devel
 # libdl patch needs
@@ -79,6 +80,7 @@
 %patch1 -p1 -b .libdl
 %patch2 -p1 -b .lemon-sprintf
 %patch3 -p1 -b .no-sqlite-doc
+%patch4 -p1 -b .align
 
 %build
 autoconf
@@ -155,6 +157,9 @@
 %endif
 
 %changelog
+* Thu Apr 09 2009 Dennis Gilmore <dennis at ausil.us> - 3.6.12-3
+- apply upstream patch for memory alignment issue (#494906)
+
 * Tue Apr 07 2009 Panu Matilainen <pmatilai at redhat.com> - 3.6.12-2
 - disable strict aliasing to work around brokenness on 3.6.12 (#494266)
 - run test-suite on build but let it fail for now




More information about the scm-commits mailing list