Module Name: src
Committed By: christos
Date: Fri Jul 1 15:09:28 UTC 2011
Modified Files:
src/lib/libtelnet: sra.c
Log Message:
- use defines for lengths
- strlcpy/snprintf
- KNK
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/lib/libtelnet/sra.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libtelnet/sra.c
diff -u src/lib/libtelnet/sra.c:1.9 src/lib/libtelnet/sra.c:1.10
--- src/lib/libtelnet/sra.c:1.9 Thu Jun 30 21:15:27 2011
+++ src/lib/libtelnet/sra.c Fri Jul 1 11:09:28 2011
@@ -32,7 +32,7 @@
#ifdef notdef
__FBSDID("$FreeBSD: src/contrib/telnet/libtelnet/sra.c,v 1.16 2002/05/06 09:48:02 markm Exp $");
#else
-__RCSID("$NetBSD: sra.c,v 1.9 2011/07/01 01:15:27 joerg Exp $");
+__RCSID("$NetBSD: sra.c,v 1.10 2011/07/01 15:09:28 christos Exp $");
#endif
#ifdef SRA
@@ -65,7 +65,7 @@
IdeaData ik;
extern int auth_debug_mode;
-extern char *line; /* see sys_term.c */
+extern char *line; /* see sys_term.c */
static int sra_valid = 0;
static int passwd_sent = 0;
@@ -73,6 +73,8 @@
static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0,
AUTHTYPE_SRA, };
+#define SMALL_LEN 256
+#define XSMALL_LEN 513
#define SRA_KEY 0
#define SRA_USER 1
#define SRA_CONTINUE 2
@@ -87,16 +89,15 @@
Data(Authenticator *ap, int type, void *d, int c)
{
unsigned char *p = str_data + 4;
- unsigned char *cd = (unsigned char *)d;
+ unsigned char *cd = d;
if (c == -1)
- c = strlen((char *)cd);
+ c = strlen(d);
if (auth_debug_mode) {
printf("%s:%d: [%d] (%d)",
- str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY",
- str_data[3],
- type, c);
+ str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY",
+ str_data[3], type, c);
printd(d, c);
printf("\r\n");
}
@@ -111,7 +112,7 @@
*p++ = SE;
if (str_data[3] == TELQUAL_IS)
printsub('>', &str_data[2], p - (&str_data[2]));
- return(telnet_net_write(str_data, p - str_data));
+ return telnet_net_write(str_data, p - str_data);
}
int
@@ -122,21 +123,21 @@
else
str_data[3] = TELQUAL_IS;
- user = (char *)malloc(256);
- xuser = (char *)malloc(513);
- pass = (char *)malloc(256);
- xpass = (char *)malloc(513);
- passprompt = (char *)malloc(256);
- xpassprompt = (char *)malloc(513);
+ user = malloc(SMALL_LEN);
+ xuser = malloc(XSMALL_LEN);
+ pass = malloc(SMALL_LEN);
+ xpass = malloc(XSMALL_LEN);
+ passprompt = malloc(SMALL_LEN);
+ xpassprompt = malloc(XSMALL_LEN);
if (user == NULL || xuser == NULL || pass == NULL || xpass ==
- NULL || passprompt == NULL || xpassprompt == NULL)
+ NULL || passprompt == NULL || xpassprompt == NULL)
return 0; /* malloc failed */
passwd_sent = 0;
- genkeys(pka,ska);
- return(1);
+ genkeys(pka, ska);
+ return 1;
}
/* client received a go-ahead for sra */
@@ -151,10 +152,10 @@
if (!Data(ap, SRA_KEY, (void *)pka, HEXKEYBYTES)) {
if (auth_debug_mode)
printf("Not enough room for authentication data\r\n");
- return(0);
+ return 0;
}
- return(1);
+ return 1;
}
/* server received an IS -- could be SRA KEY, USER, or PASS */
@@ -184,40 +185,40 @@
printf("Not enough room\r\n");
return;
}
- memcpy(pkb,data,HEXKEYBYTES);
+ memcpy(pkb, data, HEXKEYBYTES);
pkb[HEXKEYBYTES] = '\0';
- common_key(ska,pkb,&ik,&ck);
+ common_key(ska, pkb, &ik, &ck);
return;
case SRA_USER:
/* decode KAB(u) */
- if (cnt > 512) /* Attempted buffer overflow */
+ if (cnt > XSMALL_LEN - 1) /* Attempted buffer overflow */
break;
- memcpy(xuser,data,cnt);
+ memcpy(xuser, data, cnt);
xuser[cnt] = '\0';
- pk_decode(xuser,user,&ck);
+ pk_decode(xuser, user, &ck);
auth_encrypt_user(user);
#ifndef NOPAM
(void)check_user(user, "*");
#endif
- pk_encode(passprompt,xpassprompt,&ck);
- Data(ap, SRA_CONTINUE, (void *)xpassprompt, 512);
+ pk_encode(passprompt, xpassprompt, &ck);
+ Data(ap, SRA_CONTINUE, xpassprompt, XSMALL_LEN - 1);
return;
case SRA_PASS:
- if (cnt > 512) /* Attempted buffer overflow */
+ if (cnt > XSMALL_LEN - 1) /* Attempted buffer overflow */
break;
/* decode KAB(P) */
- memcpy(xpass,data,cnt);
+ memcpy(xpass, data, cnt);
xpass[cnt] = '\0';
- pk_decode(xpass,pass,&ck);
+ pk_decode(xpass, pass, &ck);
/* check user's password */
- valid = check_user(user,pass);
+ valid = check_user(user, pass);
if(valid) {
- /* PAM (via check_user()) may have changed 'user' */
+ /* PAM (via check_user()) may have changed 'user' */
auth_encrypt_user(user);
Data(ap, SRA_ACCEPT, (void *)0, 0);
skey.data = ck;
@@ -232,13 +233,9 @@
}
}
else {
- pk_encode(passprompt,xpassprompt,&ck);
- Data(ap, SRA_CONTINUE, (void *)xpassprompt, 512);
-/*
- Data(ap, SRA_REJECT, (void *)0, 0);
- sra_valid = 0;
- auth_finished(ap, AUTH_REJECT);
-*/
+ pk_encode(passprompt, xpassprompt, &ck);
+ Data(ap, SRA_CONTINUE, (void *)xpassprompt,
+ XSMALL_LEN - 1);
if (auth_debug_mode) {
printf("SRA user failed\r\n");
}
@@ -259,7 +256,7 @@
void
sra_reply(Authenticator *ap, unsigned char *data, int cnt)
{
- char uprompt[256],tuser[256];
+ char uprompt[SMALL_LEN], tuser[SMALL_LEN];
Session_Key skey;
size_t i;
@@ -275,33 +272,34 @@
}
return;
}
- memcpy(pkb,data,HEXKEYBYTES);
- pkb[HEXKEYBYTES] = '\0';
+ memcpy(pkb, data, HEXKEYBYTES);
+ pkb[HEXKEYBYTES] = '\0';
- common_key(ska,pkb,&ik,&ck);
+ common_key(ska, pkb, &ik, &ck);
enc_user:
/* encode user */
- memset(tuser,0,sizeof(tuser));
- sprintf(uprompt,"User (%s): ",UserNameRequested);
- if (telnet_gets(uprompt,tuser,255,1) == NULL) {
+ memset(tuser, 0, sizeof(tuser));
+ snprintf(uprompt, sizeof(uprompt), "User (%s): ",
+ UserNameRequested);
+ if (telnet_gets(uprompt, tuser, SMALL_LEN - 1, 1) == NULL) {
printf("\n");
exit(1);
}
if (tuser[0] == '\n' || tuser[0] == '\r' )
- strcpy(user,UserNameRequested);
+ strlcpy(user, UserNameRequested, SMALL_LEN);
else {
/* telnet_gets leaves the newline on */
- for(i=0;i<sizeof(tuser);i++) {
+ for(i = 0; i < sizeof(tuser); i++) {
if (tuser[i] == '\n') {
tuser[i] = '\0';
break;
}
}
- strcpy(user,tuser);
+ strlcpy(user, tuser, SMALL_LEN);
}
- pk_encode(user,xuser,&ck);
+ pk_encode(user, xuser, &ck);
/* send it off */
if (auth_debug_mode)
@@ -319,21 +317,21 @@
printf("[ SRA login failed ]\r\n");
goto enc_user;
}
- if (cnt > 512) {
+ if (cnt > XSMALL_LEN - 1) {
break;
} else if (cnt > 0) {
- (void)memcpy(xpassprompt,data,cnt);
+ (void)memcpy(xpassprompt, data, cnt);
pk_decode(xpassprompt, passprompt, &ck);
} else {
- (void)strcpy(passprompt, "Password: ");
+ (void)strlcpy(passprompt, "Password: ", SMALL_LEN);
}
/* encode password */
- memset(pass,0,256);
- if (telnet_gets(passprompt,pass,255,0) == NULL) {
+ memset(pass, 0, SMALL_LEN);
+ if (telnet_gets(passprompt, pass, SMALL_LEN - 1, 0) == NULL) {
printf("\n");
exit(1);
}
- pk_encode(pass,xpass,&ck);
+ pk_encode(pass, xpass, &ck);
/* send it off */
if (auth_debug_mode)
printf("Sent KAB(P)\r\n");
@@ -348,7 +346,7 @@
case SRA_REJECT:
printf("[ SRA refuses authentication ]\r\n");
printf("Trying plaintext login:\r\n");
- auth_finished(0,AUTH_REJECT);
+ auth_finished(0, AUTH_REJECT);
return;
case SRA_ACCEPT:
@@ -371,38 +369,38 @@
sra_status(Authenticator *ap __unused, char *name, size_t len, int level)
{
if (level < AUTH_USER)
- return(level);
+ return level;
if (UserNameRequested && sra_valid) {
strlcpy(name, UserNameRequested, len);
- return(AUTH_VALID);
+ return AUTH_VALID;
} else
- return(AUTH_USER);
+ return AUTH_USER;
}
-#define BUMP(buf, len) while (*(buf)) {++(buf), --(len);}
-#define ADDC(buf, len, c) if ((len) > 0) {*(buf)++ = (c); --(len);}
+#define BUMP(buf, len) while (*(buf)) { ++(buf), --(len); }
+#define ADDC(buf, len, c) if ((len) > 0) { *(buf)++ = (c); --(len); }
void
-sra_printsub(unsigned char *data, int cnt, unsigned char *buf, int buflen)
+sra_printsub(unsigned char *data, int cnt, unsigned char *ubuf, int buflen)
{
- char lbuf[32];
+ char lbuf[32], *buf = (char *)ubuf;
int i;
- buf[buflen-1] = '\0'; /* make sure its NULL terminated */
+ buf[buflen - 1] = '\0'; /* make sure its NULL terminated */
buflen -= 1;
switch(data[3]) {
case SRA_CONTINUE:
- strncpy((char *)buf, " CONTINUE ", buflen);
+ strncpy(buf, " CONTINUE ", buflen);
goto common;
case SRA_REJECT: /* Rejected (reason might follow) */
- strncpy((char *)buf, " REJECT ", buflen);
+ strncpy(buf, " REJECT ", buflen);
goto common;
case SRA_ACCEPT: /* Accepted (name might follow) */
- strncpy((char *)buf, " ACCEPT ", buflen);
+ strncpy(buf, " ACCEPT ", buflen);
common:
BUMP(buf, buflen);
@@ -416,25 +414,25 @@
break;
case SRA_KEY: /* Authentication data follows */
- strncpy((char *)buf, " KEY ", buflen);
+ strncpy(buf, " KEY ", buflen);
goto common2;
case SRA_USER:
- strncpy((char *)buf, " USER ", buflen);
+ strncpy(buf, " USER ", buflen);
goto common2;
case SRA_PASS:
- strncpy((char *)buf, " PASS ", buflen);
+ strncpy(buf, " PASS ", buflen);
goto common2;
default:
- sprintf(lbuf, " %d (unknown)", data[3]);
- strncpy((char *)buf, lbuf, buflen);
+ snprintf(lbuf, sizeof(lbuf), " %d (unknown)", data[3]);
+ strncpy(buf, lbuf, buflen);
common2:
BUMP(buf, buflen);
for (i = 4; i < cnt; i++) {
- sprintf(lbuf, " %d", data[i]);
- strncpy((char *)buf, lbuf, buflen);
+ snprintf(lbuf, sizeof(lbuf), " %d", data[i]);
+ strncpy(buf, lbuf, buflen);
BUMP(buf, buflen);
}
break;
@@ -461,7 +459,7 @@
const char *ttyn;
ttyn = ttyname;
- if (strncmp(ttyn, _PATH_DEV, sizeof(_PATH_DEV)-1) == 0)
+ if (strncmp(ttyn, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
ttyn += sizeof(_PATH_DEV) - 1;
return ((t = getttynam(ttyn)) && t->ty_status & TTY_SECURE);
@@ -476,25 +474,25 @@
if (isroot(name) && !rootterm(line))
{
- crypt("AA","*"); /* Waste some time to simulate success */
- return(0);
+ crypt("AA", "*"); /* Waste some time to simulate success */
+ return 0;
}
if (getpwnam_r(name, &pws, pwbuf, sizeof(pwbuf), &pw) == 0 &&
pw != NULL) {
if (pw->pw_shell == NULL) {
- return(0);
+ return 0;
}
salt = pw->pw_passwd;
xpasswd = crypt(cred, salt);
/* The strcmp does not catch null passwords! */
if (*pw->pw_passwd == '\0' || strcmp(xpasswd, pw->pw_passwd)) {
- return(0);
+ return 0;
}
- return(1);
+ return 1;
}
- return(0);
+ return 0;
}
#else /* !NOPAM */
@@ -505,7 +503,7 @@
* getting their username and password through an encrypted channel.
*/
-#define COPY_STRING(s) (s ? strdup(s):NULL)
+#define COPY_STRING(s) (s ? strdup(s) : NULL)
struct cred_t {
const char *uname;
@@ -514,12 +512,12 @@
typedef struct cred_t cred_t;
static int
-auth_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata)
+auth_conv(int num_msg, const struct pam_message **msg,
+ struct pam_response **resp, void *appdata)
{
int i;
- cred_t *cred = (cred_t *) appdata;
- struct pam_response *reply =
- malloc(sizeof(struct pam_response) * num_msg);
+ cred_t *cred = appdata;
+ struct pam_response *reply = malloc(sizeof(*reply) * num_msg);
if (reply == NULL)
return PAM_BUF_ERR;
@@ -532,7 +530,7 @@
/* PAM frees resp. */
break;
case PAM_PROMPT_ECHO_OFF: /* assume want password */
- (void)strlcpy(passprompt, msg[i]->msg, 256);
+ (void)strlcpy(passprompt, msg[i]->msg, SMALL_LEN);
reply[i].resp_retcode = PAM_SUCCESS;
reply[i].resp = COPY_STRING(cred->pass);
/* PAM frees resp. */
@@ -600,9 +598,9 @@
* point of view, the template user is always passed
* back as a changed value of the PAM_USER item.
*/
- if ((e = pam_get_item(pamh, PAM_USER, &item)) ==
+ if ((e = pam_get_item(pamh, PAM_USER, &item)) ==
PAM_SUCCESS) {
- strcpy(name, item);
+ strlcpy(name, item, SMALL_LEN);
} else
syslog(LOG_ERR, "Couldn't get PAM_USER: %s",
pam_strerror(pamh, e));