From: Brian Candler Date: Sat, 9 Feb 2013 10:20:10 +0000 (+0000) Subject: rlm_redis argument splitting X-Git-Tag: release_2_2_1~141^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1118c23ca7e8cd281a67443d0d779d6295739548;p=thirdparty%2Ffreeradius-server.git rlm_redis argument splitting rlm_redis_query now splits the query into separate arguments and expands each one individually. This allows for both string literals and expansions to contain spaces, e.g. %{redis:LPUSH 'my key' %{User-Name}} --- diff --git a/src/modules/rlm_redis/rlm_redis.c b/src/modules/rlm_redis/rlm_redis.c index bddb5eab3a8..a2e376efb86 100644 --- a/src/modules/rlm_redis/rlm_redis.c +++ b/src/modules/rlm_redis/rlm_redis.c @@ -229,15 +229,6 @@ static int redis_xlat(void *instance, REQUEST *request, size_t ret = 0; char *buffer_ptr; char buffer[21]; - char querystr[MAX_QUERY_LEN]; - - if (!radius_xlat(querystr, sizeof(querystr), fmt, request, - redis_escape_func)) { - radlog(L_ERR, "rlm_redis (%s): xlat failed.", - inst->xlat_name); - - return 0; - } if ((dissocket = redis_get_socket(inst)) == NULL) { radlog(L_ERR, "rlm_redis (%s): redis_get_socket() failed", @@ -247,7 +238,7 @@ static int redis_xlat(void *instance, REQUEST *request, } /* Query failed for some reason, release socket and return */ - if (rlm_redis_query(dissocket, inst, querystr) < 0) { + if (rlm_redis_query(dissocket, inst, fmt, request) < 0) { rlm_redis_finish_query(dissocket); redis_release_socket(inst,dissocket); @@ -371,16 +362,26 @@ static int redis_init_socketpool(REDIS_INST *inst) } /* - * Free the redis database + * Peform a redis query. Split into args and pass each one through xlat. */ -int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query) +int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query, + REQUEST *request) { + int argc; + const char *argv[MAX_REDIS_ARGS]; + char argv_buf[MAX_QUERY_LEN]; + if (!query || !*query) { return -1; } - DEBUG2("executing query %s", query); - dissocket->reply = redisCommand(dissocket->conn, query); + argc = rad_expand_xlat(request, query, MAX_REDIS_ARGS, argv, 0, + sizeof(argv_buf), argv_buf); + if (argc <= 0) + return -1; + + DEBUG2("executing %s ...", argv[0]); + dissocket->reply = redisCommandArgv(dissocket->conn, argc, argv, NULL); if (dissocket->reply == NULL) { radlog(L_ERR, "rlm_redis: (%s) REDIS error: %s", diff --git a/src/modules/rlm_redis/rlm_redis.h b/src/modules/rlm_redis/rlm_redis.h index c50158627dd..732559f32eb 100644 --- a/src/modules/rlm_redis/rlm_redis.h +++ b/src/modules/rlm_redis/rlm_redis.h @@ -71,15 +71,18 @@ typedef struct rlm_redis_t { REDISSOCK *(*redis_get_socket)(REDIS_INST * inst); int (*redis_release_socket)(REDIS_INST * inst, REDISSOCK *dissocket); - int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst, char *query); + int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst, + const char *query, REQUEST *request); int (*redis_finish_query)(REDISSOCK *dissocket); size_t (*redis_escape_func)(char *out, size_t outlen, const char *in); } rlm_redis_t; #define MAX_QUERY_LEN 4096 +#define MAX_REDIS_ARGS 16 -int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query); +int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query, + REQUEST *request); int rlm_redis_finish_query(REDISSOCK *dissocket); REDISSOCK * redis_get_socket(REDIS_INST * inst); diff --git a/src/modules/rlm_rediswho/rlm_rediswho.c b/src/modules/rlm_rediswho/rlm_rediswho.c index aca9df40272..9aea3121d4a 100644 --- a/src/modules/rlm_rediswho/rlm_rediswho.c +++ b/src/modules/rlm_rediswho/rlm_rediswho.c @@ -100,26 +100,12 @@ static CONF_PARSER module_config[] = { static int rediswho_command(const char *fmt, REDISSOCK *dissocket, rlm_rediswho_t *data, REQUEST *request) { - char query[MAX_STRING_LEN * 4]; int result = 0; - /* - * Do an xlat on the provided string - */ - if (request) { - if (!radius_xlat(query, sizeof (query), fmt, request, - data->redis_inst->redis_escape_func)) { - radlog(L_ERR, "rediswho_command: xlat failed on: '%s'", query); - return -1; - } - - } else { - strcpy(query, fmt); - } - - if (data->redis_inst->redis_query(dissocket, data->redis_inst, query) < 0) { + if (data->redis_inst->redis_query(dissocket, data->redis_inst, + fmt, request) < 0) { - radlog(L_ERR, "rediswho_command: database query error in: '%s'", query); + radlog(L_ERR, "rediswho_command: database query error in: '%s'", fmt); return -1; }