This is an automated email from Gerrit.

Andreas Fritiofson ([email protected]) just uploaded a new patch set 
to Gerrit, which you can find at http://openocd.zylin.com/794

-- gerrit

commit e3661a60c43d477f8fea8b1ec4391f3fe2b4dbf1
Author: Andreas Fritiofson <[email protected]>
Date:   Thu Aug 23 23:35:48 2012 +0200

    ftdi: fix overflow if last field of a scan is empty
    
    The last bit of a scan is clocked during TAP movement so it's necessary
    for the last field to have at least one bit. Strip trailing empty fields
    and make sure the TAP is not affected if there's nothing to scan. Clients
    probably shouldn't add empty fields so add a debug message to be able to
    track and fix them.
    
    Change-Id: I27552568bc11146570b9b99ed8a1ae81b5fb2c50
    Signed-off-by: Andreas Fritiofson <[email protected]>

diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index 72b08fd..46797d7 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -389,6 +389,18 @@ static int ftdi_execute_scan(struct jtag_command *cmd)
        DEBUG_JTAG_IO("%s type:%d", cmd->cmd.scan->ir_scan ? "IRSCAN" : 
"DRSCAN",
                jtag_scan_type(cmd->cmd.scan));
 
+       /* Make sure there are no trailing fields with num_bits == 0, or the 
logic below will fail. */
+       while (cmd->cmd.scan->num_fields > 0
+                       && cmd->cmd.scan->fields[cmd->cmd.scan->num_fields - 
1].num_bits == 0) {
+               cmd->cmd.scan->num_fields--;
+               LOG_DEBUG("discarding trailing empty field");
+       }
+
+       if (cmd->cmd.scan->num_fields == 0) {
+               LOG_DEBUG("empty scan, doing nothing");
+               return retval;
+       }
+
        if (cmd->cmd.scan->ir_scan) {
                if (tap_get_state() != TAP_IRSHIFT)
                        move_to_state(TAP_IRSHIFT);
@@ -413,7 +425,7 @@ static int ftdi_execute_scan(struct jtag_command *cmd)
 
                if (i == cmd->cmd.scan->num_fields - 1 && tap_get_state() != 
tap_get_end_state()) {
                        /* Last field, and we're leaving IRSHIFT/DRSHIFT. Clock 
last bit during tap
-                        *movement */
+                        * movement. This last field can't have length zero, it 
was checked above. */
                        mpsse_clock_data(mpsse_ctx,
                                field->out_value,
                                0,

-- 

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to