c - getpwnam() 如何工作?

标签 c linux

我使用下面的代码遇到了(0xC0000005)的问题,我在Duo Security源代码中看到了这段代码,Duo可以成功运行这段代码,但是当我运行这段代码时,它会失败,并且这段代码与它们相同。我尝试调试,似乎在 *iter = '\0' 发生时失败。

#include <stdio.h>
#include <stdlib.h>

char *
duo_split_at(char *s, char delimiter, unsigned int position)
{
    unsigned int count = 0;
    char *iter = NULL;
    char *result = s;

    for (iter = s; *iter; iter++) {
        if (*iter == delimiter) {
            if (count < position) {
                result = iter + 1;
                count++;
            }
            *iter = '\0';
        }
    }

    if (count < position) {
        return NULL;
    }

    return result;
}

int main()
{
    char* pw_gecos = "code1/code2/code3//textField/usergecosparsed";
    const int delimited_position = 5;
    char delimiter = '/';
    char* user = NULL;
    user = duo_split_at(pw_gecos, delimiter, delimited_position);
    printf("%s",user);
    return 0;
}

下面的代码通过使用 getpwnam() 获取用户的 gecos 部分可以完美地工作:

#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>

char *
duo_split_at( char *s, char delimiter, unsigned int position )
{
    unsigned int    count   = 0;
    char        *iter   = NULL;
    char        *result = s;

    for ( iter = s; *iter; iter++ )
    {
        if ( *iter == delimiter )
        {
            if ( count < position )
            {
                result = iter + 1;
                count++;
            }
            *iter = '\0';
        }
    }

    if ( count < position )
    {
        return(NULL);
    }

    return(result);
}


int
main()
{
    char        * user = "daijwei";
    struct passwd   *pw;
    if ( (pw = getpwnam( user ) ) == NULL )
    {
        printf( "error" );
        return(-1);
    }
    const char      delimiter       = '/';
    const unsigned int  delimited_position  = 5;
    user = duo_split_at( pw->pw_gecos, delimiter, delimited_position );

    printf( "%s\n%s\n", user, pw->pw_gecos );

    return(0);
}

但是现在我遇到了新的问题,我从 GNU 网站下载了 glibc,尝试了解 getpwnam 是如何工作的,但我失败了。有谁知道 getpwnam 是如何工作的或者它的源代码?

我只找到一个名为 getpwnam.c 的文件,但在文件内部,我不明白它是什么。

#include <pwd.h>


#define LOOKUP_TYPE struct passwd
#define FUNCTION_NAME   getpwnam
#define DATABASE_NAME   passwd
#define ADD_PARAMS  const char *name
#define ADD_VARIABLES   name
#define BUFLEN      NSS_BUFLEN_PASSWD

#include "../nss/getXXbyYY.c"

最佳答案

问题是 pw_gecos 指向字符串文字,并且尝试修改字符串文字的内容会导致未定义的行为(在您的情况下,是运行时错误)。

如果将 pw_gecos 的声明更改为

char pw_gecos[] = "code1/code2/code3//textField/usergecosparsed";

你的代码应该可以工作。在本例中,您将为 pw_gecos 创建一个数组,并将字符串文字的内容复制到其中。

关于c - getpwnam() 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009379/

相关文章:

c++ - .cpp 和 .c 文件的替换引用

c - 模仿/模仿 C 中的大端行为?

python - django模板在哪里

linux - 系统配置键盘在 Fedora 上不工作

linux - 如何在行号处拆分文件

c - 实现一个简单的shell

c - 如果线程在其他线程等待(加入)之前退出怎么办?

c - 在ubuntu linux中查找用户的资源利用率

python - 在 Linux 系统上安装 Python-Tesseract

C Linux下串口读取数据失败