2017-04-02 3 views
0

Ich führe ein C-Programm in Linux, das den Dateinamen plus Benutzer- und Gruppenbesitz ausgibt. Ich verwende getpwuid und getgrgid.getpwuid und getgrgid verursacht segfault, wenn der Benutzer nicht existiert für die angegebene UID

Wenn die Datei einem nicht existierenden Benutzer gehört (dh es gibt keinen Eintrag in /etc/passwd für die angegebene UID auf meinem Computer), wird mein Programm mit "terminated by signal 11" abgeglichen.

Wie kann ich mein Programm so verhalten wie ls, so dass es numerischen Ausdruck UID, wenn Benutzer nicht vorhanden ist, anstelle von segfaulting?

Relevante Codeausschnitt ist unten:

lstat(filename,&fileStat) 

struct group *grp; 
struct passwd *pwd; 

pwd = getpwuid(fileStat.st_uid); 
printf(" %s", pwd->pw_name); 

grp = getgrgid(fileStat.st_gid); 
printf(" %s", grp->gr_name); 
+2

überprüfen Sie, ob Pwd nicht NULL ist, bevor Sie auf seinen Wert zugreifen. Und wenn der Wert NULL ist, verwenden Sie die UID von Lstat als Name –

Antwort

1

getpwuid und getgrgid gibt einen NULL Zeiger, wenn der Benutzer nicht in/etc/passwd-Datenbank oder es wurde ein Fehler gefunden wird. Sie müssen überprüfen, dass nicht NULL vor dem Zugriff auf es Wert, um segfaults zu vermeiden.

Sie müssen auch den Rückgabewert von lstat überprüfen, um sicherzustellen, dass es erfolgreich war, bevor Sie fileStat verwenden, andernfalls verursacht es einen anderen segfault. lstat -1 zurück auf scheitern und setzt errno sonst 0. lstat(3)

int ret = lstat(filename,&fileStat) 

if(ret == -1){ 
    fprintf(stderr, "lstat: (%s): %s\n", filename, strerror(errno)); 
    return 1; 
} 

struct group *grp; 
struct passwd *pwd; 

pwd = getpwuid(fileStat.st_uid); 

if(pwd != NULL){ 
    printf(" %s", pwd->pw_name); 
}else{ 
    printf(" %ld", (long)fileStat.st_uid); 
} 

grp = getgrgid(fileStat.st_gid); 
if(grp != NULL){ 
printf(" %s", grp->gr_name);} 
else{ 
    printf(" %ld", (long)fileStat.st_gid); 
} 

getpwuid(3) Manchmal kann es einen NULL-Zeiger auf einen Fehler zurück und errno gesetzt wird. Welches Sie errno auf Null setzen müssen, bevor Sie nach dem spezifischen Fehler suchen

1

auf der Manpage Blick GETPWUID(3P)

UCKGABEWERT

Die getpwuid() Funktion einen Zeiger auf eine struct passwd zurückkehren mit der Struktur wie in einem übereinstimmenden Eintrag definiert, wenn gefunden. Ein Nullzeiger soll zurückgegeben werden, wenn der angeforderte Eintrag nicht gefunden ist oder ein Fehler auftritt. Im Fehlerfall muss errno so eingestellt werden, dass der Fehler angezeigt wird.

Vor jedem Zugriff auf einen Nullzeiger prüfen, z.

pwd = getpwuid(fileStat.st_uid); 
if (pwd) { 
    printf(" %s", pwd->pw_name); 
} else { 
    // handle non-existing user entry 
} 
Verwandte Themen