commit 4032aa94f43f1cdf535b2011c0b5a03f64214351
Author: Oswald Buddenhagen <[email protected]>
Date: Sun Mar 13 14:24:15 2011 +0100
centralize imap_cmd disposal
src/drv_imap.c | 43 +++++++++++++++++++++++--------------------
1 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/src/drv_imap.c b/src/drv_imap.c
index fb6902a..1dd6f0f 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -206,6 +206,20 @@ new_imap_cmd( int size )
cmdp->gen.callback = cb; \
cmdp->gen.callback_aux = aux;
+static int
+done_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd, int response )
+{
+ int cancel;
+
+ cmd->param.done( ctx, cmd, response );
+ free( cmd->param.data );
+ free( cmd->cmd );
+ free( cmd );
+ cancel = ctx->store_canceled;
+ deref_store( ctx );
+ return cancel ? -1 : 0;
+}
+
static struct imap_cmd *
v_submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd,
const char *fmt, va_list ap )
@@ -273,11 +287,7 @@ v_submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd,
bail:
ctx->gen.bad_callback( ctx->gen.bad_callback_aux );
bail2:
- cmd->param.done( ctx, cmd, RESP_CANCEL );
- free( cmd->param.data );
- free( cmd->cmd );
- free( cmd );
- deref_store( ctx );
+ done_imap_cmd( ctx, cmd, RESP_CANCEL );
return NULL;
}
@@ -754,7 +764,7 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
{
struct imap_cmd *cmdp, **pcmdp;
char *cmd, *arg, *arg1, *p;
- int resp, resp2, tag, greeted;
+ int cancel, resp, resp2, tag, greeted;
greeted = ctx->greeting;
while (!buffer_gets( &ctx->conn, &cmd )) {
@@ -801,7 +811,10 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
if (greeted == GreetingPending) {
ctx->ref_count++;
imap_open_store_greeted( ctx );
- goto finalize;
+ cancel = ctx->store_canceled;
+ deref_store( ctx );
+ if (cancel)
+ return;
}
} else if (!ctx->in_progress) {
error( "IMAP error: unexpected reply: %s %s\n", arg,
cmd ? cmd : "" );
@@ -880,14 +893,8 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
resp = resp2;
if (resp == RESP_CANCEL)
ctx->gen.bad_callback(
ctx->gen.bad_callback_aux );
- cmdp->param.done( ctx, cmdp, resp );
- free( cmdp->param.data );
- free( cmdp->cmd );
- free( cmdp );
- finalize:
- if (ctx->store_canceled)
- tcmd = 0;
- deref_store( ctx );
+ if (done_imap_cmd( ctx, cmdp, resp ) < 0)
+ return;
if (!tcmd || tcmd == cmdp)
return;
}
@@ -902,11 +909,7 @@ get_cmd_result_p2( imap_store_t *ctx, struct imap_cmd
*cmd, int response )
struct imap_cmd *ocmd = cmdp->orig_cmd;
if (response != RESP_OK) {
- ocmd->param.done( ctx, ocmd, response );
- free( ocmd->param.data );
- free( ocmd->cmd );
- free( ocmd );
- deref_store( ctx );
+ done_imap_cmd( ctx, ocmd, response );
} else {
ctx->uidnext = 0;
ocmd->param.create = 0;
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel