diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2002-09-11 05:10:49 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2002-09-11 05:10:49 +0800 |
commit | fbb7f7c202c6c4f8b435702ababe36463132292c (patch) | |
tree | 95bcaa3b7dba52abe7c474b1f9d15a64306cba59 /camel/camel-folder-summary.c | |
parent | 59431ce6f1c83c2549a3aca0ecc0b8be32d086a1 (diff) | |
download | gsoc2013-evolution-fbb7f7c202c6c4f8b435702ababe36463132292c.tar.gz gsoc2013-evolution-fbb7f7c202c6c4f8b435702ababe36463132292c.tar.zst gsoc2013-evolution-fbb7f7c202c6c4f8b435702ababe36463132292c.zip |
Do proper error checking and return -1 on fail.
2002-09-10 Jeffrey Stedfast <fejj@ximian.com>
* camel-folder-summary.c (perform_content_info_save): Do proper
error checking and return -1 on fail.
(camel_folder_summary_save): Check the return of
perform_content_info_save and a few other output calls within the
message_info_save loop. If any of them fail, save errno, close the
file, and return -1. If we finish the loop without fail, fflush
the stream and then fsync (fflush only flushes user-space buffers,
you still need to fsync afterward to flush the data to disk). If
either fail, treat it as an exception by saving errno, closing the
stream, and returning -1. I suspect that this also fixes bug
#30150 because the old code would fclose if fflush or fclose
failed in the check after the loop (man fclose(3) states that any
further calls using the stream (even another call to fclose) will
have undefined behaviour no matter what the first fclose call
returned).
* providers/local/camel-local-summary.c
(camel_local_summary_init): Don't malloc a private struct of 0
size.
svn path=/trunk/; revision=18036
Diffstat (limited to 'camel/camel-folder-summary.c')
-rw-r--r-- | camel/camel-folder-summary.c | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index ebef730c70..3ec6c93107 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -602,13 +602,19 @@ perform_content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentI { CamelMessageContentInfo *part; - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_save(s, out, ci); - camel_file_util_encode_uint32(out, my_list_size((struct _node **)&ci->childs)); + if (((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS (s)))->content_info_save (s, out, ci) == -1) + return -1; + + if (camel_file_util_encode_uint32 (out, my_list_size ((struct _node **)&ci->childs)) == -1) + return -1; + part = ci->childs; while (part) { - perform_content_info_save(s, out, part); + if (perform_content_info_save (s, out, part) == -1) + return -1; part = part->next; } + return 0; } @@ -625,8 +631,7 @@ int camel_folder_summary_save(CamelFolderSummary *s) { FILE *out; - int fd; - int i; + int fd, i; guint32 count; CamelMessageInfo *mi; char *path; @@ -641,7 +646,7 @@ camel_folder_summary_save(CamelFolderSummary *s) if (fd == -1) return -1; out = fdopen(fd, "w"); - if ( out == NULL ) { + if (out == NULL) { i = errno; unlink(path); close(fd); @@ -653,46 +658,52 @@ camel_folder_summary_save(CamelFolderSummary *s) CAMEL_SUMMARY_LOCK(s, io_lock); - if ( ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_save(s, out) == -1) { - i = errno; - fclose(out); - CAMEL_SUMMARY_UNLOCK(s, io_lock); - unlink(path); - errno = i; - return -1; - } - + if (((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->summary_header_save(s, out) == -1) + goto exception; + /* now write out each message ... */ /* we check ferorr when done for i/o errors */ - count = s->messages->len; - for (i=0;i<count;i++) { + for (i = 0; i < count; i++) { mi = s->messages->pdata[i]; - ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_save(s, out, mi); - + if (((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS (s)))->message_info_save (s, out, mi) == -1) + goto exception; + if (s->build_content) { - perform_content_info_save(s, out, mi->content); + if (perform_content_info_save (s, out, mi->content) == -1) + goto exception; } } - + + if (fflush (out) != 0 || fsync (fileno (out)) == -1) + goto exception; + + fclose (out); + CAMEL_SUMMARY_UNLOCK(s, io_lock); - - if (ferror(out) != 0 || fclose(out) != 0) { - i = errno; - unlink(path); - errno = i; - return -1; - } - + if (rename(path, s->summary_path) == -1) { i = errno; unlink(path); errno = i; return -1; } - + s->flags &= ~CAMEL_SUMMARY_DIRTY; return 0; + + exception: + + i = errno; + + fclose (out); + + CAMEL_SUMMARY_UNLOCK(s, io_lock); + + unlink (path); + errno = i; + + return -1; } /** |