[PATCH 08/12] virSecurityLabelDefParseXML: Don't use 'virXPathStringLimit'
Peter Krempa
pkrempa at redhat.com
Tue Nov 23 09:41:42 UTC 2021
On Mon, Nov 22, 2021 at 21:01:58 +0100, Tim Wiederhake wrote:
> On Mon, 2021-11-22 at 18:12 +0100, Peter Krempa wrote:
> > virXPathStringLimit doesn't give callers a way to differentiate
> > between
> > the queried XPath being empty and the length limit being exceeded.
> >
> > This means that callers are either overwriting the error message or
> > ignoring it altogether.
> >
> > Move the length checks into the caller.
> >
> > Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> > ---
> > src/conf/domain_conf.c | 22 ++++++++++++++--------
> > 1 file changed, 14 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index ee44bbbd4b..bd9da0744d 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -7871,9 +7871,9 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr
> > ctxt,
> > if (seclabel->type == VIR_DOMAIN_SECLABEL_STATIC ||
> > (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
> > seclabel->type != VIR_DOMAIN_SECLABEL_NONE)) {
> > - seclabel->label = virXPathStringLimit("string(./label[1])",
> > -
> > VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
> > - if (!seclabel->label) {
> > + seclabel->label = virXPathString("string(./label[1])",
> > ctxt);
> > + if (!seclabel->label ||
> > + strlen(seclabel->label) >= VIR_SECURITY_LABEL_BUFLEN -
> > 1) {
>
> What is your opinion on using strnlen instead? Not necessarily for
> security reasons, but since we do not care for the exact string length
> if it is above a certain size, we can return early.
Yeah, selling it as security is impossible because we already have at
least two copies of the XML in memory.
As a optimization sure, but let's see whether it doesn't make the code
too bulky as the lenght constant appears twice in the expression.
>
> > virReportError(VIR_ERR_XML_ERROR,
> > "%s", _("security label is missing"));
> > return NULL;
> > @@ -7884,9 +7884,10 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr
> > ctxt,
> > if (seclabel->relabel &&
> > (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
> > seclabel->type != VIR_DOMAIN_SECLABEL_NONE)) {
> > - seclabel->imagelabel =
> > virXPathStringLimit("string(./imagelabel[1])",
> > -
> > VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
> > - if (!seclabel->imagelabel) {
> > + seclabel->imagelabel =
> > virXPathString("string(./imagelabel[1])", ctxt);
> > +
> > + if (!seclabel->imagelabel ||
> > + strlen(seclabel->imagelabel) >=
> > VIR_SECURITY_LABEL_BUFLEN - 1) {
> > virReportError(VIR_ERR_XML_ERROR,
> > "%s", _("security imagelabel is
> > missing"));
> > return NULL;
> > @@ -7895,8 +7896,13 @@ virSecurityLabelDefParseXML(xmlXPathContextPtr
> > ctxt,
> >
> > /* Only parse baselabel for dynamic label type */
> > if (seclabel->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
> > - seclabel->baselabel =
> > virXPathStringLimit("string(./baselabel[1])",
> > -
> > VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
> > + seclabel->baselabel =
> > virXPathString("string(./baselabel[1])", ctxt);
> > +
> > + if (seclabel->baselabel &&
> > + strlen(seclabel->baselabel) >= VIR_SECURITY_LABEL_BUFLEN
> > - 1) {
> > + g_free(seclabel->baselabel);
> > + seclabel->baselabel = NULL;
> > + }
>
> g_clear_pointer?
Yeah, I've actually used it in later patch.
More information about the libvir-list
mailing list