diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-02-25 11:13:55 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-03-04 12:50:57 -0500 |
commit | 3b373b75414071d166e0d0cdc764dce479f68780 (patch) | |
tree | 8ffe883f61cb88cb2eab70793cf996a8e1fa3e52 | |
parent | 16cf8ab2e581330a659418151f1151d7ee6df0d5 (diff) |
GApplications: Tighten up application-id validity checks
Also add tests for these conditions.
https://bugzilla.gnome.org/show_bug.cgi?id=643197
-rw-r--r-- | gio/gapplication.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/gio/gapplication.c b/gio/gapplication.c index 263b71ad6..44f1cdb51 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -647,9 +647,9 @@ get_platform_data (GApplication *application) * For convenience, the restrictions on application identifiers are * reproduced here: * <itemizedlist> - * <listitem>Application identifiers must contain only the ASCII characters "[A-Z][a-z][0-9]_-" and must not begin with a digit.</listitem> - * <listitem>Application identifiers must contain at least one '.' (period) character (and thus at least two elements).</listitem> - * <listitem>Application identifiers must not begin with a '.' (period) character.</listitem> + * <listitem>Application identifiers must contain only the ASCII characters "[A-Z][a-z][0-9]_-." and must not begin with a digit.</listitem> + * <listitem>Application identifiers must contain at least one '.' (period) character (and thus at least three elements).</listitem> + * <listitem>Application identifiers must not begin or end with a '.' (period) character.</listitem> * <listitem>Application identifiers must not contain consecutive '.' (period) characters.</listitem> * <listitem>Application identifiers must not exceed 255 characters.</listitem> * </itemizedlist> @@ -657,28 +657,44 @@ get_platform_data (GApplication *application) gboolean g_application_id_is_valid (const gchar *application_id) { + gsize len; gboolean allow_dot; + gboolean has_dot; - if (strlen (application_id) > 255) + len = strlen (application_id); + + if (len > 255) + return FALSE; + + if (!g_ascii_isalpha (application_id[0])) return FALSE; - if (!g_ascii_isalpha (*application_id)) + if (application_id[len-1] == '.') return FALSE; application_id++; - allow_dot = FALSE; + allow_dot = TRUE; + has_dot = FALSE; for (; *application_id; application_id++) { if (g_ascii_isalnum (*application_id) || (*application_id == '-') || (*application_id == '_')) - allow_dot = TRUE; + { + allow_dot = TRUE; + } else if (allow_dot && *application_id == '.') - allow_dot = FALSE; + { + has_dot = TRUE; + allow_dot = FALSE; + } else return FALSE; } + if (!has_dot) + return FALSE; + return TRUE; } |