C++ strncpy() führt zu BOF



  • Hi
    Zuerstmal ein paar Infos:
    Compiler: g++/gcc
    OS: Linux Ubuntu 10.04

    Ich habe eine Anwendung geschrieben ,die quasi als Newsserver dienen soll geschrieben.
    Da diese an VBulletin anknüpfen soll ,muss ich auf die Datenbank zugreifen.
    Aus Sicherheitsgründen habe ich Prepared Statements verwendet ,allerdings ist die C-API für mich noch zu wenig dokumentiert.
    In C++ gibt es schöne Tutorials dazu.
    Deshalb habe ich meine Anwendung in C++ portiert (waren nur ein paar kleine Änderungen nötig).

    In gcc kompiliert funktioniert der Code einbahnfrei.
    Aber mit g++ compiliert führt ein strncpy() zum "Segmentation fault"-Fehler.

    Bin leider C++ Neuling und finde den Fehler nicht.

    Also hier der Code ,worin der Fehler liegt:

    int mysocfd = new_socket;//Hier wird der bereits existierende Socket an den neuen Thread übergeben.
    	new_socket = 0;//Globaler Socket wieder freigeben
    	char *buffer;//Pointer und Daten zu empfangen
    	int i;
    
    	recv(mysocfd,buffer,bufsize,0);
    	char buf[bufsize];//initialisiert ein char[] mit 1024
    	printf("bufsize: %i\nsizeof buf: %i\n",bufsize,(int)sizeof(buf));//Gibt überall 1024 aus
    	strncpy(buf,buffer,bufsize);//Hier ist der BOF. Da bricht er ab.
    

    Hab den Code zum besseren Verständniss kommentiert.
    Wäre super wenn jemand meinen Fehler finden könnte 🙂
    Freundliche Grüße und Danke im Vorhinein.

    //Edit:
    Hab das anze jetzt in C doch noch geschafft (PHP sei Dank) ,aber es wäre trotzdem interessant wieso ,das plötzlich einen Bufferoverflow verursacht.



  • Das hat nichts damit zu tun, ob du das als C oder C++ kompilierst. Das ist auch kein Buffer Overflow, das ist undefiniertes Verhalten. buffer ist ein uninitialisierter Zeiger.



  • Keine Ahnung von Pointern, aber mit "professionellen" Abkürkungen um sich werfen. http://de.wikipedia.org/wiki/BOF



  • Sorry ist es halt kein Bufferoverflow.
    Da der Fehler anscheinend beim strncpy() liegt ,hab ich mir gedacht ,dass das ein Overflow ist.
    Aber auf den Fehler seit ihr auch nicht gekommen oder? (soll keine bösartige Frage sein ,sondern eine ernst gemeinte).

    //Edit:
    Und ich weiß auerdem was es mit Pointern usw auf sich hat 😉
    Ich weiß ,dass ein Pointer nur die 4 oder 8 Byte(32/64 bit) lange Adresse einer anderne Variable angibt.



  • justnew schrieb:

    Aber auf den Fehler seit ihr auch nicht gekommen oder?

    MFK schrieb:

    buffer ist ein uninitialisierter Zeiger.



  • Ah Danke dir.
    Sorry falsch gelesen :S.
    Komisch in C hat er den anscheinend automatisch initialisiert XD.



  • justnew schrieb:

    Ah Danke dir.
    Sorry falsch gelesen :S.
    Komisch in C hat er den anscheinend automatisch initialisiert XD.

    Denke nicht, aber undefiniertes Verhalten kann auch gut gehen...


Log in to reply