xref: /freebsd/usr.sbin/ppp/auth.c (revision 65309e5cda5d671cbca4763b481566ce387dcf7e)
165309e5cSBrian Somers /*-
265309e5cSBrian Somers  * Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
365309e5cSBrian Somers  *          based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
465309e5cSBrian Somers  *                           Internet Initiative Japan, Inc (IIJ)
565309e5cSBrian Somers  * All rights reserved.
6af57ed9fSAtsushi Murai  *
765309e5cSBrian Somers  * Redistribution and use in source and binary forms, with or without
865309e5cSBrian Somers  * modification, are permitted provided that the following conditions
965309e5cSBrian Somers  * are met:
1065309e5cSBrian Somers  * 1. Redistributions of source code must retain the above copyright
1165309e5cSBrian Somers  *    notice, this list of conditions and the following disclaimer.
1265309e5cSBrian Somers  * 2. Redistributions in binary form must reproduce the above copyright
1365309e5cSBrian Somers  *    notice, this list of conditions and the following disclaimer in the
1465309e5cSBrian Somers  *    documentation and/or other materials provided with the distribution.
15af57ed9fSAtsushi Murai  *
1665309e5cSBrian Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1765309e5cSBrian Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1865309e5cSBrian Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1965309e5cSBrian Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2065309e5cSBrian Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2165309e5cSBrian Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2265309e5cSBrian Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2365309e5cSBrian Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2465309e5cSBrian Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2565309e5cSBrian Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2665309e5cSBrian Somers  * SUCH DAMAGE.
27af57ed9fSAtsushi Murai  *
2897d92980SPeter Wemm  * $FreeBSD$
29af57ed9fSAtsushi Murai  */
3065309e5cSBrian Somers 
31972a1bcfSBrian Somers #include <sys/param.h>
3275240ed1SBrian Somers #include <netinet/in.h>
33eaa4df37SBrian Somers #include <netinet/in_systm.h>
34eaa4df37SBrian Somers #include <netinet/ip.h>
351fa665f5SBrian Somers #include <sys/un.h>
3675240ed1SBrian Somers 
37d5015272SBrian Somers #include <pwd.h>
3875240ed1SBrian Somers #include <stdio.h>
3975240ed1SBrian Somers #include <string.h>
40aceaed92SBrian Somers #include <termios.h>
4175240ed1SBrian Somers #include <unistd.h>
4275240ed1SBrian Somers 
435d9e6103SBrian Somers #include "layer.h"
4475240ed1SBrian Somers #include "mbuf.h"
4575240ed1SBrian Somers #include "defs.h"
46aceaed92SBrian Somers #include "log.h"
4775240ed1SBrian Somers #include "timer.h"
48af57ed9fSAtsushi Murai #include "fsm.h"
4929e275ceSBrian Somers #include "iplist.h"
5029e275ceSBrian Somers #include "throughput.h"
51eaa4df37SBrian Somers #include "slcompress.h"
525a72b6edSBrian Somers #include "lqr.h"
535a72b6edSBrian Somers #include "hdlc.h"
54af57ed9fSAtsushi Murai #include "ipcp.h"
5553c9f6c0SAtsushi Murai #include "auth.h"
5675240ed1SBrian Somers #include "systems.h"
576140ba11SBrian Somers #include "lcp.h"
583b0f8d2eSBrian Somers #include "ccp.h"
596140ba11SBrian Somers #include "link.h"
6042d4d396SBrian Somers #include "descriptor.h"
61b6dec9f0SBrian Somers #include "chat.h"
625d9e6103SBrian Somers #include "proto.h"
635ca5389aSBrian Somers #include "filter.h"
643b0f8d2eSBrian Somers #include "mp.h"
65972a1bcfSBrian Somers #ifndef NORADIUS
66972a1bcfSBrian Somers #include "radius.h"
67972a1bcfSBrian Somers #endif
68aceaed92SBrian Somers #include "cbcp.h"
69aceaed92SBrian Somers #include "chap.h"
70aceaed92SBrian Somers #include "async.h"
71aceaed92SBrian Somers #include "physical.h"
72aceaed92SBrian Somers #include "datalink.h"
735828db6dSBrian Somers #include "bundle.h"
74af57ed9fSAtsushi Murai 
75455aabc3SBrian Somers const char *
765e315498SBrian Somers Auth2Nam(u_short auth, u_char type)
77ed6a16c1SPoul-Henning Kamp {
785e315498SBrian Somers   static char chap[10];
795e315498SBrian Somers 
80455aabc3SBrian Somers   switch (auth) {
81455aabc3SBrian Somers   case PROTO_PAP:
82455aabc3SBrian Somers     return "PAP";
83455aabc3SBrian Somers   case PROTO_CHAP:
845e315498SBrian Somers     snprintf(chap, sizeof chap, "CHAP 0x%02x", type);
855e315498SBrian Somers     return chap;
86455aabc3SBrian Somers   case 0:
87455aabc3SBrian Somers     return "none";
88d025849cSBrian Somers   }
89455aabc3SBrian Somers   return "unknown";
9053c9f6c0SAtsushi Murai }
9153c9f6c0SAtsushi Murai 
92d5015272SBrian Somers static int
93d5015272SBrian Somers auth_CheckPasswd(const char *name, const char *data, const char *key)
94d5015272SBrian Somers {
95d5015272SBrian Somers   if (!strcmp(data, "*")) {
96d5015272SBrian Somers     /* Then look up the real password database */
97d5015272SBrian Somers     struct passwd *pw;
98d5015272SBrian Somers     int result;
99d5015272SBrian Somers 
100d5015272SBrian Somers     result = (pw = getpwnam(name)) &&
101d5015272SBrian Somers              !strcmp(crypt(key, pw->pw_passwd), pw->pw_passwd);
102d5015272SBrian Somers     endpwent();
103d5015272SBrian Somers     return result;
104d5015272SBrian Somers   }
105d5015272SBrian Somers 
106d5015272SBrian Somers   return !strcmp(data, key);
107d5015272SBrian Somers }
108d5015272SBrian Somers 
1091ae349f5Scvs2svn int
11092b09558SBrian Somers auth_SetPhoneList(const char *name, char *phone, int phonelen)
11192b09558SBrian Somers {
11292b09558SBrian Somers   FILE *fp;
113c39aa54eSBrian Somers   int n, lineno;
11492b09558SBrian Somers   char *vector[6];
11592b09558SBrian Somers   char buff[LINE_LEN];
11692b09558SBrian Somers 
11792b09558SBrian Somers   fp = OpenSecret(SECRETFILE);
118c39aa54eSBrian Somers   lineno = 0;
11992b09558SBrian Somers   if (fp != NULL) {
12092b09558SBrian Somers     while (fgets(buff, sizeof buff, fp)) {
121c39aa54eSBrian Somers       lineno++;
12292b09558SBrian Somers       if (buff[0] == '#')
12392b09558SBrian Somers         continue;
12492b09558SBrian Somers       buff[strlen(buff) - 1] = '\0';
12592b09558SBrian Somers       memset(vector, '\0', sizeof vector);
1265b78bdf8SBrian Somers       if ((n = MakeArgs(buff, vector, VECSIZE(vector), PARSE_REDUCE)) < 0)
127c39aa54eSBrian Somers         log_Printf(LogWARN, "%s: %d: Invalid line\n", SECRETFILE, lineno);
12892b09558SBrian Somers       if (n < 5)
12992b09558SBrian Somers         continue;
13092b09558SBrian Somers       if (strcmp(vector[0], name) == 0) {
13192b09558SBrian Somers         CloseSecret(fp);
13292b09558SBrian Somers         if (*vector[4] == '\0')
13392b09558SBrian Somers           return 0;
13492b09558SBrian Somers         strncpy(phone, vector[4], phonelen - 1);
13592b09558SBrian Somers         phone[phonelen - 1] = '\0';
13692b09558SBrian Somers         return 1;		/* Valid */
13792b09558SBrian Somers       }
13892b09558SBrian Somers     }
13992b09558SBrian Somers     CloseSecret(fp);
14092b09558SBrian Somers   }
14192b09558SBrian Somers   *phone = '\0';
14292b09558SBrian Somers   return 0;
14392b09558SBrian Somers }
14492b09558SBrian Somers 
14592b09558SBrian Somers int
14692b09558SBrian Somers auth_Select(struct bundle *bundle, const char *name)
147944f7098SBrian Somers {
14853c9f6c0SAtsushi Murai   FILE *fp;
149c39aa54eSBrian Somers   int n, lineno;
1501ae349f5Scvs2svn   char *vector[5];
15186e02934SBrian Somers   char buff[LINE_LEN];
15253c9f6c0SAtsushi Murai 
153643f4904SBrian Somers   if (*name == '\0') {
154972a1bcfSBrian Somers     ipcp_Setup(&bundle->ncp.ipcp, INADDR_NONE);
155643f4904SBrian Somers     return 1;
156643f4904SBrian Somers   }
157643f4904SBrian Somers 
158972a1bcfSBrian Somers #ifndef NORADIUS
159972a1bcfSBrian Somers   if (bundle->radius.valid && bundle->radius.ip.s_addr != INADDR_NONE) {
160972a1bcfSBrian Somers     /* We've got a radius IP - it overrides everything */
161972a1bcfSBrian Somers     if (!ipcp_UseHisIPaddr(bundle, bundle->radius.ip))
162972a1bcfSBrian Somers       return 0;
163972a1bcfSBrian Somers     ipcp_Setup(&bundle->ncp.ipcp, bundle->radius.mask.s_addr);
164972a1bcfSBrian Somers     /* Continue with ppp.secret in case we've got a new label */
165972a1bcfSBrian Somers   }
166972a1bcfSBrian Somers #endif
167972a1bcfSBrian Somers 
168643f4904SBrian Somers   fp = OpenSecret(SECRETFILE);
169c39aa54eSBrian Somers   lineno = 0;
170d5015272SBrian Somers   if (fp != NULL) {
17170ee81ffSBrian Somers     while (fgets(buff, sizeof buff, fp)) {
172c39aa54eSBrian Somers       lineno++;
17353c9f6c0SAtsushi Murai       if (buff[0] == '#')
17453c9f6c0SAtsushi Murai         continue;
175501f5480SBrian Somers       buff[strlen(buff) - 1] = '\0';
17670ee81ffSBrian Somers       memset(vector, '\0', sizeof vector);
1775b78bdf8SBrian Somers       if ((n = MakeArgs(buff, vector, VECSIZE(vector), PARSE_REDUCE)) < 0)
178c39aa54eSBrian Somers         log_Printf(LogWARN, "%s: %d: Invalid line\n", SECRETFILE, lineno);
1791ae349f5Scvs2svn       if (n < 2)
18053c9f6c0SAtsushi Murai         continue;
181501f5480SBrian Somers       if (strcmp(vector[0], name) == 0) {
1821ae349f5Scvs2svn         CloseSecret(fp);
183972a1bcfSBrian Somers #ifndef NORADIUS
184972a1bcfSBrian Somers         if (!bundle->radius.valid || bundle->radius.ip.s_addr == INADDR_NONE) {
185972a1bcfSBrian Somers #endif
18692b09558SBrian Somers           if (n > 2 && *vector[2] && strcmp(vector[2], "*") &&
18792b09558SBrian Somers               !ipcp_UseHisaddr(bundle, vector[2], 1))
188643f4904SBrian Somers             return 0;
189972a1bcfSBrian Somers           ipcp_Setup(&bundle->ncp.ipcp, INADDR_NONE);
190972a1bcfSBrian Somers #ifndef NORADIUS
191972a1bcfSBrian Somers         }
192972a1bcfSBrian Somers #endif
19392b09558SBrian Somers         if (n > 3 && *vector[3] && strcmp(vector[3], "*"))
19449052c95SBrian Somers           bundle_SetLabel(bundle, vector[3]);
195d5015272SBrian Somers         return 1;		/* Valid */
19653c9f6c0SAtsushi Murai       }
197501f5480SBrian Somers     }
19853c9f6c0SAtsushi Murai     CloseSecret(fp);
199643f4904SBrian Somers   }
200643f4904SBrian Somers 
201643f4904SBrian Somers #ifndef NOPASSWDAUTH
202643f4904SBrian Somers   /* Let 'em in anyway - they must have been in the passwd file */
203972a1bcfSBrian Somers   ipcp_Setup(&bundle->ncp.ipcp, INADDR_NONE);
204643f4904SBrian Somers   return 1;
205643f4904SBrian Somers #else
206972a1bcfSBrian Somers #ifndef NORADIUS
207972a1bcfSBrian Somers   if (bundle->radius.valid)
208972a1bcfSBrian Somers     return 1;
209972a1bcfSBrian Somers #endif
210972a1bcfSBrian Somers 
211972a1bcfSBrian Somers   /* Disappeared from ppp.secret ??? */
212643f4904SBrian Somers   return 0;
213643f4904SBrian Somers #endif
21453c9f6c0SAtsushi Murai }
21553c9f6c0SAtsushi Murai 
216af57ed9fSAtsushi Murai int
217972a1bcfSBrian Somers auth_Validate(struct bundle *bundle, const char *name,
218643f4904SBrian Somers              const char *key, struct physical *physical)
219af57ed9fSAtsushi Murai {
220643f4904SBrian Somers   /* Used by PAP routines */
221643f4904SBrian Somers 
222af57ed9fSAtsushi Murai   FILE *fp;
223c39aa54eSBrian Somers   int n, lineno;
2249c97abd8SBrian Somers   char *vector[5];
22586e02934SBrian Somers   char buff[LINE_LEN];
226af57ed9fSAtsushi Murai 
227643f4904SBrian Somers   fp = OpenSecret(SECRETFILE);
228c39aa54eSBrian Somers   lineno = 0;
229643f4904SBrian Somers   if (fp != NULL) {
23070ee81ffSBrian Somers     while (fgets(buff, sizeof buff, fp)) {
231c39aa54eSBrian Somers       lineno++;
232af57ed9fSAtsushi Murai       if (buff[0] == '#')
233af57ed9fSAtsushi Murai         continue;
234af57ed9fSAtsushi Murai       buff[strlen(buff) - 1] = 0;
23570ee81ffSBrian Somers       memset(vector, '\0', sizeof vector);
2365b78bdf8SBrian Somers       if ((n = MakeArgs(buff, vector, VECSIZE(vector), PARSE_REDUCE)) < 0)
237c39aa54eSBrian Somers         log_Printf(LogWARN, "%s: %d: Invalid line\n", SECRETFILE, lineno);
238af57ed9fSAtsushi Murai       if (n < 2)
239af57ed9fSAtsushi Murai         continue;
240972a1bcfSBrian Somers       if (strcmp(vector[0], name) == 0) {
241af57ed9fSAtsushi Murai         CloseSecret(fp);
242972a1bcfSBrian Somers         return auth_CheckPasswd(name, vector[1], key);
243af57ed9fSAtsushi Murai       }
244af57ed9fSAtsushi Murai     }
245af57ed9fSAtsushi Murai     CloseSecret(fp);
246d5015272SBrian Somers   }
247d5015272SBrian Somers 
248d5015272SBrian Somers #ifndef NOPASSWDAUTH
2491342caedSBrian Somers   if (Enabled(bundle, OPT_PASSWDAUTH))
250972a1bcfSBrian Somers     return auth_CheckPasswd(name, "*", key);
251d5015272SBrian Somers #endif
252d5015272SBrian Somers 
253d5015272SBrian Somers   return 0;			/* Invalid */
254af57ed9fSAtsushi Murai }
255af57ed9fSAtsushi Murai 
256af57ed9fSAtsushi Murai char *
257972a1bcfSBrian Somers auth_GetSecret(struct bundle *bundle, const char *name, int len,
258643f4904SBrian Somers               struct physical *physical)
259af57ed9fSAtsushi Murai {
260d5015272SBrian Somers   /* Used by CHAP routines */
261d5015272SBrian Somers 
262af57ed9fSAtsushi Murai   FILE *fp;
263c39aa54eSBrian Somers   int n, lineno;
2649c97abd8SBrian Somers   char *vector[5];
265c506ecd5SBrian Somers   static char buff[LINE_LEN];	/* vector[] will point here when returned */
266af57ed9fSAtsushi Murai 
267643f4904SBrian Somers   fp = OpenSecret(SECRETFILE);
268af57ed9fSAtsushi Murai   if (fp == NULL)
269af57ed9fSAtsushi Murai     return (NULL);
270d5015272SBrian Somers 
271c39aa54eSBrian Somers   lineno = 0;
27270ee81ffSBrian Somers   while (fgets(buff, sizeof buff, fp)) {
273c39aa54eSBrian Somers     lineno++;
274af57ed9fSAtsushi Murai     if (buff[0] == '#')
275af57ed9fSAtsushi Murai       continue;
276c506ecd5SBrian Somers     n = strlen(buff) - 1;
277c506ecd5SBrian Somers     if (buff[n] == '\n')
278c506ecd5SBrian Somers       buff[n] = '\0';	/* Trim the '\n' */
27970ee81ffSBrian Somers     memset(vector, '\0', sizeof vector);
2805b78bdf8SBrian Somers     if ((n = MakeArgs(buff, vector, VECSIZE(vector), PARSE_REDUCE)) < 0)
281c39aa54eSBrian Somers       log_Printf(LogWARN, "%s: %d: Invalid line\n", SECRETFILE, lineno);
282af57ed9fSAtsushi Murai     if (n < 2)
283af57ed9fSAtsushi Murai       continue;
284972a1bcfSBrian Somers     if (strlen(vector[0]) == len && strncmp(vector[0], name, len) == 0) {
285643f4904SBrian Somers       CloseSecret(fp);
286d5015272SBrian Somers       return vector[1];
287af57ed9fSAtsushi Murai     }
288af57ed9fSAtsushi Murai   }
289af57ed9fSAtsushi Murai   CloseSecret(fp);
290af57ed9fSAtsushi Murai   return (NULL);		/* Invalid */
291af57ed9fSAtsushi Murai }
29253c9f6c0SAtsushi Murai 
29353c9f6c0SAtsushi Murai static void
294b6e82f33SBrian Somers AuthTimeout(void *vauthp)
29553c9f6c0SAtsushi Murai {
296b6e82f33SBrian Somers   struct authinfo *authp = (struct authinfo *)vauthp;
29753c9f6c0SAtsushi Murai 
298dd7e2610SBrian Somers   timer_Stop(&authp->authtimer);
29953c9f6c0SAtsushi Murai   if (--authp->retry > 0) {
300f0cdd9c0SBrian Somers     authp->id++;
301f0cdd9c0SBrian Somers     (*authp->fn.req)(authp);
302dd7e2610SBrian Somers     timer_Start(&authp->authtimer);
303aceaed92SBrian Somers   } else {
304aceaed92SBrian Somers     log_Printf(LogPHASE, "Auth: No response from server\n");
305aceaed92SBrian Somers     datalink_AuthNotOk(authp->physical->dl);
306aceaed92SBrian Somers   }
30753c9f6c0SAtsushi Murai }
30853c9f6c0SAtsushi Murai 
30953c9f6c0SAtsushi Murai void
310f0cdd9c0SBrian Somers auth_Init(struct authinfo *authp, struct physical *p, auth_func req,
311f0cdd9c0SBrian Somers           auth_func success, auth_func failure)
31253c9f6c0SAtsushi Murai {
313f0cdd9c0SBrian Somers   memset(authp, '\0', sizeof(struct authinfo));
314479508cfSBrian Somers   authp->cfg.fsm.timeout = DEF_FSMRETRY;
315479508cfSBrian Somers   authp->cfg.fsm.maxreq = DEF_FSMAUTHTRIES;
316479508cfSBrian Somers   authp->cfg.fsm.maxtrm = 0;	/* not used */
317f0cdd9c0SBrian Somers   authp->fn.req = req;
318f0cdd9c0SBrian Somers   authp->fn.success = success;
319f0cdd9c0SBrian Somers   authp->fn.failure = failure;
320f0cdd9c0SBrian Somers   authp->physical = p;
321e2ebb036SBrian Somers }
32253c9f6c0SAtsushi Murai 
323e2ebb036SBrian Somers void
324f0cdd9c0SBrian Somers auth_StartReq(struct authinfo *authp)
325e2ebb036SBrian Somers {
326dd7e2610SBrian Somers   timer_Stop(&authp->authtimer);
327e2ebb036SBrian Somers   authp->authtimer.func = AuthTimeout;
3283b0f8d2eSBrian Somers   authp->authtimer.name = "auth";
329479508cfSBrian Somers   authp->authtimer.load = authp->cfg.fsm.timeout * SECTICKS;
330e2ebb036SBrian Somers   authp->authtimer.arg = (void *)authp;
331479508cfSBrian Somers   authp->retry = authp->cfg.fsm.maxreq;
33253c9f6c0SAtsushi Murai   authp->id = 1;
333f0cdd9c0SBrian Somers   (*authp->fn.req)(authp);
334dd7e2610SBrian Somers   timer_Start(&authp->authtimer);
33553c9f6c0SAtsushi Murai }
33653c9f6c0SAtsushi Murai 
33753c9f6c0SAtsushi Murai void
338dd7e2610SBrian Somers auth_StopTimer(struct authinfo *authp)
33953c9f6c0SAtsushi Murai {
340dd7e2610SBrian Somers   timer_Stop(&authp->authtimer);
341f0cdd9c0SBrian Somers }
342f0cdd9c0SBrian Somers 
343f0cdd9c0SBrian Somers struct mbuf *
344f0cdd9c0SBrian Somers auth_ReadHeader(struct authinfo *authp, struct mbuf *bp)
345f0cdd9c0SBrian Somers {
346f0cdd9c0SBrian Somers   int len;
347f0cdd9c0SBrian Somers 
34826af0ae9SBrian Somers   len = m_length(bp);
349f0cdd9c0SBrian Somers   if (len >= sizeof authp->in.hdr) {
350f0cdd9c0SBrian Somers     bp = mbuf_Read(bp, (u_char *)&authp->in.hdr, sizeof authp->in.hdr);
351f0cdd9c0SBrian Somers     if (len >= ntohs(authp->in.hdr.length))
352f0cdd9c0SBrian Somers       return bp;
353b7ff18adSBrian Somers     authp->in.hdr.length = htons(0);
354b31a24caSBrian Somers     log_Printf(LogWARN, "auth_ReadHeader: Short packet (%d > %d) !\n",
355b31a24caSBrian Somers                ntohs(authp->in.hdr.length), len);
356b7ff18adSBrian Somers   } else {
357b7ff18adSBrian Somers     authp->in.hdr.length = htons(0);
358b31a24caSBrian Somers     log_Printf(LogWARN, "auth_ReadHeader: Short packet header (%d > %d) !\n",
359eb2d27cfSBrian Somers                (int)(sizeof authp->in.hdr), len);
360b7ff18adSBrian Somers   }
361f0cdd9c0SBrian Somers 
36226af0ae9SBrian Somers   m_freem(bp);
363f0cdd9c0SBrian Somers   return NULL;
364f0cdd9c0SBrian Somers }
365f0cdd9c0SBrian Somers 
366f0cdd9c0SBrian Somers struct mbuf *
367f0cdd9c0SBrian Somers auth_ReadName(struct authinfo *authp, struct mbuf *bp, int len)
368f0cdd9c0SBrian Somers {
369f0cdd9c0SBrian Somers   if (len > sizeof authp->in.name - 1)
370b31a24caSBrian Somers     log_Printf(LogWARN, "auth_ReadName: Name too long (%d) !\n", len);
371f0cdd9c0SBrian Somers   else {
37226af0ae9SBrian Somers     int mlen = m_length(bp);
373f0cdd9c0SBrian Somers 
374f0cdd9c0SBrian Somers     if (len > mlen)
375b31a24caSBrian Somers       log_Printf(LogWARN, "auth_ReadName: Short packet (%d > %d) !\n",
376b31a24caSBrian Somers                  len, mlen);
377f0cdd9c0SBrian Somers     else {
378f0cdd9c0SBrian Somers       bp = mbuf_Read(bp, (u_char *)authp->in.name, len);
379f0cdd9c0SBrian Somers       authp->in.name[len] = '\0';
380f0cdd9c0SBrian Somers       return bp;
381f0cdd9c0SBrian Somers     }
382f0cdd9c0SBrian Somers   }
383f0cdd9c0SBrian Somers 
384f0cdd9c0SBrian Somers   *authp->in.name = '\0';
38526af0ae9SBrian Somers   m_freem(bp);
386f0cdd9c0SBrian Somers   return NULL;
38753c9f6c0SAtsushi Murai }
388