diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2018-08-03 18:04:38 -0400 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2018-08-03 18:04:38 -0400 |
commit | 425699f52d8fb875c2197b202b9e05bdc09d0115 (patch) | |
tree | 0476a6c5969baa2465a512de7264d40b1884b0b2 /gdb/ser-tcp.c | |
parent | 4aae6e5abddb84e1225cfd696b8fd2c6832f9fb6 (diff) | |
download | fsf-binutils-gdb-425699f52d8fb875c2197b202b9e05bdc09d0115.zip fsf-binutils-gdb-425699f52d8fb875c2197b202b9e05bdc09d0115.tar.gz fsf-binutils-gdb-425699f52d8fb875c2197b202b9e05bdc09d0115.tar.bz2 |
Fix thinko when deciding whether to disable TCP's Nagle algorithm
This patch fixes a thinko that happened when I was implementing the
IPv6 support on GDB/gdbserver. On certain situations, it is necessary
to disable TCP's Nagle algorithm (NODELAY). For obvious reasons, this
only applies when we are dealing with a TCP connection.
While implementing the IPv6 patch, I noticed that the net_open
function (on gdb/ser-tcp.c) kept a flag indicating whether the
connection type was UDP or TCP. I eliminated that flag, and started
using the 'struct addrinfo *' related to the successful connection
directly. However, I made a mistake:
if (success_ainfo->ai_socktype == IPPROTO_TCP)
^^^^^^^^^^^
{
/* Disable Nagle algorithm. Needed in some cases. */
int tmp = 1;
setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
(char *) &tmp, sizeof (tmp));
}
The 'ai_socktype' field specifies the socket type (SOCK_STREAM or
SOCK_DGRAM), and not the protocol. This test was always failing, and
the Nagle algorithm was never being disabled.
The obvious fix is to use the 'ai_protocol' field. This is what this
patch does.
Huge "thank you" to Joel Brobecker who reported the regression (he was
experiencing an unusual delay while debugging a bare-metal program
running under QEMU) and helped me set up a proper reproducer for the
bug.
gdb/ChangeLog:
2018-08-03 Sergio Durigan Junior <sergiodj@redhat.com>
* ser-tcp.c (net_open): Fix thinko when deciding whether to
disable TCP's Nagle algorithm (use "ai_protocol" instead of
"ai_socktype").
Diffstat (limited to 'gdb/ser-tcp.c')
-rw-r--r-- | gdb/ser-tcp.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/ser-tcp.c b/gdb/ser-tcp.c index 618d2d9..bdfd556 100644 --- a/gdb/ser-tcp.c +++ b/gdb/ser-tcp.c @@ -371,7 +371,7 @@ net_open (struct serial *scb, const char *name) ioctl (scb->fd, FIONBIO, &ioarg); - if (success_ainfo->ai_socktype == IPPROTO_TCP) + if (success_ainfo->ai_protocol == IPPROTO_TCP) { /* Disable Nagle algorithm. Needed in some cases. */ int tmp = 1; |