【问题标题】:Why is getpwnam() always returning root information in a function?为什么 getpwnam() 总是在函数中返回根信息?
【发布时间】:2012-09-30 19:43:02
【问题描述】:

我编写了一个简单的程序,它在用户名上调用getpwnam(),将该用户名传递给一个函数,然后再次调用getpwnam()。出于某种原因,我总是在函数中获取 root 的密码信息。

#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>

void printuser(char *username) {
  printf("USERNAME2: %s\n", username);
  struct passwd *user_info = getpwnam(username);
  printf("USERNAME3: %s\n", username);
  printf("USERNAME4: %s\n", user_info->pw_name);
}

int main(int argc, char *argv[]) {
  struct passwd *user_info = getpwnam(argv[1]);
  printf("USERNAME1: %s\n", user_info->pw_name);
  printuser(user_info->pw_name);
  printf("USERNAME5: %s\n", user_info->pw_name);
}

程序总是产生以下输出:

$ ./test_getpwnam chenxiaolong
USERNAME1: chenxiaolong
USERNAME2: chenxiaolong
USERNAME3: root
USERNAME4: root
USERNAME5: root

我在手册页中找不到与此相关的任何内容。是不是我做错了什么?

提前致谢!

【问题讨论】:

    标签: c root getpwnam


    【解决方案1】:

    返回值可能指向一个静态区域,该区域被后续调用 getpwent()、getpwnam() 或 getpwuid() 覆盖。

    http://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html

    特别是,无法保证读/写的顺序,因此将getpwnam返回的数据传回getpwnam是不安全的。

    你真的不应该使用getpwnam;请改用getpwnam_r

    【讨论】:

    • 非常感谢!我应该更仔细地阅读手册页:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2016-03-30
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多