diff --git a/src/drv_imap.c b/src/drv_imap.c index a5d99c2..875da2d 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -428,8 +428,10 @@ imap_refcounted_new_cmd( struct imap_cmd_refcounted_state *sts ) static void imap_refcounted_done( struct imap_cmd_refcounted_state *sts ) { - sts->callback( sts->ret_val, sts->callback_aux ); - free( sts ); + if (!--sts->ref_count) { + sts->callback( sts->ret_val, sts->callback_aux ); + free( sts ); + } } static int @@ -1497,8 +1499,7 @@ imap_load( store_t *gctx, int minuid, int maxuid, int *excs, int nexcs, } done: free( excs ); - if (!--sts->ref_count) - imap_refcounted_done( sts ); + imap_refcounted_done( sts ); } } @@ -1525,8 +1526,7 @@ imap_load_p2( imap_store_t *ctx ATTR_UNUSED, struct imap_cmd *cmd, int response sts->ret_val = DRV_BOX_BAD; break; } - if (!--sts->ref_count) - imap_refcounted_done( sts ); + imap_refcounted_done( sts ); } /******************* imap_fetch_msg *******************/ @@ -1595,8 +1595,7 @@ imap_set_flags( store_t *gctx, message_t *msg, int uid, int add, int del, struct imap_cmd_refcounted_state *sts = imap_refcounted_new_state( cb, aux ); if ((add && imap_flags_helper( ctx, uid, '+', add, sts ) < 0) || (del && imap_flags_helper( ctx, uid, '-', del, sts ) < 0)) {} - if (!--sts->ref_count) - imap_refcounted_done( sts ); + imap_refcounted_done( sts ); } else { cb( DRV_OK, aux ); } @@ -1615,8 +1614,7 @@ imap_set_flags_p2( imap_store_t *ctx ATTR_UNUSED, struct imap_cmd *cmd, int resp sts->ret_val = DRV_MSG_BAD; break; } - if (!--sts->ref_count) - imap_refcounted_done( sts ); + imap_refcounted_done( sts ); } /******************* imap_close *******************/