Вроде как мой предыдущий пост, но проблема здесь в другом ..
Это структура C для задачи -
typedef struct ip_esp_private { /* keep track of things privately */
u_int32_t type;
u_int32_t ivlen;
u_int32_t icvlen;
u_int32_t keylen; /* length of "Encryption key */
u_int32_t akeylen; /*length of authn key */
u_int32_t key[0]; /* encryption key and authentication key both */
} esp_private;
Значения предоставляются для структуры содержимого во время выполнения следующим образом -
case 'k': /* Key */
length = stringargument(arg, &temp);
priv->keylen = length;
priv = (esp_private *)realloc(priv,
sizeof(esp_private)+/*length*/priv->keylen);
/*This one is edited */
// if(priv->akeylen)
// memmove(&priv->key[priv->keylen],
// &priv->key[0],priv->akeylen);
/*These three are commented*/
memcpy(&priv->key[0], temp, priv->keylen);
pack->private = priv;
pack->modified |= ESP_MOD_KEY;
break;
case 'K': /* Authentication Key */
length = stringargument(arg, &temp);
priv->akeylen = length; // marked line(explained below)
priv = (esp_private *)realloc(priv,
sizeof(esp_private)+/*length*/priv->keylen+priv->akeylen);
/*this one edited too */
memcpy(&priv->key[priv->keylen/sizeof(u_int32_t)],
temp,priv->akeylen);
pack->private = priv;
pack->modified |= ESP_MOD_KEY;
Теперь есть функция, которая использует значение ключа аутентификации.
Соответствующая часть функции -
if (!epriv->akeylen) {
key = &fakekey;
keylen = 1;
} else {
key = (u_int8_t *)malloc(epriv->akeylen);
memcpy(key,&epriv->key[epriv->keylen/sizeof(u_int32_t)]
,epriv->akeylen);
Теперь, когда я попытался запустить следующую программу, получаю эту ошибку, о которой я понятия не имею.
sendip: malloc.c:3574: mremap_chunk: Assertion `((size + offset)
& (mp_.pagesize-1)) == 0' failed.
Я думаю, что может быть ошибка в функциональной части, но что именно, я не уверен,
потому что, когда я комментирую отмеченную строку (упомянутую выше), akeylen
является нулевым
поэтому, взяв это значение fakekey
, программа работает нормально.
Редактировать 1:
Я отредактировал код в трех местах (также отредактированный в приведенном выше коде).
Теперь программа работает, но возникают противоречивые результаты.
Ввод:
Encryption key - qwerty
Authentication key - abcdef
Выход:
Encryption key - qwerab
Authentication key - abcdef
Ситуация стала более ясной.
Проблема, с которой это связано, наверняка есть в realloc
заявлениях.
Пожалуйста, предложите это.
Изначально я добавил длину в оба оператора realloc
, но теперь я изменил его на priv->keylen
на первом месте и priv->keylen+priv->akeylen
на втором месте.
Но что-то еще нужно улучшить
Почему это перезаписывает ???