0

Web ソケット ハンドシェイクを実装したいので、次のコード スニペットを使用しています。しかし、動的に割り当てたメモリを解放し始めると、セグメンテーション違反が発生します。初めてフリー機能を使ったところでエラーが出ます。助けてください。

char rbuf[656];        
char handshake[800];
char *handshake_part2, *handshake_part3,*key,*magic,*final;
unsigned char hash [20];

key=strndup(rbuf+359, 24);     
magic = malloc(strlen("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")+2);
strcpy(magic,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
final = malloc (60);
final = strcat(key,magic);   
SHA1(final,strlen(final),hash);
base64(hash, sizeof(hash));
handshake_part2= malloc(400);
handshake_part2= base64(hash, sizeof(hash));
strcpy (handshake,"HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: Websocket\r   \nConnection: Upgrade\r\nSec-WebSocket-Accept: ");
strcat(handshake,handshake_part2);
handshake_part3= malloc(400);
handshake_part3="\r\nWebSocket-Origin: http://localhost:9605\r\nWebSocket-Location: ws://localhost:9609/\r\n\r\n";
strcat(handshake,handshake_part3);
printf("Response Header :\n%s", handshake);

free(handshake_part3);
handshake_part3=NULL;
printf("Free 1");
free(handshake_part2);
handshake_part2=NULL;
printf("Free 2");
free(final);`
final=NULL;
printf("Free 3");
free(magic);
magic=NULL;
printf("Free 4");
free(key);
4

4 に答える 4

3

handshake_part3定数文字列になるように再割り当てしています"\r\n..."strcpy()代わりにこれを(できればstrncpy()、または同等の!)入れるつもりでしたか?

于 2012-07-16T21:02:45.727 に答える
2

定数文字列を解放しています。malloc を呼び出した後、定数文字列を割り当てるため、メモリがリークしています (そして、malloc されたメモリがリークされます)。

于 2012-07-16T21:03:37.053 に答える
1
handshake_part3= malloc(400); 
handshake_part3="\r\nWebSocket-Origin: http://localhost:9605\r\nWebSocket-Location: ws://localhost:9609/\r\n\r\n";

文字列リテラルを に割り当てて、handshake_part3それを解放しようとしています...これにより、不正に配置されたバッファがリークし、freeクラッシュします。strcpy割り当てられたバッファにその文字列リテラルを指定するか、割り当てと解放を避ける必要があります。

于 2012-07-16T21:03:45.340 に答える
0

このコードを見てください:

final = malloc (60);
final = strcat(key,magic); 

あなたがすることは、新しく割り当てられたを放棄し、それを aのアドレスfinalで上書きすることです。key後でそれを 2 回 ( viafinalと via よりも1 回) 削除しますkeyが、これは許可されていません。

ぱっと見で気づいたのはこれだけですが、他にもあるような気がします…

編集:そして、他の回答を見ると、実際に「もっと」あることがわかります

于 2012-07-16T21:06:40.290 に答える