qemu-6.2.0-rc3
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
This commit is contained in:
parent
f54452a157
commit
842e805475
@ -1,124 +0,0 @@
|
||||
From cc071629539dc1f303175a7e2d4ab854c0a8b20f Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Date: Thu, 23 Sep 2021 09:04:36 -0400
|
||||
Subject: [PATCH] block: introduce max_hw_iov for use in scsi-generic
|
||||
|
||||
Linux limits the size of iovecs to 1024 (UIO_MAXIOV in the kernel
|
||||
sources, IOV_MAX in POSIX). Because of this, on some host adapters
|
||||
requests with many iovecs are rejected with -EINVAL by the
|
||||
io_submit() or readv()/writev() system calls.
|
||||
|
||||
In fact, the same limit applies to SG_IO as well. To fix both the
|
||||
EINVAL and the possible performance issues from using fewer iovecs
|
||||
than allowed by Linux (some HBAs have max_segments as low as 128),
|
||||
introduce a separate entry in BlockLimits to hold the max_segments
|
||||
value from sysfs. This new limit is used only for SG_IO and clamped
|
||||
to bs->bl.max_iov anyway, just like max_hw_transfer is clamped to
|
||||
bs->bl.max_transfer.
|
||||
|
||||
Reported-by: Halil Pasic <pasic@linux.ibm.com>
|
||||
Cc: Hanna Reitz <hreitz@redhat.com>
|
||||
Cc: Kevin Wolf <kwolf@redhat.com>
|
||||
Cc: qemu-block@nongnu.org
|
||||
Cc: qemu-stable@nongnu.org
|
||||
Fixes: 18473467d5 ("file-posix: try BLKSECTGET on block devices too, do not round to power of 2", 2021-06-25)
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Message-Id: <20210923130436.1187591-1-pbonzini@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
---
|
||||
block/block-backend.c | 6 ++++++
|
||||
block/file-posix.c | 2 +-
|
||||
block/io.c | 1 +
|
||||
hw/scsi/scsi-generic.c | 2 +-
|
||||
include/block/block_int.h | 7 +++++++
|
||||
include/sysemu/block-backend.h | 1 +
|
||||
6 files changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/block-backend.c b/block/block-backend.c
|
||||
index 6140d133e2..ba2b5ebb10 100644
|
||||
--- a/block/block-backend.c
|
||||
+++ b/block/block-backend.c
|
||||
@@ -1986,6 +1986,12 @@ uint32_t blk_get_max_transfer(BlockBackend *blk)
|
||||
return ROUND_DOWN(max, blk_get_request_alignment(blk));
|
||||
}
|
||||
|
||||
+int blk_get_max_hw_iov(BlockBackend *blk)
|
||||
+{
|
||||
+ return MIN_NON_ZERO(blk->root->bs->bl.max_hw_iov,
|
||||
+ blk->root->bs->bl.max_iov);
|
||||
+}
|
||||
+
|
||||
int blk_get_max_iov(BlockBackend *blk)
|
||||
{
|
||||
return blk->root->bs->bl.max_iov;
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index c62e42743d..53be0bdc1b 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -1273,7 +1273,7 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
|
||||
ret = hdev_get_max_segments(s->fd, &st);
|
||||
if (ret > 0) {
|
||||
- bs->bl.max_iov = ret;
|
||||
+ bs->bl.max_hw_iov = ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/block/io.c b/block/io.c
|
||||
index 18d345a87a..bb0a254def 100644
|
||||
--- a/block/io.c
|
||||
+++ b/block/io.c
|
||||
@@ -136,6 +136,7 @@ static void bdrv_merge_limits(BlockLimits *dst, const BlockLimits *src)
|
||||
dst->min_mem_alignment = MAX(dst->min_mem_alignment,
|
||||
src->min_mem_alignment);
|
||||
dst->max_iov = MIN_NON_ZERO(dst->max_iov, src->max_iov);
|
||||
+ dst->max_hw_iov = MIN_NON_ZERO(dst->max_hw_iov, src->max_hw_iov);
|
||||
}
|
||||
|
||||
typedef struct BdrvRefreshLimitsState {
|
||||
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
|
||||
index 665baf900e..0306ccc7b1 100644
|
||||
--- a/hw/scsi/scsi-generic.c
|
||||
+++ b/hw/scsi/scsi-generic.c
|
||||
@@ -180,7 +180,7 @@ static int scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s, int len)
|
||||
page = r->req.cmd.buf[2];
|
||||
if (page == 0xb0) {
|
||||
uint64_t max_transfer = blk_get_max_hw_transfer(s->conf.blk);
|
||||
- uint32_t max_iov = blk_get_max_iov(s->conf.blk);
|
||||
+ uint32_t max_iov = blk_get_max_hw_iov(s->conf.blk);
|
||||
|
||||
assert(max_transfer);
|
||||
max_transfer = MIN_NON_ZERO(max_transfer, max_iov * qemu_real_host_page_size)
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index ffe86068d4..f4c75e8ba9 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -718,6 +718,13 @@ typedef struct BlockLimits {
|
||||
*/
|
||||
uint64_t max_hw_transfer;
|
||||
|
||||
+ /* Maximal number of scatter/gather elements allowed by the hardware.
|
||||
+ * Applies whenever transfers to the device bypass the kernel I/O
|
||||
+ * scheduler, for example with SG_IO. If larger than max_iov
|
||||
+ * or if zero, blk_get_max_hw_iov will fall back to max_iov.
|
||||
+ */
|
||||
+ int max_hw_iov;
|
||||
+
|
||||
/* memory alignment, in bytes so that no bounce buffer is needed */
|
||||
size_t min_mem_alignment;
|
||||
|
||||
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
|
||||
index 29d4fdbf63..82bae55161 100644
|
||||
--- a/include/sysemu/block-backend.h
|
||||
+++ b/include/sysemu/block-backend.h
|
||||
@@ -211,6 +211,7 @@ uint32_t blk_get_request_alignment(BlockBackend *blk);
|
||||
uint32_t blk_get_max_transfer(BlockBackend *blk);
|
||||
uint64_t blk_get_max_hw_transfer(BlockBackend *blk);
|
||||
int blk_get_max_iov(BlockBackend *blk);
|
||||
+int blk_get_max_hw_iov(BlockBackend *blk);
|
||||
void blk_set_guest_block_size(BlockBackend *blk, int align);
|
||||
void *blk_try_blockalign(BlockBackend *blk, size_t size);
|
||||
void *blk_blockalign(BlockBackend *blk, size_t size);
|
||||
--
|
||||
2.33.1
|
||||
|
@ -1,315 +0,0 @@
|
||||
From 641c964a09a5b8e52b37d6060895801a393f4073 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Mon, 15 Nov 2021 14:29:43 -0600
|
||||
Subject: [PATCH] nbd/server: Add --selinux-label option
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Under SELinux, Unix domain sockets have two labels. One is on the
|
||||
disk and can be set with commands such as chcon(1). There is a
|
||||
different label stored in memory (called the process label). This can
|
||||
only be set by the process creating the socket. When using SELinux +
|
||||
SVirt and wanting qemu to be able to connect to a qemu-nbd instance,
|
||||
you must set both labels correctly first.
|
||||
|
||||
For qemu-nbd the options to set the second label are awkward. You can
|
||||
create the socket in a wrapper program and then exec into qemu-nbd.
|
||||
Or you could try something with LD_PRELOAD.
|
||||
|
||||
This commit adds the ability to set the label straightforwardly on the
|
||||
command line, via the new --selinux-label flag. (The name of the flag
|
||||
is the same as the equivalent nbdkit option.)
|
||||
|
||||
A worked example showing how to use the new option can be found in
|
||||
this bug: https://bugzilla.redhat.com/show_bug.cgi?id=1984938
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1984938
|
||||
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
[eblake: rebase to configure changes, reject --selinux-label if it is
|
||||
not compiled in or not used on a Unix socket]
|
||||
Note that we may relax some of these restrictions at a later date,
|
||||
such as making it possible to label a TCP socket, although it may be
|
||||
smarter to do so as a generic QMP action rather than more one-off
|
||||
command lines in qemu-nbd.
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
Message-Id: <20211115202944.615966-1-eblake@redhat.com>
|
||||
Reviewed-by: Thomas Huth <thuth@redhat.com>
|
||||
[eblake: adjust meson output as suggested by thuth]
|
||||
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||
---
|
||||
meson.build | 10 +++-
|
||||
meson_options.txt | 3 ++
|
||||
qemu-nbd.c | 46 +++++++++++++++++++
|
||||
tests/docker/dockerfiles/centos8.docker | 1 +
|
||||
.../dockerfiles/fedora-i386-cross.docker | 1 +
|
||||
tests/docker/dockerfiles/fedora.docker | 1 +
|
||||
tests/docker/dockerfiles/opensuse-leap.docker | 1 +
|
||||
tests/docker/dockerfiles/ubuntu1804.docker | 1 +
|
||||
tests/docker/dockerfiles/ubuntu2004.docker | 1 +
|
||||
9 files changed, 64 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index b3e7ec0e92..7b3fcea684 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -1064,6 +1064,11 @@ keyutils = dependency('libkeyutils', required: false,
|
||||
|
||||
has_gettid = cc.has_function('gettid')
|
||||
|
||||
+# libselinux
|
||||
+selinux = dependency('libselinux',
|
||||
+ required: get_option('selinux'),
|
||||
+ method: 'pkg-config', kwargs: static_kwargs)
|
||||
+
|
||||
# Malloc tests
|
||||
|
||||
malloc = []
|
||||
@@ -1291,6 +1296,7 @@ config_host_data.set('CONFIG_FUSE', fuse.found())
|
||||
config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
|
||||
config_host_data.set('CONFIG_X11', x11.found())
|
||||
config_host_data.set('CONFIG_CFI', get_option('cfi'))
|
||||
+config_host_data.set('CONFIG_SELINUX', selinux.found())
|
||||
config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
|
||||
config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
|
||||
config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
|
||||
@@ -2741,7 +2747,8 @@ if have_tools
|
||||
qemu_io = executable('qemu-io', files('qemu-io.c'),
|
||||
dependencies: [block, qemuutil], install: true)
|
||||
qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
|
||||
- dependencies: [blockdev, qemuutil, gnutls], install: true)
|
||||
+ dependencies: [blockdev, qemuutil, gnutls, selinux],
|
||||
+ install: true)
|
||||
|
||||
subdir('storage-daemon')
|
||||
subdir('contrib/rdmacm-mux')
|
||||
@@ -3106,6 +3113,7 @@ summary_info += {'libpmem support': libpmem.found()}
|
||||
summary_info += {'libdaxctl support': libdaxctl.found()}
|
||||
summary_info += {'libudev': libudev.found()}
|
||||
summary_info += {'FUSE lseek': fuse_lseek.found()}
|
||||
+summary_info += {'selinux': selinux}
|
||||
summary(summary_info, bool_yn: true, section: 'Dependencies')
|
||||
|
||||
if not supported_cpus.contains(cpu)
|
||||
diff --git a/meson_options.txt b/meson_options.txt
|
||||
index a9a9b8f4c6..a5938500a3 100644
|
||||
--- a/meson_options.txt
|
||||
+++ b/meson_options.txt
|
||||
@@ -155,3 +155,6 @@ option('slirp', type: 'combo', value: 'auto',
|
||||
option('fdt', type: 'combo', value: 'auto',
|
||||
choices: ['disabled', 'enabled', 'auto', 'system', 'internal'],
|
||||
description: 'Whether and how to find the libfdt library')
|
||||
+
|
||||
+option('selinux', type: 'feature', value: 'auto',
|
||||
+ description: 'SELinux support in qemu-nbd')
|
||||
diff --git a/qemu-nbd.c b/qemu-nbd.c
|
||||
index 26ffbf15af..94dc2a9cca 100644
|
||||
--- a/qemu-nbd.c
|
||||
+++ b/qemu-nbd.c
|
||||
@@ -47,6 +47,10 @@
|
||||
#include "trace/control.h"
|
||||
#include "qemu-version.h"
|
||||
|
||||
+#ifdef CONFIG_SELINUX
|
||||
+#include <selinux/selinux.h>
|
||||
+#endif
|
||||
+
|
||||
#ifdef __linux__
|
||||
#define HAVE_NBD_DEVICE 1
|
||||
#else
|
||||
@@ -64,6 +68,7 @@
|
||||
#define QEMU_NBD_OPT_FORK 263
|
||||
#define QEMU_NBD_OPT_TLSAUTHZ 264
|
||||
#define QEMU_NBD_OPT_PID_FILE 265
|
||||
+#define QEMU_NBD_OPT_SELINUX_LABEL 266
|
||||
|
||||
#define MBR_SIZE 512
|
||||
|
||||
@@ -116,6 +121,9 @@ static void usage(const char *name)
|
||||
" --fork fork off the server process and exit the parent\n"
|
||||
" once the server is running\n"
|
||||
" --pid-file=PATH store the server's process ID in the given file\n"
|
||||
+#ifdef CONFIG_SELINUX
|
||||
+" --selinux-label=LABEL set SELinux process label on listening socket\n"
|
||||
+#endif
|
||||
#if HAVE_NBD_DEVICE
|
||||
"\n"
|
||||
"Kernel NBD client support:\n"
|
||||
@@ -452,6 +460,7 @@ static const char *socket_activation_validate_opts(const char *device,
|
||||
const char *sockpath,
|
||||
const char *address,
|
||||
const char *port,
|
||||
+ const char *selinux,
|
||||
bool list)
|
||||
{
|
||||
if (device != NULL) {
|
||||
@@ -470,6 +479,10 @@ static const char *socket_activation_validate_opts(const char *device,
|
||||
return "TCP port number can't be set when using socket activation";
|
||||
}
|
||||
|
||||
+ if (selinux != NULL) {
|
||||
+ return "SELinux label can't be set when using socket activation";
|
||||
+ }
|
||||
+
|
||||
if (list) {
|
||||
return "List mode is incompatible with socket activation";
|
||||
}
|
||||
@@ -532,6 +545,8 @@ int main(int argc, char **argv)
|
||||
{ "trace", required_argument, NULL, 'T' },
|
||||
{ "fork", no_argument, NULL, QEMU_NBD_OPT_FORK },
|
||||
{ "pid-file", required_argument, NULL, QEMU_NBD_OPT_PID_FILE },
|
||||
+ { "selinux-label", required_argument, NULL,
|
||||
+ QEMU_NBD_OPT_SELINUX_LABEL },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
int ch;
|
||||
@@ -558,6 +573,7 @@ int main(int argc, char **argv)
|
||||
int old_stderr = -1;
|
||||
unsigned socket_activation;
|
||||
const char *pid_file_name = NULL;
|
||||
+ const char *selinux_label = NULL;
|
||||
BlockExportOptions *export_opts;
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
@@ -747,6 +763,9 @@ int main(int argc, char **argv)
|
||||
case QEMU_NBD_OPT_PID_FILE:
|
||||
pid_file_name = optarg;
|
||||
break;
|
||||
+ case QEMU_NBD_OPT_SELINUX_LABEL:
|
||||
+ selinux_label = optarg;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -786,6 +805,7 @@ int main(int argc, char **argv)
|
||||
/* Using socket activation - check user didn't use -p etc. */
|
||||
const char *err_msg = socket_activation_validate_opts(device, sockpath,
|
||||
bindto, port,
|
||||
+ selinux_label,
|
||||
list);
|
||||
if (err_msg != NULL) {
|
||||
error_report("%s", err_msg);
|
||||
@@ -825,6 +845,18 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (selinux_label) {
|
||||
+#ifdef CONFIG_SELINUX
|
||||
+ if (sockpath == NULL && device == NULL) {
|
||||
+ error_report("--selinux-label is not permitted without --socket");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+#else
|
||||
+ error_report("SELinux support not enabled in this binary");
|
||||
+ exit(EXIT_FAILURE);
|
||||
+#endif
|
||||
+ }
|
||||
+
|
||||
if (list) {
|
||||
saddr = nbd_build_socket_address(sockpath, bindto, port);
|
||||
return qemu_nbd_client_list(saddr, tlscreds, bindto);
|
||||
@@ -938,6 +970,13 @@ int main(int argc, char **argv)
|
||||
} else {
|
||||
backlog = MIN(shared, SOMAXCONN);
|
||||
}
|
||||
+#ifdef CONFIG_SELINUX
|
||||
+ if (selinux_label && setsockcreatecon_raw(selinux_label) == -1) {
|
||||
+ error_report("Cannot set SELinux socket create context to %s: %s",
|
||||
+ selinux_label, strerror(errno));
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+#endif
|
||||
saddr = nbd_build_socket_address(sockpath, bindto, port);
|
||||
if (qio_net_listener_open_sync(server, saddr, backlog,
|
||||
&local_err) < 0) {
|
||||
@@ -945,6 +984,13 @@ int main(int argc, char **argv)
|
||||
error_report_err(local_err);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
+#ifdef CONFIG_SELINUX
|
||||
+ if (selinux_label && setsockcreatecon_raw(NULL) == -1) {
|
||||
+ error_report("Cannot clear SELinux socket create context: %s",
|
||||
+ strerror(errno));
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+#endif
|
||||
} else {
|
||||
size_t i;
|
||||
/* See comment in check_socket_activation above. */
|
||||
diff --git a/tests/docker/dockerfiles/centos8.docker b/tests/docker/dockerfiles/centos8.docker
|
||||
index 46398c61ee..7f135f8e8c 100644
|
||||
--- a/tests/docker/dockerfiles/centos8.docker
|
||||
+++ b/tests/docker/dockerfiles/centos8.docker
|
||||
@@ -51,6 +51,7 @@ ENV PACKAGES \
|
||||
libpng-devel \
|
||||
librbd-devel \
|
||||
libseccomp-devel \
|
||||
+ libselinux-devel \
|
||||
libslirp-devel \
|
||||
libssh-devel \
|
||||
libtasn1-devel \
|
||||
diff --git a/tests/docker/dockerfiles/fedora-i386-cross.docker b/tests/docker/dockerfiles/fedora-i386-cross.docker
|
||||
index dbb8195eb1..91a7c51614 100644
|
||||
--- a/tests/docker/dockerfiles/fedora-i386-cross.docker
|
||||
+++ b/tests/docker/dockerfiles/fedora-i386-cross.docker
|
||||
@@ -7,6 +7,7 @@ ENV PACKAGES \
|
||||
gcc \
|
||||
git \
|
||||
libffi-devel.i686 \
|
||||
+ libselinux-devel.i686 \
|
||||
libtasn1-devel.i686 \
|
||||
libzstd-devel.i686 \
|
||||
make \
|
||||
diff --git a/tests/docker/dockerfiles/fedora.docker b/tests/docker/dockerfiles/fedora.docker
|
||||
index eec1add7f6..c6fd7e1113 100644
|
||||
--- a/tests/docker/dockerfiles/fedora.docker
|
||||
+++ b/tests/docker/dockerfiles/fedora.docker
|
||||
@@ -53,6 +53,7 @@ ENV PACKAGES \
|
||||
libpng-devel \
|
||||
librbd-devel \
|
||||
libseccomp-devel \
|
||||
+ libselinux-devel \
|
||||
libslirp-devel \
|
||||
libssh-devel \
|
||||
libtasn1-devel \
|
||||
diff --git a/tests/docker/dockerfiles/opensuse-leap.docker b/tests/docker/dockerfiles/opensuse-leap.docker
|
||||
index 5a8bee0289..3bbdb67f4f 100644
|
||||
--- a/tests/docker/dockerfiles/opensuse-leap.docker
|
||||
+++ b/tests/docker/dockerfiles/opensuse-leap.docker
|
||||
@@ -55,6 +55,7 @@ ENV PACKAGES \
|
||||
libpulse-devel \
|
||||
librbd-devel \
|
||||
libseccomp-devel \
|
||||
+ libselinux-devel \
|
||||
libspice-server-devel \
|
||||
libssh-devel \
|
||||
libtasn1-devel \
|
||||
diff --git a/tests/docker/dockerfiles/ubuntu1804.docker b/tests/docker/dockerfiles/ubuntu1804.docker
|
||||
index 0880bf3e29..450fd06d0d 100644
|
||||
--- a/tests/docker/dockerfiles/ubuntu1804.docker
|
||||
+++ b/tests/docker/dockerfiles/ubuntu1804.docker
|
||||
@@ -60,6 +60,7 @@ ENV PACKAGES \
|
||||
libsdl2-dev \
|
||||
libsdl2-image-dev \
|
||||
libseccomp-dev \
|
||||
+ libselinux-dev \
|
||||
libsnappy-dev \
|
||||
libspice-protocol-dev \
|
||||
libspice-server-dev \
|
||||
diff --git a/tests/docker/dockerfiles/ubuntu2004.docker b/tests/docker/dockerfiles/ubuntu2004.docker
|
||||
index 39de63d012..15a026be09 100644
|
||||
--- a/tests/docker/dockerfiles/ubuntu2004.docker
|
||||
+++ b/tests/docker/dockerfiles/ubuntu2004.docker
|
||||
@@ -60,6 +60,7 @@ ENV PACKAGES \
|
||||
libsdl2-dev \
|
||||
libsdl2-image-dev \
|
||||
libseccomp-dev \
|
||||
+ libselinux-dev \
|
||||
libslirp-dev \
|
||||
libsnappy-dev \
|
||||
libspice-protocol-dev \
|
||||
--
|
||||
2.32.0
|
||||
|
@ -1,81 +0,0 @@
|
||||
From 118d527f2e4baec5fe8060b22a6212468b8e4d3f Mon Sep 17 00:00:00 2001
|
||||
From: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Date: Wed, 1 Sep 2021 16:16:24 +0300
|
||||
Subject: [PATCH] qemu-sockets: fix unix socket path copy (again)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Commit 4cfd970ec188558daa6214f26203fe553fb1e01f added an
|
||||
assert which ensures the path within an address of a unix
|
||||
socket returned from the kernel is at least one byte and
|
||||
does not exceed sun_path buffer. Both of this constraints
|
||||
are wrong:
|
||||
|
||||
A unix socket can be unnamed, in this case the path is
|
||||
completely empty (not even \0)
|
||||
|
||||
And some implementations (notable linux) can add extra
|
||||
trailing byte (\0) _after_ the sun_path buffer if we
|
||||
passed buffer larger than it (and we do).
|
||||
|
||||
So remove the assertion (since it causes real-life breakage)
|
||||
but at the same time fix the usage of sun_path. Namely,
|
||||
we should not access sun_path[0] if kernel did not return
|
||||
it at all (this is the case for unnamed sockets),
|
||||
and use the returned salen when copyig actual path as an
|
||||
upper constraint for the amount of bytes to copy - this
|
||||
will ensure we wont exceed the information provided by
|
||||
the kernel, regardless whenever there is a trailing \0
|
||||
or not. This also helps with unnamed sockets.
|
||||
|
||||
Note the case of abstract socket, the sun_path is actually
|
||||
a blob and can contain \0 characters, - it should not be
|
||||
passed to g_strndup and the like, it should be accessed by
|
||||
memcpy-like functions.
|
||||
|
||||
Fixes: 4cfd970ec188558daa6214f26203fe553fb1e01f
|
||||
Fixes: http://bugs.debian.org/993145
|
||||
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
CC: qemu-stable@nongnu.org
|
||||
---
|
||||
util/qemu-sockets.c | 13 +++++--------
|
||||
1 file changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
|
||||
index f2f3676d1f..c5043999e9 100644
|
||||
--- a/util/qemu-sockets.c
|
||||
+++ b/util/qemu-sockets.c
|
||||
@@ -1345,25 +1345,22 @@ socket_sockaddr_to_address_unix(struct sockaddr_storage *sa,
|
||||
SocketAddress *addr;
|
||||
struct sockaddr_un *su = (struct sockaddr_un *)sa;
|
||||
|
||||
- assert(salen >= sizeof(su->sun_family) + 1 &&
|
||||
- salen <= sizeof(struct sockaddr_un));
|
||||
-
|
||||
addr = g_new0(SocketAddress, 1);
|
||||
addr->type = SOCKET_ADDRESS_TYPE_UNIX;
|
||||
+ salen -= offsetof(struct sockaddr_un, sun_path);
|
||||
#ifdef CONFIG_LINUX
|
||||
- if (!su->sun_path[0]) {
|
||||
+ if (salen > 0 && !su->sun_path[0]) {
|
||||
/* Linux abstract socket */
|
||||
- addr->u.q_unix.path = g_strndup(su->sun_path + 1,
|
||||
- salen - sizeof(su->sun_family) - 1);
|
||||
+ addr->u.q_unix.path = g_strndup(su->sun_path + 1, salen - 1);
|
||||
addr->u.q_unix.has_abstract = true;
|
||||
addr->u.q_unix.abstract = true;
|
||||
addr->u.q_unix.has_tight = true;
|
||||
- addr->u.q_unix.tight = salen < sizeof(*su);
|
||||
+ addr->u.q_unix.tight = salen < sizeof(su->sun_path);
|
||||
return addr;
|
||||
}
|
||||
#endif
|
||||
|
||||
- addr->u.q_unix.path = g_strndup(su->sun_path, sizeof(su->sun_path));
|
||||
+ addr->u.q_unix.path = g_strndup(su->sun_path, salen);
|
||||
return addr;
|
||||
}
|
||||
#endif /* WIN32 */
|
@ -1,37 +0,0 @@
|
||||
From eb94846280df3f1e2a91b6179fc05f9890b7e384 Mon Sep 17 00:00:00 2001
|
||||
From: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Date: Fri, 10 Sep 2021 11:42:03 +0200
|
||||
Subject: [PATCH 1/1] qxl: fix pre-save logic
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Oops. Logic is backwards.
|
||||
|
||||
Fixes: 39b8a183e2f3 ("qxl: remove assert in qxl_pre_save.")
|
||||
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/610
|
||||
Resolves: https://bugzilla.redhat.com//show_bug.cgi?id=2002907
|
||||
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||
Message-Id: <20210910094203.3582378-1-kraxel@redhat.com>
|
||||
---
|
||||
hw/display/qxl.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
|
||||
index 43482d4364..29c80b4289 100644
|
||||
--- a/hw/display/qxl.c
|
||||
+++ b/hw/display/qxl.c
|
||||
@@ -2252,7 +2252,7 @@ static int qxl_pre_save(void *opaque)
|
||||
} else {
|
||||
d->last_release_offset = (uint8_t *)d->last_release - ram_start;
|
||||
}
|
||||
- if (d->last_release_offset < d->vga.vram_size) {
|
||||
+ if (d->last_release_offset >= d->vga.vram_size) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
--
|
||||
2.33.1
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 45adec566b073b39f4edfc1307843d12fe8105c8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 31 Aug 2021 18:50:33 +0100
|
||||
Subject: [PATCH 1/2] target/i386: add missing bits to CR4_RESERVED_MASK
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Booting Fedora kernels with -cpu max hangs very early in boot. Disabling
|
||||
the la57 CPUID bit fixes the problem. git bisect traced the regression to
|
||||
|
||||
commit 213ff024a2f92020290296cb9dc29c2af3d4a221 (HEAD, refs/bisect/bad)
|
||||
Author: Lara Lazier <laramglazier@gmail.com>
|
||||
Date: Wed Jul 21 17:26:50 2021 +0200
|
||||
|
||||
target/i386: Added consistency checks for CR4
|
||||
|
||||
All MBZ bits in CR4 must be zero. (APM2 15.5)
|
||||
Added reserved bitmask and added checks in both
|
||||
helper_vmrun and helper_write_crN.
|
||||
|
||||
Signed-off-by: Lara Lazier <laramglazier@gmail.com>
|
||||
Message-Id: <20210721152651.14683-2-laramglazier@gmail.com>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
In this commit CR4_RESERVED_MASK is missing CR4_LA57_MASK and
|
||||
two others. Adding this lets Fedora kernels boot once again.
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
target/i386/cpu.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
||||
index 6c50d3ab4f..ce85f1a29d 100644
|
||||
--- a/target/i386/cpu.h
|
||||
+++ b/target/i386/cpu.h
|
||||
@@ -257,6 +257,7 @@ typedef enum X86Seg {
|
||||
| CR4_DE_MASK | CR4_PSE_MASK | CR4_PAE_MASK \
|
||||
| CR4_MCE_MASK | CR4_PGE_MASK | CR4_PCE_MASK \
|
||||
| CR4_OSFXSR_MASK | CR4_OSXMMEXCPT_MASK |CR4_UMIP_MASK \
|
||||
+ | CR4_LA57_MASK | CR4_VMXE_MASK | CR4_SMXE_MASK \
|
||||
| CR4_FSGSBASE_MASK | CR4_PCIDE_MASK | CR4_OSXSAVE_MASK \
|
||||
| CR4_SMEP_MASK | CR4_SMAP_MASK | CR4_PKE_MASK | CR4_PKS_MASK))
|
||||
|
||||
--
|
||||
2.32.0
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 5ab2a54c262c61f64c22dbb49ade3e2db8a740bb Mon Sep 17 00:00:00 2001
|
||||
Message-Id: <5ab2a54c262c61f64c22dbb49ade3e2db8a740bb.1633708346.git.crobinso@redhat.com>
|
||||
From: Cole Robinson <crobinso@redhat.com>
|
||||
Date: Fri, 8 Oct 2021 11:47:45 -0400
|
||||
Subject: [PATCH] tests: tcg: Fix PVH test with binutils 2.36+
|
||||
|
||||
binutils started adding a .note.gnu.property ELF section which
|
||||
makes the PVH test fail:
|
||||
|
||||
TEST hello on x86_64
|
||||
qemu-system-x86_64: Error loading uncompressed kernel without PVH ELF Note
|
||||
|
||||
Discard .note.gnu* while keeping the PVH .note bits intact.
|
||||
|
||||
This also strips the build-id note, so drop the related comment.
|
||||
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
tests/tcg/x86_64/system/kernel.ld | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/tcg/x86_64/system/kernel.ld b/tests/tcg/x86_64/system/kernel.ld
|
||||
index 49c12b04ae..ca5d6bd850 100644
|
||||
--- a/tests/tcg/x86_64/system/kernel.ld
|
||||
+++ b/tests/tcg/x86_64/system/kernel.ld
|
||||
@@ -16,7 +16,10 @@ SECTIONS {
|
||||
*(.rodata)
|
||||
} :text
|
||||
|
||||
- /* Keep build ID and PVH notes in same section */
|
||||
+ /DISCARD/ : {
|
||||
+ *(.note.gnu*)
|
||||
+ }
|
||||
+
|
||||
.notes : {
|
||||
*(.note.*)
|
||||
} :note
|
||||
--
|
||||
2.32.0
|
||||
|
52
qemu.spec
52
qemu.spec
@ -6,7 +6,7 @@
|
||||
%global libfdt_version 1.6.0
|
||||
%global libseccomp_version 2.4.0
|
||||
%global libusbx_version 1.0.23
|
||||
%global meson_version 0.55.3
|
||||
%global meson_version 0.58.2
|
||||
%global usbredir_version 0.7.1
|
||||
%global ipxe_version 20200823-5.git4bd064de
|
||||
|
||||
@ -277,7 +277,7 @@ Obsoletes: %{name}-system-unicore32 <= %{epoch}:%{version}-%{release} \
|
||||
Obsoletes: %{name}-system-unicore32-core <= %{epoch}:%{version}-%{release}
|
||||
|
||||
# Release candidate version tracking
|
||||
%dnl %global rcver rc4
|
||||
%global rcver rc3
|
||||
%if 0%{?rcver:1}
|
||||
%global rcrel .%{rcver}
|
||||
%global rcstr -%{rcver}
|
||||
@ -286,8 +286,8 @@ Obsoletes: %{name}-system-unicore32-core <= %{epoch}:%{version}-%{release}
|
||||
|
||||
Summary: QEMU is a FAST! processor emulator
|
||||
Name: qemu
|
||||
Version: 6.1.0
|
||||
Release: 13%{?rcrel}%{?dist}
|
||||
Version: 6.2.0
|
||||
Release: 0.1%{?rcrel}%{?dist}
|
||||
Epoch: 2
|
||||
License: GPLv2 and BSD and MIT and CC-BY
|
||||
URL: http://www.qemu.org/
|
||||
@ -305,31 +305,9 @@ Source30: kvm-s390x.conf
|
||||
Source31: kvm-x86.conf
|
||||
Source36: README.tests
|
||||
|
||||
# Fix -cpu max
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1999700
|
||||
Patch1: 0001-target-i386-add-missing-bits-to-CR4_RESERVED_MASK.patch
|
||||
|
||||
# Fix assertion on armv7hl
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1999878
|
||||
Patch2: 0001-tcg-arm-Reduce-vector-alignment-requirement-for-NEON.patch
|
||||
|
||||
# Fix qemu crash with vnc + libvirt virDomainOpenConsole
|
||||
Patch3: 0001-qemu-sockets-fix-unix-socket-path-copy-again.patch
|
||||
# Fix tcg PVH test with binutils 2.36+
|
||||
Patch4: 0001-tests-tcg-Fix-PVH-test-with-binutils-2.36.patch
|
||||
# Fix snapshot creation with qxl graphics
|
||||
# https://gitlab.com/qemu-project/qemu/-/issues/610
|
||||
# https://gitlab.com/qemu-project/qemu/-/commit/eb94846
|
||||
Patch5: 0001-qxl-fix-pre-save-logic.patch
|
||||
|
||||
# Add support for qemu-nbd --selinux-relabel option
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1984938
|
||||
# Upstream in 6.2.
|
||||
Patch6: 0001-nbd-server-Add-selinux-label-option.patch
|
||||
|
||||
# Fix iov length limits for scsi-generic
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=2026747
|
||||
Patch7: 0001-block-introduce-max_hw_iov-for-use-in-scsi-generic.patch
|
||||
Patch1: 0001-tcg-arm-Reduce-vector-alignment-requirement-for-NEON.patch
|
||||
|
||||
BuildRequires: meson >= %{meson_version}
|
||||
BuildRequires: zlib-devel
|
||||
@ -1253,7 +1231,6 @@ mkdir -p %{static_builddir}
|
||||
--disable-hax \\\
|
||||
--disable-hvf \\\
|
||||
--disable-iconv \\\
|
||||
--disable-jemalloc \\\
|
||||
--disable-kvm \\\
|
||||
--disable-libdaxctl \\\
|
||||
--disable-libiscsi \\\
|
||||
@ -1305,7 +1282,6 @@ mkdir -p %{static_builddir}
|
||||
--disable-strip \\\
|
||||
--disable-system \\\
|
||||
--disable-tcg \\\
|
||||
--disable-tcmalloc \\\
|
||||
--disable-tools \\\
|
||||
--disable-tpm \\\
|
||||
--disable-u2f \\\
|
||||
@ -1362,7 +1338,7 @@ run_configure() {
|
||||
--with-suffix="%{name}" \
|
||||
--firmwarepath="%firmwaredirs" \
|
||||
--meson="%{__meson}" \
|
||||
--enable-trace-backend=dtrace \
|
||||
--enable-trace-backends=dtrace \
|
||||
--with-coroutine=ucontext \
|
||||
--with-git=git \
|
||||
--tls-priority=@QEMU,SYSTEM \
|
||||
@ -1393,13 +1369,13 @@ run_configure \
|
||||
%endif
|
||||
--enable-bpf \
|
||||
--enable-cap-ng \
|
||||
--enable-capstone \
|
||||
--enable-capstone=system \
|
||||
--enable-coroutine-pool \
|
||||
--enable-curl \
|
||||
--enable-debug-info \
|
||||
--enable-docs \
|
||||
%if %{have_fdt}
|
||||
--enable-fdt \
|
||||
--enable-fdt=system \
|
||||
%endif
|
||||
--enable-gnutls \
|
||||
--enable-guest-agent \
|
||||
@ -1463,7 +1439,7 @@ run_configure \
|
||||
--enable-xkbcommon \
|
||||
\
|
||||
\
|
||||
--audio-drv-list=pa,sdl,alsa,try-jack,oss \
|
||||
--audio-drv-list=pa,sdl,alsa,jack,oss \
|
||||
--target-list-exclude=moxie-softmmu \
|
||||
--with-default-devices \
|
||||
--enable-auth-pam \
|
||||
@ -1554,7 +1530,7 @@ run_configure \
|
||||
--enable-attr \
|
||||
--enable-linux-user \
|
||||
--enable-tcg \
|
||||
--disable-blobs \
|
||||
--disable-install-blobs \
|
||||
--static
|
||||
|
||||
%make_build
|
||||
@ -1639,12 +1615,12 @@ install -m 0644 -t %{buildroot}%{_datadir}/%{name}/tracetool/format scripts/trac
|
||||
# Create new directories and put them all under tests-src
|
||||
mkdir -p %{buildroot}%{testsdir}/python
|
||||
mkdir -p %{buildroot}%{testsdir}/tests
|
||||
mkdir -p %{buildroot}%{testsdir}/tests/acceptance
|
||||
mkdir -p %{buildroot}%{testsdir}/tests/avocado
|
||||
mkdir -p %{buildroot}%{testsdir}/tests/qemu-iotests
|
||||
mkdir -p %{buildroot}%{testsdir}/scripts/qmp
|
||||
|
||||
# Install avocado_qemu tests
|
||||
cp -R %{qemu_kvm_build}/tests/acceptance/* %{buildroot}%{testsdir}/tests/acceptance/
|
||||
cp -R %{qemu_kvm_build}/tests/avocado/* %{buildroot}%{testsdir}/tests/avocado/
|
||||
|
||||
# Install qemu.py and qmp/ scripts required to run avocado_qemu tests
|
||||
cp -R %{qemu_kvm_build}/python/qemu %{buildroot}%{testsdir}/python
|
||||
@ -2250,6 +2226,7 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
%{_datadir}/%{name}/kvmvapic.bin
|
||||
%{_datadir}/%{name}/linuxboot.bin
|
||||
%{_datadir}/%{name}/multiboot.bin
|
||||
%{_datadir}/%{name}/multiboot_dma.bin
|
||||
%{_datadir}/%{name}/pvh.bin
|
||||
%{_datadir}/%{name}/qboot.rom
|
||||
%if %{need_qemu_kvm}
|
||||
@ -2270,6 +2247,9 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
|
||||
|
||||
%changelog
|
||||
* Fri Dec 03 2021 Eduardo Lima (Etrunko) <etrunko@redhat.com> - 6.2.0-0.1-rc3
|
||||
- Rebase to qemu 6.2.0-rc3
|
||||
|
||||
* Thu Nov 25 2021 Daniel P. Berrangé <berrange@redhat.com> - 6.1.0-13
|
||||
- Fix iovec limits with scsi-generic
|
||||
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (qemu-6.1.0.tar.xz) = 3378ae21c75b77ee6a759827f1fcf7b2a50a0fef07e3b0e89117108022a8d8655fa977e4d65596f4f24f7c735c6594d44b0c6f69732ea4465e88a7406b1d5d3c
|
||||
SHA512 (qemu-6.2.0-rc3.tar.xz) = e3da3da4b24d48c1458b498838180df18111a5fde4f1a2b85097219ea75acd4efd66ffeb1170fc8f0b0a759e5b91acc50b0fa8fda04eb037f10f4d1204db6f67
|
||||
|
Loading…
Reference in New Issue
Block a user