2012-07-16 2 views
0

웹 소켓 핸드 셰이크를 구현하고 싶습니다. 다음 코드를 사용하고 있습니다. 하지만 내가 동적으로 할당하는 메모리를 해제 시작 세그먼트 화 오류가 발생합니다. 처음으로 자유 기능을 사용하는 곳에 오류가 나타납니다. 도와주세요. 당신은 상수 문자열 "\r\n..."handshake_part3를 재 할당하는메모리를 해제하는 동안 세그먼트 오류가 발생했습니다.

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

참으로 "더" 들여 쓰기를 수정하십시오. – sean

+0

malloc 호출 후 handshake_part3의 값을 검사하여 메모리가 처음 할당되었는지 확인해야합니다 : – Raj

+0

왜 처음에 malloc을 했습니까? – netcoder

답변

3

; strcpy() (바람직하게는 strncpy() 또는 이와 동등한 것입니다.) 대신에 이것을 사용하셨습니까?

2

일정한 문자열을 확보했습니다. malloc을 호출 한 후에 상수 문자열을 할당하고 (malloc 된 메모리가 유출되기 때문에) 메모리가 새어 나옵니다.

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 문자열을 할당 된 버퍼에 리터럴해야하거나 할당 및 해제를 피하십시오. 이 코드에서

+0

확실히 할당을 피하는 것이 좋습니다. – netcoder

0

봐 : 당신이 할 것은

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

당신은 새로 할당 final을 포기하고 key의 주소로 우선합니다. 나중에 당신은 그것을 두 번 삭제합니다 (finalkey을 통해 한 번). 이것은 허용되지 않습니다.

편집

내가 한 눈에 알 수있는 유일한 일이다

하지만 난 느낌이 더있을 수 있습니다 ... : 나는 거기에 볼 수 있습니다 그리고 다른 답변을보고

+0

어떻게 그 때이어야 하는가? 색다른 느낌을줍니다. –

+0

당신의 코드에서 C의 메모리 관리를 잘 모른다는 것이 확실하지 않습니다 - 메모리를 malloc하고 메모리가있는 곳을 여러 개 가지고 있고 반환 된 포인터를 다른 것으로 즉시 덮어 씁니다 ('final','handshake_part2', 'handshake_part3'). 'final = strcat (key, magic)'을했을 때 여러분은 어떻게 생각하고 있습니까? –

+0

strcat는 마침내 null 문자를 할당하고 키의 끝에서 제거하는 키에 마법을 추가합니다. 대상이 반환됩니다. 내가 잘못하지 않았다면 키와 같은 최종 키를 할당합니다. –

관련 문제