am 6bbf67c1: Merge changes Ieecda65d,Idf3cbdab
# By Yongil Jang (1) and git-lg-database.lge.com (1)
# Via Gerrit Code Review (1) and git-lg-database.lge.com (1)
* commit '6bbf67c11ea1b7e8e9769113072c167e822fe73f':
Fix bugs of database corruption following IO error on systems supporting atomic-write
Fix bugs of sqlite that returns SIGBUS on disk full in WAL mode
diff --git a/dist/sqlite3.c b/dist/sqlite3.c
index 8cdf8de..a43031b 100644
--- a/dist/sqlite3.c
+++ b/dist/sqlite3.c
@@ -24853,6 +24853,13 @@
*/
#if SQLITE_OS_UNIX /* This file is used on unix only */
+/* Use posix_fallocate() if it is available
+*/
+#if !defined(HAVE_POSIX_FALLOCATE) \
+ && (_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L)
+# define HAVE_POSIX_FALLOCATE 1
+#endif
+
/*
** There are various methods for file locking used for concurrency
** control:
@@ -29091,11 +29098,19 @@
** the requested memory region.
*/
if( !bExtend ) goto shmpage_out;
+#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
+ if( osFallocate(pShmNode->h, sStat.st_size, nByte)!=0 ){
+ rc = unixLogError(SQLITE_FULL, "fallocate",
+ pShmNode->zFilename);
+ goto shmpage_out;
+ }
+#else
if( robust_ftruncate(pShmNode->h, nByte) ){
rc = unixLogError(SQLITE_IOERR_SHMSIZE, "ftruncate",
pShmNode->zFilename);
goto shmpage_out;
}
+#endif
}
}
@@ -72599,6 +72614,14 @@
assert(p->iSize<=p->nBuf);
rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0);
}
+ if( rc!=SQLITE_OK ){
+ /* If an error occurred while writing to the file, close it before
+ ** returning. This way, SQLite uses the in-memory journal data to
+ ** roll back changes made to the internal page-cache before this
+ ** function was called. */
+ sqlite3OsClose(pReal);
+ p->pReal = 0;
+ }
}
}
return rc;