]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-oauth2: Improve identifier escaping function
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 14 Apr 2021 11:12:16 +0000 (14:12 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 16 Apr 2021 07:21:25 +0000 (10:21 +0300)
src/lib-oauth2/oauth2-jwt.c

index 94810766f13faaeeb9f080df8e8e68014e62fa96..2d4627381437748e73220b7e3c78e4c43baa217d 100644 (file)
@@ -49,32 +49,31 @@ get_time_field(const struct json_tree *tree, const char *key, long *value_r)
 static const char *escape_identifier(const char *identifier)
 {
        size_t pos = strcspn(identifier, "./%");
-       if (pos < strlen(identifier)) {
-               /* sanitize identifier, cannot allow dots or / in it, so we
-                 encode them */
-               string_t *new_id = t_str_new(strlen(identifier));
-               /* put initial data */
-               str_append_data(new_id, identifier, pos);
-
-               for (const char *c = identifier+pos; *c != '\0'; c++) {
-                       switch (*c) {
-                       case '.':
-                               str_append(new_id, "%2e");
-                               break;
-                       case '/':
-                               str_append(new_id, "%2f");
-                               break;
-                       case '%':
-                               str_append(new_id, "%25");
-                               break;
-                       default:
-                               str_append_c(new_id, *c);
-                               break;
-                       }
-               }
-               return str_c(new_id);
+       /* nothing to escape */
+       if (identifier[pos] == '\0')
+               return identifier;
+
+       size_t len = strlen(identifier);
+       string_t *new_id = t_str_new(len);
+       str_append_data(new_id, identifier, pos);
+
+       for (size_t i = pos; i < len; i++) {
+               switch (identifier[i]) {
+               case '.':
+                       str_append(new_id, "%2e");
+                       break;
+               case '/':
+                       str_append(new_id, "%2f");
+                       break;
+               case '%':
+                       str_append(new_id, "%25");
+                       break;
+               default:
+                       str_append_c(new_id, identifier[i]);
+                       break;
+               }
        }
-       return identifier;
+       return str_c(new_id);
 }
 
 static int