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;
	}
}

Reply via email to