[dovecot-cvs] dovecot/src/lib-storage mail-copy.c, 1.5, 1.6 mail-storage.c, 1.45, 1.46 mail-storage.h, 1.101, 1.102 mail.c, 1.3, 1.4

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


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

Modified Files:
	mail-copy.c mail-storage.c mail-storage.h mail.c 
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: mail-copy.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/mail-copy.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- mail-copy.c	7 Oct 2005 09:34:08 -0000	1.5
+++ mail-copy.c	14 Jan 2006 18:47:41 -0000	1.6
@@ -29,9 +29,9 @@
 	}
 
 	if (input->stream_errno != 0) {
-		mailbox_save_cancel(ctx);
+		mailbox_save_cancel(&ctx);
 		return -1;
 	}
 
-	return mailbox_save_finish(ctx, dest_mail);
+	return mailbox_save_finish(&ctx, dest_mail);
 }

Index: mail-storage.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/mail-storage.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- mail-storage.c	13 Jan 2006 20:26:24 -0000	1.45
+++ mail-storage.c	14 Jan 2006 18:47:41 -0000	1.46
@@ -145,10 +145,13 @@
 	return storage;
 }
 
-void mail_storage_destroy(struct mail_storage *storage)
+void mail_storage_destroy(struct mail_storage **_storage)
 {
+	struct mail_storage *storage = *_storage;
+
 	i_assert(storage != NULL);
 
+	*_storage = NULL;
 	storage->v.destroy(storage);
 }
 
@@ -265,8 +268,11 @@
 	return ctx->storage->v.mailbox_list_next(ctx);
 }
 
-int mail_storage_mailbox_list_deinit(struct mailbox_list_context *ctx)
+int mail_storage_mailbox_list_deinit(struct mailbox_list_context **_ctx)
 {
+	struct mailbox_list_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	return ctx->storage->v.mailbox_list_deinit(ctx);
 }
 
@@ -298,8 +304,11 @@
 	return storage->v.mailbox_open(storage, name, input, flags);
 }
 
-int mailbox_close(struct mailbox *box)
+int mailbox_close(struct mailbox **_box)
 {
+	struct mailbox *box = *_box;
+
+	*_box = NULL;
 	return box->v.close(box);
 }
 
@@ -342,9 +351,12 @@
 	return ctx->box->v.sync_next(ctx, sync_rec_r);
 }
 
-int mailbox_sync_deinit(struct mailbox_sync_context *ctx,
+int mailbox_sync_deinit(struct mailbox_sync_context **_ctx,
 			struct mailbox_status *status_r)
 {
+	struct mailbox_sync_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	return ctx->box->v.sync_deinit(ctx, status_r);
 }
 
@@ -362,8 +374,11 @@
 }
 
 void mailbox_keywords_free(struct mailbox_transaction_context *t,
-			   struct mail_keywords *keywords)
+			   struct mail_keywords **_keywords)
 {
+	struct mail_keywords *keywords = *_keywords;
+
+	*_keywords = NULL;
 	t->box->v.keywords_free(t, keywords);
 }
 
@@ -379,8 +394,11 @@
 	return box->v.header_lookup_init(box, headers);
 }
 
-void mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx *ctx)
+void mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx **_ctx)
 {
+	struct mailbox_header_lookup_ctx *ctx = *_ctx;
+
+	*_ctx = NULL;
 	ctx->box->v.header_lookup_deinit(ctx);
 }
 
@@ -398,8 +416,11 @@
 	return t->box->v.search_init(t, charset, args, sort_program);
 }
 
-int mailbox_search_deinit(struct mail_search_context *ctx)
+int mailbox_search_deinit(struct mail_search_context **_ctx)
 {
+	struct mail_search_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	return ctx->transaction->box->v.search_deinit(ctx);
 }
 
@@ -415,14 +436,20 @@
 	return box->v.transaction_begin(box, flags);
 }
 
-int mailbox_transaction_commit(struct mailbox_transaction_context *t,
+int mailbox_transaction_commit(struct mailbox_transaction_context **_t,
 			       enum mailbox_sync_flags flags)
 {
+	struct mailbox_transaction_context *t = *_t;
+
+	*_t = NULL;
 	return t->box->v.transaction_commit(t, flags);
 }
 
-void mailbox_transaction_rollback(struct mailbox_transaction_context *t)
+void mailbox_transaction_rollback(struct mailbox_transaction_context **_t)
 {
+	struct mailbox_transaction_context *t = *_t;
+
+	*_t = NULL;
 	t->box->v.transaction_rollback(t);
 }
 
@@ -443,13 +470,19 @@
 	return ctx->transaction->box->v.save_continue(ctx);
 }
 
-int mailbox_save_finish(struct mail_save_context *ctx, struct mail *dest_mail)
+int mailbox_save_finish(struct mail_save_context **_ctx, struct mail *dest_mail)
 {
+	struct mail_save_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	return ctx->transaction->box->v.save_finish(ctx, dest_mail);
 }
 
-void mailbox_save_cancel(struct mail_save_context *ctx)
+void mailbox_save_cancel(struct mail_save_context **_ctx)
 {
+	struct mail_save_context *ctx = *_ctx;
+
+	*_ctx = NULL;
 	ctx->transaction->box->v.save_cancel(ctx);
 }
 

Index: mail-storage.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/mail-storage.h,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -d -r1.101 -r1.102
--- mail-storage.h	13 Jan 2006 20:26:24 -0000	1.101
+++ mail-storage.h	14 Jan 2006 18:47:41 -0000	1.102
@@ -223,7 +223,7 @@
 mail_storage_create(const char *name, const char *data, const char *user,
 		    enum mail_storage_flags flags,
 		    enum mail_storage_lock_method lock_method);
