This patchset disables most uses of SO_REUSEADDR on Windows and replaces it with
calls to the new function socket_set_fast_reuse. On Windows systems the default
behaviour is equivalent to SO_REUSEADDR on other operating systems. SO_REUSEADDR
can still be set but results in undesired behaviour in most cases. It may even
lead to situations were system behaviour is unspecified. More information on
this can be found at:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx

I originally encountered this issue when accidentally launching two QEMU
instances with identical GDB ports at the same time. In which case QEMU won't
fail as one might expect.

Note that patch #4 fails checkpatch.pl. This is intentional (see v3 changes).

v5 Changes:
- Fixed inverted silent flag on all call sites of socket_set_fast_reuse

v4 Changes:
- Added the silent flag to socket_set_fast_reuse controlling error reporting
  One location where SO_REUSEADDR was set would report errors if setting the
  option failed. Keeping the reporting code there would be somewhat unclean, so
  I moved it to socket_set_fast_reuse. A side effect of this was that the error
  reporting was added for all locations that now use socket_set_fast_reuse. Here
  a new flag is added to control error reporting, which means this patchset
  won't change QEMU behaviour (except for not setting SO_REUSEADDR on Windows).

- Fixed a commit message typo

- Rebased to current master (2d1fe1873a984d1c2c89ffa3d12949cafc718551).

v3 Changes:
- Fixed coding style issues.
  According to checkpatch.pl patch #4 still introduces style errors as tabs are
  used instead of space for some indentation. I keept the tabs to stay
  consistent with the sourrounding code, as tabs seem to be used consitently in
  parts (all?) of the slirp code.

- Changed patch #3 to keep SO_REUSEADDR for multicast sockets on windows and
  added an explainatory comment.

- Rebased to current master (94c2b6aff43cdfcfdfb552773a6b6b973a72ef0b).

v2 Changes:

- Introduce a function with os specific implementation instead of using #ifdef
  I named it socket_set_fast_reuse instead of the suggested qemu_set_reuseaddr
  so the name better reflects what the function actually does.

gdbstub.c              |    6 ++----
include/qemu/sockets.h |    1 +
net/socket.c           |   18 ++++++++++--------
slirp/misc.c           |    3 +--
slirp/socket.c         |    4 +---
slirp/tcp_subr.c       |    6 ++----
slirp/udp.c            |    4 ++--
util/oslib-posix.c     |   14 ++++++++++++++
util/oslib-win32.c     |   10 ++++++++++
util/qemu-sockets.c    |    6 +++---
10 files changed, 46 insertions(+), 26 deletions(-)

util: add socket_set_fast_reuse function which will
gdbstub: call socket_set_fast_reuse instead of
net: call socket_set_fast_reuse instead of setting
slirp: call socket_set_fast_reuse instead of setting
util: call socket_set_fast_reuse instead of setting

Reply via email to