]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
msgr: fix race in learned_addr()
authorSage Weil <sage@newdream.net>
Wed, 29 Feb 2012 21:22:34 +0000 (13:22 -0800)
committerSage Weil <sage@newdream.net>
Wed, 29 Feb 2012 21:22:34 +0000 (13:22 -0800)
commitb1f264406f93af35600786f58e75908c393cf2ed
tree06e2f1c323d5d37ef5ce58196b6f35185f0fa17c
parent8a2b76411e42f0e6404e79b1a240ce502d44de3a
msgr: fix race in learned_addr()

- two connect() threads
- both hit if (need_addr) check
- one takes lock, sets addr, need_addr = false, unlocks
- continues to ::encode(ms_addr, ...);
- meanwhile, second thread set ms_addr _again_, but copies peer port into
  place before adjusting it.  racing ::encode() sees bad port and sends it
  to the peer.

Fix this two ways:

- don't copy bad port into place; set it first
- re-check need_addr after taking lock

Fixes: #1747
Signed-off-by: Sage Weil <sage@newdream.net>
Reviewed-by: Greg Farnum <gregory.farnum@dreamhost.com>
src/msg/SimpleMessenger.cc