[Date Prev][Date Next] [Chronological] [Thread] [Top]

Possible memory leak in libldap.a/liblber.a



I have a found there is (a possible) memory leak in  libldap.a or liblber.a.
I could be wrong, but I have isolated all of the code associated with my
ldap searches.  The leak is definitely in the following code or in the libs.

I'm sending my code along, just in case I have an obvious leak in my code.

I've even removed ber_free from ldap_first_attribute and ldap_next_attribute
and  ber_free it my self.

Does anyone have any suggestions or ideas?

Thanks,

r_ldap.h
----------------------------------
/*
r_ldap.h
*/

#ifndef _R_LDAP_H
#define _R_LDAP_H

#include <sys/time.h>

#include <lber.h>
#include <ldap.h>

#include <string.h>
#include <stdlib.h>
#include <stdio.h>



#define SEARCH_TIMEOUT_SEC 	2
#define SEARCH_TIMEOUT_mSEC 	750


extern char             *progname;


int r_ldap_find_user(char *uname, char *password, int password_len, char
*ldap_server, int ldap_port, char *binddn, char *bindpw);


#endif  /*   _R_LDAP_H  */


r_ldap.c
----------------------------------
/*
r_ldap.c
*/


#include "r_ldap.h"


extern LDAP*	ld;
static char msg[256];


/*	int r_ldap_connect(char *ldap_server, int ldap_port, char *binddn,
char *bindpw);


Makes connection to LDAP server and bind.

*/

int r_ldap_connect(char *ldap_server, int ldap_port, char *binddn, char
*bindpw)
{


printf("Connect attempt\n");


	if ( (ld = ldap_open(ldap_server,ldap_port)) == NULL)
	{

                snprintf(msg, 256, "%s: ldap_open -
%s:%d\n",progname,ldap_server,ldap_port);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);
		return (-1);
	}

	if (ldap_simple_bind_s(ld, binddn, bindpw) != LDAP_SUCCESS)
	{


                snprintf(msg, 256, "%s: ldap_simple_bind_s\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);
		return (-1);
	}

	return 0;



}


/* 	int r_ldap_disconnect()

Closes connection to LDAP server.

*/

int r_ldap_disconnect()
{

	if (ld != (LDAP*)NULL)
	{


/*		if (ldap_ld_free(ld, 0) != LDAP_SUCCESS) */
		if (ldap_unbind(ld) != LDAP_SUCCESS) 
		{

                        snprintf(msg, 256, "%s: ldap_unbind\n",progname);
                        fprintf(stderr, msg); fflush(stderr);
                        log_err(msg);

			return (-1);
		}

		ld = (LDAP*)NULL;
	}
	return 0;
}



/* 	int r_ldap_free(LDAPMessage *result, char **vals, BerElement *ber)

Frees asso. LDAP memory.

*/

int r_ldap_free(LDAPMessage *result, char **vals, BerElement *ber)
{


	if (result != (LDAPMessage*)NULL)
	{
		ldap_msgfree(result);
	}

	if (ber != (BerElement*)NULL)
	{
		ber_free(ber,0);
	}

	if (vals != (char**)NULL)
	{
		ldap_value_free(vals);
	}

	return 0;
}




/*	int r_ldap_find_user(char *uname, char *password, int password_len,
char *ldap_server, int ldap_port, char *binddn, char *bindpw);

returns non 0 on failure

char *uname  -  users name

char *password  -  buffer

int password_len  -  len of buffer

char *ldap_server  -  server

int ldap_port  -  port

char *binddn  -  bind as 

char *bindpw  - password


*/

int r_ldap_find_user(char *uname, char *password, int password_len, char
*ldap_server, int ldap_port, char *binddn, char *bindpw)
{

	int		search_status	=0;

	LDAPMessage	*result	=(LDAPMessage*)NULL;
	LDAPMessage	*e	=(LDAPMessage*)NULL;

	char		searchbase[256];
	char		username[256];

	struct timeval	tv;
	char		*s_attr[2];

	char		*attr	=(char*)NULL;
	char		**vals	=(char**)NULL;
	BerElement	*ber	=(BerElement*)NULL;


	if (ld == (LDAP*)NULL)
	{


		if ((r_ldap_connect(ldap_server, ldap_port, binddn, bindpw))
!= 0) 
		{

	                snprintf(msg, 256, "%s: Could not connection to LDAP
server\n",progname);
        	        fprintf(stderr, msg); fflush(stderr);
                	log_err(msg);

			r_ldap_free(result, vals, ber);
			r_ldap_disconnect(); 
			return (1);
		}

	}


	if (get_searchbase(searchbase,username,uname) != 0)
	{

		r_ldap_free(result, vals, ber);
		return (-1);		
	}	

	tv.tv_sec	=SEARCH_TIMEOUT_SEC;
	tv.tv_usec	=SEARCH_TIMEOUT_mSEC;

	s_attr[0] = "userPassword";
	s_attr[1] = NULL;

	if ( (search_status =
ldap_search_st(ld,searchbase,LDAP_SCOPE_ONELEVEL, username, s_attr, 0, &tv ,
&result))
			 != LDAP_SUCCESS)
	{

		if (search_status == LDAP_SERVER_DOWN)
		{

	                snprintf(msg, 256, "%s: Lost connection to LDAP
server\n",progname);
        	        fprintf(stderr, msg); fflush(stderr);
                	log_err(msg);

			r_ldap_free(result, vals, ber);
			r_ldap_disconnect();

			return(1);
		}

                snprintf(msg, 256, "%s: ldap-search - searchbase:\"%s\"
filter:\"%s\" \n",progname,searchbase,username);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		r_ldap_free(result, vals, ber);
		return (-1);
	}


	e = result;
/*
	if ( (e = ldap_first_entry(ld,result)) == NULL)
	{

                snprintf(msg, 256, "%s: ldap_first_entry\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		r_ldap_free(result, vals, ber);
		return (-1);
	}
*/

	if ( (attr = ldap_first_attribute(ld, e, &ber)) == NULL)
	{

                snprintf(msg, 256, "%s: ldap_first_attribute\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		r_ldap_free(result, vals, ber);
		return (-1);
	}


	if ( (vals = ldap_get_values(ld, e, attr)) == NULL)
	{

                snprintf(msg, 256, "%s: ldap_get_values\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		r_ldap_free(result, vals, ber);
		return (-1);
	}


	r_ldap_free(result, vals, ber);
	strncpy(password,*vals,password_len);

	return 0;
}




int get_searchbase(char *r_ldap_searchbase, char *r_username, char
*raw_name)
{
	char	*pos		=(char *)NULL;
	char	*realm		=(char *)NULL;
	char	*tmp_name	=(char *)NULL;


	tmp_name	=strdup(raw_name);
	if (tmp_name == (char *)NULL)
	{
                snprintf(msg, 256, "%s: get_searchbase - out of
memory\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		return (-1);		
	}
	if ( (pos = strchr(tmp_name,'@')) == NULL)
	{
                snprintf(msg, 256, "%s: get_searchbase - '@' not found in
user name\n",progname);
                fprintf(stderr, msg); fflush(stderr);
                log_err(msg);

		return (-1);
	}
	*pos	='\0';
	realm	= ++pos;
	if ( (pos = strrchr(realm,'.')) != NULL)
	{
		*pos = '\0';
	}
	
	sprintf(r_ldap_searchbase,"ou=%s, ou=members, o=citest",realm);
	sprintf(r_username,"cn=%s",tmp_name);
	return 0;
}



-------------------------
Ashley Neal Hornbeck
Splitrock Services, Inc.
281.465.1318