2017-04-02 3 views
0

のために、私は、ファイル名に加えて、そのユーザーとグループの所有権を印刷し、LinuxでCプログラムを、実行していますが存在しないとき、セグメンテーションフォールト。私はgetpwuidgetgrgidを使用しています。getpwuidとgetgrgid原因は、ユーザーが指定したUID

ファイルが存在しないユーザーによって所有されている場合(つまり、マシン上の特定のUIDに対して、/etc/passwdにエントリが存在しない場合)、私のプログラムは "シグナル11で終了"とセグメンテーションします。

私のプログラムはlsと同じように動作させることができるので、segfaultingではなく、ユーザーが存在しないときに数値の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

チェックをチェックする前にゼロをerrnoに設定する必要があります。値がNULLの場合は、名前としてlstatのuidを使用します –

答えて

1

getpwuidgetgrgidユーザは、/ etc/passwdデータベース内に見つからないかエラーが発生したされていない場合NULLポインタを返します。 segfaultsを回避するには、その値にアクセスする前にNULLでないことをチェックする必要があります。

戻り値lstatを確認して、成功したことを確認してからfileStatを使用する必要があります。それ以外の場合は別のセグメンテーションが発生します。 lstat -1を返し失敗し、そうでない場合は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を設定しますの。あなたはどちらPWDはそれが価値だアクセスする前にNULLでない場合は、特定のエラー

1

manページを見てみるとGETPWUID(3P)

返り値

はgetpwuid()関数は、構造体のpasswdへのポインタを返します が一致するエントリで定義された構造を持つ 。 要求されたエントリが でない場合、ヌルポインタが返されます。、またはエラーが発生します。エラーが発生した場合、エラー番号 を示すようにerrnoを設定します。例えば何かをアクセスする前にNULLポインタのための

チェック、

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