X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jbsockets.c;h=48f43c922b7819fb0ca428662be4b4929763b9fb;hp=fc79483b2a70afc706786e8de785aaeb85650ee7;hb=138747bd3f178c448de25dce2ca1d90de6e0f6cb;hpb=7759e9a72652fe7e10f8596212865d8b2cd22ad4 diff --git a/jbsockets.c b/jbsockets.c index fc79483b..48f43c92 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -1,4 +1,4 @@ -const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.124 2013/03/20 11:30:05 fabiankeil Exp $"; +const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.134 2015/11/06 13:37:35 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.c,v $ @@ -8,7 +8,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.124 2013/03/20 11:30:05 fabia * OS-independent. Contains #ifdefs to make this work * on many platforms. * - * Copyright : Written by and Copyright (C) 2001-2011 the + * Copyright : Written by and Copyright (C) 2001-2016 the * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -99,6 +99,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.124 2013/03/20 11:30:05 fabia #include "jbsockets.h" #include "filters.h" #include "errlog.h" +#include "miscutil.h" /* Mac OSX doesn't define AI_NUMERICSESRV */ #ifndef AI_NUMERICSERV @@ -122,6 +123,33 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct client_state *csp); #endif +/********************************************************************* + * + * Function : set_no_delay_flag + * + * Description : Disables TCP coalescence for the given socket. + * + * Parameters : + * 1 : fd = The file descriptor to operate on + * + * Returns : void + * + *********************************************************************/ +static void set_no_delay_flag(int fd) +{ +#ifdef TCP_NODELAY + int mi = 1; + + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &mi, sizeof(int))) + { + log_error(LOG_LEVEL_ERROR, + "Failed to disable TCP coalescence for socket %d", fd); + } +#else +#warning set_no_delay_flag() is a nop due to lack of TCP_NODELAY +#endif /* def TCP_NODELAY */ +} + /********************************************************************* * * Function : connect_to @@ -232,14 +260,7 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client return(JB_INVALID_SOCKET); } - csp->http->host_ip_addr_str = malloc(NI_MAXHOST); - if (NULL == csp->http->host_ip_addr_str) - { - freeaddrinfo(result); - log_error(LOG_LEVEL_ERROR, - "Out of memory while getting the server IP address."); - return JB_INVALID_SOCKET; - } + csp->http->host_ip_addr_str = malloc_or_die(NI_MAXHOST); for (rp = result; rp != NULL; rp = rp->ai_next) { @@ -285,6 +306,7 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client "Server socket number too high to use select(): %d >= %d", fd, FD_SETSIZE); close_socket(fd); + freeaddrinfo(result); return JB_INVALID_SOCKET; } #endif @@ -293,12 +315,7 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client mark_socket_for_close_on_execute(fd); #endif -#ifdef TCP_NODELAY - { /* turn off TCP coalescence */ - int mi = 1; - setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &mi, sizeof (int)); - } -#endif /* def TCP_NODELAY */ + set_no_delay_flag(fd); #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) @@ -486,12 +503,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli } #endif -#ifdef TCP_NODELAY - { /* turn off TCP coalescence */ - int mi = 1; - setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &mi, sizeof (int)); - } -#endif /* def TCP_NODELAY */ + set_no_delay_flag(fd); #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) @@ -915,10 +927,6 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) fd = socket(AF_INET, SOCK_STREAM, 0); #endif /* def HAVE_RFC2553 */ -#ifdef FEATURE_EXTERNAL_FILTERS - mark_socket_for_close_on_execute(fd); -#endif - #ifdef _WIN32 if (fd == JB_INVALID_SOCKET) #else @@ -932,6 +940,10 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) #endif } +#ifdef FEATURE_EXTERNAL_FILTERS + mark_socket_for_close_on_execute(fd); +#endif + #ifndef _WIN32 /* * This is not needed for Win32 - in fact, it stops @@ -1001,6 +1013,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) { if (errno != EINTR) { + close_socket(fd); return(-1); } } @@ -1088,22 +1101,10 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, #ifndef NI_MAXSERV #define NI_MAXSERV 32 #endif - *port = malloc(NI_MAXSERV); - if (NULL == *port) - { - log_error(LOG_LEVEL_ERROR, - "Out of memory while getting the client's port."); - return; - } + *port = malloc_or_die(NI_MAXSERV); + #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."); - freez(*port); - return; - } + *ip_address = malloc_or_die(NI_MAXHOST); retval = getnameinfo((struct sockaddr *) &server, s_length, *ip_address, NI_MAXHOST, *port, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV); @@ -1129,13 +1130,7 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, } #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; - } + *hostname = malloc_or_die(NI_MAXHOST); retval = getnameinfo((struct sockaddr *) &server, s_length, *hostname, NI_MAXHOST, NULL, 0, NI_NAMEREQD); if (retval) @@ -1300,7 +1295,7 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) setsockopt(fd, SOL_SOCKET, SO_ACCEPTFILTER, &af_options, sizeof(af_options)); #endif afd = accept (fd, (struct sockaddr *) &client, &c_length); - } while (afd < 1 && errno == EINTR); + } while (afd < 0 && errno == EINTR); if (afd < 0) { return 0; @@ -1312,7 +1307,7 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) struct linger linger_options; linger_options.l_onoff = 1; linger_options.l_linger = 5; - if (0 != setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger_options, sizeof(linger_options))) + if (0 != setsockopt(afd, SOL_SOCKET, SO_LINGER, &linger_options, sizeof(linger_options))) { log_error(LOG_LEVEL_ERROR, "Setting SO_LINGER on socket %d failed.", afd); } @@ -1334,15 +1329,11 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) mark_socket_for_close_on_execute(afd); #endif + set_no_delay_flag(afd); + 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; - } + csp->ip_addr_str = malloc_or_die(NI_MAXHOST); retval = getnameinfo((struct sockaddr *) &client, c_length, csp->ip_addr_str, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (!csp->ip_addr_str || retval)