391820b0d6
Calling close() on the same file descriptor that a previous call to close() already closed is wrong, and racy if another thread received that same file descriptor as a eg. new socket or actual file. There are two situations where wl_connection_destroy() would close its file descriptor and then another function up in the call chain would close the same file descriptor: * When wl_client_create() fails after calling wl_connection_create(), it will call wl_connection_destroy() before returning. However, its caller will always close the file descriptor if wl_client_create() fails. * wl_display_disconnect() unconditionally closes the display file descriptor and also calls wl_connection_destroy(). So these two seem to expect wl_connection_destroy() to leave the file descriptor open. The other caller of wl_connection_destroy(), wl_client_destroy(), does however expect wl_connection_destroy() to close its file descriptor, alas. This patch changes wl_connection_destroy() to indulge this majority of two callers by simply not closing the file descriptor. For the benefit of wl_client_destroy(), wl_connection_destroy() then returns the unclosed file descriptor so that wl_client_destroy() can close it itself. Since wl_connection_destroy() is a private function called from few places, changing its semantics seemed like the more expedient way to address the double-close() problem than shuffling around the logic in wl_client_create() to somehow enable it to always avoid calling wl_connection_destroy(). Signed-off-by: Benjamin Herr <ben@0x539.de> Reviewed-by: Marek Chalupa <mchqwerty@gmail.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> |
||
---|---|---|
.. | ||
array-test.c | ||
client-test.c | ||
connection-test.c | ||
display-test.c | ||
event-loop-test.c | ||
exec-fd-leak-checker.c | ||
fixed-benchmark.c | ||
fixed-test.c | ||
list-test.c | ||
map-test.c | ||
message-test.c | ||
os-wrappers-test.c | ||
queue-test.c | ||
resources-test.c | ||
sanity-test.c | ||
signal-test.c | ||
socket-test.c | ||
test-compositor.c | ||
test-compositor.h | ||
test-helpers.c | ||
test-runner.c | ||
test-runner.h |