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

Alexey Tourbin at at altlinux.ru
Tue Feb 27 03:36:21 MST 2007


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



More information about the elinks-dev mailing list