rbb         99/10/16 07:07:01

  Modified:    src/lib/apr/file_io/unix dir.c
               src/lib/apr/inc apr_macro.h
               src/lib/apr/network_io/unix networkio.h sockets.c sockopt.c
  Log:
  Put mutex's around non-thread-safe functions in APR.
  
  Revision  Changes    Path
  1.9       +10 -6     apache-2.0/src/lib/apr/file_io/unix/dir.c
  
  Index: dir.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/dir.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- dir.c     1999/10/12 06:14:42     1.8
  +++ dir.c     1999/10/16 14:06:58     1.9
  @@ -58,11 +58,15 @@
   #include <string.h>
   #include <dirent.h>
   #include <sys/stat.h>
  +#include "apr_macro.h"
   #include "fileio.h"
   #include "apr_file_io.h"
   #include "apr_lib.h"
  +#include "apr_lock.h"
   #include "apr_portable.h"
   
  +static ap_lock_t *lock_readdir = NULL;
  +
   static ap_status_t dir_cleanup(void *thedir)
   {
       struct dir_t *dir = thedir;
  @@ -88,7 +92,7 @@
       (*new)->cntxt = cont;
       (*new)->dirname = strdup(dirname);
       (*new)->dirstruct = opendir(dirname);
  -    (*new)->entry = NULL;
  +    (*new)->entry = ap_pcalloc(cont, sizeof(struct dirent));
   
       if ((*new)->dirstruct == NULL) {
           return errno;
  @@ -124,11 +128,11 @@
    */                        
   ap_status_t ap_readdir(struct dir_t *thedir)
   {
  -    thedir->entry = readdir(thedir->dirstruct);
  -    if (thedir->entry == NULL) {
  -        return errno;
  -    }    
  -    return APR_SUCCESS;
  +    ap_status_t status;
  +    SAFETY_LOCK(readdir, "readdir_file");
  +    READDIR(thedir->dirstruct, thedir->entry, status);
  +    SAFETY_UNLOCK(readdir);
  +    return status;
   }
   
   /* ***APRDOC********************************************************
  
  
  
  1.3       +55 -7     apache-2.0/src/lib/apr/inc/apr_macro.h
  
  Index: apr_macro.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/inc/apr_macro.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- apr_macro.h       1999/10/16 12:47:59     1.2
  +++ apr_macro.h       1999/10/16 14:06:59     1.3
  @@ -62,18 +62,20 @@
   extern "C" {
   #endif
   
  +#include "apr_config.h"
  +
   #ifndef _POSIX_THREAD_SAFE_FUNCTIONS
  -#define SAFETY_LOCK(func_name, name_str) \
  +#define SAFETY_LOCK(funcname, namestr) \
       { \
       if (lock_##func_name == NULL) \
           if (ap_create_lock(&lock_##func_name, APR_MUTEX, APR_INTRAPROCESS, \
           name_str, NULL) != APR_SUCCESS) \
               return APR_NOTTHREADSAFE; \
  -    if (ap_lock(lock_##func_name) != APR_SUCCESS) \
  +    if (ap_lock(lock_##funcname) != APR_SUCCESS) \
           return APR_NOTTHREADSAFE; \
       }
   #else
  -#define SAFETY_LOCK(func_name, name_str)
  +#define SAFETY_LOCK(funcname, namestr)
   #endif
   
   #ifndef _POSIX_THREAD_SAFE_FUNCTIONS
  @@ -86,15 +88,61 @@
   #endif
   
   #ifdef HAVE_GMTIME_R
  -#define GMTIME_R(x, y) gmtime_r(x, y)
  +#define GMTIME_R(x, y) gmtime_r(x, y);
   #else
  -#define GMTIME_R(x, y) memcpy(y, gmtime(x), sizeof(y))
  +#define GMTIME_R(x, y) memcpy(y, gmtime(x), sizeof(y));
   #endif
   
   #ifdef HAVE_LOCALTIME_R
  -#define LOCALTIME_R(x, y) localtime_r(x, y)
  +#define LOCALTIME_R(x, y) localtime_r(x, y);
  +#else
  +#define LOCALTIME_R(x, y) memcpy(y, localtime(x), sizeof(y));
  +#endif
  +
  +#ifdef _POSIX_THREAD_SAFE_FUNCTIONS 
  +#define GETHOSTBYNAME(x, y, z) z = gethostbyname(x);
  +#else
  +#define GETHOSTBYNAME(x, y, z) \
  +            y = gethostbyname(x); \
  +            z = ap_palloc(NULL, sizeof(struct hostent)); \
  +            memcpy(z, y, sizeof(struct hostent));
  +#endif
  +
  +#ifdef _POSIX_THREAD_SAFE_FUNCTIONS 
  +#define GETHOSTBYADDR(x, y, z) z = gethostbyaddr(x, sizeof(struct in_addr), 
AF_INET);
  +#else
  +#define GETHOSTBYADDR(x, y, z) \
  +            y = gethostbyaddr(x, sizeof(struct in_addr), AF_INET); \
  +            z = ap_palloc(NULL, sizeof(struct hostent)); \
  +            memcpy(z, y, sizeof(struct hostent));
  +#endif
  +
  +#ifdef _POSIX_THREAD_SAFE_FUNCTIONS 
  +#define INET_NTOA(x, y, len) ap_cpystrn(y, inet_ntoa(x), len);
  +#else
  +#define INET_NTOA(x, y, len) ap_cpystrn(y, inet_ntoa(x), len);
  +#endif
  +
  +#ifdef _POSIX_THREAD_SAFE_FUNCTIONS 
  +#define READDIR(x, y, z)  y = readdir(x); \
  +                           if (y == NULL) { \
  +                               z = errno; \
  +                           } \
  +                           else { \
  +                               z = APR_SUCCESS; \
  +                           }
   #else
  -#define LOCALTIME_R(x, y) memcpy(y, localtime(x), sizeof(y))
  +#define READDIR(x, y, z) \
  +                          { \
  +                          struct dirent *temp = readdir(x); \
  +                          if (temp == NULL) { \
  +                              z = errno; \
  +                          } \
  +                          else { \
  +                              memcpy(y, temp, sizeof(struct dirent)); \
  +                              z = APR_SUCCESS; \
  +                          } \
  +                          }
   #endif
   
   #ifdef __cplusplus
  
  
  
  1.7       +1 -0      apache-2.0/src/lib/apr/network_io/unix/networkio.h
  
  Index: networkio.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/networkio.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- networkio.h       1999/10/10 17:08:00     1.6
  +++ networkio.h       1999/10/16 14:07:00     1.7
  @@ -58,6 +58,7 @@
   
   #include "apr_network_io.h"
   #include "apr_general.h"
  +#include "apr_lock.h"
   #ifdef HAVE_POLL_H
   #include <poll.h>
   #endif
  
  
  
  1.17      +15 -5     apache-2.0/src/lib/apr/network_io/unix/sockets.c
  
  Index: sockets.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- sockets.c 1999/10/15 14:20:13     1.16
  +++ sockets.c 1999/10/16 14:07:00     1.17
  @@ -58,6 +58,7 @@
   #include "apr_general.h"
   #include "apr_portable.h"
   #include "apr_lib.h"
  +#include "apr_macro.h"
   #include <errno.h>
   #include <string.h>
   #include <sys/socket.h>
  @@ -66,6 +67,11 @@
   #include <arpa/inet.h>
   #include <netdb.h>
   
  +#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
  +ap_lock_t *lock_network = NULL;
  +ap_lock_t *lock_inet = NULL;
  +#endif
  +
   static ap_status_t socket_cleanup(void *sock)
   {
       struct socket_t *thesocket = sock;
  @@ -204,8 +210,9 @@
   ap_status_t ap_getipaddr(char *addr, ap_ssize_t len,
                         const struct socket_t *sock)
   {
  -    char *temp = inet_ntoa(sock->addr->sin_addr);
  -    ap_cpystrn(addr,temp,len-1);
  +    SAFETY_LOCK(inet, "inetfile");
  +    INET_NTOA(sock->addr->sin_addr, addr, len - 1);
  +    SAFETY_UNLOCK(inet);
       return APR_SUCCESS;
   }
   
  @@ -286,21 +293,24 @@
   ap_status_t ap_connect(struct socket_t *sock, char *hostname)
   {
       struct hostent *hp;
  +    struct hostent *hp_safe;
   
       if (hostname != NULL) {
  -        hp = gethostbyname(hostname);
  +        SAFETY_LOCK(network, "net_file");
  +        GETHOSTBYNAME(hostname, hp, hp_safe);
  +        SAFETY_UNLOCK(network);
   
           if ((sock->socketdes < 0) || (!sock->addr)) {
               return APR_ENOTSOCK;
           }
  -        if (!hp)  {
  +        if (!hp_safe)  {
               if (h_errno == TRY_AGAIN) {
                   return EAGAIN;
               }
               return h_errno;
           }
       
  -        memcpy((char *)&sock->addr->sin_addr, hp->h_addr_list[0], 
hp->h_length);
  +        memcpy((char *)&sock->addr->sin_addr, hp_safe->h_addr_list[0], 
hp_safe->h_length);
   
           sock->addr_len = sizeof(*sock->addr);
       }
  
  
  
  1.9       +9 -0      apache-2.0/src/lib/apr/network_io/unix/sockopt.c
  
  Index: sockopt.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/unix/sockopt.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- sockopt.c 1999/10/10 20:34:57     1.8
  +++ sockopt.c 1999/10/16 14:07:00     1.9
  @@ -57,6 +57,7 @@
   #include "apr_network_io.h"
   #include "apr_general.h"
   #include "apr_lib.h"
  +#include "apr_macro.h"
   #include <errno.h>
   #include <string.h>
   #include <sys/socket.h>
  @@ -66,6 +67,10 @@
   #include <fcntl.h>
   #include <netdb.h>
   
  +#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
  +extern ap_lock_t *lock_network;
  +#endif
  +
   static ap_status_t soblock(int sd)
   {
       int fd_flags;
  @@ -203,9 +208,13 @@
   ap_status_t ap_get_remote_hostname(char **name, struct socket_t *sock)
   {
       struct hostent *hptr;
  +    struct hostent *hp_safe;
       
  +    SAFETY_LOCK(network, "net_file");
  +    GETHOSTBYADDR((char *)&(sock->addr->sin_addr), hptr, hp_safe);
       hptr = gethostbyaddr((char *)&(sock->addr->sin_addr), 
                            sizeof(struct in_addr), AF_INET);
  +    SAFETY_UNLOCK(network);
       if (hptr != NULL) {
           *name = ap_pstrdup(sock->cntxt, hptr->h_name);
           if (*name) {
  
  
  

Reply via email to