]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Exit earlier in xlat_tokenize_alternation if the alternate is empty
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 3 Mar 2019 09:15:35 +0000 (17:15 +0800)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 3 Mar 2019 09:15:35 +0000 (17:15 +0800)
src/lib/server/xlat_tokenize.c

index 82de53dcce58d0d7f7d75e6f613aa508033bc3ce..0a143ea2bafb14107c04408975eb52cf89bd2ca4 100644 (file)
@@ -155,29 +155,31 @@ static ssize_t xlat_tokenize_alternation(TALLOC_CTX *ctx, xlat_exp_t **head, cha
         *      Allow the RHS to be empty as a special case.
         */
        if (*p == '}') {
-               /*
-                *      Hack up an empty string.
-                */
                node->alternate = xlat_exp_alloc(node, XLAT_LITERAL, "", 0);
-               p++;
-       } else {
-               slen = xlat_tokenize_literal(node, &node->alternate, p, true, rules);
-               if (slen <= 0) {
-                       talloc_free(node);
-                       return slen - (p - fmt);
-               }
+               node->async_safe = node->child->async_safe;
+               *head = node;
+               return (p + 1) - fmt;
+       }
 
-               if (!node->alternate) {
-                       talloc_free(node);
-                       fr_strerror_printf("Empty expansion is invalid");
-                       return -(p - fmt);
-               }
-               p += slen;
+       /*
+        *      Parse the alternate expansion.
+        */
+       slen = xlat_tokenize_literal(node, &node->alternate, p, true, rules);
+       if (slen <= 0) {
+               talloc_free(node);
+               return slen - (p - fmt);
        }
 
-       node->async_safe = (node->child->async_safe && node->alternate->async_safe);
+       if (!node->alternate) {
+               talloc_free(node);
+               fr_strerror_printf("Empty expansion is invalid");
+               return -(p - fmt);
+       }
+       p += slen;
 
+       node->async_safe = (node->child->async_safe && node->alternate->async_safe);
        *head = node;
+
        return p - fmt;
 }