From ea95cdb8e2012b21cd3a12f7062e851178c7f455 Mon Sep 17 00:00:00 2001
From: zwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Date: Fri, 12 Jun 2009 01:40:48 +0000
Subject: [PATCH] Improve VID/PID command argument handling in FTDI driver: -
 Bug fix: Return a syntax error when less than two arguments are given. - Bug
 fix: Use parse_u16 helper to ensure vales are parsed properly. - Simplify
 loop termination logic by ensuring argc is always even. - Move loop induction
 variable declaration to where it is used.

git-svn-id: svn://svn.berlios.de/openocd/trunk@2215 b42882b7-edfa-0310-969c-e2dbd0fdcd60
---
 src/jtag/ft2232.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c
index 4bc2f3fe4..a458315ba 100644
--- a/src/jtag/ft2232.c
+++ b/src/jtag/ft2232.c
@@ -2827,8 +2827,6 @@ static int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char*
 
 static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
-	int i;
-
 	if (argc > MAX_USB_IDS * 2)
 	{
 		LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
@@ -2839,13 +2837,21 @@ static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char
 	{
 		LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
 		if (argc < 2)
-			return ERROR_OK;
+			return ERROR_COMMAND_SYNTAX_ERROR;
+		// remove the incomplete trailing id
+		argc -= 1;
 	}
 
-	for (i = 0; i + 1 < argc; i += 2)
+	int i;
+	int retval = ERROR_OK;
+	for (i = 0; i < argc; i += 2)
 	{
-		ft2232_vid[i >> 1] = strtol(args[i], NULL, 0);
-		ft2232_pid[i >> 1] = strtol(args[i + 1], NULL, 0);
+		retval = parse_u16(args[i], &ft2232_vid[i >> 1]);
+		if (ERROR_OK != retval)
+			break;
+		retval = parse_u16(args[i + 1], &ft2232_pid[i >> 1]);
+		if (ERROR_OK != retval)
+			break;
 	}
 
 	/*
@@ -2854,7 +2860,7 @@ static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char
 	 */
 	ft2232_vid[i >> 1] = ft2232_pid[i >> 1] = 0;
 
-	return ERROR_OK;
+	return retval;
 }
 
 
-- 
GitLab