diff --git a/src/authradius.c b/src/authradius.c index 747d6e9..bc41fe5 100644 --- a/src/authradius.c +++ b/src/authradius.c @@ -72,6 +72,8 @@ #define PW_ACCT_INPUT_PACKETS 47 #define PW_ACCT_OUTPUT_PACKETS 48 #define PW_ACCT_TERMINATE_CAUSE 49 +#define PW_ACCT_INPUT_GIGAWORDS 52 +#define PW_ACCT_OUTPUT_GIGAWORDS 53 #define PW_EVENT_TIMESTAMP 55 @@ -375,7 +377,7 @@ int radsend(struct clientparam * param, int auth, int stop){ /* NAS-Port */ *ptr++ = PW_NAS_PORT_ID; *ptr++ = 6; - (*(uint32_t *)ptr)=htonl((uint32_t)ntohs((*SAPORT(¶m->srv->intsa)))); + (*(uint32_t *)ptr)=htonl(param->srv?(uint32_t)ntohs((*SAPORT(¶m->srv->intsa))):0); ptr+=4; total_length+=6; @@ -479,12 +481,28 @@ int radsend(struct clientparam * param, int auth, int stop){ (*(uint32_t *)ptr)=htonl((uint32_t)param->statssrv64); ptr+=4; total_length+=6; + /* Acct-Input-Gigawords */ + if(param->statssrv64 > 0xFFFFFFFFULL){ + *ptr++ = PW_ACCT_INPUT_GIGAWORDS; + *ptr++ = 6; + (*(uint32_t *)ptr)=htonl((uint32_t)(param->statssrv64 >> 32)); + ptr+=4; + total_length+=6; + } /* Acct-Output-Octets */ *ptr++ = PW_ACCT_OUTPUT_OCTETS; *ptr++ = 6; (*(uint32_t *)ptr)=htonl((uint32_t)param->statscli64); ptr+=4; total_length+=6; + /* Acct-Output-Gigawords */ + if(param->statscli64 > 0xFFFFFFFFULL){ + *ptr++ = PW_ACCT_OUTPUT_GIGAWORDS; + *ptr++ = 6; + (*(uint32_t *)ptr)=htonl((uint32_t)(param->statscli64 >> 32)); + ptr+=4; + total_length+=6; + } /* Acct-Input-Packets */ *ptr++ = PW_ACCT_INPUT_PACKETS; *ptr++ = 6; diff --git a/src/conf.c b/src/conf.c index 7c88530..1427419 100644 --- a/src/conf.c +++ b/src/conf.c @@ -115,10 +115,7 @@ unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsign return buf; } if(strchr((char *)name, '%')){ - struct clientparam fakecli; - - memset(&fakecli, 0, sizeof(fakecli)); - dobuf2(&fakecli, buf, NULL, NULL, ts, (char *)name); + dobuf2(NULL, buf, NULL, NULL, ts, (char *)name); } else switch(lt){ case NONE: diff --git a/src/log.c b/src/log.c index 464797e..6e39e07 100644 --- a/src/log.c +++ b/src/log.c @@ -20,16 +20,8 @@ struct srvparam logsrv; void dolog(struct clientparam * param, const unsigned char *s){ - static int init = 0; - - if(param)param->srv->logfunc(param, s); - else { - if(!init){ - srvinit(&logsrv, &logparam); - init = 1; - } - logstdout(&logparam, s); - } + if(param && param->srv)param->srv->logfunc(param, s); + else logstdout(NULL, s); } @@ -70,6 +62,9 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char long timezone; unsigned delay; + if(!logparam.srv) srvinit(&logsrv, &logparam); + if(!param) param = &logparam; + #ifdef _WIN32 @@ -317,15 +312,21 @@ int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char * int i; char * format; time_t t; + int has_srv; time(&t); - if(!param) return 0; - if(param->trafcountfunc)(*param->trafcountfunc)(param); - format = param->srv->logformat?(char *)param->srv->logformat : DEFLOGFORMAT; + has_srv = param && param->srv; + if(has_srv){ + if(param->trafcountfunc)(*param->trafcountfunc)(param); + format = param->srv->logformat?(char *)param->srv->logformat : DEFLOGFORMAT; + } + else { + format = DEFLOGFORMAT; + } tm = (*format == 'G' || *format == 'g')? gmtime(&t) : localtime(&t); i = dobuf2(param, buf, s, doublec, tm, format + 1); - clearstat(param); + if(has_srv) clearstat(param); return i; } @@ -339,8 +340,8 @@ void logstdout(struct clientparam * param, const unsigned char *s) { unsigned char tmpbuf[8192]; dobuf(param, tmpbuf, s, NULL); - log = param->srv->stdlog?param->srv->stdlog:conf.stdlog?conf.stdlog:stdout; - if(!param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) { + log = (param && param->srv && param->srv->stdlog)?param->srv->stdlog:conf.stdlog?conf.stdlog:stdout; + if(!param || !param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) { perror("printf()"); }; if(log != conf.stdlog)fflush(log); diff --git a/src/socks.c b/src/socks.c index be39cb6..8452407 100644 --- a/src/socks.c +++ b/src/socks.c @@ -77,11 +77,17 @@ void * sockschild(struct clientparam* param) { if ((i = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(451);} if (i && (unsigned)(res = sockgetlinebuf(param, CLIENT, buf, i, 0, conf.timeouts[STRING_S])) != i){RETURN(441);}; buf[i] = 0; - if(!param->username)param->username = (unsigned char *)strdup((char *)buf); + if(!param->username) { + param->username = (unsigned char *)strdup((char *)buf); + if(!param->username){RETURN(21);} + } if ((i = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(445);} if (i && (unsigned)(res = sockgetlinebuf(param, CLIENT, buf, i, 0, conf.timeouts[STRING_S])) != i){RETURN(441);}; buf[i] = 0; - if(!param->password)param->password = (unsigned char *)strdup((char *)buf); + if(!param->password) { + param->password = (unsigned char *)strdup((char *)buf); + if(!param->password){RETURN(21);} + } buf[0] = 1; buf[1] = 0; if(socksend(param, param->clisock, buf, 2, conf.timeouts[STRING_S])!=2){RETURN(481);} @@ -155,6 +161,7 @@ void * sockschild(struct clientparam* param) { } if(param->hostname)free(param->hostname); param->hostname = (unsigned char *)strdup((char *)buf); + if(!param->hostname){RETURN(21);} if (ver == 5) { if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);} buf[0] = (unsigned char) res; @@ -166,13 +173,17 @@ void * sockschild(struct clientparam* param) { else { if(sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]) < 0) {RETURN(441);} buf[127] = 0; - if(param->srv->needuser && *buf && !param->username)param->username = (unsigned char *)strdup((char *)buf); + if(param->srv->needuser && *buf && !param->username) { + param->username = (unsigned char *)strdup((char *)buf); + if(!param->username){RETURN(21);} + } if(!memcmp(SAADDR(¶m->req), "\0\0\0", 3)){ param->service = S_SOCKS45; if(sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]) < 0) {RETURN(441);} buf[127] = 0; if(param->hostname)free(param->hostname); param->hostname = (unsigned char *)strdup((char *)buf); + if(!param->hostname){RETURN(21);} if(!getip46(param->srv->family, buf, (struct sockaddr *) ¶m->req)) RETURN(100); param->sinsr = param->req; }