This is basically to fix gcc warning:
user.c: In function 'save_form_data_to_file':
user.c:243: warning: ignoring return value of 'fwrite', declared with attribute 
warn_unused_result

Now fwrite() return value must be checked.  But I also noticed that
temporary file is not being freed on error conditions.  And since stdio
is buffered, fclose() return value must be checked, too.

After a few --amend's I noticed the routine does not look quite the same
anymore.
---
 src/protocol/user.c |   39 +++++++++++++++++++++++++--------------
 1 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/src/protocol/user.c b/src/protocol/user.c
index e00cf72..fe45968 100644
--- a/src/protocol/user.c
+++ b/src/protocol/user.c
@@ -217,32 +217,43 @@ static unsigned char *
 save_form_data_to_file(struct uri *uri)
 {
        unsigned char *filename = get_tempdir_filename("elinks-XXXXXX");
-       int formfd;
-       FILE *formfile;
+       int fd;
+       FILE *fp;
+       unsigned char *formdata;
+       size_t len, nmemb;
 
        if (!filename) return NULL;
 
-       formfd = safe_mkstemp(filename);
-       if (formfd < 0) {
+       fd = safe_mkstemp(filename);
+       if (fd < 0) {
                mem_free(filename);
                return NULL;
        }
 
-       formfile = fdopen(formfd, "w");
-       if (!formfile) {
+       if (!uri->post) return filename;
+
+       /* Jump the content type */
+       formdata = strchr(uri->post, '\n');
+       formdata = formdata ? formdata + 1 : uri->post;
+       len = strlen(formdata);
+       if (len == 0) return filename;
+
+       fp = fdopen(fd, "w");
+       if (!fp) {
+error:         unlink(filename);
                mem_free(filename);
-               close(formfd);
+               close(fd);
                return NULL;
        }
 
-       if (uri->post) {
-               /* Jump the content type */
-               unsigned char *formdata = strchr(uri->post, '\n');
-
-               formdata = formdata ? formdata + 1 : uri->post;
-               fwrite(formdata, strlen(formdata), 1, formfile);
+       nmemb = fwrite(formdata, len, 1, fp);
+       if (nmemb != 1) {
+               fclose(fp);
+               goto error;
        }
-       fclose(formfile);
+
+       if (fclose(fp) != 0)
+               goto error;
 
        return filename;
 }
-- 
1.5.0.1.GIT

_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev

Reply via email to