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