Hiredis SET сталкивается с ошибкой сегментации - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь SET структурировать Redis с помощью hiredis:

struct StatLite
{
    uid_t uid;
    gid_t gid;
    mode_t mode;
}

bool RedisPermissionHandler::Set(std::string path, StatLite stat)
{
    redisReply *reply = (redisReply*)redisCommand(this->redis,
        "SET %b %b",
        path.c_str(), (size_t)path.length(),
        stat, (size_t)sizeof(stat));
    freeReplyObject(reply);
    return true;
}

Однако это приводит к ошибке сегментации где-то внутри hiredis.

this->redis, path и stat имеют правильные значения. GET Команды работают и доставляют тип ответа NIL (поскольку Redis пуст).

Что я делаю не так?

1 Ответ

2 голосов
/ 04 ноября 2019

Проблема здесь в том, что вы указываете необработанную структуру вместо указателя на структуру:

bool RedisPermissionHandler::Set(std::string path, StatLite stat)
{
    redisReply *reply = (redisReply*)redisCommand(this->redis,
        "SET %b %b",
        path.c_str(), (size_t)path.length(),
        &stat, (size_t)sizeof(stat) // Pointer to stat!
    );

    freeReplyObject(reply);
    return true;
}

Возможно, что драйвер искал буфер void* определенного размера иstat трактуется как void*, вызывая ошибку при удалении ссылки на этот указатель.

...