[libvirt] [PATCH] snapshot: avoid virsh crash with older servers

Osier Yang jyang at redhat.com
Mon Jun 11 03:58:02 UTC 2012


On 2012年06月09日 01:56, Eric Blake wrote:
> 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;
>

ACK.

Osier




More information about the libvir-list mailing list