diff options
| author | 2006-04-26 17:48:29 +0000 | |
|---|---|---|
| committer | 2006-04-26 17:48:29 +0000 | |
| commit | e4a56ea6a916ec6052c981a61c5d2a543ca4aba0 (patch) | |
| tree | 0f91120b1bf7912cac019561b43e09da56bc5b59 /nanohttp/nanohttp-socket.c | |
| parent | da247f66851df5cbe305fda874fa9188c0402f06 (diff) | |
| download | csoap-e4a56ea6a916ec6052c981a61c5d2a543ca4aba0.tar.gz csoap-e4a56ea6a916ec6052c981a61c5d2a543ca4aba0.tar.bz2 | |
Fixed a significant bug in updated ssl code that would allow processes to "run away"
Added a new option and helper functions for socket timeout
Added new helper function for ssl arguments
Diffstat (limited to 'nanohttp/nanohttp-socket.c')
| -rw-r--r-- | nanohttp/nanohttp-socket.c | 90 | 
1 files changed, 63 insertions, 27 deletions
| diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index 4d34389..84ee578 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@  /****************************************************************** -*  $Id: nanohttp-socket.c,v 1.58 2006/04/13 06:25:11 m0gg Exp $ +*  $Id: nanohttp-socket.c,v 1.59 2006/04/26 17:48:29 mrcsys Exp $  *  * CSOAP Project:  A http client/server library in C  * Copyright (C) 2003  Ferhat Ayaz @@ -105,8 +105,16 @@ _hsocket_module_sys_destroy(void)    return;  }  #else -static inline void _hsocket_module_sys_init(int argc, char **argv) { return; } -static inline void _hsocket_module_sys_destroy(void) { return; } +static inline void +_hsocket_module_sys_init(int argc, char **argv) +{ +  return; +} +static inline void +_hsocket_module_sys_destroy(void) +{ +  return; +}  #endif  /*-------------------------------------------------- @@ -137,7 +145,7 @@ hsocket_module_destroy(void)  FUNCTION: hsocket_init  ----------------------------------------------------*/  herror_t -hsocket_init(hsocket_t *sock) +hsocket_init(hsocket_t * sock)  {    memset(sock, 0, sizeof(hsocket_t)); @@ -150,7 +158,7 @@ hsocket_init(hsocket_t *sock)  FUNCTION: hsocket_free  ----------------------------------------------------*/  void -hsocket_free(hsocket_t *sock) +hsocket_free(hsocket_t * sock)  {    /* nop */ @@ -186,7 +194,8 @@ hsocket_open(hsocket_t * dsock, const char *hostname, int port, int ssl)    log_verbose4("Opening %s://%s:%i", ssl ? "https" : "http", hostname, port);    /* connect to the server */ -  if (connect(dsock->sock, (struct sockaddr *) &address, sizeof(address)) != 0) +  if (connect(dsock->sock, (struct sockaddr *) &address, sizeof(address)) != +      0)      return herror_new("hsocket_open", HSOCKET_ERROR_CONNECT,                        "Socket error (%s)", strerror(errno)); @@ -242,7 +251,7 @@ hsocket_bind(hsocket_t * dsock, int port)  #ifdef WIN32  static herror_t -_hsocket_sys_accept(hsocket_t *sock, hsocket_t *dest) +_hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest)  {    socklen_t asize;    hsocket_t sockfd; @@ -250,7 +259,8 @@ _hsocket_sys_accept(hsocket_t *sock, hsocket_t *dest)    asize = sizeof(struct sockaddr_in);    while (1)    { -    sockfd.sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize); +    sockfd.sock = +      accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize);      if (sockfd.sock == INVALID_SOCKET)      {        if (WSAGetLastError() != WSAEWOULDBLOCK) @@ -269,16 +279,19 @@ _hsocket_sys_accept(hsocket_t *sock, hsocket_t *dest)  }  #else  static herror_t -_hsocket_sys_accept(hsocket_t *sock, hsocket_t *dest) +_hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest)  {    socklen_t len;    len = sizeof(struct sockaddr_in); -  if ((dest->sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1) +  if ((dest->sock = +       accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1)    {      log_warn2("accept failed (%s)", strerror(errno)); -    return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, "Cannot accept network connection (%s)", strerror(errno)); +    return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, +                      "Cannot accept network connection (%s)", +                      strerror(errno));    }    return H_OK; @@ -289,7 +302,7 @@ _hsocket_sys_accept(hsocket_t *sock, hsocket_t *dest)  FUNCTION: hsocket_accept  ----------------------------------------------------------*/  herror_t -hsocket_accept(hsocket_t *sock, hsocket_t *dest) +hsocket_accept(hsocket_t * sock, hsocket_t * dest)  {    herror_t status; @@ -307,7 +320,8 @@ hsocket_accept(hsocket_t *sock, hsocket_t *dest)    }    log_verbose3("accepting connection from '%s' socket=%d", -               SAVE_STR(((char *) inet_ntoa(dest->addr.sin_addr))), dest->sock); +               SAVE_STR(((char *) inet_ntoa(dest->addr.sin_addr))), +               dest->sock);    return H_OK;  } @@ -316,7 +330,7 @@ hsocket_accept(hsocket_t *sock, hsocket_t *dest)  FUNCTION: hsocket_listen  ----------------------------------------------------*/  herror_t -hsocket_listen(hsocket_t *sock) +hsocket_listen(hsocket_t * sock)  {    if (sock->sock < 0)      return herror_new("hsocket_listen", HSOCKET_ERROR_NOT_INITIALIZED, @@ -334,22 +348,22 @@ hsocket_listen(hsocket_t *sock)  #ifdef WIN32  static inline void -_hsocket_sys_close(hsocket_t *sock) +_hsocket_sys_close(hsocket_t * sock)  {    char junk[10];    /* shutdown(sock,SD_RECEIVE); */    shutdown(sock->sock, SD_SEND); -  while (recv(sock->sock, junk, sizeof(junk), 0) > 0) ; -    /* nothing */ +  while (recv(sock->sock, junk, sizeof(junk), 0) > 0); +  /* nothing */    closesocket(sock->sock);    return;  }  #else  static inline void -_hsocket_sys_close(hsocket_t *sock) +_hsocket_sys_close(hsocket_t * sock)  {    shutdown(sock->sock, SHUT_RDWR); @@ -364,7 +378,7 @@ _hsocket_sys_close(hsocket_t *sock)  FUNCTION: hsocket_close  ----------------------------------------------------*/  void -hsocket_close(hsocket_t *sock) +hsocket_close(hsocket_t * sock)  {    log_verbose3("closing socket %p (%d)...", sock, sock->sock); @@ -381,7 +395,7 @@ hsocket_close(hsocket_t *sock)  FUNCTION: hsocket_send  ----------------------------------------------------*/  herror_t -hsocket_nsend(hsocket_t *sock, const byte_t * bytes, int n) +hsocket_nsend(hsocket_t * sock, const byte_t * bytes, int n)  {    herror_t status;    size_t total = 0; @@ -392,7 +406,7 @@ hsocket_nsend(hsocket_t *sock, const byte_t * bytes, int n)      return herror_new("hsocket_nsend", HSOCKET_ERROR_NOT_INITIALIZED,                        "hsocket not initialized"); -  /* log_verbose2( "SENDING %s", bytes );*/ +  /* log_verbose2( "SENDING %s", bytes ); */    while (1)    { @@ -416,13 +430,34 @@ hsocket_nsend(hsocket_t *sock, const byte_t * bytes, int n)  FUNCTION: hsocket_send  ----------------------------------------------------*/  herror_t -hsocket_send(hsocket_t *sock, const char *str) +hsocket_send(hsocket_t * sock, const char *str)  {    return hsocket_nsend(sock, str, strlen(str));  } +int +hsocket_select_read(int sock, char *buf, size_t len) +{ +  struct timeval timeout; +  fd_set fds; +  int ret; +  FD_ZERO(&fds); +  FD_SET(sock, &fds); +  timeout.tv_sec = httpd_get_timeout(); +  timeout.tv_usec = 0; +  ret = select(sock + 1, &fds, NULL, NULL, &timeout); +  if (ret == 0) +  { +    errno = ETIMEDOUT; +    log_verbose2("Socket %d timeout", sock); +    return -1; +  } +  return read(sock, buf, len); +} +  herror_t -hsocket_read(hsocket_t *sock, byte_t * buffer, int total, int force, int *received) +hsocket_read(hsocket_t * sock, byte_t * buffer, int total, int force, +             int *received)  {    herror_t status;    size_t totalRead; @@ -434,7 +469,9 @@ hsocket_read(hsocket_t *sock, byte_t * buffer, int total, int force, int *receiv    do    { -    if ((status = hssl_read(sock, &buffer[totalRead], (size_t)total - totalRead, &count)) != H_OK) +    if ((status = +         hssl_read(sock, &buffer[totalRead], (size_t) total - totalRead, +                   &count)) != H_OK)      {        log_warn2("hssl_read failed (%s)", herror_message(status));        return status; @@ -442,8 +479,8 @@ hsocket_read(hsocket_t *sock, byte_t * buffer, int total, int force, int *receiv      if (!force)      { -      /* log_verbose3("Leaving !force (received=%d)(status=%d)", *received, status); -      */ +      /* log_verbose3("Leaving !force (received=%d)(status=%d)", *received, +         status); */        *received = count;        return H_OK;      } @@ -462,4 +499,3 @@ hsocket_read(hsocket_t *sock, byte_t * buffer, int total, int force, int *receiv    }    while (1);  } - | 
