From 5e76e2d690b3cb5cdcb2ecaba68ba090d927ae50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Mass=C3=A9?= Date: Mon, 24 Nov 2025 11:44:31 +0100 Subject: [PATCH] november update --- centos-10/SOURCES/zfs-2.2.9.tar.gz | 3 + centos-10/SPECS/zfs-dkms.spec | 14 +- centos-10/SPECS/zfs.spec | 2 +- centos-9/SOURCES/libvirt-11.9.0.tar.xz | 3 + centos-9/SOURCES/zfs-2.2.9.tar.gz | 3 + centos-9/SPECS/libvirt.spec | 7 +- centos-9/SPECS/zfs-dkms.spec | 14 +- centos-9/SPECS/zfs.spec | 2 +- fedora-41/SOURCES/zfs-2.3.5.tar.gz | 3 + fedora-41/SPECS/zfs-dkms.spec | 14 +- fedora-41/SPECS/zfs.spec | 2 +- ...eedless-declaration-of-proto_registe.patch | 36 ++ ...k-Switch-header-files-to-pragma-once.patch | 47 ++ ...e-WIRESHARK_VERSION-macro-definition.patch | 81 +++ ...t-type-of-some-virNetMessageHeader-m.patch | 133 ++++ ...special-case-retval-of-get_program_d.patch | 46 ++ ...ark-Introduce-and-use-vir_val_to_str.patch | 68 ++ ...-wireshark-Don-t-leak-column-strings.patch | 165 +++++ ...8-wireshark-Adapt-to-wireshark-4.6.0.patch | 493 ++++++++++++++ fedora-42/SOURCES/zfs-2.3.5.tar.gz | 3 + fedora-42/SPECS/libvirt.spec | 15 +- fedora-42/SPECS/zfs-dkms.spec | 14 +- fedora-42/SPECS/zfs.spec | 2 +- ...eedless-declaration-of-proto_registe.patch | 36 ++ ...k-Switch-header-files-to-pragma-once.patch | 47 ++ ...e-WIRESHARK_VERSION-macro-definition.patch | 81 +++ ...t-type-of-some-virNetMessageHeader-m.patch | 133 ++++ ...special-case-retval-of-get_program_d.patch | 46 ++ ...ark-Introduce-and-use-vir_val_to_str.patch | 68 ++ ...-wireshark-Don-t-leak-column-strings.patch | 165 +++++ ...8-wireshark-Adapt-to-wireshark-4.6.0.patch | 493 ++++++++++++++ fedora-43/SOURCES/zfs-2.3.5.tar.gz | 3 + fedora-43/SPECS/libvirt.spec | 15 +- fedora-43/SPECS/zfs-dkms.spec | 168 +++++ fedora-43/SPECS/zfs.spec | 604 ++++++++++++++++++ 35 files changed, 2994 insertions(+), 35 deletions(-) create mode 100644 centos-10/SOURCES/zfs-2.2.9.tar.gz create mode 100644 centos-9/SOURCES/libvirt-11.9.0.tar.xz create mode 100644 centos-9/SOURCES/zfs-2.2.9.tar.gz create mode 100644 fedora-41/SOURCES/zfs-2.3.5.tar.gz create mode 100644 fedora-42/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch create mode 100644 fedora-42/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch create mode 100644 fedora-42/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch create mode 100644 fedora-42/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch create mode 100644 fedora-42/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch create mode 100644 fedora-42/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch create mode 100644 fedora-42/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch create mode 100644 fedora-42/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch create mode 100644 fedora-42/SOURCES/zfs-2.3.5.tar.gz create mode 100644 fedora-43/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch create mode 100644 fedora-43/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch create mode 100644 fedora-43/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch create mode 100644 fedora-43/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch create mode 100644 fedora-43/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch create mode 100644 fedora-43/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch create mode 100644 fedora-43/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch create mode 100644 fedora-43/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch create mode 100644 fedora-43/SOURCES/zfs-2.3.5.tar.gz create mode 100644 fedora-43/SPECS/zfs-dkms.spec create mode 100644 fedora-43/SPECS/zfs.spec diff --git a/centos-10/SOURCES/zfs-2.2.9.tar.gz b/centos-10/SOURCES/zfs-2.2.9.tar.gz new file mode 100644 index 0000000..508b495 --- /dev/null +++ b/centos-10/SOURCES/zfs-2.2.9.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b431f69d7225a4ead96ffa1a87e8d9c42a8cbedfd6ef7a334b8b4fd050539bc +size 33853472 diff --git a/centos-10/SPECS/zfs-dkms.spec b/centos-10/SPECS/zfs-dkms.spec index ccd729f..6610776 100644 --- a/centos-10/SPECS/zfs-dkms.spec +++ b/centos-10/SPECS/zfs-dkms.spec @@ -12,7 +12,7 @@ Name: %{module}-dkms -Version: 2.2.8 +Version: 2.2.9 Release: 1%{?dist} Summary: Kernel module(s) (dkms) @@ -32,12 +32,12 @@ Requires(post): gcc, make, perl, diffutils # Hold back kernel upgrades if kernel is not supported by ZFS %if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} -Requires: kernel-devel >= 4.18, kernel-devel <= 6.15.999 -Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.15.999 -Conflicts: kernel-devel < 4.18, kernel-devel > 6.15.999 -Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.15.999 -Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.15.999 -Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.15.999 +Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 +Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 Obsoletes: spl-dkms <= %{version} %endif diff --git a/centos-10/SPECS/zfs.spec b/centos-10/SPECS/zfs.spec index b0b4123..c3a2972 100644 --- a/centos-10/SPECS/zfs.spec +++ b/centos-10/SPECS/zfs.spec @@ -90,7 +90,7 @@ %define __python_sitelib %(%{__python} -Esc "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 2>/dev/null || %{__python} -Esc "import sysconfig; print(sysconfig.get_path('purelib'))") Name: zfs -Version: 2.2.8 +Version: 2.2.9 Release: 1%{?dist} Summary: Commands to control the kernel modules and libraries diff --git a/centos-9/SOURCES/libvirt-11.9.0.tar.xz b/centos-9/SOURCES/libvirt-11.9.0.tar.xz new file mode 100644 index 0000000..e4ab30f --- /dev/null +++ b/centos-9/SOURCES/libvirt-11.9.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:104f70ee591e72989d4f8c6caa79ed9dacd5dc84efdb0125b848afe544ad0c2d +size 10145112 diff --git a/centos-9/SOURCES/zfs-2.2.9.tar.gz b/centos-9/SOURCES/zfs-2.2.9.tar.gz new file mode 100644 index 0000000..dc69e20 --- /dev/null +++ b/centos-9/SOURCES/zfs-2.2.9.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda609af606983ad2103029edf32b8ccf0cf2b041abcb16e9c25801b2800c546 +size 33855583 diff --git a/centos-9/SPECS/libvirt.spec b/centos-9/SPECS/libvirt.spec index 5b9a1df..208a277 100644 --- a/centos-9/SPECS/libvirt.spec +++ b/centos-9/SPECS/libvirt.spec @@ -283,7 +283,7 @@ Summary: Library providing a simple virtualization API Name: libvirt -Version: 11.8.0 +Version: 11.9.0 Release: 1%{?dist}%{?extra_release} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -2686,6 +2686,11 @@ exit 0 %endif %changelog +* Tue Nov 4 2025 Jiri Denemark - 11.9.0-1 +- Rebased to libvirt-11.9.0 (RHEL-118197) +- The rebase also fixes the following bugs: + RHEL-114003 + * Wed Oct 1 2025 Jiri Denemark - 11.8.0-1 - Rebased to libvirt-11.8.0 (RHEL-118197) - The rebase also fixes the following bugs: diff --git a/centos-9/SPECS/zfs-dkms.spec b/centos-9/SPECS/zfs-dkms.spec index ccd729f..6610776 100644 --- a/centos-9/SPECS/zfs-dkms.spec +++ b/centos-9/SPECS/zfs-dkms.spec @@ -12,7 +12,7 @@ Name: %{module}-dkms -Version: 2.2.8 +Version: 2.2.9 Release: 1%{?dist} Summary: Kernel module(s) (dkms) @@ -32,12 +32,12 @@ Requires(post): gcc, make, perl, diffutils # Hold back kernel upgrades if kernel is not supported by ZFS %if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} -Requires: kernel-devel >= 4.18, kernel-devel <= 6.15.999 -Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.15.999 -Conflicts: kernel-devel < 4.18, kernel-devel > 6.15.999 -Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.15.999 -Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.15.999 -Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.15.999 +Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 +Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 Obsoletes: spl-dkms <= %{version} %endif diff --git a/centos-9/SPECS/zfs.spec b/centos-9/SPECS/zfs.spec index b0b4123..c3a2972 100644 --- a/centos-9/SPECS/zfs.spec +++ b/centos-9/SPECS/zfs.spec @@ -90,7 +90,7 @@ %define __python_sitelib %(%{__python} -Esc "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 2>/dev/null || %{__python} -Esc "import sysconfig; print(sysconfig.get_path('purelib'))") Name: zfs -Version: 2.2.8 +Version: 2.2.9 Release: 1%{?dist} Summary: Commands to control the kernel modules and libraries diff --git a/fedora-41/SOURCES/zfs-2.3.5.tar.gz b/fedora-41/SOURCES/zfs-2.3.5.tar.gz new file mode 100644 index 0000000..b50a9b1 --- /dev/null +++ b/fedora-41/SOURCES/zfs-2.3.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:931b78933e365c66ec4695cd0899b31fbe0f4f837fb1bb4144ff2ab19dbada8b +size 34379058 diff --git a/fedora-41/SPECS/zfs-dkms.spec b/fedora-41/SPECS/zfs-dkms.spec index a39ae38..347740e 100644 --- a/fedora-41/SPECS/zfs-dkms.spec +++ b/fedora-41/SPECS/zfs-dkms.spec @@ -12,7 +12,7 @@ Name: %{module}-dkms -Version: 2.3.4 +Version: 2.3.5 Release: 1%{?dist} Summary: Kernel module(s) (dkms) @@ -32,12 +32,12 @@ Requires(post): gcc, make, perl, diffutils # Hold back kernel upgrades if kernel is not supported by ZFS %if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} -Requires: kernel-devel >= 4.18, kernel-devel <= 6.16.999 -Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.16.999 -Conflicts: kernel-devel < 4.18, kernel-devel > 6.16.999 -Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999 -Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999 -Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.16.999 +Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 +Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 Obsoletes: spl-dkms <= %{version} %endif diff --git a/fedora-41/SPECS/zfs.spec b/fedora-41/SPECS/zfs.spec index c99e841..cc3fc1d 100644 --- a/fedora-41/SPECS/zfs.spec +++ b/fedora-41/SPECS/zfs.spec @@ -102,7 +102,7 @@ sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))") Name: zfs -Version: 2.3.4 +Version: 2.3.5 Release: 1%{?dist} Summary: Commands to control the kernel modules and libraries diff --git a/fedora-42/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch b/fedora-42/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch new file mode 100644 index 0000000..daf582c --- /dev/null +++ b/fedora-42/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch @@ -0,0 +1,36 @@ +From b825bb556bd3967bf5422c243b77bd4038e317e2 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 10:34:51 +0200 +Subject: [PATCH 1/8] wireshark: Drop needless declaration of + proto_register_libvirt() and proto_reg_handoff_libvirt() +Content-type: text/plain + +Both proto_register_libvirt() and proto_reg_handoff_libvirt() are +declared in packet-libvirt.h which is included from plugin.c. +There's no need to provide another declaration in plugin.c. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/plugin.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c +index 9a83f2ca07..19b25e7b1a 100644 +--- a/tools/wireshark/src/plugin.c ++++ b/tools/wireshark/src/plugin.c +@@ -72,9 +72,6 @@ void plugin_register(void) + + #else /* WIRESHARK_VERSION >= 2009000 */ + +-void proto_register_libvirt(void); +-void proto_reg_handoff_libvirt(void); +- + WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION; + WS_DLL_PUBLIC_DEF const int plugin_want_major = WIRESHARK_VERSION_MAJOR; + WS_DLL_PUBLIC_DEF const int plugin_want_minor = WIRESHARK_VERSION_MINOR; +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch b/fedora-42/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch new file mode 100644 index 0000000..df1e1de --- /dev/null +++ b/fedora-42/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch @@ -0,0 +1,47 @@ +From 41d3b457972bde85991fa7ed6f282370aca4b2af Mon Sep 17 00:00:00 2001 +Message-ID: <41d3b457972bde85991fa7ed6f282370aca4b2af.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 15:20:05 +0200 +Subject: [PATCH 2/8] wireshark: Switch header files to #pragma once +Content-type: text/plain + +The genxdrstub.pl script generates some header files. But they +use the old pattern to guard against multiple inclusion: + + #ifndef SOMETHING_H + #define SOMETHING_H + ... + #endif + +Change the script to generate just '#pragma once' used everywhere +else in our code. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/util/genxdrstub.pl | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl +index 8cfda25a27..01b663a88c 100755 +--- a/tools/wireshark/util/genxdrstub.pl ++++ b/tools/wireshark/util/genxdrstub.pl +@@ -563,11 +563,8 @@ sub add_header_file { + local $self->{header_contents} = []; + $self->print("/* *DO NOT MODIFY* this file directly.\n"); + $self->print(" * This file was generated by $0 from libvirt version $libvirt_version */\n"); +- my $ucname = uc $name; +- $self->print("#ifndef _$ucname\_H_\n"); +- $self->print("#define _$ucname\_H_\n"); ++ $self->print("#pragma once\n"); + $block->(); +- $self->print("#endif /* _$ucname\_H_ */"); + push @{ $self->{headers} }, [ $name, delete $self->{header_contents} ]; + } + +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch b/fedora-42/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch new file mode 100644 index 0000000..19bacea --- /dev/null +++ b/fedora-42/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch @@ -0,0 +1,81 @@ +From 02a0e78bf54c903da8922c56bade9b3298ade351 Mon Sep 17 00:00:00 2001 +Message-ID: <02a0e78bf54c903da8922c56bade9b3298ade351.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 09:04:17 +0200 +Subject: [PATCH 3/8] wireshark: Move WIRESHARK_VERSION macro definition +Content-type: text/plain + +Soon, other parts of the wireshark code will need to +differentiate wrt wireshark version. Therefore, move the +WIRESHARK_VERSION macro definition among with its deps into +packet-libvirt.h. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.h | 14 ++++++++++++++ + tools/wireshark/src/plugin.c | 14 -------------- + 2 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.h b/tools/wireshark/src/packet-libvirt.h +index 14e6e13696..15cfcb0534 100644 +--- a/tools/wireshark/src/packet-libvirt.h ++++ b/tools/wireshark/src/packet-libvirt.h +@@ -19,5 +19,19 @@ + + #pragma once + ++#ifdef WITH_WS_VERSION ++# include ++#else ++# include ++# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR ++# define WIRESHARK_VERSION_MINOR VERSION_MINOR ++# define WIRESHARK_VERSION_MICRO VERSION_MICRO ++#endif ++ ++#define WIRESHARK_VERSION \ ++ ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \ ++ (WIRESHARK_VERSION_MINOR * 1000) + \ ++ (WIRESHARK_VERSION_MICRO)) ++ + void proto_register_libvirt(void); + void proto_reg_handoff_libvirt(void); +diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c +index 19b25e7b1a..64317b5280 100644 +--- a/tools/wireshark/src/plugin.c ++++ b/tools/wireshark/src/plugin.c +@@ -12,15 +12,6 @@ + + #include + +-#ifdef WITH_WS_VERSION +-# include +-#else +-# include +-# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR +-# define WIRESHARK_VERSION_MINOR VERSION_MINOR +-# define WIRESHARK_VERSION_MICRO VERSION_MICRO +-#endif +- + #define HAVE_PLUGINS 1 + #include + /* plugins are DLLs */ +@@ -32,11 +23,6 @@ + /* Let the plugin version be the version of libvirt */ + #define PLUGIN_VERSION VERSION + +-#define WIRESHARK_VERSION \ +- ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \ +- (WIRESHARK_VERSION_MINOR * 1000) + \ +- (WIRESHARK_VERSION_MICRO)) +- + #if WIRESHARK_VERSION < 2005000 + + WS_DLL_PUBLIC_DEF const gchar version[] = VERSION; +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch b/fedora-42/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch new file mode 100644 index 0000000..57c978a --- /dev/null +++ b/fedora-42/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch @@ -0,0 +1,133 @@ +From 7374c4ecbd591b02f7be4b2918addc6d5852aafb Mon Sep 17 00:00:00 2001 +Message-ID: <7374c4ecbd591b02f7be4b2918addc6d5852aafb.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 09:21:30 +0200 +Subject: [PATCH 4/8] wireshark: Fix int type of some virNetMessageHeader + members +Content-type: text/plain + +Our virNetMessageHeader is a struct that's declared as follows: + + struct virNetMessageHeader { + unsigned prog; + unsigned vers; + int proc; + virNetMessageType type; + unsigned serial; + virNetMessageStatus status; + }; + +Now, per RFC 4506 enums are also encoded as signed integers. This +means, that only 'prog', 'vers' and 'serial' are really unsigned +integers. The others ('proc', 'type' and 'status') are encoded as +signed integers. Fix their type when dissecting. + +While at it, also follow latest trend in wireshark and switch +from guint32 to uint32_t. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 34 +++++++++++++++++++--------- + 1 file changed, 23 insertions(+), 11 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index da2aabd98a..af14c6bed7 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -92,7 +92,7 @@ typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xd + + typedef struct vir_dissector_index vir_dissector_index_t; + struct vir_dissector_index { +- guint32 proc; ++ int32_t proc; + vir_xdr_dissector_t args; + vir_xdr_dissector_t ret; + vir_xdr_dissector_t msg; +@@ -275,8 +275,10 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + } + + static vir_xdr_dissector_t +-find_payload_dissector(guint32 proc, guint32 type, +- const vir_dissector_index_t *pds, gsize length) ++find_payload_dissector(int32_t proc, ++ enum vir_net_message_type type, ++ const vir_dissector_index_t *pds, ++ gsize length) + { + const vir_dissector_index_t *pd; + guint32 first, last, direction; +@@ -309,6 +311,10 @@ find_payload_dissector(guint32 proc, guint32 type, + return pd->ret; + case VIR_NET_MESSAGE: + return pd->msg; ++ case VIR_NET_STREAM: ++ case VIR_NET_STREAM_HOLE: ++ /* Handled elsewhere */ ++ return NULL; + } + return NULL; + } +@@ -397,8 +403,12 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + #include "libvirt/protocol.h" + + static void +-dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, +- guint32 prog, guint32 proc, guint32 type, guint32 status) ++dissect_libvirt_payload(tvbuff_t *tvb, ++ proto_tree *tree, ++ uint32_t prog, ++ int32_t proc, ++ int32_t type, ++ int32_t status) + { + gssize payload_length; + +@@ -430,7 +440,8 @@ dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, + return; + + unknown: +- dbg("Cannot determine payload: Prog=%u, Proc=%u, Type=%u, Status=%u", prog, proc, type, status); ++ dbg("Cannot determine payload: Prog=%u, Proc=%d, Type=%d, Status=%d", ++ prog, proc, type, status); + proto_tree_add_item(tree, hf_libvirt_unknown, tvb, VIR_HEADER_LEN, -1, ENC_NA); + } + +@@ -439,7 +450,8 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + void *opaque G_GNUC_UNUSED) + { + goffset offset; +- guint32 prog, proc, type, serial, status; ++ uint32_t prog, serial; ++ int32_t proc, type, status; + const value_string *vs; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); +@@ -448,17 +460,17 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + offset = 4; /* End of length field */ + prog = tvb_get_ntohl(tvb, offset); offset += 4; + offset += 4; /* Ignore version header field */ +- proc = tvb_get_ntohl(tvb, offset); offset += 4; +- type = tvb_get_ntohl(tvb, offset); offset += 4; ++ proc = tvb_get_ntohil(tvb, offset); offset += 4; ++ type = tvb_get_ntohil(tvb, offset); offset += 4; + serial = tvb_get_ntohl(tvb, offset); offset += 4; +- status = tvb_get_ntohl(tvb, offset); offset += 4; ++ status = tvb_get_ntohil(tvb, offset); offset += 4; + + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", + val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); + if (vs == NULL) { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%u", proc); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc); + } else { + col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); + } +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch b/fedora-42/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch new file mode 100644 index 0000000..dab6c98 --- /dev/null +++ b/fedora-42/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch @@ -0,0 +1,46 @@ +From 1086888f95a322101f8cf53b63c96600ccbeb882 Mon Sep 17 00:00:00 2001 +Message-ID: <1086888f95a322101f8cf53b63c96600ccbeb882.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 19:16:54 +0200 +Subject: [PATCH 5/8] wireshark: Don't special case retval of + get_program_data() in dissect_libvirt_message() +Content-type: text/plain + +The get_program_data() function returns a pointer (in this +specific case to an array of procedure strings) which, if +non-NULL is then passed val_to_str(). Well, if val_to_str() sees +NULL it is treated gracefully, i.e. like if the numeric value +'proc' wasn't found in the array. + +Therefore, there's no need to special case call to +col_append_fstr(). Both result into the same behaviour. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index af14c6bed7..6c729801d4 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -469,11 +469,7 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- if (vs == NULL) { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc); +- } else { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); +- } ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); + + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", + val_to_str(type, type_strings, "%d"), serial, +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch b/fedora-42/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch new file mode 100644 index 0000000..439bff6 --- /dev/null +++ b/fedora-42/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch @@ -0,0 +1,68 @@ +From ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7 Mon Sep 17 00:00:00 2001 +Message-ID: +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 18:23:18 +0200 +Subject: [PATCH 6/8] wireshark: Introduce and use vir_val_to_str() +Content-type: text/plain + +Wireshark offers val_to_str() function which converts numeric +value to string by looking up value ('val') in an array ('vs') of + pairs. If no corresponding string is found, then +the value is formatted using given 'fmt' string. + +Starting from wireshark-4.6.0 not only this function gained +another argument but also returns a strdup()-ed string. To keep +our code simple, let's introduce a wrapper so which can be then +adjusted as needed. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index 6c729801d4..f6ad2c4578 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -140,6 +140,15 @@ static const value_string status_strings[] = { + { -1, NULL } + }; + ++static const char * ++G_GNUC_PRINTF(3, 0) ++vir_val_to_str(const uint32_t val, ++ const value_string *vs, ++ const char *fmt) ++{ ++ return val_to_str(val, vs, fmt); ++} ++ + static gboolean + dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + guint32 maxlen) +@@ -466,14 +475,14 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + status = tvb_get_ntohil(tvb, offset); offset += 4; + + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", +- val_to_str(prog, program_strings, "%x")); ++ vir_val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d")); + + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", +- val_to_str(type, type_strings, "%d"), serial, +- val_to_str(status, status_strings, "%d")); ++ vir_val_to_str(type, type_strings, "%d"), serial, ++ vir_val_to_str(status, status_strings, "%d")); + + if (tree) { + gint *hf_proc; +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch b/fedora-42/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch new file mode 100644 index 0000000..43b790e --- /dev/null +++ b/fedora-42/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch @@ -0,0 +1,165 @@ +From 002b9f559d69b92e77ab2d234df6966fecdaf0ec Mon Sep 17 00:00:00 2001 +Message-ID: <002b9f559d69b92e77ab2d234df6966fecdaf0ec.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 19:13:48 +0200 +Subject: [PATCH 7/8] wireshark: Don't leak column strings +Content-type: text/plain + +One of the problems of using val_to_str() is that it may return a +const string from given table ('vs'), OR return an allocated one. +Since the caller has no idea which case it is, it resides to safe +option and don't free returned string. But that might lead to a +memleak. This behaviour is fixed with wireshark-4.6.0 and support +for it will be introduced soon. But first, make vir_val_to_str() +behave like fixed val_to_str() from newer wireshark: just always +allocate the string. + +Now, if val_to_str() needs to allocate new memory it obtains +allocator by calling wmem_packet_scope() which is what we may do +too. + +Hand in hand with that, we need to free the memory using the +correct allocator, hence wmem_free(). But let's put it into a +wrapper vir_wmem_free() because just like val_to_str(), it'll +need additional argument when adapting to new wireshark. + +Oh, and freeing the memory right after col_add_fstr() is safe as +it uses vsnprintf() under the hood to format passed args. + +One last thing, the wmem.h file used to live under epan/wmem/ but +then in v3.5.0~240 [1] was moved to wsutil/wmem/. + +1: https://gitlab.com/wireshark/wireshark/-/commit/7f9c1f5f92c131354fc8b2b88d473706786064c0 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + meson.build | 20 ++++++++++++++++ + tools/wireshark/src/meson.build | 1 + + tools/wireshark/src/packet-libvirt.c | 35 ++++++++++++++++++++++------ + 3 files changed, 49 insertions(+), 7 deletions(-) + +diff --git a/meson.build b/meson.build +index bcc18b20e5..a1e0e5ecd5 100644 +--- a/meson.build ++++ b/meson.build +@@ -1365,6 +1365,26 @@ if wireshark_dep.found() + if cc.check_header('wireshark/ws_version.h') + conf.set('WITH_WS_VERSION', 1) + endif ++ ++ # Find wmem.h ++ # But it's not as easy as you'd think. Ubuntu 20.04 has split parts of ++ # libwireshark.so into libwsutil.so but: ++ # a) wireshark.pc never mentions it, ++ # b) libwsutil-dev package doesn't install pkg-config file. ++ # Fortunately, it's fixed in 24.04. ++ if cc.check_header('wireshark/epan/wmem/wmem.h', dependencies: wireshark_dep) ++ conf.set('WITH_WS_EPAN_WMEM', 1) ++ elif cc.check_header('wireshark/wsutil/wmem/wmem.h', dependencies: wireshark_dep) ++ conf.set('WITH_WS_WSUTIL_WMEM', 1) ++ else ++ error('Unable to locate wmem.h file') ++ endif ++ ++ # TODO: drop wsutil dep once support for Ubuntu 20.04 is dropped ++ wsutil_dep = dependency('', required: false) ++ if not cc.has_function('wmem_free', dependencies: wireshark_dep) ++ wsutil_dep = cc.find_library('wsutil', required: true) ++ endif + endif + + # generic build dependencies checks +diff --git a/tools/wireshark/src/meson.build b/tools/wireshark/src/meson.build +index 9b452dc5ca..ba0df913e0 100644 +--- a/tools/wireshark/src/meson.build ++++ b/tools/wireshark/src/meson.build +@@ -9,6 +9,7 @@ shared_library( + ], + dependencies: [ + wireshark_dep, ++ wsutil_dep, + xdr_dep, + tools_dep, + ], +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index f6ad2c4578..3178ac6f27 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -21,6 +21,11 @@ + #include + #include + #include ++#ifdef WITH_WS_EPAN_WMEM ++# include ++#elif WITH_WS_WSUTIL_WMEM ++# include ++#endif + #include + #include + #include "packet-libvirt.h" +@@ -140,13 +145,19 @@ static const value_string status_strings[] = { + { -1, NULL } + }; + +-static const char * ++static char * + G_GNUC_PRINTF(3, 0) + vir_val_to_str(const uint32_t val, + const value_string *vs, + const char *fmt) + { +- return val_to_str(val, vs, fmt); ++ return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt); ++} ++ ++static void ++vir_wmem_free(void *ptr) ++{ ++ wmem_free(wmem_packet_scope(), ptr); + } + + static gboolean +@@ -462,6 +473,10 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + uint32_t prog, serial; + int32_t proc, type, status; + const value_string *vs; ++ char *prog_str = NULL; ++ char *proc_str = NULL; ++ char *type_str = NULL; ++ char *status_str = NULL; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); + col_clear(pinfo->cinfo, COL_INFO); +@@ -474,15 +489,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + serial = tvb_get_ntohl(tvb, offset); offset += 4; + status = tvb_get_ntohil(tvb, offset); offset += 4; + +- col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", +- vir_val_to_str(prog, program_strings, "%x")); ++ prog_str = vir_val_to_str(prog, program_strings, "%x"); ++ col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); ++ vir_wmem_free(prog_str); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d")); ++ proc_str = vir_val_to_str(proc, vs, "%d"); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); ++ vir_wmem_free(proc_str); + ++ type_str = vir_val_to_str(type, type_strings, "%d"); ++ status_str = vir_val_to_str(status, status_strings, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", +- vir_val_to_str(type, type_strings, "%d"), serial, +- vir_val_to_str(status, status_strings, "%d")); ++ type_str, serial, status_str); ++ vir_wmem_free(status_str); ++ vir_wmem_free(type_str); + + if (tree) { + gint *hf_proc; +-- +2.51.0 + diff --git a/fedora-42/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch b/fedora-42/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch new file mode 100644 index 0000000..ebb56b5 --- /dev/null +++ b/fedora-42/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch @@ -0,0 +1,493 @@ +From b42a12174c787b99cd6fcb29b44e4b13bd64ee58 Mon Sep 17 00:00:00 2001 +Message-ID: +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 15:22:34 +0200 +Subject: [PATCH 8/8] wireshark: Adapt to wireshark-4.6.0 +Content-type: text/plain + +The main difference is that wmem_packet_scope() is gone [1] but +the packet_info struct has 'pool` member which points to the +allocator used for given packet. + +Unfortunately, while we were given pointer to packet_info at the +entry level to our dissector (dissect_libvirt() -> +tcp_dissect_pdus() -> dissect_libvirt_message()) it was never +propagated to generated/primitive dissectors. + +But not all dissectors need to allocate memory, so mark the new +argument as unused. And while our generator could be rewritten so +that the argument is annotated as unused iff it's really unused, +I couldn't bother rewriting it. It's generated code after all. +Too much work for little gain. + +Another significant change is that val_to_str() now requires new +argument: pointer to allocator to use because it always allocates +new memory [2][3]. + +1: https://gitlab.com/wireshark/wireshark/-/commit/5ca5c9ca372e06881b23ba9f4fdcb6b479886444 +2: https://gitlab.com/wireshark/wireshark/-/commit/b63599762468e4cf1783419a5556377604d344bb +3: https://gitlab.com/wireshark/wireshark/-/commit/84799be215313e61b83a3eaf074f89d6ee349b8c +Resolves: https://gitlab.com/libvirt/libvirt/-/issues/823 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 157 +++++++++++++++++++-------- + tools/wireshark/util/genxdrstub.pl | 18 +-- + 2 files changed, 119 insertions(+), 56 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index 3178ac6f27..c5c8fb4756 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -63,7 +63,7 @@ static gint ett_libvirt_stream_hole = -1; + + #define XDR_PRIMITIVE_DISSECTOR(xtype, ctype, ftype) \ + static gboolean \ +- dissect_xdr_##xtype(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) \ ++ dissect_xdr_##xtype(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) \ + { \ + goffset start; \ + ctype val; \ +@@ -93,7 +93,7 @@ XDR_PRIMITIVE_DISSECTOR(bool, bool_t, boolean) + + VIR_WARNINGS_RESET + +-typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf); ++typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, XDR *xdrs, int hf); + + typedef struct vir_dissector_index vir_dissector_index_t; + struct vir_dissector_index { +@@ -146,22 +146,32 @@ static const value_string status_strings[] = { + }; + + static char * +-G_GNUC_PRINTF(3, 0) +-vir_val_to_str(const uint32_t val, ++G_GNUC_PRINTF(4, 0) ++vir_val_to_str(packet_info *pinfo, ++ const uint32_t val, + const value_string *vs, + const char *fmt) + { +- return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt); ++#if WIRESHARK_VERSION < 4006000 ++ return val_to_str_wmem(pinfo->pool, val, vs, fmt); ++#else ++ return val_to_str(pinfo->pool, val, vs, fmt); ++#endif + } + + static void +-vir_wmem_free(void *ptr) ++vir_wmem_free(packet_info *pinfo, ++ void *ptr) + { +- wmem_free(wmem_packet_scope(), ptr); ++ wmem_free(pinfo->pool, ptr); + } + + static gboolean +-dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_string(tvbuff_t *tvb, ++ packet_info *pinfo G_GNUC_UNUSED, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 maxlen) + { + goffset start; +@@ -179,7 +189,11 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_opaque(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 size) + { + goffset start; +@@ -190,7 +204,7 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + } else { +@@ -202,7 +216,11 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_bytes(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 maxlen) + { + goffset start; +@@ -212,7 +230,7 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + free(val); +@@ -224,7 +242,11 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_pointer(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + vir_xdr_dissector_t dissect) + { + goffset start; +@@ -236,7 +258,7 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + return FALSE; + } + if (not_null) { +- return dissect(tvb, tree, xdrs, hf); ++ return dissect(tvb, pinfo, tree, xdrs, hf); + } else { + proto_item *ti; + ti = proto_tree_add_item(tree, hf, tvb, start, xdr_getpos(xdrs) - start, ENC_NA); +@@ -246,15 +268,22 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf, +- guint32 length, vir_xdr_dissector_t dissect, goffset start) ++dissect_xdr_iterable(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_item *ti, ++ XDR *xdrs, ++ gint ett, ++ int rhf, ++ guint32 length, ++ vir_xdr_dissector_t dissect, ++ goffset start) + { + proto_tree *tree; + guint32 i; + + tree = proto_item_add_subtree(ti, ett); + for (i = 0; i < length; i++) { +- if (!dissect(tvb, tree, xdrs, rhf)) ++ if (!dissect(tvb, pinfo, tree, xdrs, rhf)) + return FALSE; + } + proto_item_set_len(ti, xdr_getpos(xdrs) - start); +@@ -262,8 +291,16 @@ dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf + } + + static gboolean +-dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 size, vir_xdr_dissector_t dissect) ++dissect_xdr_vector(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 size, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -271,12 +308,20 @@ dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + start = xdr_getpos(xdrs); + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s[%u]", rtype, size); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, size, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, size, dissect, start); + } + + static gboolean +-dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 maxlen, vir_xdr_dissector_t dissect) ++dissect_xdr_array(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 maxlen, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -291,7 +336,7 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s<%u>", rtype, length); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, length, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, length, dissect, start); + } + + static vir_xdr_dissector_t +@@ -340,7 +385,10 @@ find_payload_dissector(int32_t proc, + } + + static void +-dissect_libvirt_stream(tvbuff_t *tvb, proto_tree *tree, gint payload_length) ++dissect_libvirt_stream(tvbuff_t *tvb, ++ packet_info *pinfo G_GNUC_UNUSED, ++ proto_tree *tree, ++ gint payload_length) + { + proto_tree_add_item(tree, hf_libvirt_stream, tvb, VIR_HEADER_LEN, + payload_length - VIR_HEADER_LEN, ENC_NA); +@@ -357,6 +405,7 @@ dissect_libvirt_num_of_fds(tvbuff_t *tvb, proto_tree *tree) + + static void + dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, ++ packet_info *pinfo G_GNUC_UNUSED, + gint start G_GNUC_UNUSED, + gint32 nfds G_GNUC_UNUSED) + { +@@ -364,8 +413,12 @@ dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, + } + + static void +-dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_length, +- gint32 status, vir_xdr_dissector_t dissect) ++dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ gint payload_length, ++ gint32 status, ++ vir_xdr_dissector_t dissect) + { + gint32 nfds = 0; + gint start = VIR_HEADER_LEN; +@@ -384,17 +437,21 @@ dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_l + payload_data = (caddr_t)tvb_memdup(NULL, payload_tvb, 0, payload_length); + xdrmem_create(&xdrs, payload_data, payload_length, XDR_DECODE); + +- dissect(payload_tvb, tree, &xdrs, -1); ++ dissect(payload_tvb, pinfo, tree, &xdrs, -1); + + xdr_destroy(&xdrs); + g_free(payload_data); + + if (nfds != 0) +- dissect_libvirt_fds(tvb, start + payload_length, nfds); ++ dissect_libvirt_fds(tvb, pinfo, start + payload_length, nfds); + } + + static gboolean +-dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++dissect_xdr_stream_hole(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf) + { + goffset start; + proto_item *ti; +@@ -411,10 +468,10 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + tree = proto_item_add_subtree(ti, ett_libvirt_stream_hole); + + hf = hf_libvirt_stream_hole_length; +- if (!dissect_xdr_hyper(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_hyper(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + hf = hf_libvirt_stream_hole_flags; +- if (!dissect_xdr_u_int(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_u_int(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + proto_item_set_len(ti, xdr_getpos(xdrs) - start); + return TRUE; +@@ -424,6 +481,7 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + + static void + dissect_libvirt_payload(tvbuff_t *tvb, ++ packet_info *pinfo, + proto_tree *tree, + uint32_t prog, + int32_t proc, +@@ -447,13 +505,13 @@ dissect_libvirt_payload(tvbuff_t *tvb, + xd = find_payload_dissector(proc, type, pds, *len); + if (xd == NULL) + goto unknown; +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, xd); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, xd); + } else if (status == VIR_NET_ERROR) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_remote_error); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_remote_error); + } else if (type == VIR_NET_STREAM) { /* implicitly, status == VIR_NET_CONTINUE */ +- dissect_libvirt_stream(tvb, tree, payload_length); ++ dissect_libvirt_stream(tvb, pinfo, tree, payload_length); + } else if (type == VIR_NET_STREAM_HOLE) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_stream_hole); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_stream_hole); + } else { + goto unknown; + } +@@ -489,21 +547,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + serial = tvb_get_ntohl(tvb, offset); offset += 4; + status = tvb_get_ntohil(tvb, offset); offset += 4; + +- prog_str = vir_val_to_str(prog, program_strings, "%x"); ++ prog_str = vir_val_to_str(pinfo, prog, program_strings, "%x"); + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); +- vir_wmem_free(prog_str); ++ vir_wmem_free(pinfo, prog_str); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- proc_str = vir_val_to_str(proc, vs, "%d"); ++ proc_str = vir_val_to_str(pinfo, proc, vs, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); +- vir_wmem_free(proc_str); ++ vir_wmem_free(pinfo, proc_str); + +- type_str = vir_val_to_str(type, type_strings, "%d"); +- status_str = vir_val_to_str(status, status_strings, "%d"); ++ type_str = vir_val_to_str(pinfo, type, type_strings, "%d"); ++ status_str = vir_val_to_str(pinfo, status, status_strings, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", + type_str, serial, status_str); +- vir_wmem_free(status_str); +- vir_wmem_free(type_str); ++ vir_wmem_free(pinfo, status_str); ++ vir_wmem_free(pinfo, type_str); + + if (tree) { + gint *hf_proc; +@@ -532,21 +590,26 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + proto_tree_add_item(libvirt_tree, hf_libvirt_status, tvb, offset, 4, ENC_NA); offset += 4; + + /* Dissect payload remaining */ +- dissect_libvirt_payload(tvb, libvirt_tree, prog, proc, type, status); ++ dissect_libvirt_payload(tvb, pinfo, libvirt_tree, prog, proc, type, status); + } + + return 0; + } + + static guint +-get_message_len(packet_info *pinfo G_GNUC_UNUSED, tvbuff_t *tvb, int offset, void *data G_GNUC_UNUSED) ++get_message_len(packet_info *pinfo G_GNUC_UNUSED, ++ tvbuff_t *tvb, ++ int offset, ++ void *data G_GNUC_UNUSED) + { + return tvb_get_ntohl(tvb, offset); + } + + static int +-dissect_libvirt(tvbuff_t *tvb, packet_info *pinfo, +- proto_tree *tree, void *data G_GNUC_UNUSED) ++dissect_libvirt(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ void *data G_GNUC_UNUSED) + { + /* Another magic const - 4; simply, how much bytes + * is needed to tell the length of libvirt packet. */ +diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl +index 01b663a88c..f69695c091 100755 +--- a/tools/wireshark/util/genxdrstub.pl ++++ b/tools/wireshark/util/genxdrstub.pl +@@ -250,7 +250,7 @@ sub xdr_type { + sub render_caller { + my ($self, $hfid) = @_; + my $name = $c->rinc( 'dissect_xdr_'.($self->idstrip || lc($self->xdr_type)) ); +- "$name(tvb, tree, xdrs, hf)"; ++ "$name(tvb, pinfo, tree, xdrs, hf)"; + } + + sub ft_type { +@@ -345,7 +345,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), + $c->rinc('dissect_xdr_'.$self->reftype->idstrip); + } +@@ -359,7 +359,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), $self->length || '~0'; + } + +@@ -447,7 +447,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_array(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_array(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -476,7 +476,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_vector(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_vector(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -857,7 +857,7 @@ __END__<is_primitive; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + return <%= $self->dealias->render_caller($self->ident eq $ident ? undef : $ident) %>; + } +@@ -865,7 +865,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + <% my ($self, $ident) = @_; + my $hfvar = $c->rinc('hf_'.$self->idstrip); + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + proto_item *ti; +@@ -890,7 +890,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + } + @@ Sym::Type::Enum#render_dissector + <% my ($self, $ident) = @_; %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + enum { DUMMY } es; +@@ -914,7 +914,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + my ($self, $ident) = @_; + my $decl_type = $self->decl->type->idstrip; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + gboolean rc = TRUE; + goffset start; +-- +2.51.0 + diff --git a/fedora-42/SOURCES/zfs-2.3.5.tar.gz b/fedora-42/SOURCES/zfs-2.3.5.tar.gz new file mode 100644 index 0000000..c173a4c --- /dev/null +++ b/fedora-42/SOURCES/zfs-2.3.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b8f64583d114decb8ca5efecffaf233b22827c10ff27c84d79e93b7d363bbf6 +size 34392768 diff --git a/fedora-42/SPECS/libvirt.spec b/fedora-42/SPECS/libvirt.spec index 51bfb0b..862cf05 100644 --- a/fedora-42/SPECS/libvirt.spec +++ b/fedora-42/SPECS/libvirt.spec @@ -290,7 +290,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 11.0.0 -Release: 4%{?dist} +Release: 5%{?dist} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -311,6 +311,16 @@ Patch: 0001-qemu-Be-more-forgiving-when-acquiring-QUERY-job-when.patch # libvirt-nss stops working after network restarts (bz #2364285) Patch: 0001-nss-Skip-empty-files-and-avoid-use-of-uninitialized-.patch +# Fix build with wireshark +Patch: 0001-wireshark-Drop-needless-declaration-of-proto_registe.patch +Patch: 0002-wireshark-Switch-header-files-to-pragma-once.patch +Patch: 0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch +Patch: 0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch +Patch: 0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch +Patch: 0006-wireshark-Introduce-and-use-vir_val_to_str.patch +Patch: 0007-wireshark-Don-t-leak-column-strings.patch +Patch: 0008-wireshark-Adapt-to-wireshark-4.6.0.patch + Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} Requires: libvirt-daemon-config-nwfilter = %{version}-%{release} @@ -2696,6 +2706,9 @@ exit 0 %changelog +* Fri Oct 24 2025 Cole Robinson - 11.0.0-5 +- Fix build with latest wireshark + * Fri Aug 08 2025 Cole Robinson - 11.0.0-4 - libvirt-nss stops working after network restarts (bz #2364285) diff --git a/fedora-42/SPECS/zfs-dkms.spec b/fedora-42/SPECS/zfs-dkms.spec index a39ae38..347740e 100644 --- a/fedora-42/SPECS/zfs-dkms.spec +++ b/fedora-42/SPECS/zfs-dkms.spec @@ -12,7 +12,7 @@ Name: %{module}-dkms -Version: 2.3.4 +Version: 2.3.5 Release: 1%{?dist} Summary: Kernel module(s) (dkms) @@ -32,12 +32,12 @@ Requires(post): gcc, make, perl, diffutils # Hold back kernel upgrades if kernel is not supported by ZFS %if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} -Requires: kernel-devel >= 4.18, kernel-devel <= 6.16.999 -Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.16.999 -Conflicts: kernel-devel < 4.18, kernel-devel > 6.16.999 -Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999 -Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.16.999 -Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.16.999 +Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 +Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 Obsoletes: spl-dkms <= %{version} %endif diff --git a/fedora-42/SPECS/zfs.spec b/fedora-42/SPECS/zfs.spec index c99e841..cc3fc1d 100644 --- a/fedora-42/SPECS/zfs.spec +++ b/fedora-42/SPECS/zfs.spec @@ -102,7 +102,7 @@ sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))") Name: zfs -Version: 2.3.4 +Version: 2.3.5 Release: 1%{?dist} Summary: Commands to control the kernel modules and libraries diff --git a/fedora-43/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch b/fedora-43/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch new file mode 100644 index 0000000..daf582c --- /dev/null +++ b/fedora-43/SOURCES/0001-wireshark-Drop-needless-declaration-of-proto_registe.patch @@ -0,0 +1,36 @@ +From b825bb556bd3967bf5422c243b77bd4038e317e2 Mon Sep 17 00:00:00 2001 +Message-ID: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 10:34:51 +0200 +Subject: [PATCH 1/8] wireshark: Drop needless declaration of + proto_register_libvirt() and proto_reg_handoff_libvirt() +Content-type: text/plain + +Both proto_register_libvirt() and proto_reg_handoff_libvirt() are +declared in packet-libvirt.h which is included from plugin.c. +There's no need to provide another declaration in plugin.c. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/plugin.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c +index 9a83f2ca07..19b25e7b1a 100644 +--- a/tools/wireshark/src/plugin.c ++++ b/tools/wireshark/src/plugin.c +@@ -72,9 +72,6 @@ void plugin_register(void) + + #else /* WIRESHARK_VERSION >= 2009000 */ + +-void proto_register_libvirt(void); +-void proto_reg_handoff_libvirt(void); +- + WS_DLL_PUBLIC_DEF const gchar plugin_version[] = PLUGIN_VERSION; + WS_DLL_PUBLIC_DEF const int plugin_want_major = WIRESHARK_VERSION_MAJOR; + WS_DLL_PUBLIC_DEF const int plugin_want_minor = WIRESHARK_VERSION_MINOR; +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch b/fedora-43/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch new file mode 100644 index 0000000..df1e1de --- /dev/null +++ b/fedora-43/SOURCES/0002-wireshark-Switch-header-files-to-pragma-once.patch @@ -0,0 +1,47 @@ +From 41d3b457972bde85991fa7ed6f282370aca4b2af Mon Sep 17 00:00:00 2001 +Message-ID: <41d3b457972bde85991fa7ed6f282370aca4b2af.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 15:20:05 +0200 +Subject: [PATCH 2/8] wireshark: Switch header files to #pragma once +Content-type: text/plain + +The genxdrstub.pl script generates some header files. But they +use the old pattern to guard against multiple inclusion: + + #ifndef SOMETHING_H + #define SOMETHING_H + ... + #endif + +Change the script to generate just '#pragma once' used everywhere +else in our code. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/util/genxdrstub.pl | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl +index 8cfda25a27..01b663a88c 100755 +--- a/tools/wireshark/util/genxdrstub.pl ++++ b/tools/wireshark/util/genxdrstub.pl +@@ -563,11 +563,8 @@ sub add_header_file { + local $self->{header_contents} = []; + $self->print("/* *DO NOT MODIFY* this file directly.\n"); + $self->print(" * This file was generated by $0 from libvirt version $libvirt_version */\n"); +- my $ucname = uc $name; +- $self->print("#ifndef _$ucname\_H_\n"); +- $self->print("#define _$ucname\_H_\n"); ++ $self->print("#pragma once\n"); + $block->(); +- $self->print("#endif /* _$ucname\_H_ */"); + push @{ $self->{headers} }, [ $name, delete $self->{header_contents} ]; + } + +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch b/fedora-43/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch new file mode 100644 index 0000000..19bacea --- /dev/null +++ b/fedora-43/SOURCES/0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch @@ -0,0 +1,81 @@ +From 02a0e78bf54c903da8922c56bade9b3298ade351 Mon Sep 17 00:00:00 2001 +Message-ID: <02a0e78bf54c903da8922c56bade9b3298ade351.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 09:04:17 +0200 +Subject: [PATCH 3/8] wireshark: Move WIRESHARK_VERSION macro definition +Content-type: text/plain + +Soon, other parts of the wireshark code will need to +differentiate wrt wireshark version. Therefore, move the +WIRESHARK_VERSION macro definition among with its deps into +packet-libvirt.h. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.h | 14 ++++++++++++++ + tools/wireshark/src/plugin.c | 14 -------------- + 2 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.h b/tools/wireshark/src/packet-libvirt.h +index 14e6e13696..15cfcb0534 100644 +--- a/tools/wireshark/src/packet-libvirt.h ++++ b/tools/wireshark/src/packet-libvirt.h +@@ -19,5 +19,19 @@ + + #pragma once + ++#ifdef WITH_WS_VERSION ++# include ++#else ++# include ++# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR ++# define WIRESHARK_VERSION_MINOR VERSION_MINOR ++# define WIRESHARK_VERSION_MICRO VERSION_MICRO ++#endif ++ ++#define WIRESHARK_VERSION \ ++ ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \ ++ (WIRESHARK_VERSION_MINOR * 1000) + \ ++ (WIRESHARK_VERSION_MICRO)) ++ + void proto_register_libvirt(void); + void proto_reg_handoff_libvirt(void); +diff --git a/tools/wireshark/src/plugin.c b/tools/wireshark/src/plugin.c +index 19b25e7b1a..64317b5280 100644 +--- a/tools/wireshark/src/plugin.c ++++ b/tools/wireshark/src/plugin.c +@@ -12,15 +12,6 @@ + + #include + +-#ifdef WITH_WS_VERSION +-# include +-#else +-# include +-# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR +-# define WIRESHARK_VERSION_MINOR VERSION_MINOR +-# define WIRESHARK_VERSION_MICRO VERSION_MICRO +-#endif +- + #define HAVE_PLUGINS 1 + #include + /* plugins are DLLs */ +@@ -32,11 +23,6 @@ + /* Let the plugin version be the version of libvirt */ + #define PLUGIN_VERSION VERSION + +-#define WIRESHARK_VERSION \ +- ((WIRESHARK_VERSION_MAJOR * 1000 * 1000) + \ +- (WIRESHARK_VERSION_MINOR * 1000) + \ +- (WIRESHARK_VERSION_MICRO)) +- + #if WIRESHARK_VERSION < 2005000 + + WS_DLL_PUBLIC_DEF const gchar version[] = VERSION; +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch b/fedora-43/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch new file mode 100644 index 0000000..57c978a --- /dev/null +++ b/fedora-43/SOURCES/0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch @@ -0,0 +1,133 @@ +From 7374c4ecbd591b02f7be4b2918addc6d5852aafb Mon Sep 17 00:00:00 2001 +Message-ID: <7374c4ecbd591b02f7be4b2918addc6d5852aafb.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Mon, 13 Oct 2025 09:21:30 +0200 +Subject: [PATCH 4/8] wireshark: Fix int type of some virNetMessageHeader + members +Content-type: text/plain + +Our virNetMessageHeader is a struct that's declared as follows: + + struct virNetMessageHeader { + unsigned prog; + unsigned vers; + int proc; + virNetMessageType type; + unsigned serial; + virNetMessageStatus status; + }; + +Now, per RFC 4506 enums are also encoded as signed integers. This +means, that only 'prog', 'vers' and 'serial' are really unsigned +integers. The others ('proc', 'type' and 'status') are encoded as +signed integers. Fix their type when dissecting. + +While at it, also follow latest trend in wireshark and switch +from guint32 to uint32_t. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 34 +++++++++++++++++++--------- + 1 file changed, 23 insertions(+), 11 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index da2aabd98a..af14c6bed7 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -92,7 +92,7 @@ typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xd + + typedef struct vir_dissector_index vir_dissector_index_t; + struct vir_dissector_index { +- guint32 proc; ++ int32_t proc; + vir_xdr_dissector_t args; + vir_xdr_dissector_t ret; + vir_xdr_dissector_t msg; +@@ -275,8 +275,10 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + } + + static vir_xdr_dissector_t +-find_payload_dissector(guint32 proc, guint32 type, +- const vir_dissector_index_t *pds, gsize length) ++find_payload_dissector(int32_t proc, ++ enum vir_net_message_type type, ++ const vir_dissector_index_t *pds, ++ gsize length) + { + const vir_dissector_index_t *pd; + guint32 first, last, direction; +@@ -309,6 +311,10 @@ find_payload_dissector(guint32 proc, guint32 type, + return pd->ret; + case VIR_NET_MESSAGE: + return pd->msg; ++ case VIR_NET_STREAM: ++ case VIR_NET_STREAM_HOLE: ++ /* Handled elsewhere */ ++ return NULL; + } + return NULL; + } +@@ -397,8 +403,12 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + #include "libvirt/protocol.h" + + static void +-dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, +- guint32 prog, guint32 proc, guint32 type, guint32 status) ++dissect_libvirt_payload(tvbuff_t *tvb, ++ proto_tree *tree, ++ uint32_t prog, ++ int32_t proc, ++ int32_t type, ++ int32_t status) + { + gssize payload_length; + +@@ -430,7 +440,8 @@ dissect_libvirt_payload(tvbuff_t *tvb, proto_tree *tree, + return; + + unknown: +- dbg("Cannot determine payload: Prog=%u, Proc=%u, Type=%u, Status=%u", prog, proc, type, status); ++ dbg("Cannot determine payload: Prog=%u, Proc=%d, Type=%d, Status=%d", ++ prog, proc, type, status); + proto_tree_add_item(tree, hf_libvirt_unknown, tvb, VIR_HEADER_LEN, -1, ENC_NA); + } + +@@ -439,7 +450,8 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + void *opaque G_GNUC_UNUSED) + { + goffset offset; +- guint32 prog, proc, type, serial, status; ++ uint32_t prog, serial; ++ int32_t proc, type, status; + const value_string *vs; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); +@@ -448,17 +460,17 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + offset = 4; /* End of length field */ + prog = tvb_get_ntohl(tvb, offset); offset += 4; + offset += 4; /* Ignore version header field */ +- proc = tvb_get_ntohl(tvb, offset); offset += 4; +- type = tvb_get_ntohl(tvb, offset); offset += 4; ++ proc = tvb_get_ntohil(tvb, offset); offset += 4; ++ type = tvb_get_ntohil(tvb, offset); offset += 4; + serial = tvb_get_ntohl(tvb, offset); offset += 4; +- status = tvb_get_ntohl(tvb, offset); offset += 4; ++ status = tvb_get_ntohil(tvb, offset); offset += 4; + + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", + val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); + if (vs == NULL) { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%u", proc); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc); + } else { + col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); + } +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch b/fedora-43/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch new file mode 100644 index 0000000..dab6c98 --- /dev/null +++ b/fedora-43/SOURCES/0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch @@ -0,0 +1,46 @@ +From 1086888f95a322101f8cf53b63c96600ccbeb882 Mon Sep 17 00:00:00 2001 +Message-ID: <1086888f95a322101f8cf53b63c96600ccbeb882.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 19:16:54 +0200 +Subject: [PATCH 5/8] wireshark: Don't special case retval of + get_program_data() in dissect_libvirt_message() +Content-type: text/plain + +The get_program_data() function returns a pointer (in this +specific case to an array of procedure strings) which, if +non-NULL is then passed val_to_str(). Well, if val_to_str() sees +NULL it is treated gracefully, i.e. like if the numeric value +'proc' wasn't found in the array. + +Therefore, there's no need to special case call to +col_append_fstr(). Both result into the same behaviour. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index af14c6bed7..6c729801d4 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -469,11 +469,7 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- if (vs == NULL) { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%d", proc); +- } else { +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); +- } ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); + + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", + val_to_str(type, type_strings, "%d"), serial, +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch b/fedora-43/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch new file mode 100644 index 0000000..439bff6 --- /dev/null +++ b/fedora-43/SOURCES/0006-wireshark-Introduce-and-use-vir_val_to_str.patch @@ -0,0 +1,68 @@ +From ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7 Mon Sep 17 00:00:00 2001 +Message-ID: +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 18:23:18 +0200 +Subject: [PATCH 6/8] wireshark: Introduce and use vir_val_to_str() +Content-type: text/plain + +Wireshark offers val_to_str() function which converts numeric +value to string by looking up value ('val') in an array ('vs') of + pairs. If no corresponding string is found, then +the value is formatted using given 'fmt' string. + +Starting from wireshark-4.6.0 not only this function gained +another argument but also returns a strdup()-ed string. To keep +our code simple, let's introduce a wrapper so which can be then +adjusted as needed. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index 6c729801d4..f6ad2c4578 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -140,6 +140,15 @@ static const value_string status_strings[] = { + { -1, NULL } + }; + ++static const char * ++G_GNUC_PRINTF(3, 0) ++vir_val_to_str(const uint32_t val, ++ const value_string *vs, ++ const char *fmt) ++{ ++ return val_to_str(val, vs, fmt); ++} ++ + static gboolean + dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + guint32 maxlen) +@@ -466,14 +475,14 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + status = tvb_get_ntohil(tvb, offset); offset += 4; + + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", +- val_to_str(prog, program_strings, "%x")); ++ vir_val_to_str(prog, program_strings, "%x")); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", val_to_str(proc, vs, "%d")); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d")); + + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", +- val_to_str(type, type_strings, "%d"), serial, +- val_to_str(status, status_strings, "%d")); ++ vir_val_to_str(type, type_strings, "%d"), serial, ++ vir_val_to_str(status, status_strings, "%d")); + + if (tree) { + gint *hf_proc; +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch b/fedora-43/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch new file mode 100644 index 0000000..43b790e --- /dev/null +++ b/fedora-43/SOURCES/0007-wireshark-Don-t-leak-column-strings.patch @@ -0,0 +1,165 @@ +From 002b9f559d69b92e77ab2d234df6966fecdaf0ec Mon Sep 17 00:00:00 2001 +Message-ID: <002b9f559d69b92e77ab2d234df6966fecdaf0ec.1760476767.git.crobinso@redhat.com> +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 19:13:48 +0200 +Subject: [PATCH 7/8] wireshark: Don't leak column strings +Content-type: text/plain + +One of the problems of using val_to_str() is that it may return a +const string from given table ('vs'), OR return an allocated one. +Since the caller has no idea which case it is, it resides to safe +option and don't free returned string. But that might lead to a +memleak. This behaviour is fixed with wireshark-4.6.0 and support +for it will be introduced soon. But first, make vir_val_to_str() +behave like fixed val_to_str() from newer wireshark: just always +allocate the string. + +Now, if val_to_str() needs to allocate new memory it obtains +allocator by calling wmem_packet_scope() which is what we may do +too. + +Hand in hand with that, we need to free the memory using the +correct allocator, hence wmem_free(). But let's put it into a +wrapper vir_wmem_free() because just like val_to_str(), it'll +need additional argument when adapting to new wireshark. + +Oh, and freeing the memory right after col_add_fstr() is safe as +it uses vsnprintf() under the hood to format passed args. + +One last thing, the wmem.h file used to live under epan/wmem/ but +then in v3.5.0~240 [1] was moved to wsutil/wmem/. + +1: https://gitlab.com/wireshark/wireshark/-/commit/7f9c1f5f92c131354fc8b2b88d473706786064c0 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + meson.build | 20 ++++++++++++++++ + tools/wireshark/src/meson.build | 1 + + tools/wireshark/src/packet-libvirt.c | 35 ++++++++++++++++++++++------ + 3 files changed, 49 insertions(+), 7 deletions(-) + +diff --git a/meson.build b/meson.build +index bcc18b20e5..a1e0e5ecd5 100644 +--- a/meson.build ++++ b/meson.build +@@ -1365,6 +1365,26 @@ if wireshark_dep.found() + if cc.check_header('wireshark/ws_version.h') + conf.set('WITH_WS_VERSION', 1) + endif ++ ++ # Find wmem.h ++ # But it's not as easy as you'd think. Ubuntu 20.04 has split parts of ++ # libwireshark.so into libwsutil.so but: ++ # a) wireshark.pc never mentions it, ++ # b) libwsutil-dev package doesn't install pkg-config file. ++ # Fortunately, it's fixed in 24.04. ++ if cc.check_header('wireshark/epan/wmem/wmem.h', dependencies: wireshark_dep) ++ conf.set('WITH_WS_EPAN_WMEM', 1) ++ elif cc.check_header('wireshark/wsutil/wmem/wmem.h', dependencies: wireshark_dep) ++ conf.set('WITH_WS_WSUTIL_WMEM', 1) ++ else ++ error('Unable to locate wmem.h file') ++ endif ++ ++ # TODO: drop wsutil dep once support for Ubuntu 20.04 is dropped ++ wsutil_dep = dependency('', required: false) ++ if not cc.has_function('wmem_free', dependencies: wireshark_dep) ++ wsutil_dep = cc.find_library('wsutil', required: true) ++ endif + endif + + # generic build dependencies checks +diff --git a/tools/wireshark/src/meson.build b/tools/wireshark/src/meson.build +index 9b452dc5ca..ba0df913e0 100644 +--- a/tools/wireshark/src/meson.build ++++ b/tools/wireshark/src/meson.build +@@ -9,6 +9,7 @@ shared_library( + ], + dependencies: [ + wireshark_dep, ++ wsutil_dep, + xdr_dep, + tools_dep, + ], +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index f6ad2c4578..3178ac6f27 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -21,6 +21,11 @@ + #include + #include + #include ++#ifdef WITH_WS_EPAN_WMEM ++# include ++#elif WITH_WS_WSUTIL_WMEM ++# include ++#endif + #include + #include + #include "packet-libvirt.h" +@@ -140,13 +145,19 @@ static const value_string status_strings[] = { + { -1, NULL } + }; + +-static const char * ++static char * + G_GNUC_PRINTF(3, 0) + vir_val_to_str(const uint32_t val, + const value_string *vs, + const char *fmt) + { +- return val_to_str(val, vs, fmt); ++ return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt); ++} ++ ++static void ++vir_wmem_free(void *ptr) ++{ ++ wmem_free(wmem_packet_scope(), ptr); + } + + static gboolean +@@ -462,6 +473,10 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + uint32_t prog, serial; + int32_t proc, type, status; + const value_string *vs; ++ char *prog_str = NULL; ++ char *proc_str = NULL; ++ char *type_str = NULL; ++ char *status_str = NULL; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Libvirt"); + col_clear(pinfo->cinfo, COL_INFO); +@@ -474,15 +489,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + serial = tvb_get_ntohl(tvb, offset); offset += 4; + status = tvb_get_ntohil(tvb, offset); offset += 4; + +- col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", +- vir_val_to_str(prog, program_strings, "%x")); ++ prog_str = vir_val_to_str(prog, program_strings, "%x"); ++ col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); ++ vir_wmem_free(prog_str); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", vir_val_to_str(proc, vs, "%d")); ++ proc_str = vir_val_to_str(proc, vs, "%d"); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); ++ vir_wmem_free(proc_str); + ++ type_str = vir_val_to_str(type, type_strings, "%d"); ++ status_str = vir_val_to_str(status, status_strings, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", +- vir_val_to_str(type, type_strings, "%d"), serial, +- vir_val_to_str(status, status_strings, "%d")); ++ type_str, serial, status_str); ++ vir_wmem_free(status_str); ++ vir_wmem_free(type_str); + + if (tree) { + gint *hf_proc; +-- +2.51.0 + diff --git a/fedora-43/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch b/fedora-43/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch new file mode 100644 index 0000000..ebb56b5 --- /dev/null +++ b/fedora-43/SOURCES/0008-wireshark-Adapt-to-wireshark-4.6.0.patch @@ -0,0 +1,493 @@ +From b42a12174c787b99cd6fcb29b44e4b13bd64ee58 Mon Sep 17 00:00:00 2001 +Message-ID: +In-Reply-To: +References: +From: Michal Privoznik +Date: Fri, 10 Oct 2025 15:22:34 +0200 +Subject: [PATCH 8/8] wireshark: Adapt to wireshark-4.6.0 +Content-type: text/plain + +The main difference is that wmem_packet_scope() is gone [1] but +the packet_info struct has 'pool` member which points to the +allocator used for given packet. + +Unfortunately, while we were given pointer to packet_info at the +entry level to our dissector (dissect_libvirt() -> +tcp_dissect_pdus() -> dissect_libvirt_message()) it was never +propagated to generated/primitive dissectors. + +But not all dissectors need to allocate memory, so mark the new +argument as unused. And while our generator could be rewritten so +that the argument is annotated as unused iff it's really unused, +I couldn't bother rewriting it. It's generated code after all. +Too much work for little gain. + +Another significant change is that val_to_str() now requires new +argument: pointer to allocator to use because it always allocates +new memory [2][3]. + +1: https://gitlab.com/wireshark/wireshark/-/commit/5ca5c9ca372e06881b23ba9f4fdcb6b479886444 +2: https://gitlab.com/wireshark/wireshark/-/commit/b63599762468e4cf1783419a5556377604d344bb +3: https://gitlab.com/wireshark/wireshark/-/commit/84799be215313e61b83a3eaf074f89d6ee349b8c +Resolves: https://gitlab.com/libvirt/libvirt/-/issues/823 +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: Cole Robinson +--- + tools/wireshark/src/packet-libvirt.c | 157 +++++++++++++++++++-------- + tools/wireshark/util/genxdrstub.pl | 18 +-- + 2 files changed, 119 insertions(+), 56 deletions(-) + +diff --git a/tools/wireshark/src/packet-libvirt.c b/tools/wireshark/src/packet-libvirt.c +index 3178ac6f27..c5c8fb4756 100644 +--- a/tools/wireshark/src/packet-libvirt.c ++++ b/tools/wireshark/src/packet-libvirt.c +@@ -63,7 +63,7 @@ static gint ett_libvirt_stream_hole = -1; + + #define XDR_PRIMITIVE_DISSECTOR(xtype, ctype, ftype) \ + static gboolean \ +- dissect_xdr_##xtype(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) \ ++ dissect_xdr_##xtype(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) \ + { \ + goffset start; \ + ctype val; \ +@@ -93,7 +93,7 @@ XDR_PRIMITIVE_DISSECTOR(bool, bool_t, boolean) + + VIR_WARNINGS_RESET + +-typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf); ++typedef gboolean (*vir_xdr_dissector_t)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, XDR *xdrs, int hf); + + typedef struct vir_dissector_index vir_dissector_index_t; + struct vir_dissector_index { +@@ -146,22 +146,32 @@ static const value_string status_strings[] = { + }; + + static char * +-G_GNUC_PRINTF(3, 0) +-vir_val_to_str(const uint32_t val, ++G_GNUC_PRINTF(4, 0) ++vir_val_to_str(packet_info *pinfo, ++ const uint32_t val, + const value_string *vs, + const char *fmt) + { +- return val_to_str_wmem(wmem_packet_scope(), val, vs, fmt); ++#if WIRESHARK_VERSION < 4006000 ++ return val_to_str_wmem(pinfo->pool, val, vs, fmt); ++#else ++ return val_to_str(pinfo->pool, val, vs, fmt); ++#endif + } + + static void +-vir_wmem_free(void *ptr) ++vir_wmem_free(packet_info *pinfo, ++ void *ptr) + { +- wmem_free(wmem_packet_scope(), ptr); ++ wmem_free(pinfo->pool, ptr); + } + + static gboolean +-dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_string(tvbuff_t *tvb, ++ packet_info *pinfo G_GNUC_UNUSED, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 maxlen) + { + goffset start; +@@ -179,7 +189,11 @@ dissect_xdr_string(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_opaque(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 size) + { + goffset start; +@@ -190,7 +204,7 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if ((rc = xdr_opaque(xdrs, (caddr_t)val, size))) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + } else { +@@ -202,7 +216,11 @@ dissect_xdr_opaque(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_bytes(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + guint32 maxlen) + { + goffset start; +@@ -212,7 +230,7 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + start = xdr_getpos(xdrs); + if (xdr_bytes(xdrs, (char **)&val, &length, maxlen)) { + gint len = xdr_getpos(xdrs) - start; +- const char *s = tvb_bytes_to_str(wmem_packet_scope(), tvb, start, len); ++ const char *s = tvb_bytes_to_str(pinfo->pool, tvb, start, len); + + proto_tree_add_bytes_format_value(tree, hf, tvb, start, len, NULL, "%s", s); + free(val); +@@ -224,7 +242,11 @@ dissect_xdr_bytes(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, ++dissect_xdr_pointer(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, + vir_xdr_dissector_t dissect) + { + goffset start; +@@ -236,7 +258,7 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + return FALSE; + } + if (not_null) { +- return dissect(tvb, tree, xdrs, hf); ++ return dissect(tvb, pinfo, tree, xdrs, hf); + } else { + proto_item *ti; + ti = proto_tree_add_item(tree, hf, tvb, start, xdr_getpos(xdrs) - start, ENC_NA); +@@ -246,15 +268,22 @@ dissect_xdr_pointer(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, + } + + static gboolean +-dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf, +- guint32 length, vir_xdr_dissector_t dissect, goffset start) ++dissect_xdr_iterable(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_item *ti, ++ XDR *xdrs, ++ gint ett, ++ int rhf, ++ guint32 length, ++ vir_xdr_dissector_t dissect, ++ goffset start) + { + proto_tree *tree; + guint32 i; + + tree = proto_item_add_subtree(ti, ett); + for (i = 0; i < length; i++) { +- if (!dissect(tvb, tree, xdrs, rhf)) ++ if (!dissect(tvb, pinfo, tree, xdrs, rhf)) + return FALSE; + } + proto_item_set_len(ti, xdr_getpos(xdrs) - start); +@@ -262,8 +291,16 @@ dissect_xdr_iterable(tvbuff_t *tvb, proto_item *ti, XDR *xdrs, gint ett, int rhf + } + + static gboolean +-dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 size, vir_xdr_dissector_t dissect) ++dissect_xdr_vector(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 size, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -271,12 +308,20 @@ dissect_xdr_vector(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + start = xdr_getpos(xdrs); + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s[%u]", rtype, size); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, size, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, size, dissect, start); + } + + static gboolean +-dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, +- int rhf, const gchar *rtype, guint32 maxlen, vir_xdr_dissector_t dissect) ++dissect_xdr_array(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf, ++ gint ett, ++ int rhf, ++ const gchar *rtype, ++ guint32 maxlen, ++ vir_xdr_dissector_t dissect) + { + goffset start; + proto_item *ti; +@@ -291,7 +336,7 @@ dissect_xdr_array(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf, gint ett, + + ti = proto_tree_add_item(tree, hf, tvb, start, -1, ENC_NA); + proto_item_append_text(ti, " :: %s<%u>", rtype, length); +- return dissect_xdr_iterable(tvb, ti, xdrs, ett, rhf, length, dissect, start); ++ return dissect_xdr_iterable(tvb, pinfo, ti, xdrs, ett, rhf, length, dissect, start); + } + + static vir_xdr_dissector_t +@@ -340,7 +385,10 @@ find_payload_dissector(int32_t proc, + } + + static void +-dissect_libvirt_stream(tvbuff_t *tvb, proto_tree *tree, gint payload_length) ++dissect_libvirt_stream(tvbuff_t *tvb, ++ packet_info *pinfo G_GNUC_UNUSED, ++ proto_tree *tree, ++ gint payload_length) + { + proto_tree_add_item(tree, hf_libvirt_stream, tvb, VIR_HEADER_LEN, + payload_length - VIR_HEADER_LEN, ENC_NA); +@@ -357,6 +405,7 @@ dissect_libvirt_num_of_fds(tvbuff_t *tvb, proto_tree *tree) + + static void + dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, ++ packet_info *pinfo G_GNUC_UNUSED, + gint start G_GNUC_UNUSED, + gint32 nfds G_GNUC_UNUSED) + { +@@ -364,8 +413,12 @@ dissect_libvirt_fds(tvbuff_t *tvb G_GNUC_UNUSED, + } + + static void +-dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_length, +- gint32 status, vir_xdr_dissector_t dissect) ++dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ gint payload_length, ++ gint32 status, ++ vir_xdr_dissector_t dissect) + { + gint32 nfds = 0; + gint start = VIR_HEADER_LEN; +@@ -384,17 +437,21 @@ dissect_libvirt_payload_xdr_data(tvbuff_t *tvb, proto_tree *tree, gint payload_l + payload_data = (caddr_t)tvb_memdup(NULL, payload_tvb, 0, payload_length); + xdrmem_create(&xdrs, payload_data, payload_length, XDR_DECODE); + +- dissect(payload_tvb, tree, &xdrs, -1); ++ dissect(payload_tvb, pinfo, tree, &xdrs, -1); + + xdr_destroy(&xdrs); + g_free(payload_data); + + if (nfds != 0) +- dissect_libvirt_fds(tvb, start + payload_length, nfds); ++ dissect_libvirt_fds(tvb, pinfo, start + payload_length, nfds); + } + + static gboolean +-dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++dissect_xdr_stream_hole(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ XDR *xdrs, ++ int hf) + { + goffset start; + proto_item *ti; +@@ -411,10 +468,10 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + tree = proto_item_add_subtree(ti, ett_libvirt_stream_hole); + + hf = hf_libvirt_stream_hole_length; +- if (!dissect_xdr_hyper(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_hyper(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + hf = hf_libvirt_stream_hole_flags; +- if (!dissect_xdr_u_int(tvb, tree, xdrs, hf)) return FALSE; ++ if (!dissect_xdr_u_int(tvb, pinfo, tree, xdrs, hf)) return FALSE; + + proto_item_set_len(ti, xdr_getpos(xdrs) - start); + return TRUE; +@@ -424,6 +481,7 @@ dissect_xdr_stream_hole(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) + + static void + dissect_libvirt_payload(tvbuff_t *tvb, ++ packet_info *pinfo, + proto_tree *tree, + uint32_t prog, + int32_t proc, +@@ -447,13 +505,13 @@ dissect_libvirt_payload(tvbuff_t *tvb, + xd = find_payload_dissector(proc, type, pds, *len); + if (xd == NULL) + goto unknown; +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, xd); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, xd); + } else if (status == VIR_NET_ERROR) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_remote_error); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_remote_error); + } else if (type == VIR_NET_STREAM) { /* implicitly, status == VIR_NET_CONTINUE */ +- dissect_libvirt_stream(tvb, tree, payload_length); ++ dissect_libvirt_stream(tvb, pinfo, tree, payload_length); + } else if (type == VIR_NET_STREAM_HOLE) { +- dissect_libvirt_payload_xdr_data(tvb, tree, payload_length, status, dissect_xdr_stream_hole); ++ dissect_libvirt_payload_xdr_data(tvb, pinfo, tree, payload_length, status, dissect_xdr_stream_hole); + } else { + goto unknown; + } +@@ -489,21 +547,21 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + serial = tvb_get_ntohl(tvb, offset); offset += 4; + status = tvb_get_ntohil(tvb, offset); offset += 4; + +- prog_str = vir_val_to_str(prog, program_strings, "%x"); ++ prog_str = vir_val_to_str(pinfo, prog, program_strings, "%x"); + col_add_fstr(pinfo->cinfo, COL_INFO, "Prog=%s", prog_str); +- vir_wmem_free(prog_str); ++ vir_wmem_free(pinfo, prog_str); + + vs = get_program_data(prog, VIR_PROGRAM_PROCSTRINGS); +- proc_str = vir_val_to_str(proc, vs, "%d"); ++ proc_str = vir_val_to_str(pinfo, proc, vs, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Proc=%s", proc_str); +- vir_wmem_free(proc_str); ++ vir_wmem_free(pinfo, proc_str); + +- type_str = vir_val_to_str(type, type_strings, "%d"); +- status_str = vir_val_to_str(status, status_strings, "%d"); ++ type_str = vir_val_to_str(pinfo, type, type_strings, "%d"); ++ status_str = vir_val_to_str(pinfo, status, status_strings, "%d"); + col_append_fstr(pinfo->cinfo, COL_INFO, " Type=%s Serial=%u Status=%s", + type_str, serial, status_str); +- vir_wmem_free(status_str); +- vir_wmem_free(type_str); ++ vir_wmem_free(pinfo, status_str); ++ vir_wmem_free(pinfo, type_str); + + if (tree) { + gint *hf_proc; +@@ -532,21 +590,26 @@ dissect_libvirt_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + proto_tree_add_item(libvirt_tree, hf_libvirt_status, tvb, offset, 4, ENC_NA); offset += 4; + + /* Dissect payload remaining */ +- dissect_libvirt_payload(tvb, libvirt_tree, prog, proc, type, status); ++ dissect_libvirt_payload(tvb, pinfo, libvirt_tree, prog, proc, type, status); + } + + return 0; + } + + static guint +-get_message_len(packet_info *pinfo G_GNUC_UNUSED, tvbuff_t *tvb, int offset, void *data G_GNUC_UNUSED) ++get_message_len(packet_info *pinfo G_GNUC_UNUSED, ++ tvbuff_t *tvb, ++ int offset, ++ void *data G_GNUC_UNUSED) + { + return tvb_get_ntohl(tvb, offset); + } + + static int +-dissect_libvirt(tvbuff_t *tvb, packet_info *pinfo, +- proto_tree *tree, void *data G_GNUC_UNUSED) ++dissect_libvirt(tvbuff_t *tvb, ++ packet_info *pinfo, ++ proto_tree *tree, ++ void *data G_GNUC_UNUSED) + { + /* Another magic const - 4; simply, how much bytes + * is needed to tell the length of libvirt packet. */ +diff --git a/tools/wireshark/util/genxdrstub.pl b/tools/wireshark/util/genxdrstub.pl +index 01b663a88c..f69695c091 100755 +--- a/tools/wireshark/util/genxdrstub.pl ++++ b/tools/wireshark/util/genxdrstub.pl +@@ -250,7 +250,7 @@ sub xdr_type { + sub render_caller { + my ($self, $hfid) = @_; + my $name = $c->rinc( 'dissect_xdr_'.($self->idstrip || lc($self->xdr_type)) ); +- "$name(tvb, tree, xdrs, hf)"; ++ "$name(tvb, pinfo, tree, xdrs, hf)"; + } + + sub ft_type { +@@ -345,7 +345,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), + $c->rinc('dissect_xdr_'.$self->reftype->idstrip); + } +@@ -359,7 +359,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($klass) = ref($self) =~ /([^:]+)$/; +- sprintf '%s(tvb, tree, xdrs, hf, %s)', ++ sprintf '%s(tvb, pinfo, tree, xdrs, hf, %s)', + $c->rinc('dissect_xdr_'.lc($klass)), $self->length || '~0'; + } + +@@ -447,7 +447,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_array(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_array(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -476,7 +476,7 @@ BEGIN{::register_profile( + sub render_caller { + my ($self, $hfid) = @_; + my ($pname) = reverse split /__/, $hfid; +- sprintf 'dissect_xdr_vector(tvb, tree, xdrs, hf, %s, %s, "%s", %s, %s)', ++ sprintf 'dissect_xdr_vector(tvb, pinfo, tree, xdrs, hf, %s, %s, "%s", %s, %s)', + $c->rinc('ett_'.$self->idstrip), + $c->rinc("hf_$hfid\__$pname"), + $self->reftype->idstrip, +@@ -857,7 +857,7 @@ __END__<is_primitive; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + return <%= $self->dealias->render_caller($self->ident eq $ident ? undef : $ident) %>; + } +@@ -865,7 +865,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + <% my ($self, $ident) = @_; + my $hfvar = $c->rinc('hf_'.$self->idstrip); + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + proto_item *ti; +@@ -890,7 +890,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + } + @@ Sym::Type::Enum#render_dissector + <% my ($self, $ident) = @_; %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + goffset start; + enum { DUMMY } es; +@@ -914,7 +914,7 @@ static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR * + my ($self, $ident) = @_; + my $decl_type = $self->decl->type->idstrip; + %> +-static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, proto_tree *tree, XDR *xdrs, int hf) ++static gboolean dissect_xdr_<%= $ident %>(tvbuff_t *tvb, packet_info *pinfo G_GNUC_UNUSED, proto_tree *tree, XDR *xdrs, int hf) + { + gboolean rc = TRUE; + goffset start; +-- +2.51.0 + diff --git a/fedora-43/SOURCES/zfs-2.3.5.tar.gz b/fedora-43/SOURCES/zfs-2.3.5.tar.gz new file mode 100644 index 0000000..cdda3a4 --- /dev/null +++ b/fedora-43/SOURCES/zfs-2.3.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89f9dec9a5c25a08bd11e738bdf75e24f81e99d4419551917593d49f4d483e8e +size 34404729 diff --git a/fedora-43/SPECS/libvirt.spec b/fedora-43/SPECS/libvirt.spec index d7a4565..0d3f993 100644 --- a/fedora-43/SPECS/libvirt.spec +++ b/fedora-43/SPECS/libvirt.spec @@ -284,7 +284,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 11.6.0 -Release: 1%{?dist} +Release: 2%{?dist} License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 URL: https://libvirt.org/ @@ -293,6 +293,16 @@ URL: https://libvirt.org/ %endif Source: https://download.libvirt.org/%{?mainturl}libvirt-%{version}.tar.xz +Patch: 0001-wireshark-Drop-needless-declaration-of-proto_registe.patch +Patch: 0002-wireshark-Switch-header-files-to-pragma-once.patch +Patch: 0003-wireshark-Move-WIRESHARK_VERSION-macro-definition.patch +Patch: 0004-wireshark-Fix-int-type-of-some-virNetMessageHeader-m.patch +Patch: 0005-wireshark-Don-t-special-case-retval-of-get_program_d.patch +Patch: 0006-wireshark-Introduce-and-use-vir_val_to_str.patch +Patch: 0007-wireshark-Don-t-leak-column-strings.patch +Patch: 0008-wireshark-Adapt-to-wireshark-4.6.0.patch + + Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} Requires: libvirt-daemon-config-nwfilter = %{version}-%{release} @@ -2684,6 +2694,9 @@ exit 0 %changelog +* Fri Oct 31 2025 Cole Robinson - 11.6.0-2 +- Fix build with latest wireshark + * Tue Aug 05 2025 Cole Robinson - 11.6.0-1 - Update to version 11.6.0 diff --git a/fedora-43/SPECS/zfs-dkms.spec b/fedora-43/SPECS/zfs-dkms.spec new file mode 100644 index 0000000..347740e --- /dev/null +++ b/fedora-43/SPECS/zfs-dkms.spec @@ -0,0 +1,168 @@ +%{?!packager: %define packager Brian Behlendorf } + +%if ! 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} +%define not_rpm 1 +%endif + +# Exclude input files from mangling +%global __brp_mangle_shebangs_exclude_from ^/usr/src/.*$ + +%define module zfs +%define mkconf scripts/dkms.mkconf + +Name: %{module}-dkms + +Version: 2.3.5 +Release: 1%{?dist} +Summary: Kernel module(s) (dkms) + +Group: System Environment/Kernel +License: CDDL +URL: https://github.com/openzfs/zfs +Source0: %{module}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +Requires: dkms >= 2.2.0.3 +Requires(pre): dkms >= 2.2.0.3 +Requires(post): dkms >= 2.2.0.3 +Requires(preun): dkms >= 2.2.0.3 +Requires: gcc, make, perl, diffutils +Requires(post): gcc, make, perl, diffutils + +# Hold back kernel upgrades if kernel is not supported by ZFS +%if 0%{?rhel}%{?fedora}%{?mageia}%{?suse_version}%{?openEuler} +Requires: kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Requires(post): kernel-devel >= 4.18, kernel-devel <= 6.17.999 +Conflicts: kernel-devel < 4.18, kernel-devel > 6.17.999 +Requires: kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Requires(post): kernel-uname-r >= 4.18, kernel-uname-r <= 6.17.999 +Conflicts: kernel-uname-r < 4.18, kernel-uname-r > 6.17.999 + +Obsoletes: spl-dkms <= %{version} +%endif +Provides: %{module}-kmod = %{version} +AutoReqProv: no + +%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) +# We don't directly use it, but if this isn't installed, rpmbuild as root can +# crash+corrupt rpmdb +# See issue #12071 +BuildRequires: ncompress +%endif + +%description +This package contains the dkms ZFS kernel modules. + +%prep +%setup -q -n %{module}-%{version} + +%build +%{mkconf} -n %{module} -v %{version} -f dkms.conf + +%install +if [ "$RPM_BUILD_ROOT" != "/" ]; then + rm -rf $RPM_BUILD_ROOT +fi +mkdir -p $RPM_BUILD_ROOT/usr/src/ +cp -rf ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/ + +%clean +if [ "$RPM_BUILD_ROOT" != "/" ]; then + rm -rf $RPM_BUILD_ROOT +fi + +%files +%defattr(-,root,root) +/usr/src/%{module}-%{version} + +%pre +echo "Running pre installation script: $0. Parameters: $*" +# We don't want any other versions lingering around in dkms. +# Tests with 'dnf' showed that in case of reinstall, or upgrade +# the preun scriptlet removed the version we are trying to install. +# Because of this, find all zfs dkms sources in /var/lib/dkms and +# remove them, if we find a matching version in dkms. + +dkms_root=/var/lib/dkms +if [ -d ${dkms_root}/%{module} ]; then + cd ${dkms_root}/%{module} + for x in [[:digit:]]*; do + [ -d "$x" ] || continue + otherver="$x" + opath="${dkms_root}/%{module}/${otherver}" + if [ "$otherver" != %{version} ]; then + # This is a workaround for a broken 'dkms status', we caused in a previous version. + # One day it might be not needed anymore, but it does not hurt to keep it. + if dkms status -m %{module} -v "$otherver" 2>&1 | grep "${opath}/source/dkms.conf does not exist" + then + echo "ERROR: dkms status is broken!" >&2 + if [ -L "${opath}/source" -a ! -d "${opath}/source" ] + then + echo "Trying to fix it by removing the symlink: ${opath}/source" >&2 + echo "You should manually remove ${opath}" >&2 + rm -f "${opath}/source" || echo "Removal failed!" >&2 + fi + fi + if [ `dkms status -m %{module} -v "$otherver" | grep -c %{module}` -gt 0 ]; then + echo "Removing old %{module} dkms modules version $otherver from all kernels." + dkms remove -m %{module} -v "$otherver" --all ||: + fi + fi + done + cd ${dkms_root} +fi + +# Uninstall this version of zfs dkms modules before installation of the package. +if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then + echo "Removing %{module} dkms modules version %{version} from all kernels." + dkms remove -m %{module} -v %{version} --all ||: +fi + +%post +echo "Running post installation script: $0. Parameters: $*" +# Add the module to dkms, as reccommended in the dkms man page. +# This is generally rpm specfic. +# But this also may help, if we have a broken 'dkms status'. +# Because, if the sources are available and only the symlink pointing +# to them is missing, this will resolve the situation +echo "Adding %{module} dkms modules version %{version} to dkms." +dkms add -m %{module} -v %{version} %{!?not_rpm:--rpm_safe_upgrade} ||: + +# After installing the package, dkms install this zfs version for the current kernel. +# Force the overwriting of old modules to avoid diff warnings in dkms status. +# Or in case of a downgrade to overwrite newer versions. +# Or if some other backed up versions have been restored before. +echo "Installing %{module} dkms modules version %{version} for the current kernel." +dkms install --force -m %{module} -v %{version} ||: + +%preun +dkms_root="/var/lib/dkms/%{module}/%{version}" +echo "Running pre uninstall script: $0. Parameters: $*" +# In case of upgrade we do nothing. See above comment in pre hook. +if [ "$1" = "1" -o "$1" = "upgrade" ] ; then + echo "This is an upgrade. Skipping pre uninstall action." + exit 0 +fi + +# Check if we uninstall the package. In that case remove the dkms modules. +# '0' is the value for the first parameter for rpm packages. +# 'remove' or 'purge' are the possible names for deb packages. +if [ "$1" = "0" -o "$1" = "remove" -o "$1" = "purge" ] ; then + if [ `dkms status -m %{module} -v %{version} | grep -c %{module}` -gt 0 ]; then + echo "Removing %{module} dkms modules version %{version} from all kernels." + dkms remove -m %{module} -v %{version} --all %{!?not_rpm:--rpm_safe_upgrade} && exit 0 + fi + # If removing the modules failed, it might be because of the broken 'dkms status'. + if dkms status -m %{module} -v %{version} 2>&1 | grep "${dkms_root}/source/dkms.conf does not exist" + then + echo "ERROR: dkms status is broken!" >&2 + echo "You should manually remove ${dkms_root}" >&2 + echo "WARNING: installed modules in /lib/modules/`uname -r`/extra could not be removed automatically!" >&2 + fi +else + echo "Script parameter $1 did not match any removal condition." +fi + +exit 0 + diff --git a/fedora-43/SPECS/zfs.spec b/fedora-43/SPECS/zfs.spec new file mode 100644 index 0000000..cc3fc1d --- /dev/null +++ b/fedora-43/SPECS/zfs.spec @@ -0,0 +1,604 @@ +%global _sbindir /sbin +%global _libdir /%{_lib} + +# Set the default udev directory based on distribution. +%if %{undefined _udevdir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _udevdir %{_prefix}/lib/udev +%else +%global _udevdir /lib/udev +%endif +%endif + +# Set the default udevrule directory based on distribution. +%if %{undefined _udevruledir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _udevruledir %{_prefix}/lib/udev/rules.d +%else +%global _udevruledir /lib/udev/rules.d +%endif +%endif + +# Set the default _bashcompletiondir directory based on distribution. +%if %{undefined _bashcompletiondir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _bashcompletiondir /etc/bash_completion.d +%else +%global _bashcompletiondir /usr/share/bash-completion +%endif +%endif + +# Set the default dracut directory based on distribution. +%if %{undefined _dracutdir} +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%global _dracutdir %{_prefix}/lib/dracut +%else +%global _dracutdir %{_prefix}/share/dracut +%endif +%endif + +%if %{undefined _initconfdir} +%global _initconfdir /etc/sysconfig +%endif + +%if %{undefined _unitdir} +%global _unitdir %{_prefix}/lib/systemd/system +%endif + +%if %{undefined _presetdir} +%global _presetdir %{_prefix}/lib/systemd/system-preset +%endif + +%if %{undefined _modulesloaddir} +%global _modulesloaddir %{_prefix}/lib/modules-load.d +%endif + +%if %{undefined _systemdgeneratordir} +%global _systemdgeneratordir %{_prefix}/lib/systemd/system-generators +%endif + +%if %{undefined _pkgconfigdir} +%global _pkgconfigdir %{_prefix}/%{_lib}/pkgconfig +%endif + +%bcond_with debug +%bcond_with debuginfo +%bcond_with asan +%bcond_with ubsan +%bcond_with systemd +%bcond_with pam +%bcond_without pyzfs + +# Generic enable switch for systemd +%if %{with systemd} +%define _systemd 1 +%endif + +# Distros below support systemd +%if 0%{?rhel}%{?fedora}%{?centos}%{?suse_version}%{?openEuler} +%define _systemd 1 +%endif + +# When not specified default to distribution provided version. +%if %{undefined __use_python} +%define __python /usr/bin/python3 +%define __python_pkg_version 3 +%else +%define __python %{__use_python} +%define __python_pkg_version %{__use_python_pkg_version} +%endif +%define __python_sitelib %(%{__python} -Esc " +import sysconfig; +if hasattr(sysconfig, 'get_default_scheme'): + scheme = sysconfig.get_default_scheme() +else: + scheme = sysconfig._get_default_scheme() +if scheme == 'posix_local': + scheme = 'posix_prefix' +prefix = '%{_prefix}' +if prefix == 'NONE': + prefix = '%{ac_default_prefix}' +sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) +print(sitedir);" 2>/dev/null || %{__python} -Esc "from distutils import sysconfig; print(sysconfig.get_python_lib(0,0))") + +Name: zfs +Version: 2.3.5 +Release: 1%{?dist} +Summary: Commands to control the kernel modules and libraries + +Group: System Environment/Kernel +License: CDDL +URL: https://github.com/openzfs/zfs +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +Requires: libzpool6%{?_isa} = %{version}-%{release} +Requires: libnvpair3%{?_isa} = %{version}-%{release} +Requires: libuutil3%{?_isa} = %{version}-%{release} +Requires: libzfs6%{?_isa} = %{version}-%{release} +Requires: %{name}-kmod = %{version} +Provides: %{name}-kmod-common = %{version}-%{release} +Obsoletes: spl <= %{version} + +# zfs-fuse provides the same commands and man pages that OpenZFS does. +# Renaming those on either side would conflict with all available documentation. +Conflicts: zfs-fuse + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: gcc, make +BuildRequires: zlib-devel +BuildRequires: libuuid-devel +BuildRequires: libblkid-devel +BuildRequires: libudev-devel +BuildRequires: libattr-devel +BuildRequires: openssl-devel +%if 0%{?fedora}%{?suse_version}%{?openEuler} || 0%{?rhel} >= 8 || 0%{?centos} >= 8 +BuildRequires: libtirpc-devel +%endif + +%if (0%{?fedora}%{?suse_version}%{?openEuler}) || (0%{?rhel} && 0%{?rhel} < 9) +# We don't directly use it, but if this isn't installed, rpmbuild as root can +# crash+corrupt rpmdb +# See issue #12071 +BuildRequires: ncompress +%endif + +Requires: openssl +%if 0%{?_systemd} +BuildRequires: systemd +%endif + +%endif + +%if 0%{?_systemd} +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +%endif + +# The zpool iostat/status -c scripts call some utilities like lsblk and iostat +Requires: util-linux +Requires: sysstat + +%description +This package contains the core ZFS command line utilities. + +%package -n libzpool6 +Summary: Native ZFS pool library for Linux +Group: System Environment/Kernel +Obsoletes: libzpool2 <= %{version} +Obsoletes: libzpool4 <= %{version} +Obsoletes: libzpool5 <= %{version} + +%description -n libzpool6 +This package contains the zpool library, which provides support +for managing zpools + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libzpool6 +%else +%post -n libzpool6 -p /sbin/ldconfig +%postun -n libzpool6 -p /sbin/ldconfig +%endif + +%package -n libnvpair3 +Summary: Solaris name-value library for Linux +Group: System Environment/Kernel +Obsoletes: libnvpair1 <= %{version} + +%description -n libnvpair3 +This package contains routines for packing and unpacking name-value +pairs. This functionality is used to portably transport data across +process boundaries, between kernel and user space, and can be used +to write self describing data structures on disk. + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libnvpair3 +%else +%post -n libnvpair3 -p /sbin/ldconfig +%postun -n libnvpair3 -p /sbin/ldconfig +%endif + +%package -n libuutil3 +Summary: Solaris userland utility library for Linux +Group: System Environment/Kernel +Obsoletes: libuutil1 <= %{version} + +%description -n libuutil3 +This library provides a variety of compatibility functions for OpenZFS: + * libspl: The Solaris Porting Layer userland library, which provides APIs + that make it possible to run Solaris user code in a Linux environment + with relatively minimal modification. + * libavl: The Adelson-Velskii Landis balanced binary tree manipulation + library. + * libefi: The Extensible Firmware Interface library for GUID disk + partitioning. + * libshare: NFS, SMB, and iSCSI service integration for ZFS. + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libuutil3 +%else +%post -n libuutil3 -p /sbin/ldconfig +%postun -n libuutil3 -p /sbin/ldconfig +%endif + +# The library version is encoded in the package name. When updating the +# version information it is important to add an obsoletes line below for +# the previous version of the package. +%package -n libzfs6 +Summary: Native ZFS filesystem library for Linux +Group: System Environment/Kernel +Obsoletes: libzfs2 <= %{version} +Obsoletes: libzfs4 <= %{version} +Obsoletes: libzfs5 <= %{version} + +%description -n libzfs6 +This package provides support for managing ZFS filesystems + +%if %{defined ldconfig_scriptlets} +%ldconfig_scriptlets -n libzfs6 +%else +%post -n libzfs6 -p /sbin/ldconfig +%postun -n libzfs6 -p /sbin/ldconfig +%endif + +%package -n libzfs6-devel +Summary: Development headers +Group: System Environment/Kernel +Requires: libzfs6%{?_isa} = %{version}-%{release} +Requires: libzpool6%{?_isa} = %{version}-%{release} +Requires: libnvpair3%{?_isa} = %{version}-%{release} +Requires: libuutil3%{?_isa} = %{version}-%{release} +Provides: libzpool6-devel = %{version}-%{release} +Provides: libnvpair3-devel = %{version}-%{release} +Provides: libuutil3-devel = %{version}-%{release} +Obsoletes: zfs-devel <= %{version} +Obsoletes: libzfs2-devel <= %{version} +Obsoletes: libzfs4-devel <= %{version} +Obsoletes: libzfs5-devel <= %{version} + +%description -n libzfs6-devel +This package contains the header files needed for building additional +applications against the ZFS libraries. + +%package test +Summary: Test infrastructure +Group: System Environment/Kernel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: parted +Requires: lsscsi +Requires: mdadm +Requires: bc +Requires: ksh +Requires: fio +Requires: acl +Requires: sudo +Requires: sysstat +Requires: libaio +Requires: python%{__python_pkg_version} +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: libaio-devel +%endif +AutoReqProv: no + +%description test +This package contains test infrastructure and support scripts for +validating the file system. + +%package dracut +Summary: Dracut module +Group: System Environment/Kernel +BuildArch: noarch +Requires: %{name} >= %{version} +Requires: dracut +Requires: /usr/bin/awk +Requires: grep + +%description dracut +This package contains a dracut module used to construct an initramfs +image which is ZFS aware. + +%if %{with pyzfs} +# Enforce `python36-` package prefix for CentOS 7 +# since dependencies come from EPEL and are named this way +%package -n python%{__python_pkg_version}-pyzfs +Summary: Python %{python_version} wrapper for libzfs_core +Group: Development/Languages/Python +License: Apache-2.0 +BuildArch: noarch +Requires: libzfs6 = %{version}-%{release} +Requires: libnvpair3 = %{version}-%{release} +Requires: libffi +Requires: python%{__python_pkg_version} + +%if 0%{?centos} == 7 +Requires: python36-cffi +%else +Requires: python%{__python_pkg_version}-cffi +%endif + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +%if 0%{?centos} == 7 +BuildRequires: python36-packaging +BuildRequires: python36-devel +BuildRequires: python36-cffi +BuildRequires: python36-setuptools +%else +BuildRequires: python%{__python_pkg_version}-packaging +BuildRequires: python%{__python_pkg_version}-devel +BuildRequires: python%{__python_pkg_version}-cffi +BuildRequires: python%{__python_pkg_version}-setuptools +%endif + +BuildRequires: libffi-devel +%endif + +%description -n python%{__python_pkg_version}-pyzfs +This package provides a python wrapper for the libzfs_core C library. +%endif + +%if 0%{?_initramfs} +%package initramfs +Summary: Initramfs module +Group: System Environment/Kernel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: initramfs-tools + +%description initramfs +This package contains a initramfs module used to construct an initramfs +image which is ZFS aware. +%endif + +%if %{with pam} +%package -n pam_zfs_key +Summary: PAM module for encrypted ZFS datasets + +%if 0%{?rhel}%{?centos}%{?fedora}%{?suse_version}%{?openEuler} +BuildRequires: pam-devel +%endif + +%description -n pam_zfs_key +This package contains the pam_zfs_key PAM module, which provides +support for unlocking datasets on user login. +%endif + +%prep +%if %{with debug} + %define debug --enable-debug +%else + %define debug --disable-debug +%endif + +%if %{with debuginfo} + %define debuginfo --enable-debuginfo +%else + %define debuginfo --disable-debuginfo +%endif + +%if %{with asan} + %define asan --enable-asan +%else + %define asan --disable-asan +%endif + +%if %{with ubsan} + %define ubsan --enable-ubsan +%else + %define ubsan --disable-ubsan +%endif + +%if 0%{?_systemd} + %define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --with-systemdmodulesloaddir=%{_modulesloaddir} --with-systemdgeneratordir=%{_systemdgeneratordir} --disable-sysvinit + %define systemd_svcs zfs-import-cache.service zfs-import-scan.service zfs-mount.service zfs-mount@.service zfs-share.service zfs-zed.service zfs.target zfs-import.target zfs-volume-wait.service zfs-volumes.target +%else + %define systemd --enable-sysvinit --disable-systemd +%endif + +%if %{with pyzfs} + %define pyzfs --enable-pyzfs +%else + %define pyzfs --disable-pyzfs +%endif + +%if %{with pam} + %define pam --enable-pam +%else + %define pam --disable-pam +%endif + +%setup -q + +%build +%configure \ + --with-config=user \ + --with-udevdir=%{_udevdir} \ + --with-udevruledir=%{_udevruledir} \ + --with-dracutdir=%{_dracutdir} \ + --with-pamconfigsdir=%{_datadir}/pam-configs \ + --with-pammoduledir=%{_libdir}/security \ + --with-python=%{__python} \ + --with-pkgconfigdir=%{_pkgconfigdir} \ + --disable-static \ + %{debug} \ + %{debuginfo} \ + %{asan} \ + %{ubsan} \ + %{systemd} \ + %{pam} \ + %{pyzfs} +make %{?_smp_mflags} + +%install +%{__rm} -rf $RPM_BUILD_ROOT +make install DESTDIR=%{?buildroot} +find %{?buildroot}%{_libdir} -name '*.la' -exec rm -f {} \; +%if 0%{!?__brp_mangle_shebangs:1} +find %{?buildroot}%{_bindir} \ + \( -name arc_summary -or -name arcstat -or -name dbufstat \ + -or -name zilstat \) \ + -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; +find %{?buildroot}%{_datadir} \ + \( -name test-runner.py -or -name zts-report.py \) \ + -exec %{__sed} -i 's|^#!.*|#!%{__python}|' {} \; +%endif + +%post +%if 0%{?_systemd} +%if 0%{?systemd_post:1} +%systemd_post %{systemd_svcs} +%else +if [ "$1" = "1" -o "$1" = "install" ] ; then + # Initial installation + systemctl preset %{systemd_svcs} >/dev/null || true +fi +%endif +%else +if [ -x /sbin/chkconfig ]; then + /sbin/chkconfig --add zfs-import + /sbin/chkconfig --add zfs-load-key + /sbin/chkconfig --add zfs-mount + /sbin/chkconfig --add zfs-share + /sbin/chkconfig --add zfs-zed +fi +%endif +exit 0 + +# On RHEL/CentOS 7 the static nodes aren't refreshed by default after +# installing a package. This is the default behavior for Fedora. +%posttrans +%if 0%{?rhel} == 7 || 0%{?centos} == 7 +systemctl restart kmod-static-nodes +systemctl restart systemd-tmpfiles-setup-dev +udevadm trigger +%endif + +%preun +%if 0%{?_systemd} +%if 0%{?systemd_preun:1} +%systemd_preun %{systemd_svcs} +%else +if [ "$1" = "0" -o "$1" = "remove" ] ; then + # Package removal, not upgrade + systemctl --no-reload disable %{systemd_svcs} >/dev/null || true + systemctl stop %{systemd_svcs} >/dev/null || true +fi +%endif +%else +if [ "$1" = "0" -o "$1" = "remove" ] && [ -x /sbin/chkconfig ]; then + /sbin/chkconfig --del zfs-import + /sbin/chkconfig --del zfs-load-key + /sbin/chkconfig --del zfs-mount + /sbin/chkconfig --del zfs-share + /sbin/chkconfig --del zfs-zed +fi +%endif +exit 0 + +%postun +%if 0%{?_systemd} +%if 0%{?systemd_postun:1} +%systemd_postun %{systemd_svcs} +%else +systemctl --system daemon-reload >/dev/null || true +%endif +%endif + +%files +# Core utilities +%{_sbindir}/* +%{_bindir}/raidz_test +%{_bindir}/zvol_wait +# Optional Python 3 scripts +%{_bindir}/arc_summary +%{_bindir}/arcstat +%{_bindir}/dbufstat +%{_bindir}/zilstat +# Man pages +%{_mandir}/man1/* +%{_mandir}/man4/* +%{_mandir}/man5/* +%{_mandir}/man7/* +%{_mandir}/man8/* +# Configuration files and scripts +%{_libexecdir}/%{name} +%{_udevdir}/vdev_id +%{_udevdir}/zvol_id +%{_udevdir}/rules.d/* +%{_datadir}/%{name}/compatibility.d +%if ! 0%{?_systemd} || 0%{?_initramfs} +# Files needed for sysvinit and initramfs-tools +%{_sysconfdir}/%{name}/zfs-functions +%config(noreplace) %{_initconfdir}/zfs +%else +%exclude %{_sysconfdir}/%{name}/zfs-functions +%exclude %{_initconfdir}/zfs +%endif +%if 0%{?_systemd} +%{_unitdir}/* +%{_presetdir}/* +%{_modulesloaddir}/* +%{_systemdgeneratordir}/* +%else +%config(noreplace) %{_sysconfdir}/init.d/* +%endif +%config(noreplace) %{_sysconfdir}/%{name}/zed.d/* +%config(noreplace) %{_sysconfdir}/%{name}/zpool.d/* +%config(noreplace) %{_sysconfdir}/%{name}/vdev_id.conf.*.example +%attr(440, root, root) %config(noreplace) %{_sysconfdir}/sudoers.d/* + +%config(noreplace) %{_bashcompletiondir}/zfs +%config(noreplace) %{_bashcompletiondir}/zpool + +%files -n libzpool6 +%{_libdir}/libzpool.so.* + +%files -n libnvpair3 +%{_libdir}/libnvpair.so.* + +%files -n libuutil3 +%{_libdir}/libuutil.so.* + +%files -n libzfs6 +%{_libdir}/libzfs*.so.* + +%files -n libzfs6-devel +%{_pkgconfigdir}/libzfs.pc +%{_pkgconfigdir}/libzfsbootenv.pc +%{_pkgconfigdir}/libzfs_core.pc +%{_libdir}/*.so +%{_includedir}/* +%doc AUTHORS COPYRIGHT LICENSE NOTICE README.md + +%files test +%{_datadir}/%{name}/zfs-tests +%{_datadir}/%{name}/test-runner +%{_datadir}/%{name}/runfiles +%{_datadir}/%{name}/*.sh + +%files dracut +%doc contrib/dracut/README.md +%{_dracutdir}/modules.d/* + +%if %{with pyzfs} +%files -n python%{__python_pkg_version}-pyzfs +%doc contrib/pyzfs/README +%doc contrib/pyzfs/LICENSE +%defattr(-,root,root,-) +%{__python_sitelib}/libzfs_core/* +%{__python_sitelib}/pyzfs* +%endif + +%if 0%{?_initramfs} +%files initramfs +%doc contrib/initramfs/README.md +/usr/share/initramfs-tools/* +%else +# Since we're not building the initramfs package, +# ignore those files. +%exclude /usr/share/initramfs-tools +%endif + +%if %{with pam} +%files -n pam_zfs_key +%{_libdir}/security/* +%{_datadir}/pam-configs/* +%endif