以前の投稿のようですが、ここの問題は異なります..
これは問題の 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
とnullになるため、そのfakekey
値を取得するとプログラムが正常に実行されるため、正確にはわかりません。
編集1:
コードを 3 か所で編集しました (上記のコードでも編集しました)。
プログラムは動作するようになりましたが、一貫性のない出力が発生します。
入力:
Encryption key - qwerty
Authentication key - abcdef
出力:
Encryption key - qwerab
Authentication key - abcdef
状況はより明確になりました。
それが意味する問題は確かにrealloc
ステートメントにあります。
これについて提案してください。
最初は両方のステートメントに長さを追加しましrealloc
たが、今priv->keylen
では最初の場所と 2 番目の場所に変更しpriv->keylen+priv->akeylen
ました。
しかし、まだ何かを改善する必要があります
なぜこれが上書きされているのですか???