aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qom/object.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/qom/object.c b/qom/object.c
index 95c0dc8285..654e1afaf2 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -138,9 +138,50 @@ static TypeImpl *type_new(const TypeInfo *info)
return ti;
}
+static bool type_name_is_valid(const char *name)
+{
+ const int slen = strlen(name);
+ int plen;
+
+ g_assert(slen > 1);
+
+ /*
+ * Ideally, the name should start with a letter - however, we've got
+ * too many names starting with a digit already, so allow digits here,
+ * too (except '0' which is not used yet)
+ */
+ if (!g_ascii_isalnum(name[0]) || name[0] == '0') {
+ return false;
+ }
+
+ plen = strspn(name, "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789-_.");
+
+ /* Allow some legacy names with '+' in it for compatibility reasons */
+ if (name[plen] == '+') {
+ if (plen == 6 && g_str_has_prefix(name, "power")) {
+ /* Allow "power5+" and "power7+" CPU names*/
+ return true;
+ }
+ if (plen >= 17 && g_str_has_prefix(name, "Sun-UltraSparc-I")) {
+ /* Allow "Sun-UltraSparc-IV+" and "Sun-UltraSparc-IIIi+" */
+ return true;
+ }
+ }
+
+ return plen == slen;
+}
+
static TypeImpl *type_register_internal(const TypeInfo *info)
{
TypeImpl *ti;
+
+ if (!type_name_is_valid(info->name)) {
+ fprintf(stderr, "Registering '%s' with illegal type name\n", info->name);
+ abort();
+ }
+
ti = type_new(info);
type_table_add(ti);