我通过使用下面的代码遇到了(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/