2017-04-02 116 views
0

我正在linux中運行一個C程序,它打印文件名加上它的用戶和組的所有權。我正在使用getpwuidgetgrgidgetpwuid和getgrgid導致segfault當用戶不存在給定的UID

當文件被不存在的用戶所擁有(即我的機器上的給定UID中沒有/etc/passwd的條目)時,我的程序會出現「由信號11終止」的段錯誤。

我該如何讓我的程序的行爲與ls相同,以便在用戶不存在時打印數字UID而不是分段?

相關的代碼片斷如下:

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

檢查pwd在訪問它的值之前是否不爲NULL。如果值爲NULL,則使用lstat中的uid作爲名稱 –

回答

1

getpwuidgetgrgid和返回NULL指針如果用戶沒有在/ etc /口令數據庫中發現或出現錯誤。 在訪問值之前,您必須檢查並非NULL以避免段錯誤。

您還必須檢查返回值lstat以確保它在使用前已成功fileStat否則會導致另一段錯誤。 lstat返回-1失敗,設置errno否則爲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) 有時,它可能會返回一條錯誤NULL指針,並將爲errno。在檢查特定錯誤之前,您必須將errno設置爲零

1

在手冊頁尋找GETPWUID(3P)

返回值

的getpwuid()函數將返回一個指向一個struct passwd文件 ,如果找到 ,則使用匹配條目定義的結構。 如果請求的條目不是 找到或發生錯誤,則應返回空指針。出錯時,應將errno設置爲指示 錯誤。

在訪問任何內容之前檢查空指針,例如,

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