[PATCH] textarea.c (save_textarea_file): paranoid error handling

Alexey Tourbin <[email protected]>
Newsgroups gmane.comp.web.links
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.