]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sql: driver-sqlite - Handle permission errors when opening database
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 12 Jan 2023 14:44:18 +0000 (16:44 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 25 Jan 2023 09:02:57 +0000 (09:02 +0000)
src/lib-sql/driver-sqlite.c

index 5c03803b246b35a0f159be125c505a70e3c5462d..66bcccb1c11b9e93e72c71d44ee41d6fb112708a 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "eacces-error.h"
 #include "array.h"
 #include "ioloop.h"
 #include "str.h"
@@ -11,6 +12,7 @@
 
 #ifdef BUILD_SQLITE
 #include <sqlite3.h>
+#include <sys/stat.h>
 
 /* retry time if db is busy (in ms) */
 static const int sqlite_busy_timeout = 1000;
@@ -50,6 +52,7 @@ static struct event_category event_category_sqlite = {
 
 static int driver_sqlite_connect(struct sql_db *_db)
 {
+       struct stat st;
        struct sqlite_db *db = container_of(_db, struct sqlite_db, api);
        /* this is default for sqlite_open */
        int flags;
@@ -71,16 +74,29 @@ static int driver_sqlite_connect(struct sql_db *_db)
                db->connected = TRUE;
                sqlite3_busy_timeout(db->sqlite, sqlite_busy_timeout);
                return 1;
+       case SQLITE_READONLY:
+       case SQLITE_CANTOPEN:
+       case SQLITE_PERM:
+               if (stat(db->dbfile, &st) == -1 && errno == ENOENT) {
+                       e_error(_db->event, "%s",
+                               eacces_error_get_creating("creat", db->dbfile));
+               } else {
+                       e_error(_db->event, "%s",
+                               eacces_error_get("open", db->dbfile));
+               }
+               break;
        case SQLITE_NOMEM:
                i_fatal_status(FATAL_OUTOFMEM, "open(%s) failed: %s",
                               db->dbfile, sqlite3_errmsg(db->sqlite));
        default:
                e_error(_db->event, "open(%s) failed: %s", db->dbfile,
                        sqlite3_errmsg(db->sqlite));
-               sqlite3_close(db->sqlite);
-               db->sqlite = NULL;
-               return -1;
+               break;
        }
+
+       sqlite3_close(db->sqlite);
+       db->sqlite = NULL;
+       return -1;
 }
 
 static void driver_sqlite_disconnect(struct sql_db *_db)