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 */
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;
*/
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;
{
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) {