C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[38136] Re:linux 에서 socket 전송의 segmentation fault
유영인 Cuperido [cuperido] 1892 읽음    2004-11-24 00:24
pos = (int *)malloc((index+1)*sizeof(int));

특별히 이 줄이 문제는 없어 보입니다.
다만, 다른 곳에서 메모리 엮임을 방지하기 위하여
버그를 수정해야 할 필요성이 있어 보입니다.

1. line 169
    free(rcvMsg); 이 생성 없이 소멸자만 존재

2. line 153 이 부분에서
        if( (remain-cnt) > SENDSIZE)
        {
            if( recv(sockFd, (msg+cnt), RCVSIZE, 0) < 0)
                errorMsg("msg recv() failed");
        }
        else
        {
            if( recv(sockFd, (msg+cnt), (remain-cnt), 0) < 0)
                errorMsg("msg recv() failed");
            break;
        }
        cnt += RCVSIZE;

일정 바이트가 되지 않으면 루프를 돌아 일정 바이트를 채우는 것 같은데
현재 사용하시는 TCP 통신의 경우 recv가 딱딱 떨어져서 오지는 않습니다.

if( recv(sockFd, (msg+cnt), (remain-cnt), 0) < 0) 이 부분에서 return 되는 값은
실질적으로 넘겨받은 byte 값인데, cnt += RCVSIZE; 에서 이미 define 된 값을
증가시키고 있습니다.

이런 경우, TCP통신이 조금이라도 지체되어 다음 타이밍으로 버퍼가 넘어가 잘렸을 경우
(즉, 한덩어리가 모두 오지 않은 경우) buffer overflow 에러를 발생합니다.
(물론 눈에는 보이지 않고 다른 변수들의 영향을 미칩니다)


이외 다른 부분은 테스트할 여건이 되지 않아 :( 잘 모르겠네요.
gdb 에서 한줄한줄 넘어가시면서 print 로 값의 변화를 알아보시는 것도 좋은
방법이라 생각됩니다.


cuperido


황상준 님이 쓰신 글 :
: 밑에서 물어봤던 건데요...
:
: 같은 함수를 두번 호출 하면 두번째 함수의 첫번째 malloc 부분에서
:
: segmentation fault 가 납니다.. -_-;;
:
: 좀 도와 주세요.. 쩝.. 벌써 일주일째... 답답하네요..

+ -

관련 글 리스트
38134 linux 에서 socket 전송의 segmentation fault 황상준 869 2004/11/23
38136     Re:linux 에서 socket 전송의 segmentation fault 유영인 Cuperido 1892 2004/11/24
38137         Re:Re:linux 에서 socket 전송의 segmentation fault 황상준 1186 2004/11/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.