【问题标题】:getpwuid and getgrgid causes segfault when user does not exist for given UID当给定 UID 的用户不存在时,getpwuid 和 getgrgid 会导致段错误
【发布时间】:2017-04-02 20:23:16
【问题描述】:

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

当文件由不存在的用户拥有时(即,在我的机器上,/etc/passwd 中没有给定 UID 的条目),我的程序会出现“由信号 11 终止”的段错误。

如何使我的程序与ls 表现相同,以便在用户不存在时打印数字 UID,而不是段错误?

相关代码sn-p如下:

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);

【问题讨论】:

  • 在访问它的值之前检查 pwd 是否不为 NULL。如果值为 NULL,则使用 lstat 中的 uid 作为名称

标签: c uid file-ownership


【解决方案1】:

getpwuidgetgrgid 如果在 /etc/passwd 数据库中找不到用户或出现错误,则返回 NULL 指针。 您必须在访问它的值之前检查它不是 NULL 以避免段错误。

在使用fileStat 之前,您还必须检查lstat 的返回值以确保它成功,否则会导致另一个段错误。 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 设置为零

【讨论】:

    【解决方案2】:

    查看手册页GETPWUID(3P)

    返回值

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多