Always use blocking write for data_source.send
QtWaylandClient assumes that data_source's fd is BLOCKING, but some compositors (e.g. mutter) pass an fd with O_NONBLOCK set. In this case, 'write' is not guaranteed to process all of the passed data in one call. Instead of dealing with such partial writes, remove O_NONBLOCK. Fixes: QTBUG-107076 Pick-to: 6.4 6.2 5.15 Change-Id: Ieb446da9fdfbaaa55100f573b396ee449cadc463 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
parent
50dbfe3970
commit
ea5bad9031
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -57,6 +58,13 @@ void QWaylandDataSource::data_source_send(const QString &mime_type, int32_t fd)
|
|||||||
action.sa_flags = 0;
|
action.sa_flags = 0;
|
||||||
|
|
||||||
sigaction(SIGPIPE, &action, &oldAction);
|
sigaction(SIGPIPE, &action, &oldAction);
|
||||||
|
// Some compositors (e.g., mutter) make fd with O_NONBLOCK.
|
||||||
|
// Since wl_data_source.send describes that fd is closed here,
|
||||||
|
// it should be done in a loop and don't have any advantage.
|
||||||
|
// Blocking operation will be used.
|
||||||
|
// According to fcntl(2), FSETFL ignores O_WRONLY. So this
|
||||||
|
// call will just remove O_NONBLOCK.
|
||||||
|
fcntl(fd, F_SETFL, O_WRONLY);
|
||||||
ssize_t unused = write(fd, content.constData(), content.size());
|
ssize_t unused = write(fd, content.constData(), content.size());
|
||||||
Q_UNUSED(unused);
|
Q_UNUSED(unused);
|
||||||
sigaction(SIGPIPE, &oldAction, nullptr);
|
sigaction(SIGPIPE, &oldAction, nullptr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user