我希望实现一个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);
答案 0 :(得分:3)
您将handshake_part3
重新分配为常量字符串"\r\n..."
;你的意思是strcpy()
(最好是strncpy()
或同等的!)这个呢?
答案 1 :(得分:2)
你释放一个常量字符串。内存泄漏是因为在调用malloc之后,您分配了常量字符串(并且malloc' d内存被泄漏)。
答案 2 :(得分: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
,然后尝试释放它...这会导致mallocated缓冲区泄漏,并导致free
崩溃。你应该strcpy
该字符串文字到分配的缓冲区,或者避免分配和释放。
答案 3 :(得分:0)
看看这段代码:
final = malloc (60);
final = strcat(key,magic);
你做的是放弃新分配的final
并用key
的地址覆盖它。稍后您将其删除两次(一次通过final
而不是通过key
),这是不允许的。
这是我一眼就注意到的唯一一件事,但我觉得可能会有更多......
编辑:看看其他答案,我看到的确有“更多”