Я новичок в C, я получил ошибку сегодня, которая является:ядро ошибки сегментации сбрасывали гр
segmentation fault core dumped
Я использовал GDB для отслеживания кода, я обнаружил, что ошибка в этой строке:
if (!strcmp(user_pass, passwddata->passwd))
Где user_pass
это символа массив из и passwddata
является структурой, passwd
является членом структуры, которая также является типом с хар массив, я попытался изменить код
if (!strcmp(user_pass, "ttt"))
ошибка не происходит, поэтому я предполагаю, что ошибка происходит на этой структуры, если больше кода необходимо, я могу добавить, здесь я хочу понять, при каких условиях может возникнуть такая ошибка в структуре?
Вот код:
int main(int argc, char *argv[]) {
mypwent *passwddata; /* this has to be redefined in step 2 */
/* see pwent.h */
char important[LENGTH] = "***IMPORTANT***";
char user[LENGTH];
//char *c_pass; //you might want to use this variable later...
char prompt[] = "password: ";
char *user_pass;
sighandler();
while (TRUE) {
/* check what important variable contains - do not remove, part of buffer overflow test */
printf("Value of variable 'important' before input of login name: %s\n",
important);
printf("login: ");
fflush(NULL); /* Flush all output buffers */
__fpurge(stdin); /* Purge any data in stdin buffer */
if (gets(user) == NULL) /* gets() is vulnerable to buffer */
{
exit(0); /* overflow attacks. */
}
printf("******************* %s\n",user);
/* check to see if important variable is intact after input of login name - do not remove */
printf("Value of variable 'important' after input of login name: %*.*s\n",
LENGTH - 1, LENGTH - 1, important);
user_pass = getpass(prompt);
passwddata = getpwnam(user);
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^ %s\n", user_pass);
if (passwddata != NULL) {
/* You have to encrypt user_pass for this to work */
/* Don't forget to include the salt */
if (!strcmp(user_pass, "ttt")) {
printf(" You're in !\n");
/* check UID, see setuid(2) */
/* start a shell, use execve(2) */
}
}
printf("Login Incorrect \n");
}
return 0;
}
Либо 'passwddata', либо' passwd' являются недопустимыми. – cnicutar
Пожалуйста, добавьте код для создания user_pass и passwddata. Я подозреваю, что вы не создавали экземпляр указателя passwddata – AndyG