2015-04-15 2 views
0

у меня PAM модуль:ошибка PAM модуль (передавая аргумент 1 из 'сопзЬ' 'snprintf' выкидывает)

я пытаюсь скомпилировать его, используя строку:

gcc -fPIC -DPIC -shared -rdynamic -o pam_test.so pam_test.c 

Но у меня есть ошибки: код

pam_test.c: In function ‘pam_sm_authenticate’: 
pam_test.c:74:9: warning: passing argument 1 of ‘snprintf’ discards ‘const’ qualifier from pointer target type [enabled by default] 
     snprintf(msg[0].msg,60,"Second Password:%d:%d:%d:%d:",x1,x2,x3,x4); 
     ^
In file included from pam_test.c:10:0: 
/usr/include/stdio.h:386:12: note: expected ‘char * __restrict__’ but argument is of type ‘const char *’ 
extern int snprintf (char *__restrict __s, size_t __maxlen, 

модуль:

#include <security/pam_modules.h> 
#include <stdarg.h> 
#include <time.h> 
#include <stdlib.h> 
#include <stdio.h> 


#define PAM_SM_AUTH 
#define MAX_V 30 


PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags, int argc, const char **argv) 
{ 
     unsigned int ctrl; 
     int retval; 
     const char *name, *p; 
     char *right; 
     int x1,x2,x3,x4,y; 

     time_t mytime; 
     struct tm *mytm; 

     mytime=time(0); 
     mytm=localtime(&mytime); 


     srandom(mytime); 
     x1=random()%MAX_V; 
     x2=random()%MAX_V; 
     x3=random()%MAX_V; 
     x4=random()%MAX_V; 

     retval = pam_get_user(pamh, &name, "login: "); 

     { 
      struct pam_conv *conv; 
      struct pam_message *pmsg[3],msg[3]; 
      struct pam_response *response; 


     retval = pam_get_item(pamh, PAM_CONV, (const void **) &conv) ; 

     pmsg[0] = &msg[0]; 
     msg[0].msg_style = PAM_PROMPT_ECHO_OFF; 
     msg[0].msg=malloc(100); 
     snprintf(msg[0].msg,60,"Second Password:%d:%d:%d:%d:",x1,x2,x3,x4); 

     retval = conv->conv(1, (const struct pam_message **) pmsg 
          , &response, conv->appdata_ptr); 
     y=2*x1*mytm->tm_mday+x3*mytm->tm_hour; 
     right=malloc(100); 
     snprintf(right,20,"%d",y); 

     if (!(strcmp(right,response->resp))){ 
     return PAM_SUCCESS; 
     }else{ 
     return PAM_AUTH_ERR; 
     } 
     } 

     return PAM_SUCCESS; 

} 

PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags 
           ,int argc, const char **argv) 
{ 
     unsigned int ctrl; 
     int retval; 
     retval = PAM_SUCCESS; 
} 

#ifdef PAM_STATIC 
struct pam_module _pam_unix_auth_modstruct = { 
    "pam_test", 
    pam_sm_authenticate, 
    pam_sm_setcred, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
}; 
#endif 
+0

Проблема заключается в том, что вы передаете элемент 'const' некоторой функции, параметр которой не объявлен как' const'. Это не ошибка, а просто предупреждение о том, что вы теряете 'const'ness вещи. –

ответ

0

Проблема заключается в том, что в struct pam_message поле msg объявлено как const char*; то есть указатель на неизменяемую строку. Поэтому вы не должны перезаписывать его snprintf.

Простое решение, чтобы написать строку, прежде чем вставить указатель на него в msg:

char *s = malloc(100); 
snprintf(s, 100, "Second Password:%d:%d:%d:%d:",x1,x2,x3,x4); 
msg[0].msg = s; 

Примечание: Вы должны проверить возвращаемое значение snprintf. Если возвращаемое значение больше 100, то строка была усечена.

+0

Спасибо, компиляция успешно завершена, но PAM не работает :( В sys-журнале у меня есть сообщение: show_signal_msg: 9 обратных вызовов подавлено sshd [8868]: segfault at 0 ip 00007fb ... sp 00007fb ... error 4 в pam_test.so ... –

+0

@ Igor-Potapov: Я не вижу ничего очевидного (кроме того, что вы никогда не «освобождаете» какую-либо память, которую вы «malloc», но это не вызовет segfault, или, по крайней мере, не сразу), поэтому я боюсь, что вам нужно будет отлаживать. Удачи. – rici

+0

еще раз спасибо. будет лучше snprintf ((char *) msg ​​[0] .msg, 60, " Второй пароль:% d:% d:% d:% d: ", x1, x2, x3, x4); он работает нормально !!! –

Смежные вопросы