Compare commits
241 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4820e2d885 | |||
| b5ff942369 | |||
| dafc4559bd | |||
| bfcb9ad2f0 | |||
| acce46f726 | |||
| f80d27e126 | |||
| 63cd2ced20 | |||
| cad1b6966f | |||
| a27f478451 | |||
| b94faf01a5 | |||
| 60a70c925a | |||
| e184d967ac | |||
| 985ee7390d | |||
| 156ce5b5c7 | |||
| 77b02695ab | |||
| 50057212b3 | |||
| c61c2c83ef | |||
| e3e721c529 | |||
| 7bf08eb7cb | |||
| 0862e2b778 | |||
| 9ae002fc72 | |||
| 7749fc4a26 | |||
| 5b0f05f970 | |||
| 36079ddefa | |||
| 9abc69f078 | |||
| f4d251ad6e | |||
| b0d2e09842 | |||
| b0dd011728 | |||
| 2513c9ff81 | |||
| 9ef5501a94 | |||
| 659f2f0b36 | |||
| f3cac3532b | |||
| 6eb56c2e71 | |||
| 93a549eb1a | |||
| f2a998ce76 | |||
| 8556d44e84 | |||
| f8539fae13 | |||
| 80a3188a20 | |||
| 56d89b1d61 | |||
| 2a7828bae8 | |||
| c879325741 | |||
| edf6aa6cd7 | |||
| 163b87484b | |||
| 5828ec5da6 | |||
| adaeee1c2c | |||
| 200f2942a9 | |||
| cbf07f0551 | |||
| eb9ceebe38 | |||
| 507eb37491 | |||
| 3e211fa0f6 | |||
| d4bb64489a | |||
| 6d908194bf | |||
| 2333a80c1a | |||
| f4fd6d7df6 | |||
| c1a3411c3b | |||
| 619904f37a | |||
| 044c5b0665 | |||
| 50aba9b5a0 | |||
| c98b586e70 | |||
| 987430ba8b | |||
| 58043b20fb | |||
| f1888958a6 | |||
| 6c3d79e65d | |||
| dc9be9b9a7 | |||
| 5e0d67787a | |||
| 662f0e2ba4 | |||
| 66060fa395 | |||
| 83def04a25 | |||
| 535bbcdd91 | |||
| 417e4c9cf7 | |||
| 24d349fa37 | |||
| 9f3b22fec4 | |||
| 7285a57f5c | |||
| 9944fa190c | |||
| 1a44dca7d4 | |||
| 0c2262d602 | |||
| da598118cf | |||
| da34e517db | |||
| 7b17ccd035 | |||
| 908a2f2a46 | |||
| acf19787de | |||
| c269619b9a | |||
| 3f6336f446 | |||
| a552a10ec8 | |||
| bfb8157052 | |||
| edb5200d83 | |||
| fe3f90dedd | |||
| 437df85540 | |||
| 2d6cbe6672 | |||
| 97a323d7c2 | |||
| cb839d3dfc | |||
| dc6b512f3c | |||
| ac122f4525 | |||
| 7744acbb6b | |||
| 3807f07c15 | |||
| e484fdc92b | |||
| 6752fe8c9e | |||
| 15f52369ae | |||
| 65a0e26138 | |||
| 497e096592 | |||
| 03a98aaf59 | |||
| 5845f1efec | |||
| a8d01eb9d7 | |||
| 6d76ba5956 | |||
| a11202d9e2 | |||
| bbfa59c8da | |||
| b97ad8956c | |||
| f9639a0012 | |||
| c71e60c76c | |||
| 9764121247 | |||
| a18ed3c492 | |||
| 9e2eeb32e3 | |||
| 8bf91f5d22 | |||
| 91d8eff569 | |||
| a761ea338f | |||
| 7eef88add4 | |||
| 0c88a64234 | |||
| c2f3be1f4d | |||
| 18b1c9d77e | |||
| 4528832026 | |||
| 037cd36ba2 | |||
| b94fb6a393 | |||
| b0c05ac2ae | |||
| 15c305caf3 | |||
| bc1b3e59a7 | |||
| 3c4492c415 | |||
| fecc0295a2 | |||
| 325dc837c6 | |||
| 5a45cb7f0d | |||
| 21269530e8 | |||
| fc18e983e7 | |||
| 4a7cc743a9 | |||
| 4398397311 | |||
| 401f9087bc | |||
| dd3698988e | |||
| 3df49002c2 | |||
| 1bf0aedb9f | |||
| 79accd5a6e | |||
| 422d548fce | |||
| 20ec6e955c | |||
| 406a235cbc | |||
| 4d15e56a38 | |||
| 8693111790 | |||
| 8461a521f2 | |||
| 511e2c5124 | |||
| 749dc3d3cb | |||
| 73c9e38f2c | |||
| afe8184d3f | |||
| 7d77bf76aa | |||
| 7f0f1b831e | |||
| d964be0097 | |||
| a2479f539e | |||
| c2c89ec6a3 | |||
| d61e2404ba | |||
| a2be167dfe | |||
| 15ca09e1da | |||
| 2cc07e6366 | |||
| 4dd4fe78a4 | |||
| 0bc22fb6f7 | |||
| 76097a6961 | |||
| 98cbf39fd3 | |||
| d670e246d0 | |||
| 50e7b9a91d | |||
| 5cbc0451ce | |||
| b420054636 | |||
| 143fedee46 | |||
| 88887cac0f | |||
| 579afc99f2 | |||
| 7f5808b9d0 | |||
| 4df5f77071 | |||
| 1bdd527daf | |||
| e5fa1c00d2 | |||
| 18f7b8c79c | |||
| 782468f8e9 | |||
| 202e7d9569 | |||
| 0676a07265 | |||
| f57ce74947 | |||
| 851cfde15b | |||
| 06123137eb | |||
| 6ccf3cb58c | |||
| 030ddaa4ef | |||
| a8886736c4 | |||
| 4fd635e537 | |||
| 6210c457fc | |||
| 82926cfdf0 | |||
| e7a3ca6f6b | |||
| 1ae6f647b7 | |||
| 48941c011f | |||
| a3c4cc6f3d | |||
| 90fbcbd48f | |||
| 6efd96d995 | |||
| 21316e7a45 | |||
| 8adbb7a402 | |||
| 3f19d41908 | |||
| 34da93e0c9 | |||
| 208f506190 | |||
| 0ca715cad9 | |||
| 0f5d8c1c22 | |||
| a56bcbd063 | |||
| 89c3fa751c | |||
| 051644ffcb | |||
| 2a9c282548 | |||
| 2ae80af461 | |||
| 7335ede0e1 | |||
| 6c92ba3805 | |||
| 446f680673 | |||
| 3f56aa2870 | |||
| 3cec91694f | |||
| cb0cfa566f | |||
| a27acebf66 | |||
| 99d3a0ca1a | |||
| 9c962ebc4f | |||
| 99cbbf6606 | |||
| b73e509648 | |||
| b23ff9c0f7 | |||
| 20f9ed9c4c | |||
| 04cb28c315 | |||
| a74ea318d1 | |||
| 98ed6b4e36 | |||
| 2c49d1fd11 | |||
| 6e7bca6631 | |||
| 2fe145bb02 | |||
| 10b7d235e3 | |||
| 232e2e7de2 | |||
| fb1e4b061e | |||
| 0b1a013081 | |||
| a972457f43 | |||
| 67cfa34a05 | |||
| fc2ebb7646 | |||
| e92b461b4f | |||
| b1ac7b5791 | |||
| 88424efe85 | |||
| 4e2aab98a2 | |||
| f4bc1a2fe2 | |||
| a4bf2768b8 | |||
| 47cd44e9da | |||
| 731c6b90ff | |||
| 47ca46905d | |||
| 860ffc5b13 | |||
| 611b2ee520 | |||
| edcb926f9d |
@@ -0,0 +1,31 @@
|
||||
[suppress_function]
|
||||
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||
soname_regexp = libvirt\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||
soname_regexp = libvirt-admin\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = LIBVIRT_PRIVATE.*
|
||||
soname_regexp = libvirt\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = LIBVIRT_ADMIN_PRIVATE.*
|
||||
soname_regexp = libvirt-admin\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_storage_.*\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_storage_.*\\.so.*
|
||||
|
||||
[suppress_function]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_driver_.*\\.so.*
|
||||
|
||||
[suppress_variable]
|
||||
symbol_version_regexp = .*
|
||||
soname_regexp = libvirt_driver_.*\\.so.*
|
||||
+1
-1
@@ -2,4 +2,4 @@
|
||||
*.rpm
|
||||
i686
|
||||
x86_64
|
||||
libvirt-*.tar.gz
|
||||
libvirt-*.tar.xz
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From 5629ebcb4234fde10fd9468d5fc5dd4947ed8677 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Tue, 29 Apr 2025 15:49:10 +0100
|
||||
Subject: [PATCH] Fix mocking of virQEMUCapsProbeHVF function
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_capabilities.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
|
||||
index ea7c14daa9..488a1a058e 100644
|
||||
--- a/src/qemu/qemu_capabilities.h
|
||||
+++ b/src/qemu/qemu_capabilities.h
|
||||
@@ -943,7 +943,7 @@ bool
|
||||
virQEMUCapsGetKVMSupportsSecureGuest(virQEMUCaps *qemuCaps) G_NO_INLINE;
|
||||
|
||||
bool
|
||||
-virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps) G_NO_INLINE;
|
||||
+virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps) G_NO_INLINE __attribute__((noipa));
|
||||
|
||||
virArch virQEMUCapsArchFromString(const char *arch);
|
||||
const char *virQEMUCapsArchToString(virArch arch);
|
||||
--
|
||||
2.49.0
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
From 63a3d70697dc44ef2f8b40f7c8e9aa869227a7da Mon Sep 17 00:00:00 2001
|
||||
From: Jiang XueQian <jiangxueqian@gmail.com>
|
||||
Date: Sat, 18 Jan 2025 16:32:10 +0800
|
||||
Subject: [PATCH] nss: Skip empty files and avoid use of uninitialized value
|
||||
Content-type: text/plain
|
||||
|
||||
JSON parser isn't called when reading empty files so `jerr` will be used
|
||||
uninitialized in the original code. Empty files appear when a network
|
||||
has no dhcp clients.
|
||||
|
||||
This patch checks for such files and skip them.
|
||||
|
||||
Fixes: a8d828c88bbdaf83ae78dc06cdd84d5667fcc424
|
||||
Signed-off-by: Jiang XueQian <jiangxueqian@gmail.com>
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
tools/nss/libvirt_nss_leases.c | 9 +++++++--
|
||||
tools/nss/libvirt_nss_macs.c | 9 +++++++--
|
||||
2 files changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/tools/nss/libvirt_nss_leases.c b/tools/nss/libvirt_nss_leases.c
|
||||
index aea81bb56e..25ea6b0ce2 100644
|
||||
--- a/tools/nss/libvirt_nss_leases.c
|
||||
+++ b/tools/nss/libvirt_nss_leases.c
|
||||
@@ -263,7 +263,7 @@ findLeases(const char *file,
|
||||
enum json_tokener_error jerr;
|
||||
int jsonflags = JSON_TOKENER_STRICT | JSON_TOKENER_VALIDATE_UTF8;
|
||||
char line[1024];
|
||||
- ssize_t nreadTotal = 0;
|
||||
+ size_t nreadTotal = 0;
|
||||
int rv;
|
||||
|
||||
if ((fd = open(file, O_RDONLY)) < 0) {
|
||||
@@ -290,12 +290,17 @@ findLeases(const char *file,
|
||||
jerr = json_tokener_get_error(tok);
|
||||
} while (jerr == json_tokener_continue);
|
||||
|
||||
+ if (nreadTotal == 0) {
|
||||
+ ret = 0;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
if (jerr == json_tokener_continue) {
|
||||
ERROR("Cannot parse %s: incomplete json found", file);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (nreadTotal > 0 && jerr != json_tokener_success) {
|
||||
+ if (jerr != json_tokener_success) {
|
||||
ERROR("Cannot parse %s: %s", file, json_tokener_error_desc(jerr));
|
||||
goto cleanup;
|
||||
}
|
||||
diff --git a/tools/nss/libvirt_nss_macs.c b/tools/nss/libvirt_nss_macs.c
|
||||
index 23229a18f3..bac8c0e1bb 100644
|
||||
--- a/tools/nss/libvirt_nss_macs.c
|
||||
+++ b/tools/nss/libvirt_nss_macs.c
|
||||
@@ -124,7 +124,7 @@ findMACs(const char *file,
|
||||
json_tokener *tok = NULL;
|
||||
enum json_tokener_error jerr;
|
||||
int jsonflags = JSON_TOKENER_STRICT | JSON_TOKENER_VALIDATE_UTF8;
|
||||
- ssize_t nreadTotal = 0;
|
||||
+ size_t nreadTotal = 0;
|
||||
int rv;
|
||||
size_t i;
|
||||
|
||||
@@ -152,12 +152,17 @@ findMACs(const char *file,
|
||||
jerr = json_tokener_get_error(tok);
|
||||
} while (jerr == json_tokener_continue);
|
||||
|
||||
+ if (nreadTotal == 0) {
|
||||
+ ret = 0;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+
|
||||
if (jerr == json_tokener_continue) {
|
||||
ERROR("Cannot parse %s: incomplete json found", file);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- if (nreadTotal > 0 && jerr != json_tokener_success) {
|
||||
+ if (jerr != json_tokener_success) {
|
||||
ERROR("Cannot parse %s: %s", file, json_tokener_error_desc(jerr));
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
From cd0de70e05475d5f4aa46e578fbb98033d38c06b Mon Sep 17 00:00:00 2001
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
Date: Mon, 16 Jun 2025 10:28:37 +0200
|
||||
Subject: [PATCH] qemu: Be more forgiving when acquiring QUERY job when
|
||||
formatting domain XML
|
||||
Content-type: text/plain
|
||||
|
||||
In my previous commit of v11.0.0-rc1~115 I've made QEMU driver
|
||||
implementation for virDomainGetXMLDesc() (qemuDomainGetXMLDesc())
|
||||
acquire QERY job. See its commit message for more info. But this
|
||||
unfortunately broke apps witch fetch domain XML for incoming
|
||||
migration (like virt-manager). The reason is that for incoming
|
||||
migration the VIR_ASYNC_JOB_MIGRATION_IN async job is set, but
|
||||
the mask of allowed synchronous jobs is empty (because QEMU can't
|
||||
talk on monitor really). This makes virDomainObjBeginJob() fail
|
||||
which in turn makes qemuDomainGetXMLDesc() fail too.
|
||||
|
||||
It makes sense for qemuDomainGetXMLDesc() to acquire the job
|
||||
(e.g. so that it's coherent with another thread that might be in
|
||||
the middle of a MODIFY job). But failure to dump XML may be
|
||||
treated as broken daemon (e.g. virt-manager does so).
|
||||
|
||||
Therefore, still try to acquire the QUERY job (if job mask
|
||||
permits it) but, do not treat failure as an error.
|
||||
|
||||
Fixes: 6cc93bf28842526be2fd596a607ebca796b7fb2e
|
||||
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2369243
|
||||
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_driver.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index d2eddbd9ae..6bdeede2e8 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -6158,6 +6158,7 @@ static char
|
||||
{
|
||||
virQEMUDriver *driver = dom->conn->privateData;
|
||||
virDomainObj *vm;
|
||||
+ bool hasJob = false;
|
||||
char *ret = NULL;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS | VIR_DOMAIN_XML_UPDATE_CPU,
|
||||
@@ -6169,8 +6170,10 @@ static char
|
||||
if (virDomainGetXMLDescEnsureACL(dom->conn, vm->def, flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- if (virDomainObjBeginJob(vm, VIR_JOB_QUERY) < 0)
|
||||
- goto cleanup;
|
||||
+ if (virDomainNestedJobAllowed(vm->job, VIR_JOB_QUERY) &&
|
||||
+ virDomainObjBeginJob(vm, VIR_JOB_QUERY) >= 0) {
|
||||
+ hasJob = true;
|
||||
+ }
|
||||
|
||||
qemuDomainUpdateCurrentMemorySize(vm);
|
||||
|
||||
@@ -6186,7 +6189,8 @@ static char
|
||||
|
||||
ret = qemuDomainFormatXML(driver, vm, flags);
|
||||
|
||||
- virDomainObjEndJob(vm);
|
||||
+ if (hasJob)
|
||||
+ virDomainObjEndJob(vm);
|
||||
|
||||
cleanup:
|
||||
virDomainObjEndAPI(&vm);
|
||||
@@ -1,165 +0,0 @@
|
||||
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||
Date: Fri, 8 Apr 2016 10:46:41 +0200
|
||||
Subject: [PATCH] qemu: support virt-2.6 machine type on arm
|
||||
|
||||
Some places already check for "virt-" prefix as well as plain "virt".
|
||||
virQEMUCapsHasPCIMultiBus did not, resulting in multiple PCI devices
|
||||
having assigned the same unnumbered "pci" alias.
|
||||
|
||||
Add a test for the "virt-2.6" machine type which also omits the
|
||||
<model type='virtio'/> in <interface>, to check if
|
||||
qemuDomainDefaultNetModel works too.
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1325085
|
||||
(cherry picked from commit f06ca25d235433f9139cbfb3d5d9eae7409156b9)
|
||||
---
|
||||
src/qemu/qemu_capabilities.c | 3 +-
|
||||
src/qemu/qemu_domain.c | 3 +-
|
||||
...l2argv-aarch64-virt-2.6-virtio-pci-default.args | 37 +++++++++++++++++
|
||||
...ml2argv-aarch64-virt-2.6-virtio-pci-default.xml | 47 ++++++++++++++++++++++
|
||||
tests/qemuxml2argvtest.c | 6 +++
|
||||
5 files changed, 94 insertions(+), 2 deletions(-)
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
|
||||
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
|
||||
|
||||
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
|
||||
index 2823843..57e2056 100644
|
||||
--- a/src/qemu/qemu_capabilities.c
|
||||
+++ b/src/qemu/qemu_capabilities.c
|
||||
@@ -2172,7 +2172,8 @@ bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps,
|
||||
/* If 'virt' supports PCI, it supports multibus.
|
||||
* No extra conditions here for simplicity.
|
||||
*/
|
||||
- if (STREQ(def->os.machine, "virt"))
|
||||
+ if (STREQ(def->os.machine, "virt") ||
|
||||
+ STRPREFIX(def->os.machine, "virt-"))
|
||||
return true;
|
||||
}
|
||||
|
||||
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
||||
index f38b0f3..d9d5041 100644
|
||||
--- a/src/qemu/qemu_domain.c
|
||||
+++ b/src/qemu/qemu_domain.c
|
||||
@@ -1479,7 +1479,8 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
|
||||
if (STREQ(def->os.machine, "versatilepb"))
|
||||
return "smc91c111";
|
||||
|
||||
- if (STREQ(def->os.machine, "virt"))
|
||||
+ if (STREQ(def->os.machine, "virt") ||
|
||||
+ STRPREFIX(def->os.machine, "virt-"))
|
||||
return "virtio";
|
||||
|
||||
/* Incomplete. vexpress (and a few others) use this, but not all
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
|
||||
new file mode 100644
|
||||
index 0000000..93c181d
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.args
|
||||
@@ -0,0 +1,37 @@
|
||||
+LC_ALL=C \
|
||||
+PATH=/bin \
|
||||
+HOME=/home/test \
|
||||
+USER=test \
|
||||
+LOGNAME=test \
|
||||
+QEMU_AUDIO_DRV=none \
|
||||
+/usr/bin/qemu-system-aarch64 \
|
||||
+-name aarch64test \
|
||||
+-S \
|
||||
+-M virt-2.6 \
|
||||
+-cpu cortex-a53 \
|
||||
+-m 1024 \
|
||||
+-smp 1 \
|
||||
+-uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
|
||||
+-nographic \
|
||||
+-nodefconfig \
|
||||
+-nodefaults \
|
||||
+-monitor unix:/tmp/lib/domain--1-aarch64test/monitor.sock,server,nowait \
|
||||
+-boot c \
|
||||
+-kernel /aarch64.kernel \
|
||||
+-initrd /aarch64.initrd \
|
||||
+-append 'earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait' \
|
||||
+-dtb /aarch64.dtb \
|
||||
+-device i82801b11-bridge,id=pci.1,bus=pcie.0,addr=0x1 \
|
||||
+-device pci-bridge,chassis_nr=2,id=pci.2,bus=pci.1,addr=0x1 \
|
||||
+-device virtio-serial-device,id=virtio-serial0 \
|
||||
+-usb \
|
||||
+-drive file=/aarch64.raw,format=raw,if=none,id=drive-virtio-disk0 \
|
||||
+-device virtio-blk-device,drive=drive-virtio-disk0,id=virtio-disk0 \
|
||||
+-device virtio-net-device,vlan=0,id=net0,mac=52:54:00:09:a4:37 \
|
||||
+-net user,vlan=0,name=hostnet0 \
|
||||
+-serial pty \
|
||||
+-chardev pty,id=charconsole1 \
|
||||
+-device virtconsole,chardev=charconsole1,id=console1 \
|
||||
+-device virtio-balloon-device,id=balloon0 \
|
||||
+-object rng-random,id=objrng0,filename=/dev/random \
|
||||
+-device virtio-rng-device,rng=objrng0,id=rng0
|
||||
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
|
||||
new file mode 100644
|
||||
index 0000000..e745101
|
||||
--- /dev/null
|
||||
+++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-virt-2.6-virtio-pci-default.xml
|
||||
@@ -0,0 +1,47 @@
|
||||
+<domain type="qemu">
|
||||
+ <name>aarch64test</name>
|
||||
+ <uuid>496d7ea8-9739-544b-4ebd-ef08be936e8b</uuid>
|
||||
+ <memory>1048576</memory>
|
||||
+ <currentMemory>1048576</currentMemory>
|
||||
+ <vcpu placement='static'>1</vcpu>
|
||||
+ <os>
|
||||
+ <type arch="aarch64" machine="virt-2.6">hvm</type>
|
||||
+ <kernel>/aarch64.kernel</kernel>
|
||||
+ <initrd>/aarch64.initrd</initrd>
|
||||
+ <dtb>/aarch64.dtb</dtb>
|
||||
+ <cmdline>earlyprintk console=ttyAMA0,115200n8 rw root=/dev/vda rootwait</cmdline>
|
||||
+ </os>
|
||||
+ <features>
|
||||
+ <acpi/>
|
||||
+ <apic/>
|
||||
+ <pae/>
|
||||
+ </features>
|
||||
+ <cpu match='exact'>
|
||||
+ <model>cortex-a53</model>
|
||||
+ </cpu>
|
||||
+ <clock offset="utc"/>
|
||||
+ <on_poweroff>destroy</on_poweroff>
|
||||
+ <on_reboot>restart</on_reboot>
|
||||
+ <on_crash>restart</on_crash>
|
||||
+ <devices>
|
||||
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
|
||||
+ <disk type='file' device='disk'>
|
||||
+ <source file='/aarch64.raw'/>
|
||||
+ <target dev='vda' bus='virtio'/>
|
||||
+ </disk>
|
||||
+ <interface type='user'>
|
||||
+ <mac address='52:54:00:09:a4:37'/>
|
||||
+ </interface>
|
||||
+ <console type='pty'/>
|
||||
+ <console type='pty'>
|
||||
+ <target type='virtio' port='0'/>
|
||||
+ </console>
|
||||
+ <memballoon model='virtio'/>
|
||||
+ <!--
|
||||
+ This actually doesn't work in practice because vexpress only has
|
||||
+ 4 virtio slots available, rng makes 5 -->
|
||||
+ <rng model='virtio'>
|
||||
+ <backend model='random'>/dev/random</backend>
|
||||
+ </rng>
|
||||
+ </devices>
|
||||
+</domain>
|
||||
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
||||
index e9b8d64..d1b9e98 100644
|
||||
--- a/tests/qemuxml2argvtest.c
|
||||
+++ b/tests/qemuxml2argvtest.c
|
||||
@@ -1661,6 +1661,12 @@ mymain(void)
|
||||
QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM,
|
||||
QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE,
|
||||
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE);
|
||||
+ DO_TEST("aarch64-virt-2.6-virtio-pci-default",
|
||||
+ QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB,
|
||||
+ QEMU_CAPS_DEVICE_VIRTIO_MMIO,
|
||||
+ QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM,
|
||||
+ QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE,
|
||||
+ QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE);
|
||||
/* Example of using virtio-pci with no explicit PCI controller
|
||||
but with manual PCI addresses */
|
||||
DO_TEST("aarch64-virtio-pci-manual-addresses",
|
||||
@@ -0,0 +1,94 @@
|
||||
From 63e4cbd109374f44e8bd4f8d1af5e2a2c67611bc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 28 Apr 2025 11:42:13 +0100
|
||||
Subject: [PATCH] storage: stop hardcoding paths for mkfs, mount, umount
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
This was always undesirable but now causes problems on Fedora 42
|
||||
where at build time we detect a /sbin path but at runtime this
|
||||
will only exist on upgraded machines, not fresh installs.
|
||||
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
meson.build | 13 -------------
|
||||
src/storage/storage_backend_fs.c | 17 +++--------------
|
||||
2 files changed, 3 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 37b1caa566..14c98b49a1 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -1827,23 +1827,10 @@ if conf.has('WITH_LIBVIRTD')
|
||||
endif
|
||||
endif
|
||||
|
||||
- if fs_enable
|
||||
- mount_prog = find_program('mount', required: get_option('storage_fs'), dirs: libvirt_sbin_path)
|
||||
- umount_prog = find_program('umount', required: get_option('storage_fs'), dirs: libvirt_sbin_path)
|
||||
- mkfs_prog = find_program('mkfs', required: get_option('storage_fs'), dirs: libvirt_sbin_path)
|
||||
-
|
||||
- if not mount_prog.found() or not umount_prog.found() or not mkfs_prog.found()
|
||||
- fs_enable = false
|
||||
- endif
|
||||
- endif
|
||||
-
|
||||
if fs_enable
|
||||
use_storage = true
|
||||
|
||||
conf.set('WITH_STORAGE_FS', 1)
|
||||
- conf.set_quoted('MOUNT', mount_prog.full_path())
|
||||
- conf.set_quoted('UMOUNT', umount_prog.full_path())
|
||||
- conf.set_quoted('MKFS', mkfs_prog.full_path())
|
||||
endif
|
||||
endif
|
||||
|
||||
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
|
||||
index fce395d60f..6ec359625a 100644
|
||||
--- a/src/storage/storage_backend_fs.c
|
||||
+++ b/src/storage/storage_backend_fs.c
|
||||
@@ -304,7 +304,7 @@ virStorageBackendFileSystemMount(virStoragePoolObj *pool)
|
||||
if (!(src = virStorageBackendFileSystemGetPoolSource(pool)))
|
||||
return -1;
|
||||
|
||||
- cmd = virStorageBackendFileSystemMountCmd(MOUNT, def, src);
|
||||
+ cmd = virStorageBackendFileSystemMountCmd("mount", def, src);
|
||||
|
||||
/* Mounting a shared FS might take a long time. Don't hold
|
||||
* the pool locked meanwhile. */
|
||||
@@ -362,7 +362,7 @@ virStorageBackendFileSystemStop(virStoragePoolObj *pool)
|
||||
if ((rc = virStorageBackendFileSystemIsMounted(pool)) != 1)
|
||||
return rc;
|
||||
|
||||
- cmd = virCommandNewArgList(UMOUNT, def->target.path, NULL);
|
||||
+ cmd = virCommandNewArgList("umount", def->target.path, NULL);
|
||||
return virCommandRun(cmd, NULL);
|
||||
}
|
||||
#endif /* WITH_STORAGE_FS */
|
||||
@@ -402,18 +402,7 @@ virStorageBackendExecuteMKFS(const char *device,
|
||||
g_autoptr(virCommand) cmd = NULL;
|
||||
g_autofree char *mkfs = NULL;
|
||||
|
||||
-#if WITH_STORAGE_FS
|
||||
- mkfs = virFindFileInPath(MKFS);
|
||||
-#endif /* WITH_STORAGE_FS */
|
||||
-
|
||||
- if (!mkfs) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("mkfs is not available on this platform: Failed to make filesystem of type '%1$s' on device '%2$s'"),
|
||||
- format, device);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- cmd = virCommandNewArgList(mkfs, "-t", format, NULL);
|
||||
+ cmd = virCommandNewArgList("mkfs", "-t", format, NULL);
|
||||
|
||||
/* use the force, otherwise mkfs.xfs won't overwrite existing fs.
|
||||
* Similarly mkfs.ext2, mkfs.ext3, and mkfs.ext4 require supplying -F
|
||||
--
|
||||
2.49.0
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
To: devel@lists.libvirt.org
|
||||
Subject: [PATCH] util: avoid overflow in hextable buffer
|
||||
Date: Mon, 20 Jan 2025 10:09:24 +0000
|
||||
Message-ID: <20250120100924.3864818-1-berrange@redhat.com>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The assigned string is 17 chars long once the trailing nul is taken
|
||||
into account. This triggers a warning with GCC 15
|
||||
|
||||
src/util/virsystemd.c: In function ‘virSystemdEscapeName’:
|
||||
src/util/virsystemd.c:59:38: error: initializer-string for array of ‘char’ is too long [-Werror=unterminated-string-initialization]
|
||||
59 | static const char hextable[16] = "0123456789abcdef";
|
||||
| ^~~~~~~~~~~~~~~~~~
|
||||
|
||||
Switch to a dynamically sized array as used in all the other places
|
||||
we have a hextable array.
|
||||
|
||||
See also: https://gcc.gnu.org/PR115185
|
||||
Reported-by: Yaakov Selkowitz <yselkowi@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
src/util/virsystemd.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c
|
||||
index 5b772e29dd..d46e5f74fc 100644
|
||||
--- a/src/util/virsystemd.c
|
||||
+++ b/src/util/virsystemd.c
|
||||
@@ -56,7 +56,7 @@ struct _virSystemdActivationEntry {
|
||||
static void virSystemdEscapeName(virBuffer *buf,
|
||||
const char *name)
|
||||
{
|
||||
- static const char hextable[16] = "0123456789abcdef";
|
||||
+ static const char hextable[] = "0123456789abcdef";
|
||||
|
||||
#define ESCAPE(c) \
|
||||
do { \
|
||||
--
|
||||
2.47.1
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
From 7ab0f1c2a3fddf46d381f055e49111e3063b4829 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||
Date: Mon, 28 Apr 2025 11:47:34 +0100
|
||||
Subject: [PATCH] util: stop hardcoding numad path
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
From: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
Change the meson rules to always enable numad if on a Linux host, unless
|
||||
the meson options say not to.
|
||||
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
---
|
||||
meson.build | 10 +++-------
|
||||
src/util/virnuma.c | 2 +-
|
||||
2 files changed, 4 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/meson.build b/meson.build
|
||||
index 14c98b49a1..767205f44b 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2028,14 +2028,10 @@ if not get_option('nss').disabled()
|
||||
endif
|
||||
endif
|
||||
|
||||
-if not get_option('numad').disabled() and numactl_dep.found()
|
||||
- numad_prog = find_program('numad', required: get_option('numad'), dirs: libvirt_sbin_path)
|
||||
- if numad_prog.found()
|
||||
- conf.set('WITH_NUMAD', 1)
|
||||
- conf.set_quoted('NUMAD', numad_prog.full_path())
|
||||
- endif
|
||||
+if not get_option('numad').disabled() and numactl_dep.found() and host_machine.system() == 'linux'
|
||||
+ conf.set('WITH_NUMAD', 1)
|
||||
elif get_option('numad').enabled()
|
||||
- error('You must have numactl enabled for numad support.')
|
||||
+ error('You must have a Linux host with numactl enabled for numad support.')
|
||||
endif
|
||||
|
||||
# nwfilter should only be compiled for linux, and only if the
|
||||
diff --git a/src/util/virnuma.c b/src/util/virnuma.c
|
||||
index 9393c20875..67c51630c7 100644
|
||||
--- a/src/util/virnuma.c
|
||||
+++ b/src/util/virnuma.c
|
||||
@@ -61,7 +61,7 @@ virNumaGetAutoPlacementAdvice(unsigned short vcpus,
|
||||
g_autoptr(virCommand) cmd = NULL;
|
||||
char *output = NULL;
|
||||
|
||||
- cmd = virCommandNewArgList(NUMAD, "-w", NULL);
|
||||
+ cmd = virCommandNewArgList("numad", "-w", NULL);
|
||||
virCommandAddArgFormat(cmd, "%d:%llu", vcpus,
|
||||
VIR_DIV_UP(balloon, 1024));
|
||||
|
||||
--
|
||||
2.49.0
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From b825bb556bd3967bf5422c243b77bd4038e317e2 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 10 Apr 2016 18:21:13 +0200
|
||||
Subject: [PATCH] build: cleanup GCC < 4.6 -Wlogical-op workaround
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
(cherry picked from commit 7fb81831fc497aa4a34fdfc036be9c9ae4401084)
|
||||
---
|
||||
m4/virt-compile-warnings.m4 | 2 +-
|
||||
src/internal.h | 10 ++++++++++
|
||||
src/util/virbuffer.c | 11 +++--------
|
||||
src/util/virstring.c | 9 +--------
|
||||
src/util/virsysinfo.c | 13 ++-----------
|
||||
5 files changed, 17 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4
|
||||
index 3dd0665..1b0a2cf 100644
|
||||
--- a/m4/virt-compile-warnings.m4
|
||||
+++ b/m4/virt-compile-warnings.m4
|
||||
@@ -236,7 +236,7 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
|
||||
|
||||
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
|
||||
test "$lv_cv_gcc_wlogical_op_broken" = yes; then
|
||||
- AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1,
|
||||
+ AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_STRCHR], 1,
|
||||
[Define to 1 if gcc -Wlogical-op reports false positives on strchr])
|
||||
fi
|
||||
])
|
||||
diff --git a/src/internal.h b/src/internal.h
|
||||
index db26fb0..35cc6d4 100644
|
||||
--- a/src/internal.h
|
||||
+++ b/src/internal.h
|
||||
@@ -253,6 +253,16 @@
|
||||
# define VIR_WARNINGS_RESET
|
||||
# endif
|
||||
|
||||
+/* Workaround bogus GCC < 4.6 that produces false -Wlogical-op warnings for
|
||||
+ * strchr(). Those old GCCs don't support push/pop. */
|
||||
+# if BROKEN_GCC_WLOGICALOP_STRCHR
|
||||
+# define VIR_WARNINGS_NO_WLOGICALOP_STRCHR \
|
||||
+ _Pragma ("GCC diagnostic ignored \"-Wlogical-op\"")
|
||||
+# else
|
||||
+# define VIR_WARNINGS_NO_WLOGICALOP_STRCHR
|
||||
+# endif
|
||||
+
|
||||
+
|
||||
/*
|
||||
* Use this when passing possibly-NULL strings to printf-a-likes.
|
||||
*/
|
||||
diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c
|
||||
index 43cd1a7..d582e7d 100644
|
||||
--- a/src/util/virbuffer.c
|
||||
+++ b/src/util/virbuffer.c
|
||||
@@ -417,14 +417,9 @@ virBufferVasprintf(virBufferPtr buf, const char *format, va_list argptr)
|
||||
buf->use += count;
|
||||
}
|
||||
|
||||
-/* Work around spurious strchr() diagnostics given by -Wlogical-op
|
||||
- * for gcc < 4.6. Doing it via a local pragma keeps the damage
|
||||
- * smaller than disabling it on the package level. Unfortunately, the
|
||||
- * affected GCCs don't allow diagnostic push/pop which would have
|
||||
- * further reduced the impact. */
|
||||
-#if BROKEN_GCC_WLOGICALOP
|
||||
-# pragma GCC diagnostic ignored "-Wlogical-op"
|
||||
-#endif
|
||||
+
|
||||
+VIR_WARNINGS_NO_WLOGICALOP_STRCHR
|
||||
+
|
||||
|
||||
/**
|
||||
* virBufferEscapeString:
|
||||
diff --git a/src/util/virstring.c b/src/util/virstring.c
|
||||
index 7ec42aa..2d7fbf3 100644
|
||||
--- a/src/util/virstring.c
|
||||
+++ b/src/util/virstring.c
|
||||
@@ -989,14 +989,7 @@ virStringHasControlChars(const char *str)
|
||||
}
|
||||
|
||||
|
||||
-/* Work around spurious strchr() diagnostics given by -Wlogical-op
|
||||
- * for gcc < 4.6. Doing it via a local pragma keeps the damage
|
||||
- * smaller than disabling it on the package level. Unfortunately, the
|
||||
- * affected GCCs don't allow diagnostic push/pop which would have
|
||||
- * further reduced the impact. */
|
||||
-#if BROKEN_GCC_WLOGICALOP
|
||||
-# pragma GCC diagnostic ignored "-Wlogical-op"
|
||||
-#endif
|
||||
+VIR_WARNINGS_NO_WLOGICALOP_STRCHR
|
||||
|
||||
|
||||
/**
|
||||
diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c
|
||||
index 05d33a8..e8dbd4d 100644
|
||||
--- a/src/util/virsysinfo.c
|
||||
+++ b/src/util/virsysinfo.c
|
||||
@@ -428,17 +428,8 @@ virSysinfoRead(void)
|
||||
|
||||
|
||||
#elif defined(__s390__) || defined(__s390x__)
|
||||
-/*
|
||||
- we need to ignore warnings about strchr caused by -Wlogical-op
|
||||
- for some GCC versions.
|
||||
- Doing it via a local pragma keeps the damage smaller than
|
||||
- disabling it on the package level.
|
||||
- Unfortunately, the affected GCCs don't allow diagnostic push/pop
|
||||
- which would have further reduced the impact.
|
||||
- */
|
||||
-# if BROKEN_GCC_WLOGICALOP
|
||||
-# pragma GCC diagnostic ignored "-Wlogical-op"
|
||||
-# endif
|
||||
+
|
||||
+VIR_WARNINGS_NO_WLOGICALOP_STRCHR
|
||||
|
||||
static char *
|
||||
virSysinfoParseDelimited(const char *base, const char *name, char **value,
|
||||
@@ -0,0 +1,47 @@
|
||||
From 41d3b457972bde85991fa7ed6f282370aca4b2af Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <41d3b457972bde85991fa7ed6f282370aca4b2af.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
From: Pavel Hrdina <phrdina@redhat.com>
|
||||
Date: Sun, 10 Apr 2016 18:22:20 +0200
|
||||
Subject: [PATCH] build: add GCC 6.0 -Wlogical-op workaround
|
||||
|
||||
fdstream.c: In function 'virFDStreamWrite':
|
||||
fdstream.c:390:29: error: logical 'or' of equal expressions [-Werror=logical-op]
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
^~
|
||||
|
||||
Fedora rawhide now uses gcc 6.0 and there is a bug with -Wlogical-op
|
||||
producing false warnings.
|
||||
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602
|
||||
|
||||
Use GCC pragma push/pop and ignore -Wlogical-op for GCC that supports
|
||||
push/pop pragma and also has this bug.
|
||||
|
||||
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
||||
(cherry picked from commit d713a6b120904c488170e7920c482b2fade70ae1)
|
||||
---
|
||||
m4/virt-compile-warnings.m4 | 20 ++++++++++++++++++++
|
||||
src/fdstream.c | 4 ++++
|
||||
src/internal.h | 12 ++++++++++++
|
||||
src/rpc/virnetsshsession.c | 6 ++++++
|
||||
src/security/security_selinux.c | 2 ++
|
||||
5 files changed, 44 insertions(+)
|
||||
|
||||
diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4
|
||||
index 1b0a2cf..eb689e2 100644
|
||||
--- a/m4/virt-compile-warnings.m4
|
||||
+++ b/m4/virt-compile-warnings.m4
|
||||
@@ -117,6 +117,20 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
|
||||
[lv_cv_gcc_wlogical_op_broken=yes])
|
||||
CFLAGS="$save_CFLAGS"])
|
||||
|
||||
+ AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op],
|
||||
+ [lv_cv_gcc_wlogical_op_equal_expr_broken], [
|
||||
+ save_CFLAGS="$CFLAGS"
|
||||
+ CFLAGS="-O2 -Wlogical-op -Werror"
|
||||
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
+ #define TEST1 1
|
||||
+ #define TEST2 TEST1
|
||||
+ ]], [[
|
||||
+ int test = 0;
|
||||
+ return test == TEST1 || test == TEST2;]])],
|
||||
+ [lv_cv_gcc_wlogical_op_equal_expr_broken=no],
|
||||
+ [lv_cv_gcc_wlogical_op_equal_expr_broken=yes])
|
||||
+ CFLAGS="$save_CFLAGS"])
|
||||
+
|
||||
# We might fundamentally need some of these disabled forever, but
|
||||
# ideally we'd turn many of them on
|
||||
dontwarn="$dontwarn -Wfloat-equal"
|
||||
@@ -239,4 +253,10 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
|
||||
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_STRCHR], 1,
|
||||
[Define to 1 if gcc -Wlogical-op reports false positives on strchr])
|
||||
fi
|
||||
+
|
||||
+ if test "$gl_cv_warn_c__Wlogical_op" = yes &&
|
||||
+ test "$lv_cv_gcc_wlogical_op_equal_expr_broken" = yes; then
|
||||
+ AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_EQUAL_EXPR], 1,
|
||||
+ [Define to 1 if gcc -Wlogical-op reports false positive 'or' equal expr])
|
||||
+ fi
|
||||
])
|
||||
diff --git a/src/fdstream.c b/src/fdstream.c
|
||||
index a85cf9d..ef118b5 100644
|
||||
--- a/src/fdstream.c
|
||||
+++ b/src/fdstream.c
|
||||
@@ -387,7 +387,9 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
|
||||
retry:
|
||||
ret = write(fdst->fd, bytes, nbytes);
|
||||
if (ret < 0) {
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
+ VIR_WARNINGS_RESET
|
||||
ret = -2;
|
||||
} else if (errno == EINTR) {
|
||||
goto retry;
|
||||
@@ -437,7 +439,9 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
|
||||
retry:
|
||||
ret = read(fdst->fd, bytes, nbytes);
|
||||
if (ret < 0) {
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
+ VIR_WARNINGS_RESET
|
||||
ret = -2;
|
||||
} else if (errno == EINTR) {
|
||||
goto retry;
|
||||
diff --git a/src/internal.h b/src/internal.h
|
||||
index 35cc6d4..926e990 100644
|
||||
--- a/src/internal.h
|
||||
+++ b/src/internal.h
|
||||
@@ -245,11 +245,23 @@
|
||||
_Pragma ("GCC diagnostic push")
|
||||
# endif
|
||||
|
||||
+/* Workaround bogus GCC 6.0 for logical 'or' equal expression warnings.
|
||||
+ * (GCC bz 69602) */
|
||||
+# if BROKEN_GCC_WLOGICALOP_EQUAL_EXPR
|
||||
+# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \
|
||||
+ _Pragma ("GCC diagnostic push") \
|
||||
+ _Pragma ("GCC diagnostic ignored \"-Wlogical-op\"")
|
||||
+# else
|
||||
+# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \
|
||||
+ _Pragma ("GCC diagnostic push")
|
||||
+# endif
|
||||
+
|
||||
# define VIR_WARNINGS_RESET \
|
||||
_Pragma ("GCC diagnostic pop")
|
||||
# else
|
||||
# define VIR_WARNINGS_NO_CAST_ALIGN
|
||||
# define VIR_WARNINGS_NO_PRINTF
|
||||
+# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
# define VIR_WARNINGS_RESET
|
||||
# endif
|
||||
|
||||
diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c
|
||||
index 406a831..e742175 100644
|
||||
--- a/src/rpc/virnetsshsession.c
|
||||
+++ b/src/rpc/virnetsshsession.c
|
||||
@@ -545,9 +545,11 @@ virNetSSHAuthenticateAgent(virNetSSHSessionPtr sess,
|
||||
agent_identity)))
|
||||
return 0; /* key accepted */
|
||||
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (ret != LIBSSH2_ERROR_AUTHENTICATION_FAILED &&
|
||||
ret != LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED &&
|
||||
ret != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) {
|
||||
+ VIR_WARNINGS_RESET
|
||||
libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
|
||||
virReportError(VIR_ERR_AUTH_FAILED,
|
||||
_("failed to authenticate using SSH agent: %s"),
|
||||
@@ -605,9 +607,11 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
|
||||
priv->password)) == 0)
|
||||
return 0; /* success */
|
||||
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (priv->password ||
|
||||
ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
|
||||
ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) {
|
||||
+ VIR_WARNINGS_RESET
|
||||
libssh2_session_last_error(sess->session, &errmsg, NULL, 0);
|
||||
virReportError(VIR_ERR_AUTH_FAILED,
|
||||
_("authentication with private key '%s' "
|
||||
@@ -673,11 +677,13 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess,
|
||||
"has failed: %s"),
|
||||
priv->filename, errmsg);
|
||||
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED ||
|
||||
ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED)
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
+ VIR_WARNINGS_RESET
|
||||
}
|
||||
|
||||
return 0;
|
||||
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
|
||||
index 26d95d1..04760a1 100644
|
||||
--- a/src/security/security_selinux.c
|
||||
+++ b/src/security/security_selinux.c
|
||||
@@ -911,8 +911,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon,
|
||||
* hopefully sets one of the necessary SELinux virt_use_{nfs,usb,pci}
|
||||
* boolean tunables to allow it ...
|
||||
*/
|
||||
+ VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR
|
||||
if (setfilecon_errno != EOPNOTSUPP && setfilecon_errno != ENOTSUP &&
|
||||
setfilecon_errno != EROFS) {
|
||||
+ VIR_WARNINGS_RESET
|
||||
virReportSystemError(setfilecon_errno,
|
||||
_("unable to set security context '%s' on '%s'"),
|
||||
tcon, path);
|
||||
@@ -0,0 +1,81 @@
|
||||
From 02a0e78bf54c903da8922c56bade9b3298ade351 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <02a0e78bf54c903da8922c56bade9b3298ade351.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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 <wireshark/ws_version.h>
|
||||
+#else
|
||||
+# include <wireshark/config.h>
|
||||
+# 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 <config.h>
|
||||
|
||||
-#ifdef WITH_WS_VERSION
|
||||
-# include <wireshark/ws_version.h>
|
||||
-#else
|
||||
-# include <wireshark/config.h>
|
||||
-# define WIRESHARK_VERSION_MAJOR VERSION_MAJOR
|
||||
-# define WIRESHARK_VERSION_MINOR VERSION_MINOR
|
||||
-# define WIRESHARK_VERSION_MICRO VERSION_MICRO
|
||||
-#endif
|
||||
-
|
||||
#define HAVE_PLUGINS 1
|
||||
#include <wireshark/epan/proto.h>
|
||||
/* 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
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
From 7374c4ecbd591b02f7be4b2918addc6d5852aafb Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <7374c4ecbd591b02f7be4b2918addc6d5852aafb.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From 1086888f95a322101f8cf53b63c96600ccbeb882 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <1086888f95a322101f8cf53b63c96600ccbeb882.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
From ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <ba2c4bdd5cbccd5c0673149cf76802c98b70d2f7.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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
|
||||
<val, string> 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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
From 002b9f559d69b92e77ab2d234df6966fecdaf0ec Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <002b9f559d69b92e77ab2d234df6966fecdaf0ec.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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 <wireshark/epan/proto.h>
|
||||
#include <wireshark/epan/packet.h>
|
||||
#include <wireshark/epan/dissectors/packet-tcp.h>
|
||||
+#ifdef WITH_WS_EPAN_WMEM
|
||||
+# include <wireshark/epan/wmem/wmem.h>
|
||||
+#elif WITH_WS_WSUTIL_WMEM
|
||||
+# include <wireshark/wsutil/wmem/wmem.h>
|
||||
+#endif
|
||||
#include <rpc/types.h>
|
||||
#include <rpc/xdr.h>
|
||||
#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
|
||||
|
||||
@@ -0,0 +1,493 @@
|
||||
From b42a12174c787b99cd6fcb29b44e4b13bd64ee58 Mon Sep 17 00:00:00 2001
|
||||
Message-ID: <b42a12174c787b99cd6fcb29b44e4b13bd64ee58.1760476767.git.crobinso@redhat.com>
|
||||
In-Reply-To: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
References: <b825bb556bd3967bf5422c243b77bd4038e317e2.1760476767.git.crobinso@redhat.com>
|
||||
From: Michal Privoznik <mprivozn@redhat.com>
|
||||
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 <mprivozn@redhat.com>
|
||||
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
||||
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||
---
|
||||
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__<<DUMMY # Dummy heredoc to disable perl syntax highlighting
|
||||
my ($self, $ident) = @_;
|
||||
return if $self->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
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
# Makefile for source rpm: libvirt
|
||||
# $Id$
|
||||
NAME := libvirt
|
||||
SPECFILE = $(firstword $(wildcard *.spec))
|
||||
|
||||
define find-makefile-common
|
||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(find-makefile-common))
|
||||
|
||||
ifeq ($(MAKEFILE_COMMON),)
|
||||
# attempt a checkout
|
||||
define checkout-makefile-common
|
||||
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
|
||||
endef
|
||||
|
||||
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
|
||||
endif
|
||||
|
||||
include $(MAKEFILE_COMMON)
|
||||
+2180
-2727
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user