malloc / free Frage ... mal wieder ^^



  • Hallo,

    ich habe ne Frage zu malloc / free und obwohl ich schon auch das Forum durchsucht habe, bin ich nicht fündig geworden. Am besten ich poste mal das Codestückchen und kommetiere mein Gedanken dazu mit '///'. Das Programm/Funktion läuft so dass es am 1. free (nicht einkommentiert) ankommt, bzw. fehlschlägt.

    int check_webserver_user (void)
    {
            struct passwd *pw;
    /// hier hole ich mir den Speicher für den struct
            pw = (struct passwd *) malloc (sizeof (struct passwd));
    /// und prüfe obs geklappt hat
            if (pw == 0)
            {
                    error_html ("malloc failed. Aborting");
                    exit (EXIT_FAILURE);
            }
    /// Speicherbereich mit 0 füllen
            memset (pw, 0, sizeof (struct passwd));
    /// das struct mit Daten füllen
            pw = getpwnam (webserver_user);
    /// und prüfe obs geklappt hat
            if (pw == 0)
            {
                    return -1;
            }
    /// die if Abfrage gibt true zurück also ...
            if (pw->pw_uid != getuid ())
            {
    /// hier rein und zurück
                    free (pw);
                    return 1;
            }
            // free (pw);
            return 0;
    }
    

    So, wenn ich das Programm nun ausführe bekomme ich immer
    *** glibc detected *** ./secwrap: free(): invalid pointer
    bei dem new. Wenn ich das new dann einkommentiere, dann passierts natürlich nicht. Beim zweiten new habe ich daselbe Problem.

    Allerdings kann ich das nicht nachvollziehen. Der Speicher wird ordentlich allokiert und benutzt und beim free passiert dann das ... 😕

    Kann mir das jmd. bitte erklären?
    danke
    Alex



  • acwn schrieb:

    /// das struct mit Daten füllen
    pw = getpwnam (webserver_user);

    An dieser Stelle passen Code und Kommentar nicht zusammen. Hier wird keine Struct gefüllt, hier wird ein Zeiger umgebogen. pw zeigt danach auf den Rückgabewert von getpwnam, und damit nicht mehr auf den Speicher, den du vorher mit malloc geholt hast.



  • Lasse den ganzen malloc Kram weg, bei free musst du mal die Spezifikation von getpwnam anschauen, ob free möglich/nötig ist.

    int check_webserver_user (void)
    {
            struct passwd *pw;
            pw = getpwnam (webserver_user);
    /// und prüfe obs geklappt hat
            if (pw == 0)
            {
                    return -1;
            }
            if (pw->pw_uid != getuid ())
            {
            /* free (pw);*/
                    return 1;
            }
            /* free (pw);*/
            return 0;
    }
    


  • Danke für die fixen Antworten von euch beiden ^^
    In den Spezifikationen von getpwnam steht nicht explizit dass man mit malloc/free arbeiten muss. Ich dachte bisher, dass gehört zum guten Stil 🙂
    Ich habe den malloc Kram nun mal weggelassen, nun motzt valgrind auch nicht mehr 😃



  • malloc / free in Verbindung macht für mich nur wirklich Sinn, wenn ich
    vorher nicht weiß, wieviel Speicher ich brauche. Ich benutze doch auch
    im High-Level-Assembler auf der Z/OS nur dann getmain, freemain, wenn ich
    was dynamisch mache. Ich habe bisher in den seltensten Fällen wirklich
    malloc - free benötigt - gut bei einigen Dingen gehts nicht anders - aber im
    Regelfall weiß man doch, bez kann in der Anwendung begrenzen, wieviel Speicher gebraucht wird - man muß doch nicht immer alles in einem Rutsch einlesen und oder
    ausgeben. Aus der Großrechnerwelt kenne ich - und nutze ich auch mit C die Möglichkeiten der satzweisen Verarbeitung - hier ist halt der Datensatz nicht vordefiniert - sondern wird im Regelfall per lf oder cr-lf bestimmt.
    Ganz abgesehen davon, wenn ich malloc nicht nutze, kanns auch nicht passieren, dass ein free vergessen geht und die Kiste zugemüllt wird.


Anmelden zum Antworten