From 15806fdeeb6850f83eb66d5c19c5a98c197133d2 Mon Sep 17 00:00:00 2001 From: Dmitry Chestnykh Date: Sun, 22 Apr 2012 11:54:57 +0200 Subject: [PATCH] Check for errors in fclose(). Use fsync(). --- src/file.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/file.c b/src/file.c index 9ef8dd7..78f087b 100644 --- a/src/file.c +++ b/src/file.c @@ -178,24 +178,44 @@ gint file_save_real(GtkWidget *textview, FileInfo *fi) GTK_MESSAGE_ERROR, err->message); } g_error_free(err); - return -1; + goto err0; } fp = fopen(fi->filename, "w"); if (!fp) { run_dialog_message(gtk_widget_get_toplevel(textview), GTK_MESSAGE_ERROR, _("Can't open file to write")); - return -1; + goto err0; } if (fputs(str, fp) == EOF) { run_dialog_message(gtk_widget_get_toplevel(textview), GTK_MESSAGE_ERROR, _("Can't write file")); - return -1; + goto err1; } - + if (fflush(fp) == EOF) { + run_dialog_message(gtk_widget_get_toplevel(textview), + GTK_MESSAGE_ERROR, _("Can't write file")); + goto err1; + } + if (fsync(fileno(fp)) == -1) { + run_dialog_message(gtk_widget_get_toplevel(textview), + GTK_MESSAGE_ERROR, _("Can't sync file")); + goto err1; + } + if (fclose(fp) == EOF) { + run_dialog_message(gtk_widget_get_toplevel(textview), + GTK_MESSAGE_ERROR, _("Can't close file")); + goto err0; + } + gtk_text_buffer_set_modified(textbuffer, FALSE); - fclose(fp); g_free(str); - + return 0; + +err1: + fclose(fp); /* ignore close error */ +err0: + g_free(str); + return -1; } -- 1.7.9.5