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

memory leak



Hello everybody,

I'm developing a ldap application and I have noticed that my program
suffers a memory leak.
I'm using the default openldap libraries installed with redhat linux 7.2
(I think the release is 2.0.11). By the way, how can I check the release
of slapd if it's already installed and there are no sources?

Well, focusing in my problem, I have minimized the code to a simply
program
without errors treatment and so on. This are the ldap functions I use:

ld= ldap_init (ldapHost, atoi(ldapPort));
msgid = ldap_simple_bind_s (ld, radiusMgrDn, radiusMgrPw);
ldap_search_s (ld, basedn, LDAP_SCOPE_SUBTREE, filtro, NULL, 0 ,
&result);
numValues = ldap_count_entries (ld, result);
e = ldap_first_entry (ld, result);
ldapDatosRadius2 = ldap_get_values( ld, e, attrLdap_password);

And this are the parameters I free:

ldap_value_free (ldapDatosRadius);
ldap_value_free (ldapDatosRadius2);
ldap_msgfree (result);
ldap_unbind_s (ld);
/*ldap_msgfree (e);*/

(the complete main source code is shown at the end of the email)

I don't know exactly the variables I should free. I think I also should
free "e", but when I do it and I run the application, the program is
aborted and this error occurs:
$ ../_linux.O/prueba.a
prueba.a: io.c:184: ber_free: Assertion
`((ber)->ber_opts.lbo_valid==0x2)' failed.
Aborted

Does anybody know which are the variables I should free??

Thank you very much in advantage and have a nice day.
ALICIA

--------------------------------------------------------------
main ()
{
/* INICIO DE PROGRAMA */

LDAP *ld;
LDAPMessage *result, *e;
BerElement *ber;
char **ldapDatosRadius;
char **ldapDatosRadius2;
/* Cada array puede tener 5 atributos de 25 cararcteres cada uno */
char nomAtributosRadius[5][25]={"User-Name", "Password",
"SESIONES-INFOVIA"};
char nomAtributosLdap[5][25]={"uid", "userpassword", "portlimit"};
char cadena [4 * 1024];
char filtro[256];
char buffer[1024];
char attrLdap_username[CADENA_MAXIMA]={"uid"};  /* Vble donde se
almacena el nombre del atributo Ldap para el caso de User-Name */
char attrLdap_password [CADENA_MAXIMA]={"userpassword"};        /* Vble
donde se almacena el nombre del atributo atributo Ldap en el caso de
Password */
int numValues;
int numAtrib=3;                                         /* Numero de
atributos que se quieren del usuario buscado */
int k=1;
int cont, i, len, B, numIter;
int primer_atributo=1;
int msgid, rc;
struct timeval timeout;
/* Vbles que entraban por parametro en la libreria */
char loginUsuarioRadius[30]={"usuario1@ceaid2"};
char salida[4096];

/*Iniciamos bucle */
numIter = 5000;
for (B=1 ; B <= numIter ; B++)
{

/* Abrimos fichero de trazas */
logFile = fopen
("/home/redIP/LINBOX/DESARROLLO/PRUEBAS/ESQUELETO/trazas_prueba.txt",
"a");
fprintf (logFile, "\n\n\n TRAZAS INAUGURADAS (ITERACION=%d)....\n", B);

/*LDAP_INIT : CREA ESTRUCTURA LDAP */
fprintf (logFile, "******* ldap_init *******\n");
ld= ldap_init (ldapHost, atoi(ldapPort));

/*LDAP_SIMPLE_BIND: AUTENTICACION SIMPLE ASINCRONA (ldap_unbind hace
free de ld) */
fprintf (logFile, "******* ldap_simple_bind *******\n");
msgid = ldap_simple_bind_s (ld, radiusMgrDn, radiusMgrPw);

/* LDAP_SEARCH_S: REALIZA LA BUSQUEDA POR FILTRO (somos responsables de
liberar la memoria que puede reservar) */
/* Preparamos el filtro */
sprintf (filtro, "(uid=%s)", loginUsuarioRadius);
fprintf (logFile, "filtro: %s\n", filtro);

fprintf (logFile, "******* ldap_search_s *******\n");
ldap_search_s (ld, basedn, LDAP_SCOPE_SUBTREE, filtro, NULL, 0 ,
&result);

/*LDAP_COUNT_ENTRIES: NUM D ENRADAS ENCONTRADAS EN BUSQUEDA */
fprintf (logFile, "******* ldap_count_entries *******\n");
numValues = ldap_count_entries (ld, result);

/* LDAP_FIRST_ENTRY: CAPTURA DATOS DE PRIMERA ENTRADA */
fprintf (logFile, "******* ldap_first_entry *******\n");
e = ldap_first_entry (ld, result);

/*LDAP_GET_VALUES: MANEJAR VALORES DE ATRIBUTOS */
fprintf (logFile, "******* ldap_get_values *******\n");
ldapDatosRadius2 = ldap_get_values( ld, e, attrLdap_password);
if (ldapDatosRadius2 [0]!=NULL)
{
        sprintf (buffer, "Password=%s\n", ldapDatosRadius2[0]);
        strcpy (cadena, buffer);
        for (k=0; k<numAtrib; k++)
        {
                if ((strcmp(nomAtributosRadius [k], "Password") != 0) &&

(strcmp(nomAtributosRadius[k], "User-Name") != 0))
                {
                        fprintf (logFile, "******* ldap_get_value
*******\n");
                        ldapDatosRadius = ldap_get_values (ld, e,
nomAtributosLdap[k]);
                        if (ldapDatosRadius != NULL)
                        {
                                sprintf (buffer, "%s=%s",
nomAtributosRadius[k], ldapDatosRadius[0]);
                                /* Para quitarle los blancos al atributo

*/
                                cont = strlen (buffer) -1;
                                while (buffer [cont] == ' ')
                                {
                                        buffer [cont] = '\n';
                                        cont --;
                                }
                                if (primer_atributo == 1)
                                {
                                        strcat (cadena, buffer);
                                        primer_atributo = 0;
                                }
                                else
                                {
                                        strcat (cadena, ",");
                                        strcat (cadena, buffer);
                                }
                                cont = strlen (buffer);
for (i=1; ldapDatosRadius[i] != NULL; i++)
                                {
                                        fprintf (logFile, "Es un
atributo multi-value, ");
                                        sprintf (buffer, "%s=%s, ",
nomAtributosRadius[k], ldapDatosRadius[i]);
                                        strcat (cadena, buffer );
                                        fprintf (logFile, "NEW: Por
ahora la cadena es . %s", cadena);
                                }
                        }
                }
        }
        len = strlen(cadena);
        strcpy (salida, cadena);
        fprintf (logFile, "\nEl vector de respuesta se ha rellenado:
%s", salida);
        }

fprintf (logFile, "******* ldap_value_free *******\n");
ldap_value_free (ldapDatosRadius);
fprintf (logFile, "******* ldap_values_free *******\n");
ldap_value_free (ldapDatosRadius2);
fprintf (logFile, "******* ldap_msgfree *******\n");
ldap_msgfree (result);
fprintf (logFile, "******* ldap_msgfree *******\n");
/*ldap_msgfree (e);*/
fprintf (logFile, "Se ha cerrado la conexion\n");
ldap_unbind_s (ld);
fprintf (logFile, "Ahora devolveriamos al radius : %s\n", salida);

if (B==numIter)
        fprintf (logFile, "---->>  SALGO DEL PROGRAMA POR MI PROPIO
PIE!!\n");
/* Cerramos el fichero de trazas */
fclose (logFile);

}
/* fin del bucle*/


/*FIN DEL PROGRAMA */
}
----------------------------------------------------------------------