opts: don't silently truncate long parameter keys
commite652714f98f22e8882e88e3d563b025c5b00feec
authorDaniel P. Berrangé <berrange@redhat.com>
Mon, 16 Apr 2018 11:17:42 +0000 (16 12:17 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 8 May 2018 22:13:39 +0000 (9 00:13 +0200)
tree390b2f4efaff251dcd68d7077a53fe10bf3c7148
parent20efc49ed625585809401d8293ad9267927a6a4a
opts: don't silently truncate long parameter keys

The existing QemuOpts parsing code uses a fixed size 128 byte buffer
for storing the parameter keys. If a key exceeded this size it was
silently truncate and no error reported to the user. This behaviour was
reasonable & harmless because traditionally the key names are all
statically declared, and it was known that no code was declaring a key
longer than 127 bytes. This assumption, however, ceased to be valid once
the block layer added support for dot-separate compound keys. This
syntax allows for keys that can be arbitrarily long, limited only by the
number of block drivers you can stack up. With this usage, silently
truncating the key name can never lead to correct behaviour.

Hopefully such truncation would turn into an error, when the block code
then tried to extract options later, but there's no guarantee that will
happen. It is conceivable that an option specified by the user may be
truncated and then ignored. This could have serious consequences,
possibly even leading to security problems if the ignored option set a
security relevant parameter.

If the operating system didn't limit the user's argv when spawning QEMU,
the code should honour whatever length arguments were given without
imposing its own length restrictions. This patch thus changes the code
to use a heap allocated buffer for storing the keys during parsing,
lifting the arbitrary length restriction.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20180416111743.8473-3-berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
tests/test-qemu-opts.c
util/qemu-option.c