Revert "wayland: Drop Xwayland abstract socket"

This reverts commit e2123768f6.  Various
container/chroot (e.g. Snaps, pressure-vessel) systems still depend on
the presence of the abstract X11 socket.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1613
(cherry picked from commit ea2192c4899ac7897efca31e8e85c157895950ac)

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1669>
This commit is contained in:
James Henstridge 2020-10-17 11:50:31 +08:00 committed by Olivier Fourdan
parent 5671888775
commit df4b6d4ca5
2 changed files with 89 additions and 12 deletions

View File

@ -46,6 +46,7 @@ typedef struct
{ {
int display_index; int display_index;
char *lock_file; char *lock_file;
int abstract_fd;
int unix_fd; int unix_fd;
char *name; char *name;
} MetaXWaylandConnection; } MetaXWaylandConnection;

View File

@ -438,6 +438,51 @@ create_lock_file (int display,
return filename; return filename;
} }
static int
bind_to_abstract_socket (int display,
gboolean *fatal,
GError **error)
{
struct sockaddr_un addr;
socklen_t size, name_size;
int fd;
fd = socket (PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
if (fd < 0)
{
*fatal = TRUE;
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
"Failed to create socket: %s", g_strerror (errno));
return -1;
}
addr.sun_family = AF_LOCAL;
name_size = snprintf (addr.sun_path, sizeof addr.sun_path,
"%c/tmp/.X11-unix/X%d", 0, display);
size = offsetof (struct sockaddr_un, sun_path) + name_size;
if (bind (fd, (struct sockaddr *) &addr, size) < 0)
{
*fatal = errno != EADDRINUSE;
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
"Failed to bind to %s: %s",
addr.sun_path + 1, g_strerror (errno));
close (fd);
return -1;
}
if (listen (fd, 1) < 0)
{
*fatal = errno != EADDRINUSE;
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
"Failed to listen to %s: %s",
addr.sun_path + 1, g_strerror (errno));
close (fd);
return -1;
}
return fd;
}
static int static int
bind_to_unix_socket (int display, bind_to_unix_socket (int display,
GError **error) GError **error)
@ -597,18 +642,29 @@ ensure_x11_unix_dir (GError **error)
static gboolean static gboolean
open_display_sockets (MetaXWaylandManager *manager, open_display_sockets (MetaXWaylandManager *manager,
int display_index, int display_index,
int *abstract_fd_out,
int *unix_fd_out, int *unix_fd_out,
gboolean *fatal,
GError **error) GError **error)
{ {
int unix_fd; int abstract_fd, unix_fd;
if (!ensure_x11_unix_dir (error)) if (!ensure_x11_unix_dir (error))
return FALSE; return FALSE;
unix_fd = bind_to_unix_socket (display_index, error); abstract_fd = bind_to_abstract_socket (display_index, fatal, error);
if (unix_fd < 0) if (abstract_fd < 0)
return FALSE; return FALSE;
unix_fd = bind_to_unix_socket (display_index, error);
if (unix_fd < 0)
{
*fatal = FALSE;
close (abstract_fd);
return FALSE;
}
*abstract_fd_out = abstract_fd;
*unix_fd_out = unix_fd; *unix_fd_out = unix_fd;
return TRUE; return TRUE;
@ -621,6 +677,7 @@ choose_xdisplay (MetaXWaylandManager *manager,
{ {
int display = 0; int display = 0;
char *lock_file = NULL; char *lock_file = NULL;
gboolean fatal = FALSE;
if (display_number_override != -1) if (display_number_override != -1)
display = display_number_override; display = display_number_override;
@ -640,12 +697,23 @@ choose_xdisplay (MetaXWaylandManager *manager,
} }
if (!open_display_sockets (manager, display, if (!open_display_sockets (manager, display,
&connection->abstract_fd,
&connection->unix_fd, &connection->unix_fd,
&fatal,
&local_error)) &local_error))
{ {
unlink (lock_file); unlink (lock_file);
g_prefix_error (error, "Failed to bind X11 socket: ");
return FALSE; if (!fatal)
{
display++;
continue;
}
else
{
g_warning ("Failed to bind X11 socket");
return FALSE;
}
} }
break; break;
@ -843,9 +911,10 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
launcher = g_subprocess_launcher_new (flags); launcher = g_subprocess_launcher_new (flags);
g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3); g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3);
g_subprocess_launcher_take_fd (launcher, manager->public_connection.unix_fd, 4); g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 4);
g_subprocess_launcher_take_fd (launcher, displayfd[1], 5); g_subprocess_launcher_take_fd (launcher, manager->public_connection.unix_fd, 5);
g_subprocess_launcher_take_fd (launcher, manager->private_connection.unix_fd, 6); g_subprocess_launcher_take_fd (launcher, displayfd[1], 6);
g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 7);
g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE); g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE);
@ -860,14 +929,16 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager,
args[i++] = manager->auth_file; args[i++] = manager->auth_file;
args[i++] = "-listen"; args[i++] = "-listen";
args[i++] = "4"; args[i++] = "4";
args[i++] = "-displayfd"; args[i++] = "-listen";
args[i++] = "5"; args[i++] = "5";
args[i++] = "-displayfd";
args[i++] = "6";
#ifdef HAVE_XWAYLAND_INITFD #ifdef HAVE_XWAYLAND_INITFD
args[i++] = "-initfd"; args[i++] = "-initfd";
args[i++] = "6"; args[i++] = "7";
#else #else
args[i++] = "-listen"; args[i++] = "-listen";
args[i++] = "6"; args[i++] = "7";
#endif #endif
for (j = 0; j < G_N_ELEMENTS (x11_extension_names); j++) for (j = 0; j < G_N_ELEMENTS (x11_extension_names); j++)
{ {
@ -987,6 +1058,7 @@ meta_xwayland_init (MetaXWaylandManager *manager,
GError **error) GError **error)
{ {
MetaDisplayPolicy policy; MetaDisplayPolicy policy;
gboolean fatal;
if (!manager->public_connection.name) if (!manager->public_connection.name)
{ {
@ -1002,13 +1074,17 @@ meta_xwayland_init (MetaXWaylandManager *manager,
{ {
if (!open_display_sockets (manager, if (!open_display_sockets (manager,
manager->public_connection.display_index, manager->public_connection.display_index,
&manager->public_connection.abstract_fd,
&manager->public_connection.unix_fd, &manager->public_connection.unix_fd,
&fatal,
error)) error))
return FALSE; return FALSE;
if (!open_display_sockets (manager, if (!open_display_sockets (manager,
manager->private_connection.display_index, manager->private_connection.display_index,
&manager->private_connection.abstract_fd,
&manager->private_connection.unix_fd, &manager->private_connection.unix_fd,
&fatal,
error)) error))
return FALSE; return FALSE;
} }
@ -1022,7 +1098,7 @@ meta_xwayland_init (MetaXWaylandManager *manager,
if (policy == META_DISPLAY_POLICY_ON_DEMAND) if (policy == META_DISPLAY_POLICY_ON_DEMAND)
{ {
g_unix_fd_add (manager->public_connection.unix_fd, G_IO_IN, g_unix_fd_add (manager->public_connection.abstract_fd, G_IO_IN,
xdisplay_connection_activity_cb, manager); xdisplay_connection_activity_cb, manager);
} }