D_FORTIFY_SOURCE и gcc - PullRequest
       15

D_FORTIFY_SOURCE и gcc

3 голосов
/ 12 сентября 2010

Эта функция предназначена для генерации md5hash:

out = malloc(32+1);
void md5sum( u_char *secret_data, int secret_len, char *in,char *out ) {
        ngx_md5_t       md5;
        u_char hash[16];
        ngx_md5_init(&md5);
        ngx_md5_update(&md5, in, strlen(in));
        ngx_md5_update(&md5, secret_data, secret_len);
        ngx_md5_final(hash, &md5);
        int ii;
        for (ii = 0; ii &lqt; 16; ii++) {
                char tt[2];
                sprintf(tt, "%02x", hash[ii] );
                strcat(out,tt);

        }
}

Она работает, но если я использую опцию D_FORTIFY_SOURCE с компилятором gcc, я получаю ошибку сегментацииЕсли я изменю тип tt на: char tt[3], все в порядке.Почему?

Ответы [ 2 ]

5 голосов
/ 12 сентября 2010

sprintf вставляет нулевой символ для завершения строки.Таким образом, вам нужен трехсимвольный массив для хранения двухсимвольной строки;это действительно 'a' 'b' '\ 0'.

4 голосов
/ 12 сентября 2010

Вы получаете ошибку сегментации, потому что вы пытаетесь записать 3 символа в массив из 2 символов.(NUL тоже персонаж)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...