]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
push all leaf attributes to env pairs
authorAlan T. DeKok <aland@freeradius.org>
Tue, 26 Dec 2023 15:55:48 +0000 (10:55 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 26 Dec 2023 15:55:48 +0000 (10:55 -0500)
src/lib/server/exec.c

index 8ff04bd02092e9345d20bf43c13a60f639421515..af1a73ce0b93973a422bd2ff1f1fefefd3a76a6e 100644 (file)
@@ -130,20 +130,21 @@ int exec_pair_to_env(char **env_p, size_t env_len,
        size_t                  i, j;
        fr_dcursor_t            cursor;
        fr_dict_attr_t const    *da;
-       fr_pair_t               *vp;
        fr_sbuff_t              sbuff = FR_SBUFF_BIND_CURRENT(env_sbuff);
 
+       if (!env_pairs) {
+               env_p[0] = NULL;
+               return 0;
+       }
+
        /*
         *      Set up the environment variables in the
         *      parent, so we don't call libc functions that
         *      hold mutexes.  They might be locked when we fork,
         *      and will remain locked in the child.
         */
-       for (vp = fr_pair_list_head(env_pairs), i = 0;
-            vp && (i < env_len - 1);
-            vp = fr_pair_list_next(env_pairs, vp), i++) {
-               if (!fr_type_is_leaf(vp->vp_type)) continue;
-
+       i = 0;
+       fr_pair_list_foreach_leaf(env_pairs, vp) {
                fr_sbuff_marker(&env_m[i], &sbuff);
 
                if (fr_sbuff_in_strcpy(&sbuff, vp->da->name) <= 0) {
@@ -162,7 +163,7 @@ int exec_pair_to_env(char **env_p, size_t env_len,
                for (; p < fr_sbuff_current(&sbuff); p++) {
                        if (isalpha((uint8_t)*p)) *p = toupper((uint8_t) *p);
                        else if (*p == '-') *p = '_';
-                       else if (isdigit((uint8_t)*p)) continue;
+                       else if (isdigit((uint8_t)*p)) goto next;
                        else *p = '_';
                }
 
@@ -204,6 +205,10 @@ int exec_pair_to_env(char **env_p, size_t env_len,
                        fr_strerror_printf("Out of buffer space");
                        return -1;
                }
+
+       next:
+               i++;
+               if (i == (env_len - 1)) break;
        }
 
        /*
@@ -217,8 +222,10 @@ int exec_pair_to_env(char **env_p, size_t env_len,
 
        da = fr_dict_attr_child_by_num(fr_dict_root(fr_dict_internal()), FR_EXEC_EXPORT);
        if (da) {
+               fr_pair_t *vp;
+
                for (vp = fr_pair_dcursor_by_da_init(&cursor, &request->control_pairs, da);
-                    vp && (i < (env_len - 1));
+                    vp;
                     vp = fr_dcursor_next(&cursor)) {
                        env_p[i++] = UNCONST(char *, vp->vp_strvalue);
                }