PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : prob mit pointern?



quinte17
30-06-2003, 18:14
ich habe hier folgenden codeabschnitt aufzurufen mit:


#define MAXLENG 100
#include <stdio.h>
#include <strings.h>
int main()
{
char ip[] = {"222.222.222.222"};
char name[] = {"ww17.kicks-ass.net"};
check_ipcache_new(ip,name);
return 0;
}




int check_ipcache_new(char *newip, char *hostname)
{
char str[MAXLENG+1] = "\0";
char ipaddr[MAXLENG+1] = "\0";
char dir[] = {"/var/dyndnsupdate/"};
FILE *infile;
int isthesame;
// HIER IST ipaddr noch ok
printf("1 %s %s\n",str,ipaddr);

if ((infile = fopen(strcat(dir,hostname),"r")) == NULL)
{
printf("2 %s %s\n",str,ipaddr);
return 0;
}
else
{
// HIER WIRD DES KOMISCHE IN ipaddr AUSGEGEBEN
printf("3 %s - %s - %s\n",str,ipaddr,hostname);
fgets(str, MAXLENG, infile);
printf("4 %s %s\n",str,ipaddr);
strcat(ipaddr, str);
fclose(infile);
}

isthesame = strcmp(ipaddr, newip);
printf("5 %d \"%s\" \"%s\"\n",isthesame,ipaddr,newip);

if (isthesame>0)
{
return 1;
}
else
{
return 0;
}
}


wenn die funktion gestartet wird dann gibt sie im moment folgendes aus:



1
3 - .net - ww17.kicks-ass.net
4 217.228.215.250 .net
5 -4 ".net217.228.215.250" "217.228.215.250"


wie zu sehen ist ist plötzlich in der variable ipaddress ".net" als zeichenfolge drin...
übergeben wir in newip ein char array der art: 217.228.215.250
und in hostname: ww17.kicks-ass.net

kann mir wer auf die sprünge helfen? ich bekomms einfach nicht ganz bugfrei ;(
ich vermute, dass der strcat schuld an der misere ist... aber sicher bin ich mir da nicht...

vielen dank schoneinmal im vorraus!!!!!!
mfg
[EDIT]noch ein nachtrag:
die file /var/dyndnsupdate/ww17.kicks-ass.net sollte die ip als zeichenfolge beinhalten... sonst kommt er gar nicht so weit [EDIT]

pik7
30-06-2003, 18:34
hallo,

char dir[] = {"/var/dyndnsupdate/"};
und
strcat(dir,hostname),"r")) == NULL)

ist das so richtig?

weil

The strcat() function appends the src string to the dest
string overwriting the `\0' character at the end of dest,
and then adds a terminating `\0' character. The strings
may not overlap, and the dest string must have enough
space for the result.


gruß

quinte17
30-06-2003, 18:41
des versteh ich nicht ganz... des zeugs hat ja nix mit der variable ipaddr zu tun...
und die arrays sind ja 100 zeichen lang, des sollte eigentlich schon ohne probs reichen.... *grml*

es passiert wirklcih nur wegen dem strcat... weil des zufällig was in ipaddr überlappt, ohne dass ich check warum...

kann des einer genauer erklären? wär echt net

danke!

[edit] apropos die manpage hab ich mir vorher scho durchgelesen [edit]

pik7
30-06-2003, 18:53
hallo,

char dir[] = {"/var/dyndnsupdate/"};

ist aber nur 19 zeichen lang
wenn du jetzt da noch "ww17.kicks-ass.net"
dranhängst liegst du auserhalb des Arrays also
schon in nem Speicherbereich eines anderen Arrays.
Da steht dann dein .net noch drin.

Tauche mal

char str[MAXLENG+1] = "\0";
char ipaddr[MAXLENG+1] = "\0";

in

char ipaddr[MAXLENG+1] = "\0";
char str[MAXLENG+1] = "\0";

dann sollte das .net in str auftauchen.

gruß

wraith
30-06-2003, 18:57
Wie bereits erwähnt,liegt das Problem am ersten strcat.
Du willst hostname an dir anhängen,dazu muß aber in dir genug Platz sein für die Anzahl der Zeichen von hostname.
Aber dir hat eine feste Länge,also wird dir strcat Speicher überschreiben,der hinter dir liegt.
Was das ist hängt davon ab,wie der Compiler deine lokalen Variablen anordnet,aber es sieht doch so aus,also ob er dir in ipaddr reinschreibt.

EDIT:
@pik7,
Das kann doch nicht dein Ernst sein,oder?

quinte17
30-06-2003, 19:00
krass!!!
danke dir ;D jetzt hab ichs gecheckt *grml bin ich doof*
4 augen sehen nunmal mehr als 2

danke nochmal ;)
jetzt funzts endlich

pik7
30-06-2003, 19:03
EDIT:
@pik7,
Das kann doch nicht dein Ernst sein,oder?


?

wraith
30-06-2003, 19:07
Original geschrieben von pik7
?
Mal ebend die Reihenfolge der char Arrays umstellen *kopfschüttel*.
Der Code mit dem strcat ist falsch,Bufferoverflow,bäng,undefiniertes Verhalten.
Das er jetzt in ein anderes Array reinschreibt,und der Code jetzt zufällig läuft kann man wohl nur als Hack bezeichnen.

quinte17
30-06-2003, 19:11
apropos: als ich die array getauscht habe, habe ich das von pik beschriebene fänomen wirklich beobachten können!
dein tipp, dass ich übersehen hab des chararray "dir[]" groß genug zu machen, hat mirs dann bugfrei gemacht! (ich will ja nicht einen krieg hier auslösen)

somit hab ich auch noch was gelernt!! (dass ich next time mal auf meine arrays mehr aufpassen muss *gg*)

aber danke nochmal an euch beide, ihr habt mir sehr geholfen

pik7
30-06-2003, 19:13
hallo,

@wraith
War eher als Demonstration gedacht damit
quinte versteht warums geht.

gruß

wraith
30-06-2003, 19:20
Original geschrieben von pik7

@wraith
War eher als Demonstration gedacht damit
quinte versteht warums geht.

Dann bitte das nächstemal dranschreiben,daß das als Demo gemeint ist :),sonst denkt man noch jemand programmiert wirklich so.

Ahja,
du kannst bei fgets die exakte Länge deines char-Arrays übergeben


fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1,

also kannst du das +1 hier wegnehmen.


char str[MAXLENGTH + 1];