]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Only call fchown when running as root and supporting files mismatch the database...
authoradam <adam@noemail.net>
Thu, 31 May 2012 00:21:28 +0000 (00:21 +0000)
committeradam <adam@noemail.net>
Thu, 31 May 2012 00:21:28 +0000 (00:21 +0000)
FossilOrigin-Name: ed53b645cc791e2c75885866ecb668fff14f8e7e

manifest
manifest.uuid
src/os_unix.c

index 33b5a9beeaf1553243dc8bd59a3bf1d6a89ac88a..7d6b945e1e083ff24ce89489765ec7b6d2701f9a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.7.12.1
-D 2012-05-22T13:11:12.948
+C Only\scall\sfchown\swhen\srunning\sas\sroot\sand\ssupporting\sfiles\smismatch\sthe\sdatabase\sowner\s&\sperms
+D 2012-05-31T00:21:28.876
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 957c9693400fca6cb8b533b589e69ddee7bcb27c
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -162,7 +162,7 @@ F src/os.c 4c8c8d72a6c58ad2fde4865783e8ae26b494a85e
 F src/os.h 59beba555b65a450bd1d804220532971d4299f60
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
 F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
-F src/os_unix.c d0eeadc475783bf595646da42bd263ec9063e267
+F src/os_unix.c 1f91f7309b09950ffdad97dc57d139894904a621
 F src/os_win.c 24b57b4aec07ec78ae759244ab6d9759a70fe29b
 F src/pager.c 544cc84d50fea0ca921d448037b217ecabba359b
 F src/pager.h 42926ac0fe69e9d7e17a54e6b37417e581a429d7
@@ -1003,7 +1003,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh a8a0a3babda96dfb1ff51adda3cbbf3dfb7266c2
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 4068abe05c3a94c9ac7cff72b77fb8e47a2b1a5d 6d326d44fd1d626aae0e8456e5fa2049f1ce0789
-R c922f8f99b5b09d1465707239bb63cb8
-U drh
-Z 7d8c65e663650788e8582bc64982bc90
+P 972e75bb5d7349297b94cec2f19561ee105a22cf
+R dc2606f2c7e5fe470f213999e83f4d98
+U adam
+Z f9040a054a2aa40cbe8724b598475c77
index 72b478a252a46060f10615ff880b0fc08c00b53e..57cce91ce07f6b27275a5c0882e016a2f5e5db19 100644 (file)
@@ -1 +1 @@
-972e75bb5d7349297b94cec2f19561ee105a22cf
\ No newline at end of file
+ed53b645cc791e2c75885866ecb668fff14f8e7e
\ No newline at end of file
index 8a8a4ebede0946d77c6f6fa09775963ba2f1407b..1582173e9f404265716a2a0545f637a55c00148c 100644 (file)
@@ -4704,17 +4704,6 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
         goto shm_open_err;
       }
 
-      /* If this process is running as root, make sure that the SHM file
-      ** is owned by the same user that owns the original database.  Otherwise,
-      ** the original owner will not be able to connect. If this process is
-      ** not root, the following fchown() will fail, but we don't care.  The
-      ** if(){..} and the UNIXFILE_CHOWN flag are purely to silence compiler
-      ** warnings.
-      */
-      if( osFchown(pShmNode->h, sStat.st_uid, sStat.st_gid)==0 ){
-        pDbFd->ctrlFlags |= UNIXFILE_CHOWN;
-      }
-  
       /* Check to see if another process is holding the dead-man switch.
       ** If not, truncate the file to zero length. 
       */
@@ -4726,9 +4715,11 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
           /* If running as root set the uid/gid of the shm file to match
           ** the database */
           uid_t euid = geteuid();
-          if( euid==0 && (euid!=sStat.st_uid || getegid()!=sStat.st_gid) ){
-            if( fchown(pShmNode->h, sStat.st_uid, sStat.st_gid) ){
+          if( (!pShmNode->isReadonly) && euid==0 && (euid!=sStat.st_uid || getegid()!=sStat.st_gid) ){
+            if( osFchown(pShmNode->h, sStat.st_uid, sStat.st_gid) ){
               rc = SQLITE_IOERR_SHMOPEN;
+            }else{
+              pDbFd->ctrlFlags |= UNIXFILE_CHOWN;
             }
           }
         }
@@ -5257,12 +5248,17 @@ static int unixTruncateDatabase(unixFile *pFile, int bFlags) {
   if( (bFlags&SQLITE_TRUNCATE_INITIALIZE_HEADER_MASK)!=0 ){
     /* initialize a new database in TMPDIR and copy the contents over */
     const char *tDir = unixTempFileDir();
-    int tLen = sizeof(char) * (strlen(tDir) + 11);
+    int tDirLen = strlen(tDir);
+    int tLen = sizeof(char) * (tDirLen + 12);
     char *tDbPath = (char *)malloc(tLen);
     int tFd = -1;
     
     strlcpy(tDbPath, tDir, tLen);
-    strlcat(tDbPath, "tmpdbXXXXX", tLen);
+    if( tDbPath[(tDirLen-1)] != '/' ){
+      strlcat(tDbPath, "/tmpdbXXXXX", tLen);
+    } else {
+      strlcat(tDbPath, "tmpdbXXXXX", tLen);
+    }
     tFd = mkstemp(tDbPath);
     if( tFd==-1 ){
       storeLastErrno(pFile, errno);
@@ -6352,23 +6348,13 @@ static int unixOpen(
     if( !isReadonly && (flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL)) ){
       uid_t euid = geteuid();
       if( euid==0 && (euid!=uid || getegid()!=gid) ){
-        if( fchown(fd, uid, gid) ){
+        if( osFchown(fd, uid, gid) ){
           rc = SQLITE_CANTOPEN_BKPT;
           goto open_finished;
         }
+        p->ctrlFlags |= UNIXFILE_CHOWN;
       }
     }
-
-    /* If this process is running as root and if creating a new rollback
-    ** journal or WAL file, set the ownership of the journal or WAL to be
-    ** the same as the original database.  If we are not running as root,
-    ** then the fchown() call will fail, but that's ok.  The "if(){}" and
-    ** the setting of the UNIXFILE_CHOWN flag are purely to silence compiler
-    ** warnings from gcc.
-    */
-    if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){
-      if( osFchown(fd, uid, gid)==0 ){ p->ctrlFlags |= UNIXFILE_CHOWN; }
-    }
   }
   assert( fd>=0 );
   if( pOutFlags ){