talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 618839aae3e97e0869fcc2c9b2b25f86995877b0
parent c01f3c5b9042dd0cdd2abc35b6e6b084fa22c51f
Author: Colin Leroy <colin@colino.net>
Date:   Fri,  5 Oct 2018 23:01:46 +0200

Implement safe_fclose() so we can respect the "Metadata handling"
preference for every data file we write into.

Diffstat:
Msrc/Makefile.am | 2++
Msrc/addrbook.c | 3++-
Msrc/addrindex.c | 3++-
Msrc/common/Makefile.am | 1+
Msrc/common/log.c | 3++-
Msrc/common/prefs.c | 13++-----------
Msrc/common/ssl_certificate.c | 5+++--
Msrc/common/tags.c | 3++-
Msrc/common/template.c | 3++-
Msrc/common/utils.c | 14++++++++------
Msrc/compose.c | 8+++++---
Msrc/etpan/imap-thread.c | 3++-
Msrc/exporthtml.c | 7++++---
Msrc/exportldif.c | 3++-
Msrc/ldapquery.c | 3++-
Msrc/main.c | 3++-
Msrc/mbox.c | 13+++++++------
Msrc/messageview.c | 4+++-
Msrc/mh.c | 7++-----
Msrc/msgcache.c | 22++++------------------
Msrc/news.c | 5+++--
Msrc/partial_download.c | 5+++--
Msrc/plugins/acpi_notifier/acpi_notifier.c | 3++-
Msrc/plugins/bogofilter/bogofilter.c | 3++-
Msrc/plugins/fancy/claws.def | 1+
Msrc/plugins/fancy/fancy_viewer.c | 3++-
Msrc/plugins/libravatar/claws.def | 1+
Msrc/plugins/libravatar/libravatar_image.c | 3++-
Msrc/plugins/libravatar/libravatar_missing.c | 3++-
Msrc/plugins/mailmbox/claws.def | 2++
Msrc/plugins/mailmbox/mailmbox_folder.c | 5+++--
Msrc/plugins/pgpinline/claws.def | 2++
Msrc/plugins/pgpinline/pgpinline.c | 3++-
Msrc/plugins/pgpmime/claws.def | 2++
Msrc/plugins/pgpmime/pgpmime.c | 3++-
Msrc/plugins/rssyl/claws.def | 1+
Msrc/plugins/rssyl/opml_export.c | 3++-
Msrc/plugins/rssyl/rssyl_add_item.c | 3++-
Msrc/plugins/rssyl/rssyl_deleted.c | 3++-
Msrc/plugins/smime/claws.def | 1+
Msrc/plugins/smime/smime.c | 7++++---
Msrc/plugins/vcalendar/claws.def | 1+
Msrc/plugins/vcalendar/vcal_meeting_gtk.c | 3++-
Msrc/pop.c | 5+++--
Msrc/prefs_common.c | 6++++--
Msrc/procmsg.c | 9+++++----
Asrc/safe_fclose.c | 46++++++++++++++++++++++++++++++++++++++++++++++
Asrc/safe_fclose.h | 24++++++++++++++++++++++++
48 files changed, 187 insertions(+), 92 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am @@ -228,6 +228,7 @@ claws_mail_SOURCES = \ quote_fmt_parse.y \ recv.c \ remotefolder.c \ + safe_fclose.c \ send_message.c \ setup.c \ sourcewindow.c \ @@ -348,6 +349,7 @@ claws_mailinclude_HEADERS = \ quote_fmt_parse.h \ recv.h \ remotefolder.h \ + safe_fclose.h \ send_message.h \ setup.h \ sourcewindow.h \ diff --git a/src/addrbook.c b/src/addrbook.c @@ -33,6 +33,7 @@ #include "addrcache.h" #include "addrbook.h" #include "adbookbase.h" +#include "safe_fclose.h" #ifndef DEV_STANDALONE #include "prefs_gtk.h" @@ -1318,7 +1319,7 @@ static gint addrbook_write_to(AddressBookFile *book, gchar *newFile) book->retVal = MGU_SUCCESS; #ifdef DEV_STANDALONE - fclose(fp); + safe_fclose(fp); #else if (prefs_file_close( pfile ) < 0) book->retVal = MGU_ERROR_WRITE; diff --git a/src/addrindex.c b/src/addrindex.c @@ -43,6 +43,7 @@ #include "utils.h" #include "alertpanel.h" #include "passwordstore.h" +#include "safe_fclose.h" #ifndef DEV_STANDALONE #include "prefs_gtk.h" @@ -1782,7 +1783,7 @@ static gint addrindex_write_to( AddressIndex *addrIndex, const gchar *newFile ) addrIndex->retVal = MGU_SUCCESS; #ifdef DEV_STANDALONE - fclose( fp ); + safe_fclose( fp ); #else if( prefs_file_close( pfile ) < 0 ) { addrIndex->retVal = MGU_ERROR_WRITE; diff --git a/src/common/Makefile.am b/src/common/Makefile.am @@ -87,6 +87,7 @@ clawscommoninclude_HEADERS = $(arch_headers) \ unmime.h AM_CPPFLAGS = \ + -I$(srcdir)/.. \ -I$(top_srcdir)/intl \ $(GLIB_CFLAGS) \ $(VALGRIND_CFLAGS) \ diff --git a/src/common/log.c b/src/common/log.c @@ -35,6 +35,7 @@ #include "utils.h" #include "log.h" #include "hooks.h" +#include "safe_fclose.h" #define FWRITE(_b,_s,_n,_f) if (fwrite(_b,_s,_n,_f) != _n) { \ g_message("log fwrite failed!\n"); \ @@ -136,7 +137,7 @@ void set_log_file(LogInstance instance, const gchar *filename) void close_log_file(LogInstance instance) { if (log_fp[instance]) { - fclose(log_fp[instance]); + safe_fclose(log_fp[instance]); log_fp[instance] = NULL; log_size[instance] = 0; g_free(log_filename[instance]); diff --git a/src/common/prefs.c b/src/common/prefs.c @@ -28,6 +28,7 @@ #include "prefs.h" #include "utils.h" +#include "safe_fclose.h" static gboolean prefs_is_readonly (const gchar *path); @@ -159,17 +160,7 @@ gint prefs_file_close(PrefFile *pfile) tmppath = g_strconcat(path, ".tmp", NULL); - - if (prefs_common_get_flush_metadata() && fsync(fileno(fp)) < 0) { - FILE_OP_ERROR(tmppath, "fsync"); - fclose(fp); - claws_unlink(tmppath); - g_free(path); - g_free(tmppath); - return -1; - } - - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmppath, "fclose"); claws_unlink(tmppath); g_free(path); diff --git a/src/common/ssl_certificate.c b/src/common/ssl_certificate.c @@ -46,6 +46,7 @@ #include "socket.h" #include "hooks.h" #include "defs.h" +#include "safe_fclose.h" static GHashTable *warned_expired = NULL; @@ -376,7 +377,7 @@ static void ssl_certificate_save (SSLCertificate *cert) gnutls_export_X509_fp(fp, cert->x509_cert, GNUTLS_X509_FMT_DER); g_free(file); - fclose(fp); + safe_fclose(fp); } @@ -682,7 +683,7 @@ static void ssl_certificate_save_chain(gnutls_x509_crt_t *certs, gint len, const } if (fp) - fclose(fp); + safe_fclose(fp); } gboolean ssl_certificate_check (gnutls_x509_crt_t x509_cert, guint status, diff --git a/src/common/tags.c b/src/common/tags.c @@ -40,6 +40,7 @@ #include "defs.h" #include "utils.h" #include "tags.h" +#include "safe_fclose.h" static GHashTable *tags_table = NULL; static GHashTable *tags_reverse_table = NULL; @@ -146,7 +147,7 @@ void tags_write_tags(void) return; } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(file, "fclose"); g_free(file); g_free(file_new); diff --git a/src/common/template.c b/src/common/template.c @@ -29,6 +29,7 @@ #include "utils.h" #include "template.h" #include "codeconv.h" +#include "safe_fclose.h" static GSList *template_list; @@ -283,7 +284,7 @@ static void template_write_config(GSList *tmpl_list) } else { TRY(fwrite("", sizeof(gchar), 1, fp) == 1); } - TRY_NO_CLOSE(fclose(fp) != EOF); + TRY_NO_CLOSE(safe_fclose(fp) != EOF); if (new) { if (rename_force(new, filename) < 0) { diff --git a/src/common/utils.c b/src/common/utils.c @@ -85,6 +85,8 @@ #include "socket.h" #include "codeconv.h" #include "tlds.h" +#include "timing.h" +#include "safe_fclose.h" #define BUFFSIZE 8192 @@ -340,7 +342,7 @@ gint file_strip_crs(const gchar *file) } fclose(fp); - if (fclose(outfp) == EOF) { + if (safe_fclose(outfp) == EOF) { goto unlinkout; } @@ -2523,7 +2525,7 @@ gint copy_file(const gchar *src, const gchar *dest, gboolean keep_backup) err = TRUE; } fclose(src_fp); - if (fclose(dest_fp) == EOF) { + if (safe_fclose(dest_fp) == EOF) { FILE_OP_ERROR(dest, "fclose"); err = TRUE; } @@ -2619,7 +2621,7 @@ gint copy_file_part(FILE *fp, off_t offset, size_t length, const gchar *dest) if (copy_file_part_to_fp(fp, offset, length, dest_fp) < 0) err = TRUE; - if (fclose(dest_fp) == EOF) { + if (safe_fclose(dest_fp) == EOF) { FILE_OP_ERROR(dest, "fclose"); err = TRUE; } @@ -2737,7 +2739,7 @@ gint canonicalize_file(const gchar *src, const gchar *dest) err = TRUE; } fclose(src_fp); - if (fclose(dest_fp) == EOF) { + if (safe_fclose(dest_fp) == EOF) { FILE_OP_ERROR(dest, "fclose"); err = TRUE; } @@ -2997,7 +2999,7 @@ gint str_write_to_file(const gchar *str, const gchar *file) return -1; } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(file, "fclose"); claws_unlink(file); return -1; @@ -4580,7 +4582,7 @@ void mailcap_update_default(const gchar *type, const gchar *command) if (fp) fclose(fp); - if (fclose(outfp) == EOF) + if (safe_fclose(outfp) == EOF) err = TRUE; if (!err) diff --git a/src/compose.c b/src/compose.c @@ -107,6 +107,8 @@ #include "autofaces.h" #include "spell_entry.h" #include "headers.h" +#include "safe_fclose.h" + #ifdef USE_LDAP #include "password.h" #include "ldapserver.h" @@ -5983,7 +5985,7 @@ static gint compose_write_body_to_file(Compose *compose, const gchar *file) g_free(chars); - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(file, "fclose"); claws_unlink(file); return -1; @@ -6276,7 +6278,7 @@ static ComposeQueueResult compose_queue_sub(Compose *compose, gint *msgnum, Fold g_free(tmp); return COMPOSE_QUEUE_ERROR_WITH_ERRNO; } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmp, "fclose"); claws_unlink(tmp); g_free(tmp); @@ -10379,7 +10381,7 @@ gboolean compose_draft (gpointer data, guint action) fclose(fp); goto warn_err; } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { goto warn_err; } diff --git a/src/etpan/imap-thread.c b/src/etpan/imap-thread.c @@ -44,6 +44,7 @@ #include "utils.h" #include "mainwindow.h" #include "proxy.h" +#include "safe_fclose.h" #include "ssl.h" #include "ssl_certificate.h" #include "socket.h" @@ -2637,7 +2638,7 @@ static void fetch_content_run(struct etpan_thread_op * op) goto fclose; } - r = fclose(f); + r = safe_fclose(f); if (r == EOF) { result->error = MAILIMAP_ERROR_FETCH; goto unlink; diff --git a/src/exporthtml.c b/src/exporthtml.c @@ -46,6 +46,7 @@ #include "utils.h" #include "exporthtml.h" #include "xmlprops.h" +#include "safe_fclose.h" #ifdef MKDIR_TAKES_ONE_ARG #undef mkdir @@ -301,7 +302,7 @@ static gint exporthtml_create_css_dfl( const gchar *fileSpec ) { fprintf( cssFile, ".tab-attr {\n" ); fprintf( cssFile, "}\n" ); - fclose( cssFile ); + safe_fclose( cssFile ); return MGU_SUCCESS; } @@ -365,7 +366,7 @@ static gint exporthtml_create_css_full( const gchar *fileSpec ) { fprintf( cssFile, ".tab-attr {\n" ); fprintf( cssFile, "}\n" ); - fclose( cssFile ); + safe_fclose( cssFile ); return MGU_SUCCESS; } @@ -994,7 +995,7 @@ void exporthtml_process( fprintf( htmlFile, "</body>\n" ); fprintf( htmlFile, "</html>\n" ); - fclose( htmlFile ); + safe_fclose( htmlFile ); ctl->retVal = MGU_SUCCESS; /* Create stylesheet files */ diff --git a/src/exportldif.c b/src/exportldif.c @@ -38,6 +38,7 @@ #include "exportldif.h" #include "xmlprops.h" #include "ldif.h" +#include "safe_fclose.h" #ifdef MKDIR_TAKES_ONE_ARG @@ -541,7 +542,7 @@ void exportldif_process( ExportLdifCtl *ctl, AddressCache *cache ) rootFolder = cache->rootFolder; exportldif_fmt_folder( ctl, ldifFile, rootFolder ); - fclose( ldifFile ); + safe_fclose( ldifFile ); ctl->retVal = MGU_SUCCESS; } diff --git a/src/ldapquery.c b/src/ldapquery.c @@ -38,6 +38,7 @@ #include "ldapctrl.h" #include "ldapserver.h" #include "mgutils.h" +#include "safe_fclose.h" #include "addritem.h" #include "addrcache.h" @@ -426,7 +427,7 @@ static GSList *ldapqry_add_single_value( LDAP *ld, LDAPMessage *entry, char *att FILE *fp = g_fopen(file, "wb"); if (fp) { fwrite(vals[0]->bv_val, 1, vals[0]->bv_len, fp); - fclose(fp); + safe_fclose(fp); } list = g_slist_append( list, file); } diff --git a/src/main.c b/src/main.c @@ -132,6 +132,7 @@ #include "advsearch.h" #include "avatars.h" #include "passwordstore.h" +#include "safe_fclose.h" #ifdef HAVE_LIBETPAN #include "imap-thread.h" @@ -477,7 +478,7 @@ static int migrate_common_rc(const gchar *old_rc, const gchar *new_rc) g_free(new_plugin_path); g_free(old_plugin_path); fclose(oldfp); - if (fclose(newfp) == EOF) + if (safe_fclose(newfp) == EOF) err = TRUE; return (err ? -1:0); diff --git a/src/mbox.c b/src/mbox.c @@ -56,6 +56,7 @@ #include "filtering.h" #include "alertpanel.h" #include "statusbar.h" +#include "safe_fclose.h" #define MESSAGEBUFSIZE 8192 @@ -230,7 +231,7 @@ gint proc_mbox(FolderItem *dest, const gchar *mbox, gboolean apply_filter, return -1; } - if (fclose(tmp_fp) == EOF) { + if (safe_fclose(tmp_fp) == EOF) { FILE_OP_ERROR(tmp_file, "fclose"); g_warning("can't write to temporary file"); fclose(mbox_fp); @@ -333,7 +334,7 @@ gint lock_mbox(const gchar *base, LockType type) return -1; } - if (fclose(lockfp) == EOF) { + if (safe_fclose(lockfp) == EOF) { FILE_OP_ERROR(lockfile, "fclose"); g_free(lockfile); return -1; @@ -509,7 +510,7 @@ gint copy_mbox(gint srcfd, const gchar *dest) err = TRUE; } - if (fclose(dest_fp) == EOF) { + if (safe_fclose(dest_fp) == EOF) { FILE_OP_ERROR(dest, "fclose"); err = TRUE; } @@ -531,7 +532,7 @@ void empty_mbox(const gchar *mbox) g_warning("can't truncate mailbox to zero."); return; } - fclose(fp); + safe_fclose(fp); } gint export_list_to_mbox(GSList *mlist, const gchar *mbox) @@ -657,7 +658,7 @@ gint export_list_to_mbox(GSList *mlist, const gchar *mbox) #ifdef HAVE_FGETS_UNLOCKED funlockfile(msg_fp); #endif - fclose(msg_fp); + safe_fclose(msg_fp); statusbar_progress_all(msgs++,total, 500); if (msgs%500 == 0) GTK_EVENTS_FLUSH(); @@ -670,7 +671,7 @@ out: #ifdef HAVE_FGETS_UNLOCKED funlockfile(mbox_fp); #endif - fclose(mbox_fp); + safe_fclose(mbox_fp); return err; } diff --git a/src/messageview.c b/src/messageview.c @@ -67,6 +67,8 @@ #include "statusbar.h" #include "folder_item_prefs.h" #include "avatars.h" +#include "safe_fclose.h" + #ifndef USE_ALT_ADDRBOOK #include "addressbook.h" #else @@ -1060,7 +1062,7 @@ static gint disposition_notification_send(MsgInfo *msginfo) if (ok < 0) goto FILE_ERROR; - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmp, "fclose"); claws_unlink(tmp); return -1; diff --git a/src/mh.c b/src/mh.c @@ -44,6 +44,7 @@ #include "gtkutils.h" #include "timing.h" #include "msgcache.h" +#include "safe_fclose.h" /* Define possible missing constants for Windows. */ #ifdef G_OS_WIN32 @@ -1421,11 +1422,7 @@ static void mh_write_sequences(FolderItem *item, gboolean remove_unseen) fclose(mh_sequences_old_fp); } - fflush(mh_sequences_new_fp); -#if 0 - fsync(fileno(mh_sequences_new_fp)); -#endif - if (fclose(mh_sequences_new_fp) == EOF) + if (safe_fclose(mh_sequences_new_fp) == EOF) err = TRUE; if (!err) { diff --git a/src/msgcache.c b/src/msgcache.c @@ -47,6 +47,7 @@ #include "timing.h" #include "tags.h" #include "prefs_common.h" +#include "safe_fclose.h" #ifdef HAVE_FWRITE_UNLOCKED #define SC_FWRITE fwrite_unlocked @@ -1219,29 +1220,14 @@ gint msgcache_write(const gchar *cache_file, const gchar *mark_file, const gchar if (write_fps.tags_fp) funlockfile(write_fps.tags_fp); #endif - /* flush buffers */ - if (write_fps.cache_fp) - write_fps.error |= (fflush(write_fps.cache_fp) != 0); - if (write_fps.mark_fp) - write_fps.error |= (fflush(write_fps.mark_fp) != 0); - if (write_fps.tags_fp) - write_fps.error |= (fflush(write_fps.tags_fp) != 0); - - /* sync to filesystem */ - if (prefs_common.flush_metadata && write_fps.cache_fp) - write_fps.error |= (fsync(fileno(write_fps.cache_fp)) != 0); - if (prefs_common.flush_metadata && write_fps.mark_fp) - write_fps.error |= (fsync(fileno(write_fps.mark_fp)) != 0); - if (prefs_common.flush_metadata && write_fps.tags_fp) - write_fps.error |= (fsync(fileno(write_fps.tags_fp)) != 0); /* close files */ if (write_fps.cache_fp) - write_fps.error |= (fclose(write_fps.cache_fp) != 0); + write_fps.error |= (safe_fclose(write_fps.cache_fp) != 0); if (write_fps.mark_fp) - write_fps.error |= (fclose(write_fps.mark_fp) != 0); + write_fps.error |= (safe_fclose(write_fps.mark_fp) != 0); if (write_fps.tags_fp) - write_fps.error |= (fclose(write_fps.tags_fp) != 0); + write_fps.error |= (safe_fclose(write_fps.tags_fp) != 0); if (write_fps.error != 0) { diff --git a/src/news.c b/src/news.c @@ -62,6 +62,7 @@ # include "ssl.h" #endif #include "main.h" +#include "safe_fclose.h" #define NNTP_PORT 119 #ifdef USE_GNUTLS @@ -702,7 +703,7 @@ GSList *news_get_group_list(Folder *folder) } newsnntp_list_free(grouplist); } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { log_error(LOG_PROTOCOL, ("Can't write newsgroup list\n")); session_destroy(SESSION(session)); REMOTE_FOLDER(folder)->session = NULL; @@ -984,7 +985,7 @@ gint news_cancel_article(Folder * folder, MsgInfo * msginfo) return -1; } - if (fclose(tmpfp) == EOF) { + if (safe_fclose(tmpfp) == EOF) { FILE_OP_ERROR(tmp, "fclose"); claws_unlink(tmp); g_free(tmp); diff --git a/src/partial_download.c b/src/partial_download.c @@ -63,6 +63,7 @@ #include "folder.h" #include "procheader.h" #include "msgcache.h" +#include "safe_fclose.h" int partial_msg_in_uidl_list(MsgInfo *msginfo) { @@ -248,7 +249,7 @@ static int partial_uidl_mark_mail(MsgInfo *msginfo, int download) g_free(stat); } } - if (fclose(fpnew) == EOF) { + if (safe_fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(path); @@ -308,7 +309,7 @@ static int partial_uidl_mark_mail(MsgInfo *msginfo, int download) goto bail; } } - if (fclose(fpnew) == EOF) { + if (safe_fclose(fpnew) == EOF) { FILE_OP_ERROR(pathnew, "fclose"); fclose(fp); g_free(pathnew); diff --git a/src/plugins/acpi_notifier/acpi_notifier.c b/src/plugins/acpi_notifier/acpi_notifier.c @@ -47,6 +47,7 @@ #include "utils.h" #include "folder_item_prefs.h" #include "gtkcmoptionmenu.h" +#include "safe_fclose.h" #define PREFS_BLOCK_NAME "AcpiNotifier" #define PLUGIN_NAME _("Acpi Notifier") @@ -676,7 +677,7 @@ static void acpi_set(gboolean on) } else { fwrite(acpiprefs.off_param, 1, strlen(acpiprefs.off_param), fp); } - fclose(fp); + safe_fclose(fp); } else { gchar *cmd = g_strdup_printf("%s %s", acpiprefs.file_path, diff --git a/src/plugins/bogofilter/bogofilter.c b/src/plugins/bogofilter/bogofilter.c @@ -52,6 +52,7 @@ #include "prefs_common.h" #include "alertpanel.h" #include "addr_compl.h" +#include "safe_fclose.h" #ifdef HAVE_SYSEXITS_H #include <sysexits.h> @@ -279,7 +280,7 @@ static void bogofilter_do_filter(BogoFilterData *data) } } fclose(input); - if (fclose(output) == EOF) + if (safe_fclose(output) == EOF) err = TRUE; if (!err) move_file(tmpfile, file, TRUE); diff --git a/src/plugins/fancy/claws.def b/src/plugins/fancy/claws.def @@ -85,6 +85,7 @@ procmsg_msginfo_unset_flags procmsg_register_spam_learner procmsg_spam_set_folder procmsg_unregister_spam_learner +safe_fclose settings start_address_completion statusbar_pop_all diff --git a/src/plugins/fancy/fancy_viewer.c b/src/plugins/fancy/fancy_viewer.c @@ -28,6 +28,7 @@ #include <fancy_viewer.h> #include <fancy_prefs.h> #include <alertpanel.h> +#include <safe_fclose.h> #include <printing.h> #include <webkit/webkithittestresult.h> @@ -670,7 +671,7 @@ static void *download_file_curl (void *data) if (CURLE_OK != res) alertpanel_error(_("An error occurred: %d\n"), res); if (viewer->stream) - fclose(viewer->stream); + safe_fclose(viewer->stream); curl_global_cleanup(); } #ifdef USE_PTHREAD diff --git a/src/plugins/libravatar/claws.def b/src/plugins/libravatar/claws.def @@ -36,5 +36,6 @@ prefs_write_param prefs_common_get_prefs procmsg_msginfo_add_avatar procmsg_msginfo_get_avatar +safe_fclose slist_free_strings_full to_human_readable diff --git a/src/plugins/libravatar/libravatar_image.c b/src/plugins/libravatar/libravatar_image.c @@ -27,6 +27,7 @@ #include <common/claws.h> #include <prefs_common.h> +#include <safe_fclose.h> #include "libravatar.h" #include "libravatar_prefs.h" @@ -106,7 +107,7 @@ static GdkPixbuf *pixbuf_from_url(const gchar *url, const gchar *md5, const gcha debug_print("retrieving URL to file: %s -> %s\n", url, filename); curl_easy_perform(curl); filesize = ftell(file); - fclose(file); + safe_fclose(file); if (filesize < MIN_PNG_SIZE) debug_print("not enough data for an avatar image: %ld bytes\n", filesize); else diff --git a/src/plugins/libravatar/libravatar_missing.c b/src/plugins/libravatar/libravatar_missing.c @@ -21,6 +21,7 @@ #include "libravatar_missing.h" #include "libravatar_prefs.h" #include "utils.h" +#include "safe_fclose.h" /** * Loads the hash table of md5sum → time from the given filename. @@ -108,7 +109,7 @@ gint missing_save_to_file(GHashTable *table, const gchar *filename) g_hash_table_foreach(table, missing_save_item, (gpointer)file); debug_print("Saved %u missing avatar entries\n", g_hash_table_size(table)); - if (fclose(file) != 0) { + if (safe_fclose(file) != 0) { g_warning("error closing '%s'", filename); return -1; } diff --git a/src/plugins/mailmbox/claws.def b/src/plugins/mailmbox/claws.def @@ -28,3 +28,4 @@ prefs_set_default prefs_write_open prefs_write_param prefs_common_get_prefs +safe_fclose +\ No newline at end of file diff --git a/src/plugins/mailmbox/mailmbox_folder.c b/src/plugins/mailmbox/mailmbox_folder.c @@ -56,6 +56,7 @@ #include "mailmbox.h" #include "mailmbox_folder.h" #include "mailmbox_parse.h" +#include "safe_fclose.h" #define MAILMBOX_CACHE_DIR "mailmboxcache" @@ -257,7 +258,7 @@ static void write_max_uid_value(FolderItem *item, guint max_uid) return; } - fclose(f); + safe_fclose(f); } static void claws_mailmbox_folder_item_destroy(Folder *folder, FolderItem *_item) @@ -471,7 +472,7 @@ static gchar *s_claws_mailmbox_fetch_msg(Folder *folder, FolderItem *item, gint if (r == 0) goto close; - fclose(f); + safe_fclose(f); return file; diff --git a/src/plugins/pgpinline/claws.def b/src/plugins/pgpinline/claws.def @@ -22,3 +22,4 @@ procmime_scan_file procmime_write_mimeinfo procmime_get_part procmime_get_tmp_file_name +safe_fclose +\ No newline at end of file diff --git a/src/plugins/pgpinline/pgpinline.c b/src/plugins/pgpinline/pgpinline.c @@ -28,6 +28,7 @@ #include <glib/gi18n.h> #include <errno.h> #include <gpgme.h> +#include <safe_fclose.h> #include "utils.h" #include "privacy.h" @@ -410,7 +411,7 @@ static MimeInfo *pgpinline_decrypt(MimeInfo *mimeinfo) } } - if (fclose(dstfp) == EOF) { + if (safe_fclose(dstfp) == EOF) { FILE_OP_ERROR(fname, "fclose"); privacy_set_error(_("Couldn't close decrypted file %s"), fname); g_free(fname); diff --git a/src/plugins/pgpmime/claws.def b/src/plugins/pgpmime/claws.def @@ -18,3 +18,4 @@ procmime_mimeinfo_new procmime_mimeinfo_parent procmime_scan_file procmime_write_mimeinfo +safe_fclose +\ No newline at end of file diff --git a/src/plugins/pgpmime/pgpmime.c b/src/plugins/pgpmime/pgpmime.c @@ -42,6 +42,7 @@ #include <plugins/pgpcore/pgp_utils.h> #include "prefs_common.h" +#include "safe_fclose.h" typedef struct _PrivacyDataPGP PrivacyDataPGP; @@ -384,7 +385,7 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo) } g_free(chars); - if (fclose(dstfp) == EOF) { + if (safe_fclose(dstfp) == EOF) { FILE_OP_ERROR(fname, "fclose"); privacy_set_error(_("Couldn't close decrypted file %s"), fname); g_free(fname); diff --git a/src/plugins/rssyl/claws.def b/src/plugins/rssyl/claws.def @@ -116,6 +116,7 @@ procheader_parse_file procmsg_get_message_file procmsg_msginfo_unset_flags remove_dir_recursive +safe_fclose slist_free_strings_full strtailchomp subst_for_shellsafe_filename diff --git a/src/plugins/rssyl/opml_export.c b/src/plugins/rssyl/opml_export.c @@ -32,6 +32,7 @@ #include <log.h> #include <folder.h> #include <common/utils.h> +#include <safe_fclose.h> /* Local includes */ #include "libfeed/date.h" @@ -185,7 +186,7 @@ void rssyl_opml_export(void) debug_print("RSSyl: Feed export finished.\n"); - fclose(f); + safe_fclose(f); g_free(opmlfile); g_free(ctx); } diff --git a/src/plugins/rssyl/rssyl_add_item.c b/src/plugins/rssyl/rssyl_add_item.c @@ -34,6 +34,7 @@ #include <codeconv.h> #include <procmsg.h> #include <common/utils.h> +#include <safe_fclose.h> /* Local includes */ #include "libfeed/date.h" @@ -546,7 +547,7 @@ void rssyl_add_item(RFolderItem *ritem, FeedItem *feed_item) feed_item_enclosure_get_size(enc) ); fprintf(f, "</body></html>\n"); - fclose(f); + safe_fclose(f); g_return_if_fail(template != NULL); diff --git a/src/plugins/rssyl/rssyl_deleted.c b/src/plugins/rssyl/rssyl_deleted.c @@ -31,6 +31,7 @@ /* Claws Mail includes */ #include <codeconv.h> #include <common/utils.h> +#include <safe_fclose.h> /* Local includes */ #include "rssyl.h" @@ -188,7 +189,7 @@ static void rssyl_deleted_store_internal(GSList *deleted_items, const gchar *del g_slist_foreach(deleted_items, (GFunc)_store_one_deleted_item, (gpointer)f); - fclose(f); + safe_fclose(f); debug_print("RSSyl: written and closed deletion file\n"); } diff --git a/src/plugins/smime/claws.def b/src/plugins/smime/claws.def @@ -26,4 +26,5 @@ procmime_mimeinfo_parent procmime_scan_file procmime_write_mime_header procmime_write_mimeinfo +safe_fclose str_write_to_file diff --git a/src/plugins/smime/smime.c b/src/plugins/smime/smime.c @@ -43,6 +43,7 @@ #include "prefs_common.h" #include "procmime.h" #include "plugin.h" +#include "safe_fclose.h" typedef struct _PrivacyDataPGP PrivacyDataPGP; @@ -480,7 +481,7 @@ static MimeInfo *smime_decrypt(MimeInfo *mimeinfo) return NULL; } } - if (fclose(dstfp) == EOF) { + if (safe_fclose(dstfp) == EOF) { FILE_OP_ERROR(fname, "fclose"); g_free(fname); g_free(chars); @@ -804,7 +805,7 @@ gboolean smime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data) procmime_decode_content(msgcontent); procmime_write_mime_header(msgcontent, fp); procmime_write_mimeinfo(msgcontent, fp); - fclose(fp); + safe_fclose(fp); canonicalize_file_replace(tmpfile); fp = g_fopen(tmpfile, "rb"); if (fp == NULL) { @@ -846,7 +847,7 @@ gboolean smime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data) g_free(enccontent); return FALSE; } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmpfile, "fclose"); claws_unlink(tmpfile); g_free(tmpfile); diff --git a/src/plugins/vcalendar/claws.def b/src/plugins/vcalendar/claws.def @@ -144,6 +144,7 @@ procmsg_msginfo_get_full_info procmsg_send_message_queue_with_lock qp_encode_line remove_dir_recursive +safe_fclose slist_free_strings slist_free_strings_full statusbar_progress_all diff --git a/src/plugins/vcalendar/vcal_meeting_gtk.c b/src/plugins/vcalendar/vcal_meeting_gtk.c @@ -54,6 +54,7 @@ #include "gtkutils.h" #include "log.h" #include "utils.h" +#include "safe_fclose.h" struct _VCalMeeting { @@ -1858,7 +1859,7 @@ void multisync_export(void) FILE_OP_ERROR(file, "fprintf"); g_free(file); } - if (fclose(fp) == EOF) + if (safe_fclose(fp) == EOF) FILE_OP_ERROR(file, "fclose"); } else { FILE_OP_ERROR(file, "fopen"); diff --git a/src/pop.c b/src/pop.c @@ -40,6 +40,7 @@ #include "partial_download.h" #include "log.h" #include "hooks.h" +#include "safe_fclose.h" static gint pop3_greeting_recv (Pop3Session *session, const gchar *msg); @@ -705,7 +706,7 @@ gint pop3_write_uidl_list(Pop3Session *session) > 0); } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmp_path, "fclose"); fp = NULL; goto err_write; @@ -806,7 +807,7 @@ static gint pop3_write_msg_to_file(const gchar *file, const gchar *data, } } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(file, "fclose"); claws_unlink(file); return -1; diff --git a/src/prefs_common.c b/src/prefs_common.c @@ -61,6 +61,8 @@ #include "prefswindow.h" #include "colorlabel.h" #include "passwordstore.h" +#include "safe_fclose.h" + #ifndef USE_ALT_ADDRBOOK #include "addrcustomattr.h" #endif @@ -1399,7 +1401,7 @@ static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar * fputc('\n', fp) != EOF); } - if (fclose(fp) == EOF) { + if (safe_fclose(fp) == EOF) { FILE_OP_ERROR(tmp_path, "fclose"); fp = NULL; goto out; @@ -1415,7 +1417,7 @@ static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar * out: if (fp) - fclose(fp); + safe_fclose(fp); g_free(tmp_path); g_free(path); } diff --git a/src/procmsg.c b/src/procmsg.c @@ -49,6 +49,7 @@ #include "timing.h" #include "inc.h" #include "privacy.h" +#include "safe_fclose.h" extern SessionStats session_stats; @@ -1120,7 +1121,7 @@ gint procmsg_remove_special_headers(const gchar *in, const gchar *out) return -1; } } - fclose(outfp); + safe_fclose(outfp); fclose(fp); return 0; } @@ -1705,7 +1706,7 @@ send_mail: } } } - fclose(tmpfp); + safe_fclose(tmpfp); if (newsval == 0) { debug_print("Sending message by news\n"); @@ -2339,14 +2340,14 @@ MsgInfo *procmsg_msginfo_new_from_mimeinfo(MsgInfo *src_msginfo, MimeInfo *mimei } if (fp && procmime_write_mimeinfo(mimeinfo, fp) >= 0) { - fclose(fp); + safe_fclose(fp); fp = NULL; tmp_msginfo = procheader_parse_file( tmpfile, flags, TRUE, FALSE); } if (fp) - fclose(fp); + safe_fclose(fp); if (tmp_msginfo != NULL) { if (src_msginfo) diff --git a/src/safe_fclose.c b/src/safe_fclose.c @@ -0,0 +1,46 @@ +/* + * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client + * Copyright (C) 1999-2018 Colin Leroy and the Claws Mail team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#include "claws-features.h" +#endif + +#include <stdio.h> +#include <unistd.h> + +#include "prefs_common.h" +#include "common/timing.h" + +int safe_fclose(FILE *fp) +{ + int r; + START_TIMING(""); + + if (fflush(fp) != 0) { + return EOF; + } + if (prefs_common_get_prefs()->flush_metadata && fsync(fileno(fp)) != 0) { + return EOF; + } + + r = fclose(fp); + END_TIMING(); + + return r; +} diff --git a/src/safe_fclose.h b/src/safe_fclose.h @@ -0,0 +1,24 @@ +/* + * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client + * Copyright (C) 1999-2018 Colin Leroy and the Claws Mail team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __SAFE_FCLOSE_H__ +#define __SAFE_FCLOSE_H__ + +int safe_fclose(FILE *fp); + +#endif