0

我希望实现一个网络套接字握手,为此我正在使用以下代码片段。但是当我开始释放动态分配的内存时出现分段错误。第一次使用free功能的地方出现错误。请帮忙。

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); 

你所做的是放弃新分配的final并用key's 地址覆盖它。稍后您将其删除两次(一次 viafinal和一次 via key),这是不允许的。

这是我一眼就注意到的唯一东西,但我感觉可能还有更多……

编辑:看看其他答案,我可以看到确实有“更多”

于 2012-07-16T21:06:40.290 回答