-void mail_storage_destroy(struct mail_storage *storage);
+void mail_storage_destroy(struct mail_storage **storage);
 
 struct mail_storage *
 mail_storage_create_default(const char *user, enum mail_storage_flags flags,
@@ -271,7 +271,7 @@
 mail_storage_mailbox_list_next(struct mailbox_list_context *ctx);
 /* Deinitialize mailbox list request. Returns FALSE if some error
    occurred while listing. */
-int mail_storage_mailbox_list_deinit(struct mailbox_list_context *ctx);
+int mail_storage_mailbox_list_deinit(struct mailbox_list_context **ctx);
 
 /* Subscribe/unsubscribe mailbox. There should be no error when
    subscribing to already subscribed mailbox. Subscribing to
@@ -300,7 +300,7 @@
 			     enum mailbox_open_flags flags);
 /* Close the box. Returns -1 if some cleanup errors occurred, but
    the mailbox was closed anyway. */
-int mailbox_close(struct mailbox *box);
+int mailbox_close(struct mailbox **box);
 
 /* Returns storage of given mailbox */
 struct mail_storage *mailbox_get_storage(struct mailbox *box);
@@ -323,7 +323,7 @@
 mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags);
 int mailbox_sync_next(struct mailbox_sync_context *ctx,
 		      struct mailbox_sync_rec *sync_rec_r);
-int mailbox_sync_deinit(struct mailbox_sync_context *ctx,
+int mailbox_sync_deinit(struct mailbox_sync_context **ctx,
 			struct mailbox_status *status_r);
 
 /* Call given callback function when something changes in the mailbox.
@@ -334,16 +334,16 @@
 struct mailbox_transaction_context *
 mailbox_transaction_begin(struct mailbox *box,
 			  enum mailbox_transaction_flags flags);
-int mailbox_transaction_commit(struct mailbox_transaction_context *t,
+int mailbox_transaction_commit(struct mailbox_transaction_context **t,
 			       enum mailbox_sync_flags flags);
-void mailbox_transaction_rollback(struct mailbox_transaction_context *t);
+void mailbox_transaction_rollback(struct mailbox_transaction_context **t);
 
 /* Build mail_keywords from NULL-terminated keywords list. */
 struct mail_keywords *
 mailbox_keywords_create(struct mailbox_transaction_context *t,
 			const char *const keywords[]);
 void mailbox_keywords_free(struct mailbox_transaction_context *t,
-			   struct mail_keywords *keywords);
+			   struct mail_keywords **keywords);
 
 /* Convert uid range to sequence range. */
 int mailbox_get_uids(struct mailbox *box, uint32_t uid1, uint32_t uid2,
@@ -352,7 +352,7 @@
 /* Initialize header lookup for given headers. */
 struct mailbox_header_lookup_ctx *
 mailbox_header_lookup_init(struct mailbox *box, const char *const headers[]);
-void mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx *ctx);
+void mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx **ctx);
 
 /* Modify sort_program to specify a sort program acceptable for
    search_init(). If mailbox supports no sorting, it's simply set to
@@ -370,7 +370,7 @@
 		    const char *charset, struct mail_search_arg *args,
 		    const enum mail_sort_type *sort_program);
 /* Deinitialize search request. */
-int mailbox_search_deinit(struct mail_search_context *ctx);
+int mailbox_search_deinit(struct mail_search_context **ctx);
 /* Search the next message. Returns 1 if found, 0 if not, -1 if failure. */
 int mailbox_search_next(struct mail_search_context *ctx, struct mail *mail);
 
@@ -388,8 +388,8 @@
 		  const char *from_envelope, struct istream *input,
 		  bool want_mail);
 int mailbox_save_continue(struct mail_save_context *ctx);
-int mailbox_save_finish(struct mail_save_context *ctx, struct mail *dest_mail);
-void mailbox_save_cancel(struct mail_save_context *ctx);
+int mailbox_save_finish(struct mail_save_context **ctx, struct mail *dest_mail);
+void mailbox_save_cancel(struct mail_save_context **ctx);
 
 /* Copy given message. If dest_mail is non-NULL, the copied message can be
    accessed using it. Note that setting it non-NULL may require mailbox
@@ -415,7 +415,7 @@
 struct mail *mail_alloc(struct mailbox_transaction_context *t,
 			enum mail_fetch_field wanted_fields,
 			struct mailbox_header_lookup_ctx *wanted_headers);
-void mail_free(struct mail *mail);
+void mail_free(struct mail **mail);
 int mail_set_seq(struct mail *mail, uint32_t seq);
 
 /* Get the time message was received (IMAP INTERNALDATE).

Index: mail.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/mail.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mail.c	12 Apr 2005 11:29:48 -0000	1.3
+++ mail.c	14 Jan 2006 18:47:41 -0000	1.4
@@ -11,11 +11,12 @@
 	return t->box->v.mail_alloc(t, wanted_fields, wanted_headers);
 }
 
-void mail_free(struct mail *mail)
+void mail_free(struct mail **mail)
 {
-	struct mail_private *p = (struct mail_private *)mail;
+	struct mail_private *p = (struct mail_private *)*mail;
 
-	p->v.free(mail);
+	p->v.free(*mail);
+	*mail = NULL;
 }
 
 int mail_set_seq(struct mail *mail, uint32_t seq)



More information about the dovecot-cvs mailing list