/* Since the reentrant gethost functions take a char * buffer, * we have to make sure they internally do not assume alignment. * The actual return values are not relevant. If the test fails, * it'll be due to an alignment exception which means the test * app is killed by the kernel. */ #include <errno.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/socket.h> int main(int argc, char *argv[]) { size_t i; char buf[1024]; in_addr_t addr; addr = inet_addr("127.0.0.1"); for (i = 0; i < sizeof(size_t) * 2; ++i) { struct hostent hent, *hentres; int ret, herr; printf("Testing misalignment of %2zi bytes: ", i); memset(&hent, 0x00, sizeof(hent)); ret = gethostent_r(&hent, buf + i, sizeof(buf) - i, &hentres, &herr); printf("%sgethostent_r() ", (ret ? "!!!" : "")); memset(&hent, 0x00, sizeof(hent)); ret = gethostbyname_r("localhost", &hent, buf + i, sizeof(buf) - i, &hentres, &herr); printf("%sgethostbyname_r() ", (ret ? "!!!" : "")); memset(&hent, 0x00, sizeof(hent)); ret = gethostbyname2_r("localhost", AF_INET, &hent, buf + i, sizeof(buf) - i, &hentres, &herr); printf("%sgethostbyname2_r() ", (ret ? "!!!" : "")); memset(&hent, 0x00, sizeof(hent)); ret = gethostbyaddr_r(&addr, sizeof(addr), AF_INET, &hent, buf + i, sizeof(buf) - i, &hentres, &herr); printf("%sgethostbyaddr_r() ", (ret ? "!!!" : "")); puts("OK!"); } return 0; }