j'ai un utilitaire qui dumpe une base de donnée redis
mon framework web utilise lui aussi redis et sauve le cache des pages dedans, une des première version sauvais en cache toutes les pages, même les 404
un cron sauve toute les nuit un dump de mes bases, et je viens de me rendre compte que ca ne dumpe plus depuis qq temps
je teste manuellement et la horreur, segfault

après masse de debug, je me rend compte que des nom de clef chelou sont dans redis, un type avais du tester de hacker et ses tests sont restés dans le cache de la vieille version
une des clef depuis redis-cli :
redis 127.0.0.1:6379> keys "*?clone"
1) "fastIce:designCache:en:/../../../../../../../../../../../../../../../../../../../../../../../..//tmp/kulo\x0000?clone"
la même dans mon utilitaire de dump :
[mk@hightland rdd]$ rdd "*?clone"
fastIce:designCache:en:/../../../../../../../../../../../../../../../../../../../../../../../..//tmp/kulo Erreur de segmentation (core dumped)
cette ligne la fait le crash dans mon utilitaire
redisAppendCommand(rd,redisGetCmd[ktype[n]],keys->element[n]->str); // get data
pour faire simple mon util récupère une liste de clef matchant la requête, pour chaque clef ensuite il récupère le type de clef, puis ensuite les data
la clef récupéré ne contient pas le \x0000 ou alors ce que j’utilise ne marche pas avec, printf(" name %s\n",keys->element[n]->str); ne m'affiche pas le \x0000
et keys->element[n]->str est créé et remplis par le client C officiel
quant je demande le type de clef, j'envois un nom inexistant car sans le \x0000, ça me répond donc 255 (unknow)
et 255 est un peu trop pour
const char * const redisGetCmd[ 5] = { "GET %s", "LRANGE %s 0 -1", "SMEMBERS %s", "ZRANGE %s 0 -1 WITHSCORES", "HGETALL %s" };qui provoque le crash
bref, à votre avis est ce un soucis de redis lui même, de son client C, ou de mon code ?
une idée de chose à faire pour y remédier ?
à noter que dans le binaire du client officiel,
redis 127.0.0.1:6379> hgetall "fastIce:designCache:en:/../../../../../../../../../../../../../../../../../../../../../../../..//tmp/kulo\x0000?clone"fonctionne
et sans les quotes
redis 127.0.0.1:6379> hgetall fastIce:designCache:en:/../../../../../../../../../../../../../../../../../../../../../../../..//tmp/kulo\x0000?clone (empty list or set)ca ne marche pas
je devrais plutôt poster ca sur la mailling list de redis je pense ^^