Commits 51082301, 16d7b39, and 521cc447 introduced support for
'virsh snapshot-list --from' when talking to a server older than
0.9.5, but broke support for plain 'virsh snapshot-list' for the
same old server in the process. Because the code is not properly
gated, we end up with a SIGSEGV during a strcmp with a NULL argument.
* tools/virsh.c (cmdSnapshotList): Don't waste time on fallbacks
when --from is not present.
---
Caveat: I tested by manually setting ctl->useSnapshotOld=true in
virsh.c, rather than actually loading an older libvirtd, but I'm
confident that the results would be the same.
tools/virsh.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index abcfbff..0453b95 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -16740,10 +16740,10 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
qsort(&names[0], actual, sizeof(char*), namesorter);
- if (tree || ctl->useSnapshotOld) {
+ if (tree || (from && ctl->useSnapshotOld)) {
parents = vshCalloc(ctl, sizeof(char *), actual);
for (i = (from && !ctl->useSnapshotOld); i < actual; i++) {
- if (ctl->useSnapshotOld && STREQ(names[i], from)) {
+ if (from && ctl->useSnapshotOld && STREQ(names[i], from))
{
start_index = i;
continue;
}
@@ -16765,7 +16765,8 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
char indentBuf[INDENT_BUFLEN];
for (i = 0 ; i < actual ; i++) {
memset(indentBuf, '\0', sizeof(indentBuf));
- if (ctl->useSnapshotOld ? STREQ(names[i], from) : !parents[i])
+ if ((from && ctl->useSnapshotOld) ? STREQ(names[i], from) :
+ !parents[i])
cmdNodeListDevicesPrint(ctl,
names,
parents,
@@ -16834,7 +16835,7 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
}
for (i = 0; i < actual; i++) {
- if (ctl->useSnapshotOld &&
+ if (from && ctl->useSnapshotOld &&
(descendants ? !names[i] : STRNEQ_NULLABLE(parents[i], from)))
continue;
--
1.7.10.2