2005-03-08 Nathan Sidwell * remote.c (MIN_REMOTE_PACKET_SIZE): Set to 20. (remote_fetch_registers): Allow uppercase hex when resyncing. (remote_write_bytes): Only call get_memory_write_packet_size once. Robustify packet size calculation for very small packets. Check that at least one byte will be written. Index: remote.c =================================================================== RCS file: /cvs/src/src/gdb/remote.c,v retrieving revision 1.176 diff -c -3 -p -r1.176 remote.c *** remote.c 4 Mar 2005 17:52:53 -0000 1.176 --- remote.c 8 Mar 2005 11:03:32 -0000 *************** get_memory_packet_size (struct memory_pa *** 413,421 **** #ifndef MAX_REMOTE_PACKET_SIZE #define MAX_REMOTE_PACKET_SIZE 16384 #endif ! /* NOTE: 16 is just chosen at random. */ #ifndef MIN_REMOTE_PACKET_SIZE ! #define MIN_REMOTE_PACKET_SIZE 16 #endif long what_they_get; if (config->fixed_p) --- 413,421 ---- #ifndef MAX_REMOTE_PACKET_SIZE #define MAX_REMOTE_PACKET_SIZE 16384 #endif ! /* NOTE: 20 ensures we can write at least one byte. */ #ifndef MIN_REMOTE_PACKET_SIZE ! #define MIN_REMOTE_PACKET_SIZE 20 #endif long what_they_get; if (config->fixed_p) *************** remote_fetch_registers (int regnum) *** 3332,3337 **** --- 3332,3338 ---- in the buffer is not a hex character, assume that has happened and try to fetch another packet to read. */ while ((buf[0] < '0' || buf[0] > '9') + && (buf[0] < 'A' || buf[0] > 'F') && (buf[0] < 'a' || buf[0] > 'f') && buf[0] != 'x') /* New: unavailable register value. */ { *************** remote_write_bytes (CORE_ADDR memaddr, c *** 3659,3674 **** /* Verify that the target can support a binary download. */ check_binary_download (memaddr); /* Compute the size, and then allocate space for the largest ! possible packet. Include space for an extra trailing NULL. */ ! sizeof_buf = get_memory_write_packet_size () + 1; buf = alloca (sizeof_buf); /* Compute the size of the actual payload by subtracting out the ! packet header and footer overhead: "$M,:...#nn". */ ! payload_size = (get_memory_write_packet_size () - (strlen ("$M,:#NN") ! + hexnumlen (memaddr) ! + hexnumlen (len))); /* Construct the packet header: "[MX],:". */ --- 3660,3677 ---- /* Verify that the target can support a binary download. */ check_binary_download (memaddr); + payload_size = get_memory_write_packet_size (); + /* Compute the size, and then allocate space for the largest ! possible packet. Include space for an extra trailing NUL. */ ! sizeof_buf = payload_size + 1; buf = alloca (sizeof_buf); /* Compute the size of the actual payload by subtracting out the ! packet header and footer overhead: "$M,:...#nn". ! */ ! payload_size -= strlen ("$M,:#NN"); ! payload_size -= hexnumlen (memaddr); /* Construct the packet header: "[MX],:". */ *************** remote_write_bytes (CORE_ADDR memaddr, c *** 3681,3691 **** --- 3684,3698 ---- *p++ = 'X'; /* Best guess at number of bytes that will fit. */ todo = min (len, payload_size); + payload_size -= hexnumlen (todo); + todo = min (todo, payload_size); break; case PACKET_DISABLE: *p++ = 'M'; /* Num bytes that will fit. */ todo = min (len, payload_size / 2); + payload_size -= hexnumlen (todo); + todo = min (todo, payload_size / 2); break; case PACKET_SUPPORT_UNKNOWN: internal_error (__FILE__, __LINE__, *************** remote_write_bytes (CORE_ADDR memaddr, c *** 3693,3698 **** --- 3700,3708 ---- default: internal_error (__FILE__, __LINE__, _("bad switch")); } + if (todo <= 0) + internal_error (__FILE__, __LINE__, + _("minumum packet size too small to write data")); /* Append "". */ memaddr = remote_address_masked (memaddr);