]> git.sur5r.net Git - openldap/blobdiff - servers/ldapd/main.c
Fix memory leak if duplicate attr name in at_insert
[openldap] / servers / ldapd / main.c
index 85f9b5d71f46cf53c34b1557c7a4a673a909ef4f..764f4e9c094e8267595f4baebe4541d97d77dc92 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /*
  * Copyright (c) 1990-1996 Regents of the University of Michigan.
  * All rights reserved.
@@ -106,12 +107,13 @@ main( int argc, char **argv )
        int                     udps;
 #endif
        int                     myport = LDAP_PORT;
+       int                     no_detach = 0;
        int                     i, pid, socktype;
        char                    *myname;
        fd_set                  readfds;
        struct hostent          *hp;
        struct sockaddr_in      from;
-       int                     len;
+       socklen_t               len;
        int                     dsapargc;
        char                    **dsapargv;
 #ifdef LDAP_PROCTITLE
@@ -150,13 +152,15 @@ main( int argc, char **argv )
                        dsapargc = 3;
                        break;
 
-               case 'd':       /* turn on debugging */
+               case 'd':       /* set debug level and 'do not detach' flag */
+                       no_detach = 1;
 #ifdef LDAP_DEBUG
                        ldap_debug = atoi( optarg );
                        if ( ldap_debug & LDAP_DEBUG_PACKETS )
-                               lber_debug = ldap_debug;
+                               ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &ldap_debug );
 #else
-                       fprintf( stderr, "Not compiled with -DLDAP_DEBUG!\n" );
+                       if ( atoi( optarg ) != 0 )
+                               fputs( "Not compiled with -DLDAP_DEBUG!\n", stderr );
 #endif
                        break;
 
@@ -261,11 +265,7 @@ main( int argc, char **argv )
                setproctitle( "initializing" );
 #endif
 #ifndef VMS
-#  ifdef LDAP_DEBUG
-               lutil_detach( ldap_debug, 1 );
-#  else
-               lutil_detach( 0, 1 );
-#  endif
+               lutil_detach( no_detach, 1 );
 #endif
                (void) SIGNAL( SIGCHLD, wait4child );
                (void) SIGNAL( SIGINT, log_and_exit );
@@ -406,7 +406,7 @@ main( int argc, char **argv )
 
 #ifdef HAVE_TCPD
                if ( !hosts_ctl("ldapd", (hp == NULL) ? "unknown" : hp->h_name,
-                       inet_ntoa( from.sin_addr ), STRING_UNKNOWN ) {
+                       inet_ntoa( from.sin_addr ), STRING_UNKNOWN) ) {
 
                        Debug( LDAP_DEBUG_ARGS, "connection from %s (%s) denied.\n",
                                (hp == NULL) ? "unknown" : hp->h_name,
@@ -418,7 +418,7 @@ main( int argc, char **argv )
                                    inet_ntoa( from.sin_addr ) );
                        }
 
-                       close(ns);
+                       tcp_close(ns);
                        continue;
                }
 #endif /* TCP_WRAPPERS */
@@ -436,7 +436,7 @@ main( int argc, char **argv )
 
 #ifdef VMS
                /* This is for debug on terminal on VMS */
-               close( tcps );
+               tcp_close( tcps );
 #ifdef LDAP_PROCTITLE
                setproctitle( hp == NULL ? inet_ntoa( from.sin_addr ) :
                    hp->h_name );
@@ -450,7 +450,7 @@ main( int argc, char **argv )
 
                switch( pid = fork() ) {
                case 0:         /* child */
-                       close( tcps );
+                       tcp_close( tcps );
 #ifdef LDAP_PROCTITLE
                         sprintf( title, "%s (%d)\n", hp == NULL ?
                                inet_ntoa( from.sin_addr ) : hp->h_name,
@@ -467,14 +467,14 @@ main( int argc, char **argv )
 #ifdef LDAP_DEBUG
                        if ( ldap_debug ) perror( "fork" );
 #endif
-                       close( ns );
+                       tcp_close( ns );
                        syslog( LOG_ERR, "fork failed %m" );
                        /* let things cool off */
                        sleep( 15 );
                        break;
 
                default:        /* parent */
-                       close( ns );
+                       tcp_close( ns );
                        Debug( LDAP_DEBUG_TRACE, "forked child %d\n", pid, 0,
                            0 );
                        break;
@@ -515,18 +515,10 @@ do_queries(
                conn_init();
        }
 
-       (void) memset( (void *) &sb, '\0', sizeof( sb ) );
-       sb.sb_sd = clientsock;
-       sb.sb_naddr = ( udp ) ? 1 : 0;
-#ifdef LDAP_CONNECTIONLESS
-       sb.sb_addrs = (void **)saddrlist;
-       sb.sb_fromaddr = &faddr;
-       sb.sb_useaddr = saddrlist[ 0 ] = &saddr;
-#endif
-       sb.sb_ber.ber_buf = NULL;
-       sb.sb_ber.ber_ptr = NULL;
-       sb.sb_ber.ber_end = NULL;
-
+       ber_pvt_sb_init( &sb );
+       ber_pvt_sb_set_desc( &sb, clientsock );
+       ber_pvt_sb_set_io( &sb, (udp) ? &ber_pvt_sb_io_udp :
+                                       &ber_pvt_sb_io_tcp, NULL );
        timeout.tv_sec = idletime;
        timeout.tv_usec = 0;
        for ( ;; ) {
@@ -555,7 +547,7 @@ do_queries(
                 * already waiting for us on the client sock.
                 */
 
-               if ( sb.sb_ber.ber_ptr >= sb.sb_ber.ber_end ) {
+               if ( ! ber_pvt_sb_data_ready( &sb ) ) {
                        if ( (rc = select( dtblsize, &readfds, 0, 0,
                            udp ? 0 : &timeout )) < 1 ) {
 #ifdef LDAP_DEBUG
@@ -581,7 +573,7 @@ do_queries(
                        }
                }
 
-               if ( sb.sb_ber.ber_ptr < sb.sb_ber.ber_end ||
+               if ( ber_pvt_sb_data_ready( &sb ) ||
                    FD_ISSET( clientsock, &readfds ) ) {
                        client_request( &sb, conns, udp );
                } else {
@@ -611,18 +603,31 @@ set_socket(
                 exit( 1 );
         }
 
+#ifdef SO_REUSEADDR
         /* set option so clients can't keep us from coming back up */
-       i = 1;
+               i = 1;
         if ( setsockopt( s, SOL_SOCKET, SO_REUSEADDR, (void *) &i, sizeof(i) )
-           < 0 ) {
+                   < 0 )
+               {
+                perror( "setsockopt" );
+                exit( 1 );
+        }
+#endif
+#ifdef SO_KEEPALIVE
+        /* enable keep alives */
+               i = 1;
+        if ( setsockopt( s, SOL_SOCKET, SO_KEEPALIVE, (void *) &i, sizeof(i) )
+                   < 0 )
+               {
                 perror( "setsockopt" );
                 exit( 1 );
         }
+#endif
 
         /* bind to a name */
        (void)memset( (void *)&addr, '\0', sizeof( addr ));
         addr.sin_family = AF_INET;
-        addr.sin_addr.s_addr = INADDR_ANY;
+        addr.sin_addr.s_addr = htonl(INADDR_ANY);
         addr.sin_port = htons( port );
         if ( bind( s, (struct sockaddr *) &addr, sizeof(addr) ) ) {
                 perror( "bind" );