From: Arran Cudbard-Bell Date: Thu, 14 May 2015 23:36:52 +0000 (-0400) Subject: Fix const stupidity in exec function and rad_expand_xlat X-Git-Tag: release_3_0_9~359 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a43cef0f479b59ced2e33c449a4ed17e6d75b22;p=thirdparty%2Ffreeradius-server.git Fix const stupidity in exec function and rad_expand_xlat --- diff --git a/src/include/radiusd.h b/src/include/radiusd.h index 373a58431ee..b7d13ac9c4e 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -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 */ diff --git a/src/main/exec.c b/src/main/exec.c index 9ccb33f5477..e90f5e0c1ea 100644 --- a/src/main/exec.c +++ b/src/main/exec.c @@ -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; diff --git a/src/main/util.c b/src/main/util.c index 905d1402a6b..0b9a4889ef7 100644 --- a/src/main/util.c +++ b/src/main/util.c @@ -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; diff --git a/src/modules/rlm_redis/rlm_redis.c b/src/modules/rlm_redis/rlm_redis.c index 2f26880f48e..164c99a4752 100644 --- a/src/modules/rlm_redis/rlm_redis.c +++ b/src/modules/rlm_redis/rlm_redis.c @@ -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) {