Hi all,
I am writing some program... simple program and I've got some code:
j=strcmp( "log", *(lines+i) );
printf( "ble\n" );
if( strcmp( "log", *(lines+i) ) == 0 )
{
printf( "ble2\n" );
it is in for loop. "ble" and "ble2" are some texts for debuging purposes :)
So... when I run my program I can see three times "ble" and only two
times "ble2"...
after last "ble" there is:
*** glibc detected *** free(): invalid next size (normal): 0x0804c208 ***
Przerwane
is it a bug in glibc or in my code?
I added file with that loop.
"Przerwane" means interrupted/broken/stopped, it is polish locale (LC=pl_PL)
#include <stdio.h>
#include <string.h>
#include "config.h"
int config_parse() {
int i,j;
char** lines = NULL;
char *eqch,*tmp;
unsigned int linesc = 0;
if( ( config_content == NULL ) || ( config_content==0 ) )
{
fprintf( logi, "=> Nie moge przetwarzaæ nie istniej±cej tre¶ci pliku konfiguracyjnego\n" );
return 0;
}
lines = (char**) malloc( sizeof( char* ) );
if( lines == NULL )
{
fprintf( logi, "=> B³±d alokacji pamiêci na vector linii\n" );
return 0;
}
*(lines) = config_content;
for( i = 0; i < config_contentl; i++ )
{
if( *(config_content+i) == '\n' )
{
lines = (char**) realloc( lines, sizeof( char** )*(linesc+1) );
if( lines == NULL )
{
fprintf( logi, "=> B³±d alokacji\n" );
return 0;
}
linesc++;
*(lines+linesc) = (config_content+i+1);
*(config_content+i) = '\0';
printf( "-> linesc++\n" );
}
}
fprintf( stdout, "-> linesc = %u\n", linesc );
for( i = 0; i < linesc; i++ )
{
if( *(*(lines+i)) == '#' )
{
continue;
}
/*
j = strlen( *(lines+i) );
if( (i != linesc-1) && (*(lines+i+1) != *(lines+i) +j +1) )
{
fprintf( logi, "=> Znak 0 wykryty w pliku konfiguracyjnym\n" );
fprintf( logi, " w miejscu numer %i\n",i );
free( lines );
return 0;
}
*/
eqch = strchr( *(lines+i), '=' );
if( eqch == NULL )
{
fprintf( logi, "=> Brak znaku = w linni %i\n",i );
free( lines );
return 0;
}
*eqch = '\0';
tmp = strtok( *(lines+i), " \t" );
if( ( tmp == NULL ) && ( eqch == *(lines+i) ) )
{
fprintf( logi, "=> B³êdna opcja w pliku konfiguracyjnym w linni %i\n",i );
free(lines);
return 0;
}
j=strcmp( "log", *(lines+i) );
printf( "ble\n" );
if( strcmp( "log", *(lines+i) ) == 0 )
{
config_configpathl = strlen( eqch+1 );
config_configpath = (char*) malloc( config_configpathl );
if( config_configpath == NULL )
{
fprintf( logi, "=> B³±d alokacji pamiêci na nazwe pliku loga dla linii %i\n",i );
free( lines );
return 0;
}
strcpy( config_configpath, eqch+1 );
fprintf( stdout, "-> log = `%s'\n", eqch+1 );
continue;
}
if( strcmp( "sysctl", *(lines+i) ) == 0 )
{
if( ! config_addsysctl( eqch+1 ) )
{
fprintf( logi, " B³±d dodawania opcji sysctl do listy w linni %i\n",i );
free( lines );
return 0;
}
fprintf( stdout, "-> sysctl = `%s'\n", eqch+1 );
continue;
}
if( strcmp( "ip", *(lines+i) ) == 0 )
{
if( ! config_addip( eqch+1 ) )
{
fprintf( logi, " B³±d dodawania opcji ip do listy w linni %i\n",i );
free( lines );
return 0;
}
fprintf( stdout, "-> ip = `%s'\n", eqch+1 );
continue;
}
fprintf( logi, "=> Nieznana opcja w pliku konfiguracyjnym w linni %i\n",i );
return 0;
}
}