当用户不存在给定的UID时,getpwuid和getgrgid会导致段错误

时间:2017-04-02 20:23:17

标签: c uid file-ownership

我正在linux中运行一个C程序,它打印文件名及其用户和组所有权。我使用的是getpwuidgetgrgid

当文件由不存在的用户拥有时(即,/etc/passwd中我的机器上没有给定UID的条目),我的程序会以&#34;以信号11&#34; <终止而终止。< / p>

如何使我的程序与ls的行为相同,以便在用户不存在时打印数字UID,而不是segfaulting?

相关的代码段如下:

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 个答案:

答案 0 :(得分:2)

如果在/ etc / passwd数据库中找不到用户或者出现错误,则

getpwuidgetgrgid会返回NULL指针。 在访问它之前,您必须检查它不是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 :(得分:1)

查看手册页GETPWUID(3P)

  

返回值

     

getpwuid()函数应返回指向struct passwd的指针          具有匹配条目if中定义的结构          找到。 如果请求的条目不是,则返回空指针          发现,或发生错误。出错时,应将errno设置为指示          错误。

在访问任何内容之前检查空指针,例如

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