Speicher wird überschrieben



  • Hallo zusammen!

    Habe ein seltsames Problem mit einem Programmmm dass eine ip adresse per argv übergeben bekommt.
    Die Ip Adresse wird mittels einer Funktion auf ihre Gültigkeit überprüft.
    Wenn Sie gültig ist, wird eine Connect Funktion aufgerufen.
    Die Funktion springt bei Aufruf und argv als Übergabeparameter mit der Fehlermeldung "The instuction at "0x004014d2" referenced memory at 0x00000004. The memory could not be read" aus dem Programm.

    Anbei mal die 2 Funktionen:

    int main(int argc, char * argv[2])
    {
    	char * z,*test;
    	long rc;
    	int i=0,http,ipwrong=1;
    	rc=startWinsock();
    
    	if ((argv[1]!=NULL && (strcmp(argv[1],"/?")==0)) || (argv[1]==NULL))
    	{
    		printf("Aufruf: netcheck.exe IP-Adresse Intervall in Sekunden");
    	}
    
             if ((chkip(argv[1])==0))
    		{
    			i=0;
    			do
    			{
    				z=get_time();
    // Hier knallt es 		         http=connectHTTP(argv[1],z);
    			}
    			while (http==0);
    		}
    	}
    	if (http==1) return 1;
    }
    
    //--------------------------------------------------------------------------
    
    int chkip(char * ipstr)
    {
    	char *ip[3],delim='.';
    	int  ipNum[3],i=0,ipwrong=0;
    
    	ipstr=strtok(ipstr,&delim);
    
    	while (ipstr!=NULL && i<=3)
    	{	
    		ip[i]=ipstr;
    		ipstr=strtok(NULL,&delim);
    		i++;
    	}
    
    	if (i>3)
    	{
    		i=0;
    		do
    		{
    			ipNum[i]=atoi(ip[i]);
    			printf("%i\n",ipNum[i]);
    			i++;
    		}
    		while (i<4);
    
    		for (i=0;i<4;i++)
    		{
    			if (ipNum[i]>256 || ipNum[i]<0)
    			{
    				ipwrong=1;
    			}
    		}
    	}
    	else {ipwrong=1;}
    	if (ipwrong==1) 
    	{
    		printf("IP-Adresse ungueltig");
    	}
    	return ipwrong;
    }
    

    Meine Vermutung ist, dass irgendwo in der Chkip-Funktion Speicher überschrieben wird, da der HTTP_Connect ohne vorherige Check der IP-Adresse funktioniert.

    Vielen Dank im vorraus.



  • Erstmal solltest du mit argc überprüfen, wieviele Parameter überhaupt übergeben wurden - das ist sicherer als alle argv[]-Elemente zu überprüfen.

    Zweitens: Ja, man: strtok modifiziert den übergebenen String.

    Und drittens: Das Array char* ip[] ist ein Feld zu klein für deine Daten.



  • strtok, zweiter parameter, muss ein string sein. bei dir ists nur ein pointer auf ein einzelnes unterminiertes zeichen.

    get_time() returnt einen pointer. wo liegt der bezeigte string?

    "if ipNum[i]>256" ist falsch. >=256 heisst es.


Anmelden zum Antworten