Fix bugs of sqlite that returns SIGBUS on disk full in WAL mode

Attempts to prepare a query on a WAL database when the disk space is
critically low result in the process killed with SIGBUS.
The crash happens in walIndexWriteHdr invoked from walIndexRecover.

Some Providers that using WAL mode like as SettingsProvider and MediaProvider
get failed in case of disk full with SIGBUS.
This patch changes unixShmMap() to call fallocate() instead of ftruncate.
In case of disk full, fallocate() will return SQLITE_FULL.

This patch is originated from www.sqlite.org.
(URL: http://www.sqlite.org/src/info/5eaa61ea18)
To simplify error status, returned error code is changed
from SQLITE_IOERR_SHMSIZE to SQLITE_FULL.

[written by Yongil Jang <yi.jang@lge.com>]

Change-Id: Idf3cbdab1ed4a4f2bc1b2b93ab6d8900edc7ee05
diff --git a/dist/sqlite3.c b/dist/sqlite3.c
index abe6186..9d01a51 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
       }
     }