diff mbox series

[U-Boot] cmd/nvedit.c: Update input handling to cover overflow cases

Message ID 1506469031-11572-1-git-send-email-trini@konsulko.com
State Accepted
Commit c667723ffb50b00585b729ee0da7b0e8c93ffa13
Delegated to: Tom Rini
Headers show
Series [U-Boot] cmd/nvedit.c: Update input handling to cover overflow cases | expand

Commit Message

Tom Rini Sept. 26, 2017, 11:37 p.m. UTC
When we have multiple messages provided, we need to be sure that we do
not exceed the length of our 'message' buffer.  In the for loop, make
sure that pos is not larger than message.  Only copy in at most however
much of the message buffer remains.  Finally, if we have not reached the
end of the message buffer, put in a space and NULL, and if we have,
ensure the buffer is now NULL termined.

Reported-by: Coverity (CID: 165116)
Signed-off-by: Tom Rini <trini@konsulko.com>
---
 cmd/nvedit.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Tom Rini Oct. 7, 2017, 1:09 p.m. UTC | #1
On Tue, Sep 26, 2017 at 07:37:11PM -0400, Tom Rini wrote:

> When we have multiple messages provided, we need to be sure that we do
> not exceed the length of our 'message' buffer.  In the for loop, make
> sure that pos is not larger than message.  Only copy in at most however
> much of the message buffer remains.  Finally, if we have not reached the
> end of the message buffer, put in a space and NULL, and if we have,
> ensure the buffer is now NULL termined.
> 
> Reported-by: Coverity (CID: 165116)
> Signed-off-by: Tom Rini <trini@konsulko.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 4033d90c8e2d..055836cc72d1 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -393,15 +393,18 @@  int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		sprintf(message, "Please enter '%s': ", argv[1]);
 	} else {
 		/* env_ask envname message1 ... messagen [size] */
-		for (i = 2, pos = 0; i < argc; i++) {
+		for (i = 2, pos = 0; i < argc && pos < sizeof(message); i++) {
 			if (pos)
 				message[pos++] = ' ';
 
-			strcpy(message + pos, argv[i]);
+			strncpy(message + pos, argv[i], sizeof(message) - pos);
 			pos += strlen(argv[i]);
 		}
-		message[pos++] = ' ';
-		message[pos] = '\0';
+		if (pos < sizeof(message) - 1) {
+			message[pos++] = ' ';
+			message[pos] = '\0';
+		} else
+			message[CONFIG_SYS_CBSIZE - 1] = '\0';
 	}
 
 	if (size >= CONFIG_SYS_CBSIZE)