On Thu, Oct 13, 2016 at 07:34:06PM +0200, Paolo Bonzini wrote:
> +static void backup_drain(BlockJob *job)
> +{
> + BackupBlockJob *s = container_of(job, BackupBlockJob, common);
> +
> + /* Need to keep a reference in case blk_drain triggers execution
> + * of backup_complete...
> + */
> + if (s->target) {
> + blk_ref(s->target);
> + blk_drain(s->target);
> + blk_unref(s->target);
> + }
[...]
> @@ -331,6 +346,7 @@ static void backup_complete(BlockJob *job, void *opaque)
> BackupCompleteData *data = opaque;
>
> blk_unref(s->target);
> + s->target = NULL;Will blk_unref(s->target) segfault since backup_complete() has set it to NULL? I expected backup_drain() to stash the pointer in a local variable to avoid using s->target.
signature.asc
Description: PGP signature
