Blame SOURCES/elinks-0.12pre6-static-analysis.patch

06c6ff
From 0bfe44b6e0041210859c91e1589d5dc45c3991de Mon Sep 17 00:00:00 2001
06c6ff
From: Kamil Dudka <kdudka@redhat.com>
06c6ff
Date: Tue, 6 Nov 2018 18:35:19 +0100
06c6ff
Subject: [PATCH] elinks: fix programming mistakes detected by static analysis
06c6ff
06c6ff
---
06c6ff
 src/bfu/menu.c                |  1 +
06c6ff
 src/bfu/msgbox.c              |  1 +
06c6ff
 src/config/conf.c             |  5 ++++-
06c6ff
 src/dialogs/options.c         |  3 ++-
06c6ff
 src/intl/gettext/loadmsgcat.c | 14 ++++++++++++--
06c6ff
 src/protocol/ftp/ftp.c        |  8 +++++++-
06c6ff
 src/scripting/lua/core.c      |  8 ++++++--
06c6ff
 src/terminal/event.c          |  2 +-
06c6ff
 src/util/string.c             |  2 +-
06c6ff
 9 files changed, 35 insertions(+), 9 deletions(-)
06c6ff
06c6ff
diff --git a/src/bfu/menu.c b/src/bfu/menu.c
06c6ff
index 74b60d7..07285b7 100644
06c6ff
--- a/src/bfu/menu.c
06c6ff
+++ b/src/bfu/menu.c
06c6ff
@@ -125,6 +125,7 @@ do_menu_selected(struct terminal *term, struct menu_item *items,
06c6ff
 		refresh_hotkeys(term, menu);
06c6ff
 		add_window(term, menu_handler, menu);
06c6ff
 	} else {
06c6ff
+		/* FIXME: This will cause BAD_FREE when called from do_setup_menu() */
06c6ff
 		free_menu_items(items);
06c6ff
 	}
06c6ff
 }
06c6ff
diff --git a/src/bfu/msgbox.c b/src/bfu/msgbox.c
06c6ff
index d7af62b..f272459 100644
06c6ff
--- a/src/bfu/msgbox.c
06c6ff
+++ b/src/bfu/msgbox.c
06c6ff
@@ -103,6 +103,7 @@ msg_text_do(unsigned char *format, va_list ap)
06c6ff
 	VA_COPY(ap2, ap);
06c6ff
 
06c6ff
 	infolen = vsnprintf(NULL, 0, format, ap2);
06c6ff
+	va_end(ap2);
06c6ff
 	info = mem_alloc(infolen + 1);
06c6ff
 	if (!info) return NULL;
06c6ff
 
06c6ff
diff --git a/src/config/conf.c b/src/config/conf.c
06c6ff
index 12bba7c..e879ea5 100644
06c6ff
--- a/src/config/conf.c
06c6ff
+++ b/src/config/conf.c
06c6ff
@@ -702,7 +702,10 @@ read_config_file(unsigned char *name)
06c6ff
 	if (fd < 0) return NULL;
06c6ff
 	set_bin(fd);
06c6ff
 
06c6ff
-	if (!init_string(&string)) return NULL;
06c6ff
+	if (!init_string(&string)) {
06c6ff
+		close(fd);
06c6ff
+		return NULL;
06c6ff
+	}
06c6ff
 
06c6ff
 	while ((r = safe_read(fd, cfg_buffer, FILE_BUF)) > 0) {
06c6ff
 		int i;
06c6ff
diff --git a/src/dialogs/options.c b/src/dialogs/options.c
06c6ff
index f40d07d..a3a0a8b 100644
06c6ff
--- a/src/dialogs/options.c
06c6ff
+++ b/src/dialogs/options.c
06c6ff
@@ -125,8 +125,9 @@ push_ok_button(struct dialog_data *dlg_data, struct widget_data *button)
06c6ff
 static widget_handler_status_T
06c6ff
 push_save_button(struct dialog_data *dlg_data, struct widget_data *button)
06c6ff
 {
06c6ff
+	struct terminal *term = dlg_data->win->term;
06c6ff
 	push_ok_button(dlg_data, button);
06c6ff
-	write_config(dlg_data->win->term);
06c6ff
+	write_config(term);
06c6ff
 
06c6ff
 	return EVENT_PROCESSED;
06c6ff
 }
06c6ff
diff --git a/src/intl/gettext/loadmsgcat.c b/src/intl/gettext/loadmsgcat.c
06c6ff
index 0eac283..1be7b2b 100644
06c6ff
--- a/src/intl/gettext/loadmsgcat.c
06c6ff
+++ b/src/intl/gettext/loadmsgcat.c
06c6ff
@@ -312,8 +312,10 @@ source_success:
06c6ff
 		unsigned char *read_ptr;
06c6ff
 
06c6ff
 		data = (struct mo_file_header *) malloc(size);
06c6ff
-		if (data == NULL)
06c6ff
+		if (data == NULL) {
06c6ff
+			close(fd);
06c6ff
 			return;
06c6ff
+		}
06c6ff
 
06c6ff
 		to_read = size;
06c6ff
 		read_ptr = (unsigned char *) data;
06c6ff
@@ -321,6 +323,7 @@ source_success:
06c6ff
 			ssize_t nb = safe_read(fd, read_ptr, to_read);
06c6ff
 
06c6ff
 			if (nb <= 0) {
06c6ff
+				free(data);
06c6ff
 				close(fd);
06c6ff
 				return;
06c6ff
 			}
06c6ff
@@ -345,8 +348,15 @@ source_success:
06c6ff
 	}
