Почему malloc провоцирует повреждение памяти здесь?

Я продолжаю получать следующую ошибку:

*** Error in `./vice': malloc(): memory corruption: 0x08e77530 ***
Aborted (core dumped)

Соответствующий код:

open_result *
open_file_1_svc(open_args *argp, struct svc_req *rqstp)
{
    static open_result  result;
    int obtained_fd;
    int just_read;
    int total_read = 0;
    int max_bytes_read = 1024;
    char *ptr_file;
    char *pathName = "MyFiles/"; // strlen = 8
    int toReserve;

    xdr_free((xdrproc_t)xdr_open_result, (char *)&result);

    // Construct full name of the file (in "MyFiles")
    toReserve = strlen(argp->fname) + strlen(pathName) + 1; // "\0"
    char *fullName = malloc(toReserve*sizeof(char));
    fullName = strdup(pathName);
    fullName = strcat(fullName, argp->fname);

    // Call to open in POSIX
    obtained_fd = open(fullName, argp->flags);

    result.fd = obtained_fd;

    /* If there was an error while reading, the error code will be sent, but not
       the file (it might not even exist) */
    if (obtained_fd < 0) {
        result.characters = "";
        result.number_characters = 0;
    }
    /* If the file opening was successful,
       both the fd and the file will be sent */
    else {
        char *file_just_read = malloc(max_bytes_read * sizeof(char)); // This is the problem
        ptr_file = file_just_read;

        /* Reading the file byte by byte */
        while((just_read = read(obtained_fd, ptr_file, max_bytes_read)) > 0) {
            total_read += just_read;
            file_just_read = realloc(file_just_read, (total_read+max_bytes_read) * sizeof(char));
            ptr_file = file_just_read + total_read;
        }
        result.characters = file_just_read;
        result.number_characters = total_read;
    }
    return &result;
}

Позвольте мне объяснить, что делает код. Это сервер с именем "Vice", который связывается со своими клиентами через RPC. Эта функция должна получать "open_args" и возвращать "open_result". Они определены в файле "Vice.x". Соответствующая часть этого файла:

struct open_args {
    string fname<>;
    int flags;
};

struct open_result {
    string characters<>;
    int number_characters;
    int fd;
};

open_file_1_svc должен попытаться открыть файл с именем, указанным в argp->fname, в каталоге MyFiles. Если открытие успешно, open_file_1_svc попытается скопировать содержимое файла в result.characters, отправив копию содержимого файла клиенту таким образом. Number_characters позволит мне узнать, есть ли между ними нулевые байты.

Ошибка, которую я получаю, появляется, когда я пытаюсь выделить часть памяти для части файла, которую я собираюсь прочитать.

Я читал об этом типе ошибки, но я не понимаю, что не так с этим конкретным случаем.

1 ответ

Решение

malloc не "провоцирует" коррупцию; malloc обнаруживает это.

Эта ошибка говорит вам о том, что что-то набросало метаданные кучи ранее malloc был вызван (на этот раз); у вас, вероятно, переполнение буфера.

И то и другое malloc вызовы в этом коде выполняются до того, как что-либо запишется в память, поэтому переполнение, скорее всего, происходит в другом месте (Я не провёл детальную проверку того, что этот код верен, но здесь это постфактум.)


Изменить: я пропустил неявное malloc позвоните внутрь strdup, Это приведет к переполнению, потому что дублированная строка имеет меньшее распределение. Я думаю ты имеешь ввиду strcpyне strdup,

Другие вопросы по тегам