On Thu, Sep 07, 2023 at 11:02:42 +0200, Michal Privoznik wrote: > If a domain has no snapshots and 'virsh snapshot-list' is called, > this gets all the way down to virshSnapshotListCollect() which > then collects all snapshots (none), and passes them to qsort() > which doesn't like being called with NULL: > > extern void qsort (void *__base, size_t __nmemb, size_t __size, > __compar_fn_t __compar) __nonnull ((1, 4)); > > Resolves: https://gitlab.com/libvirt/libvirt/-/issues/533 > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > tools/virsh-snapshot.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/tools/virsh-snapshot.c b/tools/virsh-snapshot.c > index d7889a38e4..ecb935b2b4 100644 > --- a/tools/virsh-snapshot.c > +++ b/tools/virsh-snapshot.c > @@ -1310,9 +1310,11 @@ virshSnapshotListCollect(vshControl *ctl, virDomainPtr dom, > } > } > } > - if (!(orig_flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL)) > + if (!(orig_flags & VIR_DOMAIN_SNAPSHOT_LIST_TOPOLOGICAL) && > + snaplist->snaps) { In most other places in virsh we do the check as 'snaplist->snaps && snaplist->nsnaps'. > qsort(snaplist->snaps, snaplist->nsnaps, sizeof(*snaplist->snaps), > virshSnapSorter); > + } > snaplist->nsnaps -= deleted; > > ret = g_steal_pointer(&snaplist); Regardless of the above comment: Reviewed-by: Peter Krempa <pkrempa@xxxxxxxxxx>