commit 08f5a625b0cbf26f11da63f08d51237d91b20516
Author: Oswald Buddenhagen <o...@kde.org>
Date:   Sun Jun 17 14:52:46 2012 +0200

    don't decode aux pointer on DRV_CANCELED
    
    the aux data was already free()d by the error callback by the time we
    get this status code.

 src/sync.c |  110 +++++++++++++++++++++++++++------------------------
 1 files changed, 58 insertions(+), 52 deletions(-)

diff --git a/src/sync.c b/src/sync.c
index 5142641..a1f5373 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -156,9 +156,15 @@ typedef struct {
 } sync_vars_t;
 
 #define AUX &svars->t[t]
-#define SVARS(aux) \
+#define DECL_SVARS \
+       int t; \
+       sync_vars_t *svars
+#define INIT_SVARS(aux) \
+       t = *(int *)aux; \
+       svars = (sync_vars_t *)(((char *)(&((int *)aux)[-t])) - 
offsetof(sync_vars_t, t))
+#define DECL_INIT_SVARS(aux) \
        int t = *(int *)aux; \
-       sync_vars_t *svars = (sync_vars_t *)(((char *)(&((int *)aux)[-t])) - 
offsetof(sync_vars_t, t));
+       sync_vars_t *svars = (sync_vars_t *)(((char *)(&((int *)aux)[-t])) - 
offsetof(sync_vars_t, t))
 
 /* operation dependencies:
    select(S): -
@@ -197,7 +203,7 @@ static int msg_fetched( int sts, void *aux );
 static int
 copy_msg( copy_vars_t *vars )
 {
-       SVARS(vars->aux)
+       DECL_INIT_SVARS(vars->aux);
 
        vars->data.flags = vars->msg->flags;
        return svars->drv[1-t]->fetch_msg( svars->ctx[1-t], vars->msg, 
&vars->data, msg_fetched, vars );
@@ -209,7 +215,7 @@ static int
 msg_fetched( int sts, void *aux )
 {
        copy_vars_t *vars = (copy_vars_t *)aux;
-       SVARS(vars->aux)
+       DECL_SVARS;
        char *fmap, *buf;
        int i, len, extra, scr, tcr, lcrs, hcrs, bcrs, lines;
        int start, sbreak = 0, ebreak = 0;
@@ -217,6 +223,8 @@ msg_fetched( int sts, void *aux )
 
        switch (sts) {
        case DRV_OK:
+               INIT_SVARS(vars->aux);
+
                vars->msg->flags = vars->data.flags;
 
                scr = (svars->drv[1-t]->flags / DRV_CRLF) & 1;
@@ -324,6 +332,8 @@ msg_fetched( int sts, void *aux )
        case DRV_MSG_BAD:
                return vars->cb( SYNC_NOGOOD, 0, vars );
        case DRV_STORE_BAD:
+               INIT_SVARS(vars->aux);
+               (void)svars;
                return vars->cb( SYNC_BAD(1-t), 0, vars );
        default:
                return vars->cb( SYNC_FAIL, 0, vars );
@@ -334,19 +344,22 @@ static int
 msg_stored( int sts, int uid, void *aux )
 {
        copy_vars_t *vars = (copy_vars_t *)aux;
-       SVARS(vars->aux)
+       DECL_SVARS;
 
-       (void)svars;
        switch (sts) {
        case DRV_OK:
                return vars->cb( SYNC_OK, uid, vars );
        case DRV_CANCELED:
                return vars->cb( SYNC_CANCELED, 0, vars );
        case DRV_MSG_BAD:
+               INIT_SVARS(vars->aux);
+               (void)svars;
                warn( "Warning: %s refuses to store message %d from %s.\n",
                      str_ms[t], vars->msg->uid, str_ms[1-t] );
                return vars->cb( SYNC_NOGOOD, 0, vars );
        case DRV_STORE_BAD:
+               INIT_SVARS(vars->aux);
+               (void)svars;
                return vars->cb( SYNC_BAD(t), 0, vars );
        default:
                return vars->cb( SYNC_FAIL, 0, vars );
@@ -401,7 +414,7 @@ cancel_sync( sync_vars_t *svars )
 static void
 cancel_done( int sts, void *aux )
 {
-       SVARS(aux)
+       DECL_INIT_SVARS(aux);
 
        if (sts != DRV_OK) {
                svars->ret |= SYNC_BAD(t);
@@ -417,16 +430,20 @@ cancel_done( int sts, void *aux )
 
 
 static int
-check_ret( int sts, sync_vars_t *svars, int t )
+check_ret( int sts, void *aux )
 {
+       DECL_SVARS;
+
        switch (sts) {
        case DRV_CANCELED:
                return 1;
        case DRV_STORE_BAD:
+               INIT_SVARS(aux);
                svars->ret |= SYNC_BAD(t);
                cancel_sync( svars );
                return 1;
        case DRV_BOX_BAD:
+               INIT_SVARS(aux);
                svars->ret |= SYNC_FAIL;
                cancel_sync( svars );
                return 1;
@@ -434,15 +451,28 @@ check_ret( int sts, sync_vars_t *svars, int t )
        return 0;
 }
 
-static int
-check_ret_aux( int sts, sync_vars_t *svars, int t, void *aux )
-{
-       if (!check_ret( sts, svars, t ))
-               return 0;
-       free( aux );
-       return 1;
-}
-
+#define SVARS_CHECK_RET \
+       DECL_SVARS; \
+       if (check_ret( sts, aux )) \
+               return 1; \
+       INIT_SVARS(aux)
+
+#define SVARS_CHECK_RET_VARS(type) \
+       type *vars = (type *)aux; \
+       DECL_SVARS; \
+       if (check_ret( sts, vars->aux )) { \
+               free( vars ); \
+               return 1; \
+       } \
+       INIT_SVARS(vars->aux)
+
+#define SVARS_CHECK_CANCEL_RET \
+       DECL_SVARS; \
+       if (sts == SYNC_CANCELED) { \
+               free( vars ); \
+               return 1; \
+       } \
+       INIT_SVARS(vars->aux)
 
 static char *
 clean_strdup( const char *s )
@@ -834,12 +864,10 @@ static int msgs_found_sel( sync_vars_t *svars, int t );
 static int
 box_selected( int sts, void *aux )
 {
-       SVARS(aux)
        find_vars_t *fv;
        sync_rec_t *srec;
 
-       if (check_ret( sts, svars, t ))
-               return 1;
+       SVARS_CHECK_RET;
        if (svars->uidval[t] >= 0 && svars->uidval[t] != 
svars->ctx[t]->uidvalidity) {
                error( "Error: UIDVALIDITY of %s changed (got %d, expected 
%d)\n",
                         str_ms[t], svars->ctx[t]->uidvalidity, 
svars->uidval[t] );
@@ -880,11 +908,7 @@ box_selected( int sts, void *aux )
 static int
 msg_found_sel( int sts, int uid, void *aux )
 {
-       find_vars_t *vars = (find_vars_t *)aux;
-       SVARS(vars->aux)
-
-       if (check_ret_aux( sts, svars, t, vars ))
-               return 1;
+       SVARS_CHECK_RET_VARS(find_vars_t);
        switch (sts) {
        case DRV_OK:
                debug( "  -> new UID %d\n", uid );
@@ -1268,8 +1292,7 @@ msgs_found_sel( sync_vars_t *svars, int t )
 static int
 msg_copied( int sts, int uid, copy_vars_t *vars )
 {
-       SVARS(vars->aux)
-
+       SVARS_CHECK_CANCEL_RET;
        switch (sts) {
        case SYNC_OK:
                msg_copied_p2( svars, vars->srec, t, vars->msg, uid );
@@ -1281,7 +1304,6 @@ msg_copied( int sts, int uid, copy_vars_t *vars )
                break;
        default:
                cancel_sync( svars );
-       case SYNC_CANCELED:
                free( vars );
                return 1;
        }
@@ -1343,11 +1365,7 @@ msgs_copied( sync_vars_t *svars, int t )
 static int
 msg_found_new( int sts, int uid, void *aux )
 {
-       find_vars_t *vars = (find_vars_t *)aux;
-       SVARS(vars->aux)
-
-       if (check_ret_aux( sts, svars, t, vars ))
-               return 1;
+       SVARS_CHECK_RET_VARS(find_vars_t);
        switch (sts) {
        case DRV_OK:
                debug( "  -> new UID %d\n", uid );
@@ -1369,11 +1387,7 @@ msg_found_new( int sts, int uid, void *aux )
 static int
 flags_set_del( int sts, void *aux )
 {
-       flag_vars_t *vars = (flag_vars_t *)aux;
-       SVARS(vars->aux)
-
-       if (check_ret_aux( sts, svars, t, vars ))
-               return 1;
+       SVARS_CHECK_RET_VARS(flag_vars_t);
        switch (sts) {
        case DRV_OK:
                vars->srec->status |= S_DEL(t);
@@ -1390,11 +1404,7 @@ flags_set_del( int sts, void *aux )
 static int
 flags_set_sync( int sts, void *aux )
 {
-       flag_vars_t *vars = (flag_vars_t *)aux;
-       SVARS(vars->aux)
-
-       if (check_ret_aux( sts, svars, t, vars ))
-               return 1;
+       SVARS_CHECK_RET_VARS(flag_vars_t);
        switch (sts) {
        case DRV_OK:
                if (vars->aflags & F_DELETED)
@@ -1490,12 +1500,13 @@ msgs_flags_set( sync_vars_t *svars, int t )
 static int
 msg_trashed( int sts, void *aux )
 {
-       SVARS(aux)
+       DECL_SVARS;
 
        if (sts == DRV_MSG_BAD)
                sts = DRV_BOX_BAD;
-       if (check_ret( sts, svars, t ))
+       if (check_ret( sts, aux ))
                return 1;
+       INIT_SVARS(aux);
        svars->trash_done[t]++;
        stats( svars );
        return sync_close( svars, t );
@@ -1504,8 +1515,7 @@ msg_trashed( int sts, void *aux )
 static int
 msg_rtrashed( int sts, int uid, copy_vars_t *vars )
 {
-       SVARS(vars->aux)
-
+       SVARS_CHECK_CANCEL_RET;
        (void)uid;
        switch (sts) {
        case SYNC_OK:
@@ -1513,7 +1523,6 @@ msg_rtrashed( int sts, int uid, copy_vars_t *vars )
                break;
        default:
                cancel_sync( svars );
-       case SYNC_CANCELED:
                free( vars );
                return 1;
        }
@@ -1545,10 +1554,7 @@ sync_close( sync_vars_t *svars, int t )
 static int
 box_closed( int sts, void *aux )
 {
-       SVARS(aux)
-
-       if (check_ret( sts, svars, t ))
-               return 1;
+       SVARS_CHECK_RET;
        svars->state[t] |= ST_DID_EXPUNGE;
        box_closed_p2( svars, t );
        return 0;

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to