Print this page
12585 insufficient validation in svccfg for service name
@@ -21,11 +21,11 @@
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
- * Copyright 2019 Joyent, Inc.
+ * Copyright 2020 Joyent, Inc.
*/
/*
* XML document manipulation routines
@@ -3402,10 +3402,32 @@
return (rc);
}
/*
+ * Validate the svc:/-prefixed FMRI generated from the service name.
+ */
+static void
+validate_service_name(const entity_t *s)
+{
+ char *fmri;
+ int ftype;
+ const char *finst;
+
+ if ((fmri = uu_strdup(s->sc_fmri)) == NULL)
+ uu_die(gettext("couldn't allocate memory"));
+
+ if (scf_parse_fmri(fmri, &ftype, NULL, NULL, &finst, NULL, NULL) != 0 ||
+ finst != NULL || ftype != SCF_FMRI_TYPE_SVC) {
+ uu_die(gettext("invalid value \"%s\": should be a bare "
+ "service name\n"), s->sc_name);
+ }
+
+ uu_free(fmri);
+}
+
+/*
* Translate a service element into an internal instance/property tree, added
* to bundle.
*
* If op is SVCCFG_OP_APPLY (i.e., apply a profile), do not allow for
* modification of template data.
@@ -3425,10 +3447,12 @@
* Fetch attributes, as appropriate.
*/
s = internal_service_new((char *)xmlGetProp(svc,
(xmlChar *)name_attr));
+ validate_service_name(s);
+
version = xmlGetProp(svc, (xmlChar *)version_attr);
s->sc_u.sc_service.sc_service_version = atol((const char *)version);
xmlFree(version);
type = xmlGetProp(svc, (xmlChar *)type_attr);