svn commit: r330000 - head/sys/netinet
Patrick Kelsey
pkelsey at FreeBSD.org
Mon Feb 26 02:43:27 UTC 2018
Author: pkelsey
Date: Mon Feb 26 02:43:26 2018
New Revision: 330000
URL: https://svnweb.freebsd.org/changeset/base/330000
Log:
Fix harmless locking bug in tfp_fastopen_check_cookie().
The keylist lock was not being acquired early enough. The only side
effect of this bug is that the effective add time of a new key could
be slightly later than it would have been otherwise, as seen by a TFO
client.
Reviewed by: tuexen
MFC after: 1 month
Sponsored by: Limelight Networks
Differential Revision: https://reviews.freebsd.org/D14046
Modified:
head/sys/netinet/tcp_fastopen.c
Modified: head/sys/netinet/tcp_fastopen.c
==============================================================================
--- head/sys/netinet/tcp_fastopen.c Mon Feb 26 02:28:32 2018 (r329999)
+++ head/sys/netinet/tcp_fastopen.c Mon Feb 26 02:43:26 2018 (r330000)
@@ -313,6 +313,7 @@ tcp_fastopen_check_cookie(struct in_conninfo *inc, uin
{
struct rm_priotracker tracker;
unsigned int i, key_index;
+ int rv;
uint64_t cur_cookie;
if (V_tcp_fastopen_acceptany) {
@@ -320,21 +321,22 @@ tcp_fastopen_check_cookie(struct in_conninfo *inc, uin
return (1);
}
+ TCP_FASTOPEN_KEYS_RLOCK(&tracker);
if (len != TCP_FASTOPEN_COOKIE_LEN) {
if (V_tcp_fastopen_numkeys > 0) {
*latest_cookie =
tcp_fastopen_make_cookie(
V_tcp_fastopen_keys.key[V_tcp_fastopen_keys.newest],
inc);
- return (0);
- }
- return (-1);
+ rv = 0;
+ } else
+ rv = -1;
+ goto out;
}
/*
* Check against each available key, from newest to oldest.
*/
- TCP_FASTOPEN_KEYS_RLOCK(&tracker);
key_index = V_tcp_fastopen_keys.newest;
for (i = 0; i < V_tcp_fastopen_numkeys; i++) {
cur_cookie =
@@ -343,17 +345,19 @@ tcp_fastopen_check_cookie(struct in_conninfo *inc, uin
if (i == 0)
*latest_cookie = cur_cookie;
if (memcmp(cookie, &cur_cookie, TCP_FASTOPEN_COOKIE_LEN) == 0) {
- TCP_FASTOPEN_KEYS_RUNLOCK(&tracker);
- return (1);
+ rv = 1;
+ goto out;
}
if (key_index == 0)
key_index = TCP_FASTOPEN_MAX_KEYS - 1;
else
key_index--;
}
- TCP_FASTOPEN_KEYS_RUNLOCK(&tracker);
+ rv = 0;
- return (0);
+out:
+ TCP_FASTOPEN_KEYS_RUNLOCK(&tracker);
+ return (rv);
}
static int
More information about the svn-src-all
mailing list