[dovecot-cvs] dovecot/src/lib-mail istream-header-filter.c, 1.32, 1.33 message-body-search.c, 1.25, 1.26 message-header-search.c, 1.16, 1.17 message-header-search.h, 1.5, 1.6 message-parser.c, 1.70, 1.71 message-parser.h, 1.29, 1.30

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


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

Modified Files:
	istream-header-filter.c message-body-search.c 
	message-header-search.c message-header-search.h 
	message-parser.c message-parser.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: istream-header-filter.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/istream-header-filter.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- istream-header-filter.c	13 Jan 2006 20:26:16 -0000	1.32
+++ istream-header-filter.c	14 Jan 2006 18:47:35 -0000	1.33
@@ -45,8 +45,8 @@
 		(struct header_filter_istream *)stream;
 
 	if (mstream->hdr_ctx != NULL)
-		message_parse_header_deinit(mstream->hdr_ctx);
-	i_stream_unref(mstream->input);
+		message_parse_header_deinit(&mstream->hdr_ctx);
+	i_stream_unref(&mstream->input);
 	pool_unref(mstream->pool);
 }
 
@@ -166,7 +166,7 @@
 
 	if (hdr == NULL) {
 		/* finished */
-		message_parse_header_deinit(mstream->hdr_ctx);
+		message_parse_header_deinit(&mstream->hdr_ctx);
 		mstream->hdr_ctx = NULL;
 
 		if (!mstream->header_parsed && mstream->callback != NULL)
@@ -255,7 +255,7 @@
 	stream->buffer = NULL;
 
 	if (mstream->hdr_ctx != NULL) {
-		message_parse_header_deinit(mstream->hdr_ctx);
+		message_parse_header_deinit(&mstream->hdr_ctx);
 		mstream->hdr_ctx = NULL;
 	}
 

Index: message-body-search.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-body-search.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- message-body-search.c	13 Jan 2006 20:26:16 -0000	1.25
+++ message-body-search.c	14 Jan 2006 18:47:35 -0000	1.26
@@ -155,7 +155,7 @@
 		}
 	}
 	i_assert(ret != 0);
-	message_parse_header_deinit(hdr_ctx);
+	message_parse_header_deinit(&hdr_ctx);
 
 	return found;
 }
@@ -346,10 +346,10 @@
 		pos -= data_size;
 	}
 
-	i_stream_unref(input);
+	i_stream_unref(&input);
 
 	if (ctx->translation != NULL)
-		charset_to_utf8_end(ctx->translation);
+		charset_to_utf8_end(&ctx->translation);
 	buffer_free(ctx->decode_buf);
 	return found;
 }

Index: message-header-search.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-header-search.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- message-header-search.c	13 Jan 2006 20:26:16 -0000	1.16
+++ message-header-search.c	14 Jan 2006 18:47:35 -0000	1.17
@@ -71,8 +71,9 @@
 	return ctx;
 }
 
-void message_header_search_free(struct header_search_context *ctx)
+void message_header_search_free(struct header_search_context **_ctx)
 {
+        struct header_search_context *ctx = *_ctx;
 	pool_t pool;
 
 	buffer_free(ctx->match_buf);
@@ -81,6 +82,8 @@
 	p_free(pool, ctx->key);
 	p_free(pool, ctx->key_charset);
 	p_free(pool, ctx);
+
+	*_ctx = NULL;
 }
 
 static void search_with_charset(const unsigned char *data, size_t size,

Index: message-header-search.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-header-search.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- message-header-search.h	13 Jan 2006 20:26:16 -0000	1.5
+++ message-header-search.h	14 Jan 2006 18:47:35 -0000	1.6
@@ -10,7 +10,7 @@
 			   bool *unknown_charset);
 
 /* Free search context. Not needed if you just destroy the pool. */
-void message_header_search_free(struct header_search_context *ctx);
+void message_header_search_free(struct header_search_context **ctx);
 
 /* Returns TRUE if key is found from header. This function may be called
    multiple times with partial header blocks, but the blocks must contain only

Index: message-parser.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-parser.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- message-parser.c	13 Jan 2006 20:26:16 -0000	1.70
+++ message-parser.c	14 Jan 2006 18:47:35 -0000	1.71
@@ -253,7 +253,7 @@
 		parser_ctx->callback(part, NULL, parser_ctx->context);
 	if (hdr_ctx->has_nuls)
 		part->flags |= MESSAGE_PART_FLAG_HAS_NULS;
-	message_parse_header_deinit(hdr_ctx);
+	message_parse_header_deinit(&hdr_ctx);
 
 	i_assert((part->flags & MUTEX_FLAGS) != MUTEX_FLAGS);
 }
@@ -587,10 +587,12 @@
 	return ctx;
 }
 
-struct message_part *message_parser_deinit(struct message_parser_ctx *ctx)
+struct message_part *message_parser_deinit(struct message_parser_ctx **_ctx)
 {
+        struct message_parser_ctx *ctx = *_ctx;
 	struct message_part *parts = ctx->parts;
 
+	*_ctx = NULL;
 	pool_unref(ctx->parser_pool);
 	return parts;
 }
@@ -658,7 +660,7 @@
 	while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0)
 		callback(part, hdr, context);
 	i_assert(ret != 0);
-	message_parse_header_deinit(hdr_ctx);
+	message_parse_header_deinit(&hdr_ctx);
 
 	/* call after the final skipping */
 	callback(part, NULL, context);
@@ -681,13 +683,17 @@
 	return ctx;
 }
 
-void message_parse_header_deinit(struct message_header_parser_ctx *ctx)
+void message_parse_header_deinit(struct message_header_parser_ctx **_ctx)
 {
+	struct message_header_parser_ctx *ctx = *_ctx;
+
 	i_stream_skip(ctx->input, ctx->skip);
 	if (ctx->value_buf != NULL)
 		buffer_free(ctx->value_buf);
-	str_free(ctx->name);
+	str_free(&ctx->name);
 	i_free(ctx);
+
+	*_ctx = NULL;
 }
 
 int message_parse_header_next(struct message_header_parser_ctx *ctx,

Index: message-parser.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-mail/message-parser.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- message-parser.h	13 Jan 2006 20:26:16 -0000	1.29
+++ message-parser.h	14 Jan 2006 18:47:35 -0000	1.30
@@ -84,7 +84,7 @@
    are allocated from. */
 struct message_parser_ctx *
 message_parser_init(pool_t part_pool, struct istream *input);
-struct message_part *message_parser_deinit(struct message_parser_ctx *ctx);
+struct message_part *message_parser_deinit(struct message_parser_ctx **ctx);
 
 /* Read and parse header. */
 void message_parser_parse_header(struct message_parser_ctx *ctx,
@@ -106,7 +106,7 @@
 struct message_header_parser_ctx *
 message_parse_header_init(struct istream *input, struct message_size *hdr_size,
 			 bool skip_initial_lwsp);
-void message_parse_header_deinit(struct message_header_parser_ctx *ctx);
+void message_parse_header_deinit(struct message_header_parser_ctx **ctx);
 
 /* Read and return next header line. Returns 1 if header is returned, 0 if
    input stream is non-blocking and more data needs to be read, -1 when all is



More information about the dovecot-cvs mailing list