X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=jbsockets.c;h=3d4b29640b99291ace35fcdd4504fa1fd8fc96b8;hb=40f23d485c1e8bc8aa892b93d644dad4b8243685;hp=23e427fdb425ee844469ef1e50b16adb243910cf;hpb=a729163e4309e9b0cbbc2b4870b0eb9bc5035f3d;p=privoxy.git diff --git a/jbsockets.c b/jbsockets.c index 23e427fd..3d4b2964 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -1,4 +1,4 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.61 2009/05/28 21:13:34 fabiankeil Exp $"; +const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.67 2009/09/10 14:53:34 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ @@ -169,7 +169,10 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) memset((char *)&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICSERV; /* avoid service look-up */ + hints.ai_flags = AI_NUMERICSERV; /* avoid service look-up */ +#ifdef AI_ADDRCONFIG + hints.ai_flags |= AI_ADDRCONFIG; +#endif if ((retval = getaddrinfo(host, service, &hints, &result))) { log_error(LOG_LEVEL_INFO, @@ -196,6 +199,12 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) #endif /* def FEATURE_ACL */ csp->http->host_ip_addr_str = malloc(NI_MAXHOST); + if (NULL == csp->http->host_ip_addr_str) + { + log_error(LOG_LEVEL_ERROR, + "Out of memory while getting the server IP address."); + return JB_INVALID_SOCKET; + } retval = getnameinfo(rp->ai_addr, rp->ai_addrlen, csp->http->host_ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (!csp->http->host_ip_addr_str || retval) @@ -559,7 +568,7 @@ int read_socket(jb_socket fd, char *buf, int len) #elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__) return(recv(fd, buf, (size_t)len, 0)); #else - return(read(fd, buf, (size_t)len)); + return((int)read(fd, buf, (size_t)len)); #endif } @@ -580,6 +589,7 @@ int read_socket(jb_socket fd, char *buf, int len) *********************************************************************/ int data_is_available(jb_socket fd, int seconds_to_wait) { + char buf[10]; fd_set rfds; struct timeval timeout; int n; @@ -600,7 +610,7 @@ int data_is_available(jb_socket fd, int seconds_to_wait) /* * XXX: Do we care about the different error conditions? */ - return (n == 1); + return ((n == 1) && (1 == recv(fd, buf, 1, MSG_PEEK))); } @@ -696,7 +706,10 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) hints.ai_family = AF_UNSPEC; } hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; + hints.ai_flags = AI_PASSIVE; +#ifdef AI_ADDRCONFIG + hints.ai_flags |= AI_ADDRCONFIG; +#endif hints.ai_protocol = 0; /* Realy any stream protocol or TCP only */ hints.ai_canonname = NULL; hints.ai_addr = NULL; @@ -898,6 +911,12 @@ void get_host_information(jb_socket afd, char **ip_address, char **hostname) } #ifdef HAVE_RFC2553 *ip_address = malloc(NI_MAXHOST); + if (NULL == *ip_address) + { + log_error(LOG_LEVEL_ERROR, + "Out of memory while getting the client's IP address."); + return; + } retval = getnameinfo((struct sockaddr *) &server, s_length, *ip_address, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (retval) @@ -921,6 +940,12 @@ void get_host_information(jb_socket afd, char **ip_address, char **hostname) #ifdef HAVE_RFC2553 *hostname = malloc(NI_MAXHOST); + if (NULL == *hostname) + { + log_error(LOG_LEVEL_ERROR, + "Out of memory while getting the client's hostname."); + return; + } retval = getnameinfo((struct sockaddr *) &server, s_length, *hostname, NI_MAXHOST, NULL, 0, NI_NAMEREQD); if (retval) @@ -1029,6 +1054,12 @@ int accept_connection(struct client_state * csp, jb_socket fd) csp->cfd = afd; #ifdef HAVE_RFC2553 csp->ip_addr_str = malloc(NI_MAXHOST); + if (NULL == csp->ip_addr_str) + { + log_error(LOG_LEVEL_ERROR, + "Out of memory while getting the client's IP address."); + return 0; + } retval = getnameinfo((struct sockaddr *) &client, c_length, csp->ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (!csp->ip_addr_str || retval) @@ -1183,6 +1214,9 @@ unsigned long resolve_hostname_to_ip(const char *host) *********************************************************************/ int socket_is_still_usable(jb_socket sfd) { + char buf[10]; + int no_data_waiting; + #ifdef HAVE_POLL int poll_result; struct pollfd poll_fd[1]; @@ -1193,20 +1227,16 @@ int socket_is_still_usable(jb_socket sfd) poll_result = poll(poll_fd, 1, 0); - if (-1 != poll_result) - { - return !(poll_fd[0].revents & POLLIN); - } - else + if (-1 == poll_result) { log_error(LOG_LEVEL_CONNECT, "Polling socket %d failed.", sfd); return FALSE; } + no_data_waiting = !(poll_fd[0].revents & POLLIN); #else fd_set readable_fds; struct timeval timeout; int ret; - int socket_is_alive = 0; memset(&timeout, '\0', sizeof(timeout)); FD_ZERO(&readable_fds); @@ -1215,17 +1245,13 @@ int socket_is_still_usable(jb_socket sfd) ret = select((int)sfd+1, &readable_fds, NULL, NULL, &timeout); if (ret < 0) { - log_error(LOG_LEVEL_ERROR, "select() failed!: %E"); + log_error(LOG_LEVEL_CONNECT, "select() on socket %d failed: %E", sfd); + return FALSE; } - - /* - * XXX: I'm not sure why !FD_ISSET() works, - * but apparently it does. - */ - socket_is_alive = !FD_ISSET(sfd, &readable_fds); - - return socket_is_alive; + no_data_waiting = !FD_ISSET(sfd, &readable_fds); #endif /* def HAVE_POLL */ + + return (no_data_waiting || (1 == recv(sfd, buf, 1, MSG_PEEK))); } #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */