[dovecot-cvs] dovecot/src/lib-sql driver-mysql.c, 1.12, 1.13 driver-pgsql.c, 1.7, 1.8 sql-api.c, 1.5, 1.6 sql-api.h, 1.5, 1.6

cras at dovecot.org cras at dovecot.org
Sat Jan 14 20:47:43 EET 2006


Update of /var/lib/cvs/dovecot/src/lib-sql
In directory talvi:/tmp/cvs-serv16037/lib-sql

Modified Files:
	driver-mysql.c driver-pgsql.c sql-api.c sql-api.h 
Log Message:
deinit, unref, destroy, close, free, etc. functions now take a pointer to
their data pointer, and set it to NULL. This makes double-frees less likely
to cause security holes.



Index: driver-mysql.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/driver-mysql.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- driver-mysql.c	13 Jan 2006 20:26:24 -0000	1.12
+++ driver-mysql.c	14 Jan 2006 18:47:40 -0000	1.13
@@ -510,7 +510,7 @@
 {
 	const char *error;
 
-	if (sql_transaction_commit_s(ctx, &error) < 0)
+	if (sql_transaction_commit_s(&ctx, &error) < 0)
 		callback(error, context);
 	else
 		callback(NULL, context);
@@ -537,7 +537,7 @@
 		}
 		sql_result_free(result);
 	}
-	sql_transaction_rollback(_ctx);
+	sql_transaction_rollback(&_ctx);
 	return ret;
 }
 
@@ -547,7 +547,7 @@
 	struct mysql_transaction_context *ctx =
 		(struct mysql_transaction_context *)_ctx;
 
-	str_free(ctx->queries);
+	str_free(&ctx->queries);
 	i_free(ctx);
 }
 

Index: driver-pgsql.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/driver-pgsql.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- driver-pgsql.c	13 Jan 2006 20:26:24 -0000	1.7
+++ driver-pgsql.c	14 Jan 2006 18:47:40 -0000	1.8
@@ -72,10 +72,8 @@
 
 static void driver_pgsql_close(struct pgsql_db *db)
 {
-	if (db->io != NULL) {
-		io_remove(db->io);
-		db->io = NULL;
-	}
+	if (db->io != NULL)
+		io_remove(&db->io);
 	db->io_dir = 0;
 
 	PQfinish(db->pg);
@@ -131,7 +129,7 @@
 
 	if (db->io_dir != io_dir) {
 		if (db->io != NULL)
-			io_remove(db->io);
+			io_remove(&db->io);
 		db->io = io_dir == 0 ? NULL :
 			io_add(PQsocket(db->pg), io_dir, connect_callback, db);
 		db->io_dir = io_dir;
@@ -211,8 +209,7 @@
 
 	} while (PQgetResult(db->pg) != NULL);
 
-	io_remove(db->io);
-	db->io = NULL;
+	io_remove(&db->io);
 
 	db->querying = FALSE;
 	if (db->queue != NULL && db->connected)
@@ -283,10 +280,8 @@
 		return;
 	}
 
-	if (db->io != NULL) {
-		io_remove(db->io);
-		db->io = NULL;
-	}
+	if (db->io != NULL)
+		io_remove(&db->io);
 
 	result->pgres = PQgetResult(db->pg);
 	result_finish(result);
@@ -302,8 +297,7 @@
 	if (ret > 0)
 		return;
 
-	io_remove(db->io);
-        db->io = NULL;
+	io_remove(&db->io);
 
 	if (ret < 0) {
 		db->connected = FALSE;
@@ -375,10 +369,8 @@
 	if (db->queue != NULL)
 		queue_send_next(db);
 
-	if (db->queue == NULL) {
-		timeout_remove(db->queue_to);
-                db->queue_to = NULL;
-	}
+	if (db->queue == NULL)
+		timeout_remove(&db->queue_to);
 }
 
 static void
@@ -477,7 +469,7 @@
 	else {
 		/* have to move our existing I/O handler to new I/O loop */
 		old_io = *db->io;
-		io_remove(db->io);
+		io_remove(&db->io);
 
 		db->ioloop = io_loop_create(default_pool);
 
@@ -488,8 +480,7 @@
 	driver_pgsql_query(_db, query, pgsql_query_s_callback, db);
 
 	io_loop_run(db->ioloop);
-	io_loop_destroy(db->ioloop);
-	db->ioloop = NULL;
+	io_loop_destroy(&db->ioloop);
 
 	i_assert(db->io == NULL);
 

Index: sql-api.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/sql-api.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- sql-api.c	10 Dec 2005 18:57:11 -0000	1.5
+++ sql-api.c	14 Jan 2006 18:47:40 -0000	1.6
@@ -26,9 +26,10 @@
 	i_fatal("Unknown database driver '%s'", db_driver);
 }
 
-void sql_deinit(struct sql_db *db)
+void sql_deinit(struct sql_db **db)
 {
-	db->deinit(db);
+	(*db)->deinit(*db);
+	*db = NULL;
 }
 
 enum sql_db_flags sql_get_flags(struct sql_db *db)
@@ -127,20 +128,29 @@
 	return db->transaction_begin(db);
 }
 
-void sql_transaction_commit(struct sql_transaction_context *ctx,
+void sql_transaction_commit(struct sql_transaction_context **_ctx,
 			    sql_commit_callback_t *callback, void *context)
 {
+	struct sql_transaction_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	ctx->db->transaction_commit(ctx, callback, context);
 }
 
-int sql_transaction_commit_s(struct sql_transaction_context *ctx,
+int sql_transaction_commit_s(struct sql_transaction_context **_ctx,
 			     const char **error_r)
 {
+	struct sql_transaction_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	return ctx->db->transaction_commit_s(ctx, error_r);
 }
 
-void sql_transaction_rollback(struct sql_transaction_context *ctx)
+void sql_transaction_rollback(struct sql_transaction_context **_ctx)
 {
+	struct sql_transaction_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	ctx->db->transaction_rollback(ctx);
 }
 

Index: sql-api.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-sql/sql-api.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- sql-api.h	10 Dec 2005 18:57:11 -0000	1.5
+++ sql-api.h	14 Jan 2006 18:47:40 -0000	1.6
@@ -20,7 +20,7 @@
 /* Initialize database connections. db_driver is the database driver name,
    eg. "mysql" or "pgsql". connect_string is driver-specific. */
 struct sql_db *sql_init(const char *db_driver, const char *connect_string);
-void sql_deinit(struct sql_db *db);
+void sql_deinit(struct sql_db **db);
 
 /* Returns SQL database state flags. */
 enum sql_db_flags sql_get_flags(struct sql_db *db);
@@ -68,12 +68,12 @@
    transaction at a time. */
 struct sql_transaction_context *sql_transaction_begin(struct sql_db *db);
 /* Commit transaction. */
-void sql_transaction_commit(struct sql_transaction_context *ctx,
+void sql_transaction_commit(struct sql_transaction_context **ctx,
 			    sql_commit_callback_t *callback, void *context);
 /* Synchronous commit. Returns 0 if ok, -1 if error. */
-int sql_transaction_commit_s(struct sql_transaction_context *ctx,
+int sql_transaction_commit_s(struct sql_transaction_context **ctx,
 			     const char **error_r);
-void sql_transaction_rollback(struct sql_transaction_context *ctx);
+void sql_transaction_rollback(struct sql_transaction_context **ctx);
 
 /* Execute query in given transaction. */
 void sql_update(struct sql_transaction_context *ctx, const char *query);



More information about the dovecot-cvs mailing list