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