06c6ff
 
06c6ff
 	domain = (struct loaded_domain *) malloc(sizeof(struct loaded_domain));
06c6ff
-	if (domain == NULL)
06c6ff
+	if (domain == NULL) {
06c6ff
+#ifdef LOADMSGCAT_USE_MMAP
06c6ff
+		if (use_mmap)
06c6ff
+			munmap((void *) data, size);
06c6ff
+		else
06c6ff
+#endif
06c6ff
+			free(data);
06c6ff
 		return;
06c6ff
+	}
06c6ff
 	domain_file->data = domain;
06c6ff
 
06c6ff
 	domain->data = (unsigned char *) data;
06c6ff
diff --git a/src/protocol/ftp/ftp.c b/src/protocol/ftp/ftp.c
06c6ff
index 10c9e28..fe3b7f0 100644
06c6ff
--- a/src/protocol/ftp/ftp.c
06c6ff
+++ b/src/protocol/ftp/ftp.c
06c6ff
@@ -926,11 +926,17 @@ ftp_data_connect(struct connection *conn, int pf, struct sockaddr_storage *sa,
06c6ff
 	}
06c6ff
 
06c6ff
 	fd = socket(pf, SOCK_STREAM, 0);
06c6ff
-	if (fd < 0 || set_nonblocking_fd(fd) < 0) {
06c6ff
+	if (fd < 0) {
06c6ff
 		abort_connection(conn, connection_state(S_FTP_ERROR));
06c6ff
 		return -1;
06c6ff
 	}
06c6ff
 
06c6ff
+	if (set_nonblocking_fd(fd) < 0) {
06c6ff
+		abort_connection(conn, connection_state(S_FTP_ERROR));
06c6ff
+		close(fd);
06c6ff
+		return -1;
06c6ff
+	}
06c6ff
+
06c6ff
 	set_ip_tos_throughput(fd);
06c6ff
 
06c6ff
 	conn->data_socket->fd = fd;
06c6ff
diff --git a/src/scripting/lua/core.c b/src/scripting/lua/core.c
06c6ff
index 1c4dbbc..f86bf0d 100644
06c6ff
--- a/src/scripting/lua/core.c
06c6ff
+++ b/src/scripting/lua/core.c
06c6ff
@@ -207,12 +207,16 @@ l_pipe_read(LS)
06c6ff
 		if (l > 0) {
06c6ff
 			unsigned char *news = mem_realloc(s, len + l);
06c6ff
 
06c6ff
-			if (!news) goto lua_error;
06c6ff
+			if (!news) {
06c6ff
+				pclose(fp);
06c6ff
+				goto lua_error;
06c6ff
+			}
06c6ff
 			s = news;
06c6ff
 			memcpy(s + len, buf, l);
06c6ff
 			len += l;
06c6ff
 
06c6ff
-		} else if (l < 0) {
06c6ff
+		} else {
06c6ff
+			pclose(fp);
06c6ff
 			goto lua_error;
06c6ff
 		}
06c6ff
 	}
06c6ff
diff --git a/src/terminal/event.c b/src/terminal/event.c
06c6ff
index 9ad90df..d0de6f0 100644
06c6ff
--- a/src/terminal/event.c
06c6ff
+++ b/src/terminal/event.c
06c6ff
@@ -251,13 +251,13 @@ handle_interlink_event(struct terminal *term, struct interlink_event *ilev)
06c6ff
 		/* Either the initialization of the first session failed or we
06c6ff
 		 * are doing a remote session so quit.*/
06c6ff
 		if (!decode_session_info(term, info)) {
06c6ff
-			destroy_terminal(term);
06c6ff
 			/* Make sure the user is notified if the initialization
06c6ff
 			 * of the first session fails. */
06c6ff
 			if (program.terminate) {
06c6ff
 				usrerror(_("Failed to create session.", term));
06c6ff
 				program.retval = RET_FATAL;
06c6ff
 			}
06c6ff
+			destroy_terminal(term);
06c6ff
 			return 0;
06c6ff
 		}
06c6ff
 
06c6ff
diff --git a/src/util/string.c b/src/util/string.c
06c6ff
index 604a00d..833fb9b 100644
06c6ff
--- a/src/util/string.c
06c6ff
+++ b/src/util/string.c
06c6ff
@@ -417,10 +417,10 @@ add_file_to_string(struct string *string, const unsigned char *filename)
06c6ff
 	string->length += fread(string->source + string->length, 1,
06c6ff
 	                        (size_t) filelen, file);
06c6ff
 	string->source[string->length] = 0;
06c6ff
-	fclose(file);
06c6ff
 
06c6ff
 	if (string->length != newlength) goto err;
06c6ff
 
06c6ff
+	fclose(file);
06c6ff
 	return string;
06c6ff
 
06c6ff
 err:
06c6ff
-- 
06c6ff
2.17.2
06c6ff