3

以前の投稿のようですが、ここの問題は異なります..

これは問題の 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ました。

しかし、まだ何かを改善する必要があります

なぜこれが上書きされているのですか???

4

2 に答える 2

0

内部 からアサーション エラーが発生した場合malloc、問題は外部にあります。アサーションは、malloc に渡されたパラメーターに関するものではなく、破損しているメモリの状態に関するものです。これは、書き込むべきではないメモリ領域に以前に書き込んだことを意味します。したがって、適切なトレースバックを (たとえば gdb を使用して) 提供したとしても、問題の原因を突き止めることはできません。メモリの問題をデバッグするためのツールは多数あります。最も広く使用されているツールの 1 つは valgrind です。それはあなたのプログラムを恐ろしく遅くし、すべてのメモリアクセスを調べることで、起こりうる問題をたくさん示します. もう 1 つのより軽量なツールはマッドフラップで、リンクする必要があります。問題を絞り込むための非常に基本的なアプローチは、追加することですassert(condition)ステートメントをコードに追加し、以前に失敗することを願っています。この問題は、コード内のすべてのメモリ アクセスを調べて範囲外でないことを確認することで解決できる場合があります (不明な場合は、アサーション ステートメントを追加します)。

于 2011-10-24T13:48:56.100 に答える