This is an automated email from Gerrit.

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

-- gerrit

commit eebab908907a64b44725068bf9fb97db48822849
Author: Philip Nye <[email protected]>
Date:   Mon Nov 14 20:11:51 2011 +0000

    gdb: Potential rounding error in reg_packet_size gdb_get_registers_packet
    
    The calculation for reg_packet_size in gdb_get_registers_packet() could
    generate a wrong result in the case of multiple registers whose size is
    not a multiple of 8.
    
    The current calculation sums the sizes for all registers then rounds the 
result
    up to the next multiple of 8.
    
    Instead it should round each register size up individually and sum the 
results for all registers.
    
    Change-Id: Idfb5e5eeee0e69a6889dbe9769c0bf17feacb63b
    Signed-off-by: Spencer Oliver <[email protected]>

diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 7c55e7c..fa2ffeb 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -1058,12 +1058,12 @@ static int gdb_get_registers_packet(struct connection 
*connection,
 
        for (i = 0; i < reg_list_size; i++)
        {
-               reg_packet_size += reg_list[i]->size;
+               reg_packet_size += DIV_ROUND_UP(reg_list[i]->size, 8) * 2;
        }
 
        assert(reg_packet_size > 0);
 
-       reg_packet = malloc(DIV_ROUND_UP(reg_packet_size, 8) * 2);
+       reg_packet = malloc(reg_packet_size);
        reg_packet_p = reg_packet;
 
        for (i = 0; i < reg_list_size; i++)
@@ -1077,13 +1077,13 @@ static int gdb_get_registers_packet(struct connection 
*connection,
 #ifdef _DEBUG_GDB_IO_
        {
                char *reg_packet_p;
-               reg_packet_p = strndup(reg_packet, 
DIV_ROUND_UP(reg_packet_size, 8) * 2);
+               reg_packet_p = strndup(reg_packet, reg_packet_size);
                LOG_DEBUG("reg_packet: %s", reg_packet_p);
                free(reg_packet_p);
        }
 #endif
 
-       gdb_put_packet(connection, reg_packet, DIV_ROUND_UP(reg_packet_size, 8) 
* 2);
+       gdb_put_packet(connection, reg_packet, reg_packet_size);
        free(reg_packet);
 
        free(reg_list);
@@ -2451,7 +2451,7 @@ static int gdb_target_start(struct target *target, const 
char *port)
                {
                        curr = head->target;
                        if (curr != target) curr->gdb_service = gdb_service;
-                       head = head->next;      
+                       head = head->next;
                }
        }
        return ret;
@@ -2462,7 +2462,7 @@ static int gdb_target_add_one(struct target *target)
        /*  one gdb instance per smp list */
        if ((target->smp) && (target->gdb_service)) return ERROR_OK;
        int retval = gdb_target_start(target, gdb_port_next);
-       if (retval == ERROR_OK) 
+       if (retval == ERROR_OK)
        {
                long portnumber;
                /* If we can parse the port number

-- 

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to