]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Close SQLite sockets properly on failure
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 7 Mar 2013 19:36:42 +0000 (14:36 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 8 Mar 2013 03:39:42 +0000 (22:39 -0500)
src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c
src/modules/rlm_sql/sql.c

index f8ddf234a0957fad657c28932f559942e550da50..057f2d805c9c618cef61fe1054ba08855101a231 100644 (file)
@@ -68,7 +68,8 @@ static int sql_check_error(sqlite3 *db)
        case SQLITE_FULL:
        case SQLITE_CONSTRAINT:
        case SQLITE_MISMATCH:
-               radlog(L_ERR, "rlm_sql_sqlite: Error (%d)", error);
+               radlog(L_ERR, "rlm_sql_sqlite: Error (%d): %s", error,
+                      sqlite3_errmsg(db));
                
                return -1;
                break;
@@ -78,7 +79,7 @@ static int sql_check_error(sqlite3 *db)
         */
        default:
                radlog(L_ERR, "rlm_sql_sqlite: Handle is unusable, "
-                      "error (%d)", error);
+                      "error (%d): %s", error, sqlite3_errmsg(db));
                return SQL_DOWN;
                break;
        }
@@ -100,6 +101,34 @@ static int sql_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config)
                                                       config->sql_db));
        }
        
+static int sql_close(rlm_sql_handle_t *handle,
+                    UNUSED rlm_sql_config_t *config)
+{
+       int status = 0;
+       rlm_sql_conn_t *conn = handle->conn;
+       
+       if (conn && conn->db) {
+               sqlite3_close(conn->db);
+               conn->db = NULL;
+       }
+       
+       if (status != SQLITE_OK) {
+               return -1;
+       }
+       
+       return 0;
+}
+
+
+static int sql_destroy_socket(rlm_sql_handle_t *handle,
+                             UNUSED rlm_sql_config_t *config)
+{
+       if (!handle->conn) {
+               return 0;
+       }
+
+       TALLOC_FREE(handle->conn);
+       
        return 0;
 }
 
@@ -118,8 +147,16 @@ static int sql_init_socket(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
        status = sqlite3_open_v2(driver->filename, &(conn->db),
                                 SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX,
                                 NULL);
-       if (status != SQLITE_OK) {
-               return sql_check_error(conn->db);
+       if (!conn->db) {
+               radlog(L_ERR, "rlm_sql_sqlite: Failed creating "
+                      "opening/creating SQLite database error "
+                      "code (%u)", status);
+                      
+               goto error;
+       }
+       
+       if (sql_check_error(conn->db)) {
+               goto close;
        }
        
        /*
@@ -127,19 +164,19 @@ static int sql_init_socket(rlm_sql_handle_t *handle, rlm_sql_config_t *config)
         */
        status = sqlite3_extended_result_codes(conn->db, 1);
        
-       return sql_check_error(conn->db);
-}
-
-static int sql_destroy_socket(rlm_sql_handle_t *handle,
-                             UNUSED rlm_sql_config_t *config)
-{
-       if (!handle->conn) {
-               return 0;
+       if (sql_check_error(conn->db)) {
+               goto close;
        }
-
-       TALLOC_FREE(handle->conn);
        
        return 0;
+       
+       close:
+       sql_close(handle, config);
+       
+       error:
+       sql_destroy_socket(handle, config);
+       
+       return -1;
 }
 
 static int sql_select_query(rlm_sql_handle_t * handle,
@@ -335,24 +372,6 @@ static const char *sql_error(rlm_sql_handle_t *handle,
        return "Invalid handle";
 }
 
-static int sql_close(rlm_sql_handle_t *handle,
-                    UNUSED rlm_sql_config_t *config)
-{
-       int status = 0;
-       rlm_sql_conn_t *conn = handle->conn;
-       
-       if (conn && conn->db) {
-               status = sqlite3_close(conn->db);
-               conn->db = NULL;
-       }
-       
-       if (status != SQLITE_OK) {
-               return -1;
-       }
-       
-       return 0;
-}
-
 static int sql_finish_query(rlm_sql_handle_t *handle,
                            UNUSED rlm_sql_config_t *config)
 {
index 6fc963a4bab426c68d153684a9abb5d887905bae..13560250e159a18e0f4f2b3d962c9bb6f8fc493e 100644 (file)
@@ -82,10 +82,6 @@ static void *sql_conn_create(void *ctx)
                return handle;
        }
 
-       radlog(L_ERR, "rlm_sql (%s): Error opening connection: %s",
-              inst->config->xlat_name,
-              (inst->module->sql_error)(handle, inst->config));
-
        exec_trigger(NULL, inst->cs, "modules.sql.fail", TRUE);
 
        talloc_free(handle);