Allow numbers in random expansions
authorAlan T. DeKok <aland@freeradius.org>
Sun, 15 Feb 2015 17:10:54 +0000 (12:10 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 15 Feb 2015 17:10:54 +0000 (12:10 -0500)
src/modules/rlm_expr/rlm_expr.c

index 605bd11..21c4698 100644 (file)
@@ -549,6 +549,7 @@ static ssize_t randstr_xlat(UNUSED void *instance, UNUSED REQUEST *request,
 {
        char const      *p;
        unsigned int    result;
+       unsigned int    number;
        size_t          freespace = outlen;
 
        if (outlen <= 1) return 0;
@@ -557,7 +558,28 @@ static ssize_t randstr_xlat(UNUSED void *instance, UNUSED REQUEST *request,
 
        p = fmt;
        while (*p && (--freespace > 0)) {
+               number = 0;
+
+               /*
+                *      Modifiers are polite.
+                *
+                *      But we limit it to 100, because we don't want
+                *      utter stupidity.
+                */
+               while (isdigit((int) *p)) {
+                       if (number >= 100) {
+                               *(p++);
+                               continue;
+                       }
+
+                       number *= 10;
+                       number += *p - '0';
+                       p++;
+               }
+
+       redo:
                result = fr_rand();
+
                switch (*p) {
                /*
                 *  Lowercase letters
@@ -653,6 +675,11 @@ static ssize_t randstr_xlat(UNUSED void *instance, UNUSED REQUEST *request,
                        return -1;
                }
 
+               if (number > 0) {
+                       number--;
+                       goto redo;
+               }
+
                p++;
        }