Re: [PATCH] textarea.c (save_textarea_file): paranoid error handling
Laurent MONIN <[email protected]>
| Newsgroups | gmane.comp.web.links |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 27 Feb 2007 13:36:21 +0300 Alexey Tourbin <[email protected]> wrote: > gcc warning as follows: > textarea.c: In function 'save_textarea_file': > textarea.c:305: warning: ignoring return value of 'fwrite', declared with attribute warn_unused_result > > Check fwrite() and fclose() return values. > Also unlink temporary file on error conditions. > > This routine is now very similar to user.c:save_form_data_to_file(). > Maybe they should be factored. > --- > src/viewer/text/textarea.c | 33 +++++++++++++++++++++++++-------- > 1 files changed, 25 insertions(+), 8 deletions(-) > > diff --git a/src/viewer/text/textarea.c b/src/viewer/text/textarea.c > index bbc58dc..7e2ac2d 100644 > --- a/src/viewer/text/textarea.c > +++ b/src/viewer/text/textarea.c > @@ -292,22 +292,39 @@ static unsigned char * > save_textarea_file(unsigned char *value) > { > unsigned char *filename; > - FILE *file = NULL; > - int h; > + FILE *fp; > + int fd; > + size_t len, nmemb; > > filename = get_tempdir_filename("elinks-area-XXXXXX"); > if (!filename) return NULL; > > - h = safe_mkstemp(filename); > - if (h >= 0) file = fdopen(h, "w"); > + fd = safe_mkstemp(filename); > + if (fd < 0) { > + mem_free(filename); > + return NULL; > + } > > - if (file) { > - fwrite(value, strlen(value), 1, file); > - fclose(file); > - } else { > + len = strlen(value); > + if (len == 0) return filename; > + > + fp = fdopen(fd, "w"); > + if (!fp) { > +error: unlink(filename); > mem_free(filename); > + close(fd); > + return NULL; > + } > + > + nmemb = fwrite(value, len, 1, fp); > + if (nmemb != 1) { > + fclose(fp); > + goto error; > } > > + if (fclose(fp) != 0) > + goto error; > + > return filename; > } > > -- > 1.5.0.1.GIT > Thanks, committed to master branch. Kind regards, -- Zas