On Tue, Feb 21, 2017 at 02:30:10PM +0100, Alberto Garcia wrote:
> On Tue 21 Feb 2017 12:55:05 PM CET, Daniel P. Berrange wrote:
> > + switch (s->crypt_method_header) {
> > + case QCOW_CRYPT_NONE:
> > + break;
> > +
> > + case QCOW_CRYPT_AES:
> > + r->crypto_opts = block_crypto_open_opts_init(
> > + Q_CRYPTO_BLOCK_FORMAT_QCOW, opts, "aes-", errp);
> > + break;
> > +
> > + default:
> > + error_setg(errp, "Unsupported encryption method %d",
> > + s->crypt_method_header);
> > + break;
> > + }
> > + if (s->crypt_method_header && !r->crypto_opts) {
> > + ret = -EINVAL;
> > + goto fail;
> > + }
>
> This last condition relies on the assumption that QCOW_CRYPT_NONE == 0.
>
> I think it's safe to assume that its value is never going to change and
> therefore this isn't too important, but I'm just pointing it out in case
> you want to make it explicit.
Yeah, I'll make it explicit to be kinder to future reviewers :-)
>
> > @@ -1122,6 +1145,24 @@ static int qcow2_open(BlockDriverState *bs, QDict
> > *options, int flags,
> > goto fail;
> > }
> >
> > + if (s->crypt_method_header == QCOW_CRYPT_AES) {
> > + unsigned int cflags = 0;
> > + if (flags & BDRV_O_NO_IO) {
> > + cflags |= QCRYPTO_BLOCK_OPEN_NO_IO;
> > + }
> > + /* TODO how do we pass the same crypto opts down to the
> > + * backing file by default, so we don't have to manually
> > + * provide the same key-secret property against the full
> > + * backing chain
> > + */
> > + s->crypto = qcrypto_block_open(s->crypto_opts, NULL, NULL,
> > + cflags, errp);
> > + if (!s->crypto) {
> > + ret = -EINVAL;
> > + goto fail;
> > + }
> > + }
>
> Actually this has the same problem that I mentioned for patch 9: if
> qcow2_open() fails then s->crypto is leaked.
Yep, and the crypto_opts actually
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|