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