free unter Suse und Debian
-
Hallo zusammen,
Ich habe ein kleines Problem mit dem freigeben von Speicher. Unter Debian funktioniert folgender Code perfekt, jedoch unter SuSe wird mir der nachfolgende Fehler sowie ein Backtrace ausgegeben.
Leider weiss ich nicht wo genau der unterschied zwischen diesen beiden Betriebssystemen liegt und wie ich den Fehler am einfachsten beseitigen kann.Code:
void get_users(int *count, utmpx_t **users){ utmpx_t *u; utmpx_t *tmp_buffer = NULL; int lc = 0; setutxent(); if(getutxent() == NULL){ printf("No entry found\n"); } while ((u = getutxent()) != NULL){ if((strcmp(u->ut_user, "LOGIN") != 0) && (strcmp(u->ut_user, "") != 0) && (strcmp(u->ut_line, "") != 0) && u->ut_type == 7){ lc ++; if(u == NULL){ printf("Error\n"); break; } if(lc == 1){ tmp_buffer = (utmpx_t *) realloc(tmp_buffer, lc * sizeof(utmpx_t)); tmp_buffer[lc -1] = *u; } else { int i, save = 1; for(i = 0; i<lc; i++){ utmpx_t *pu = &tmp_buffer[i]; if(strcmp(u->ut_user, pu->ut_user) == 0){ save = 0; } } if(save == 1){ tmp_buffer = (utmpx_t *) realloc(tmp_buffer, lc * sizeof(utmpx_t)); tmp_buffer[lc - 1] = *u; } else { lc --; } } } } endutxent(); *users = tmp_buffer; *count = lc; } void free_users(int lc, utmpx_t *tmp_buffer){ int i = 0; for(i =0; i <lc; i++){ //Hier wird der Fehler beim zweiten durchlaufen der Schleife geworfen free(&tmp_buffer[i]); } }
Fehler:
# *** glibc detected *** ./uacd: free(): invalid pointer: 0x0804f310 *** ======= Backtrace: ========= /lib/libc.so.6[0xb7e7b6e1] /lib/libc.so.6(cfree+0x89)[0xb7e7cd79] ./uacd[0x804a1ae]
-
Du versuchst Speicher frei zu geben, der nicht mit malloc/calloc/realloc angelegt wurde...
-
Zu dem Unterschiedlichen Verhalten bzgl. Fehlermeldung: Es liegt an der Glibc. Dein Debian und dein Suse werden 100% unterschiedliche glibc Versionen haben und andere Flags gesetzt haben, als sie kompiliert wurden.