]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix const stupidity in exec function and rad_expand_xlat
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 14 May 2015 23:36:52 +0000 (19:36 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 15 May 2015 03:32:12 +0000 (23:32 -0400)
src/include/radiusd.h
src/main/exec.c
src/main/util.c
src/modules/rlm_redis/rlm_redis.c

index 373a58431ee5e628873a9252ca605e423f8993ca..b7d13ac9c4e05bf17104610c25f8b5c27cc946a7 100644 (file)
@@ -408,7 +408,7 @@ int         rad_copy_string_bare(char *dst, char const *src);
 int            rad_copy_variable(char *dst, char const *from);
 uint32_t       rad_pps(uint32_t *past, uint32_t *present, time_t *then, struct timeval *now);
 int            rad_expand_xlat(REQUEST *request, char const *cmd,
-                               int max_argc, char *argv[], bool can_fail,
+                               int max_argc, char const *argv[], bool can_fail,
                                size_t argv_buflen, char *argv_buf);
 
 void           verify_request(char const *file, int line, REQUEST *request);   /* only for special debug builds */
index 9ccb33f547701c2abac9972c6d381fb6147f20fe..e90f5e0c1ea482a3fdff6a0421d43ef6b4eaf3a8 100644 (file)
@@ -93,15 +93,23 @@ pid_t radius_start_program(char const *cmd, REQUEST *request, bool exec_wait,
        int from_child[2] = {-1, -1};
        pid_t pid;
 #endif
-       int argc;
-       int i;
-       char *argv[MAX_ARGV];
-       char argv_buf[4096];
+       int             argc;
+       int             i;
+       char const      **argv_p;
+       char            *argv[MAX_ARGV], **argv_start = argv;
+       char            argv_buf[4096];
 #define MAX_ENVP 1024
        char *envp[MAX_ENVP];
        int envlen = 0;
 
-       argc = rad_expand_xlat(request, cmd, MAX_ARGV, argv, true, sizeof(argv_buf), argv_buf);
+       /*
+        *      Stupid array decomposition...
+        *
+        *      If we do memcpy(&argv_p, &argv, sizeof(argv_p)) src ends up being a char **
+        *      pointing to the value of the first element.
+        */
+       memcpy(&argv_p, &argv_start, sizeof(argv_p));
+       argc = rad_expand_xlat(request, cmd, MAX_ARGV, argv_p, true, sizeof(argv_buf), argv_buf);
        if (argc <= 0) {
                DEBUG("invalid command line '%s'.", cmd);
                return -1;
index 905d1402a6b9a53f54666b4e8beb0a31f37d3e2b..0b9a4889ef7692c593deec7a5a05115de70ad501 100644 (file)
@@ -904,7 +904,7 @@ uint32_t rad_pps(uint32_t *past, uint32_t *present, time_t *then, struct timeval
  */
 
 int rad_expand_xlat(REQUEST *request, char const *cmd,
-                   int max_argc, char *argv[], bool can_fail,
+                   int max_argc, char const *argv[], bool can_fail,
                    size_t argv_buflen, char *argv_buf)
 {
        char const *from;
index 2f26880f48e12c233729667bd0d8ff3348f69012..164c99a4752a1667480d0bdf535e6065f6a4dab2 100644 (file)
@@ -201,7 +201,7 @@ int rlm_redis_query(REDISSOCK **dissocket_p, REDIS_INST *inst,
 {
        REDISSOCK *dissocket;
        int argc;
-       char *argv[MAX_REDIS_ARGS];
+       char const *argv[MAX_REDIS_ARGS];
        char argv_buf[MAX_QUERY_LEN];
 
        if (!query || !*query || !inst || !dissocket_p) {