소켓플그래밍 bind 함수에서 sockaddr로 typecast 했을경우에
일반적인 소켓플그래밍의 bind 과정입니다.
struct sockaddr{
sa_family_t sun_family;
char sa_data[14];
}
struct sockaddr_in {
sa_family_t sin_family; //2bytes
in_port_t sin_port;//2bytes
struct in_addr sin_addr;//4bytes
unsigned char sin_zero[8]; //8bytes
}serv_addr;
.
.
.중간생략 < 일반적 소켓플그래밍 setting >
.
.
bind(serv_sock,(struct sockaddr*) &serv_addr,sizeof(serv_addr))
sockaddr_in 을 sockaddr 로 typecast할떄는
serv_addr 구조체가 sockaddr에 딱 맞는 사이즈라서 sockaddr 구조체에 맞게 들어갑니다.
sockaddr_in 의 sin_family(short)는 sockaddr의 sun_family(short)로 들어가고,
sockaddr의 char sa_data[14]에 sockaddr_in의 sin_port (2bytes), sin_addr (4bytes), sin_zero[8] (8bytes)...
이런식으로 sa_data 배열에 꽉차게 됩니다.
그런데 문제는
struct sockaddr_un{
sa_family_t sun_family;
char sum_path[108];
}sock_un
.
.
.
bind(serv_sock, (struct sockaddr*) &sock_un, sizeof(sock_un))
sock_un의 sum_path에 20자 정도의 글자가 저장되어있다고 생각하고, sock_un을 sockaddr 로 typecast 했을 때
sockaddr의 sa_data[14]은 overflow 되는거 아닌가요?
즉 sock_un의 sum_path[108]의 데이터를 저장하기에는 sa_data[14]의 크기가 작아서 overflow를 발생시킨다고 생각하는데
컴파일은 되네요...
아니면 sockaddr의 sa_data[0] 포인터가 sum_path의 첫번쨰 바이트를 가리키는 건가요?
댓글 달기