gamma-control: Read ramps using pread

read advances the file description offset, and requires the client to
ensure that it is reset appropriately before the next gamma ramp
submission. As there is no event to indicate that wlroots finished
processing the new gamma ramp, this can result in a race between the
client seeking in the file and wlroots reading its content.

Use pread with a fixed offset instead.

Fixes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3655
This commit is contained in:
Kenny Levinsen 2023-06-05 11:51:06 +02:00
parent b61d5922f1
commit 15f2f6642f

View file

@ -1,3 +1,4 @@
#define _POSIX_C_SOURCE 200809L
#include <assert.h> #include <assert.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h> #include <stdlib.h>
@ -119,7 +120,7 @@ static void gamma_control_handle_set_gamma(struct wl_client *client,
goto error_fd; goto error_fd;
} }
ssize_t n_read = read(fd, table, table_size); ssize_t n_read = pread(fd, table, table_size, 0);
if (n_read < 0) { if (n_read < 0) {
wlr_log_errno(WLR_ERROR, "failed to read gamma table"); wlr_log_errno(WLR_ERROR, "failed to read gamma table");
gamma_control_send_failed(gamma_control); gamma_control_send_failed(gamma_control);