From 72c14894935e26bc0a35842e0b0a3048455e623b Mon Sep 17 00:00:00 2001 From: Alfons Hoogervorst Date: Thu, 21 Mar 2002 21:49:26 +0000 Subject: [PATCH] more refactoring for delete after xxx days; plug mem leak introduced by delete from server --- ChangeLog.claws | 6 ++++++ configure.in | 2 +- src/pop.c | 52 ++++++++++++++++++++++++++----------------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/ChangeLog.claws b/ChangeLog.claws index 574c79514..0a00b2589 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -1,3 +1,9 @@ +2002-03-21 [alfons] 0.7.4claws30 + + * src/pop.c + more code refactoring + plug mem leak introduced by delete on server + 2002-03-21 [paul] 0.7.4claws29 * sync with 0.7.4cvs11 diff --git a/configure.in b/configure.in index ca06b0c89..8b0dcd56c 100644 --- a/configure.in +++ b/configure.in @@ -8,7 +8,7 @@ MINOR_VERSION=7 MICRO_VERSION=4 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=claws29 +EXTRA_VERSION=claws30 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION dnl set $target diff --git a/src/pop.c b/src/pop.c index 0a9ee1289..6ea299c26 100644 --- a/src/pop.c +++ b/src/pop.c @@ -334,37 +334,35 @@ static gboolean should_delete(const char *uidl, gpointer data) * answer[0] will contain uidl */ Pop3State *state = (Pop3State *) data; gchar **answer; - GDate *curdate; - int id = 0; - const gchar *sdate; + int id; gboolean result; + int tdate, keep_for, today, nb_days; + const gchar *sdate; + GDate curdate; + gchar *tuidl; if (!state->ac_prefs->rmmail || !strchr(uidl, ' ')) return FALSE; - curdate = g_date_new(); - g_return_val_if_fail(curdate, FALSE); - - g_date_set_time(curdate, time(NULL)); - /* remove \r\n */ - uidl = g_strndup(uidl, strlen(uidl) - 2); + tuidl = g_strndup(uidl, strlen(uidl) - 2); answer = g_strsplit(uidl, " ", 2); id = atoi(answer[0]); if (NULL != (sdate = g_hash_table_lookup(state->uidl_table, answer[1]))) { - int tdate = atoi(sdate); - int keep_for = atoi(state->ac_prefs->leave_time); /* FIXME: leave time should be an int */ - int today = g_date_day_of_year(curdate); - int nb_days = 365; + tdate = atoi(sdate); + keep_for = atoi(state->ac_prefs->leave_time); /* FIXME: leave time should be an int */ - nb_days = g_date_is_leap_year(g_date_year(curdate)) ? 366 : 365; - result = ( (tdate + keep_for)%nb_days <= today ); + g_date_clear(&curdate, time(NULL)); + g_date_set_time(&curdate, time(NULL)); + today = g_date_day_of_year(&curdate); + + nb_days = g_date_is_leap_year(g_date_year(&curdate)) ? 366 : 365; + result = ((tdate + keep_for) % nb_days <= today); } else result = FALSE; - g_date_free(curdate); - g_free(uidl); + g_free(tuidl); g_strfreev(answer); return result; @@ -453,6 +451,7 @@ gint pop3_top_recv(SockInfo *sock, gpointer data) if (change_file_mode_rw(fp, filename) == 0) fprintf(fp, "%s\n", buf); + g_free(buf); fclose(fp); } @@ -482,7 +481,7 @@ gint pop3_retr_recv(SockInfo *sock, gpointer data) Pop3State *state = (Pop3State *)data; const gchar *file; gint ok, drop_ok; - int keep_for=atoi(g_strdup(state->ac_prefs->leave_time)); + int keep_for; if ((ok = pop3_ok(sock, NULL)) == PS_SUCCESS) { if (recv_write_to_file(sock, (file = get_tmp_file())) < 0) { @@ -499,9 +498,11 @@ gint pop3_retr_recv(SockInfo *sock, gpointer data) state->cur_total_bytes += state->msg[state->cur_msg].size; state->cur_total_num++; - if (drop_ok == 0 && state->ac_prefs->rmmail && keep_for == 0) { + keep_for = (state->ac_prefs && state->ac_prefs->leave_time) ? + atoi(state->ac_prefs->leave_time) : 0; + + if (drop_ok == 0 && state->ac_prefs->rmmail && keep_for == 0) return POP3_DELETE_SEND; - } state->msg[state->cur_msg].received = TRUE; @@ -555,16 +556,19 @@ gint pop3_delete_recv(SockInfo *sock, gpointer data) gint pop3_logout_send(SockInfo *sock, gpointer data) { Pop3State *state = (Pop3State *)data; + gchar **parts; + while (state->uidl_todelete_list != NULL) { - gchar **parts; - gint ok; - + /* + * FIXME: doesn't feel right - no checks for parts + */ parts = g_strsplit((gchar *) state->uidl_todelete_list->data, " ", 2); state->uidl_todelete_list = g_slist_remove (state->uidl_todelete_list, state->uidl_todelete_list->data); pop3_gen_send(sock, "DELE %s", parts[0]); - if ((ok = pop3_ok(sock, NULL)) != PS_SUCCESS) + if (pop3_ok(sock, NULL) != PS_SUCCESS) log_warning(_("error occurred on DELE\n")); + g_strfreev(parts); } inc_progress_update(state, POP3_LOGOUT_SEND); -- 2.25.1