sockaddr로 type casting 할때 궁금한 점...
struct sockaddr{
sa_family_t sin_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;
.
.
.
bind(serv_sock,(struct sockaddr*) &serv_addr,sizeof(serv_addr))
serv_addr 구조체는 총 16바이트니깐 sockaddr에 딱 맞는 사이즈라서
sockaddr 의 배열에 차곡차곡 들어갑니다.
sin_faminly,port,ip address,패딩역할하는 8바이트짜리 배열...
그런데...
struct sockaddr_un{
sa_family_t sun_family;
char sum_path[108];
}sock_un
.
.
.
bind(serv_sock, (struct sockaddr*) &sock_un, sizeof(sock_un))
이런식으로 형변환하면 오버플로우 아닌가요?
예를 들면 sum_path에 14자 이상이 저장된다면, sockaddr의 sa_data[14]가 오버플로우 되는거 아닌가요?
아님 sockaddr의 sa_data[0] 포인터가 sum_path 스트링을 가리키는건가여?...
구조체 type casting에 대해서 헷갈리네여...\-_-/
더 적게 할당되면야
더 적게 할당되면야 문제를 일으킬 수 있지만, 더 많이 할당된거야 문제를 일으킬 일은 없지요. 상황과 용도의 문제겠죠.
참고로 FAM ( Flexible Array Member ) 와도 관련지어 생각해 보세요...
Orion Project : http://orionids.org
댓글 달기