X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fplugins%2Fradius%2Favpair.c;h=bbe141d2d80acdc439307430c8916371c3e0e362;hb=04f851936555d7157e2d518fa233778eb96d3f23;hp=ebc1895c0a6900d79e8d799e596e1169dcaad8e4;hpb=c58bf2e8023dd846683f09cb00e15d64143dac8c;p=ppp.git diff --git a/pppd/plugins/radius/avpair.c b/pppd/plugins/radius/avpair.c index ebc1895..bbe141d 100644 --- a/pppd/plugins/radius/avpair.c +++ b/pppd/plugins/radius/avpair.c @@ -31,7 +31,7 @@ static void rc_extract_vendor_specific_attributes(int attrlen, * */ -VALUE_PAIR *rc_avpair_add (VALUE_PAIR **list, int attrid, void *pval, int len, +VALUE_PAIR *rc_avpair_add (VALUE_PAIR **list, int attrid, const void *pval, int len, int vendorcode) { VALUE_PAIR *vp; @@ -57,7 +57,7 @@ VALUE_PAIR *rc_avpair_add (VALUE_PAIR **list, int attrid, void *pval, int len, * */ -int rc_avpair_assign (VALUE_PAIR *vp, void *pval, int len) +int rc_avpair_assign (VALUE_PAIR *vp, const void *pval, int len) { int result = -1; @@ -65,19 +65,19 @@ int rc_avpair_assign (VALUE_PAIR *vp, void *pval, int len) { case PW_TYPE_STRING: - if (((len == 0) && (strlen ((char *) pval)) > AUTH_STRING_LEN) + if (((len == 0) && (strlen ((const char *) pval)) > AUTH_STRING_LEN) || (len > AUTH_STRING_LEN)) { error("rc_avpair_assign: bad attribute length"); return result; } if (len > 0) { - memcpy(vp->strvalue, (char *)pval, len); + memcpy(vp->strvalue, (const char *)pval, len); vp->strvalue[len] = '\0'; vp->lvalue = len; } else { - strncpy (vp->strvalue, (char *) pval, AUTH_STRING_LEN); - vp->lvalue = strlen((char *) pval); + strncpy ((char*) vp->strvalue, (const char *) pval, AUTH_STRING_LEN); + vp->lvalue = strlen((const char *) pval); } result = 0; @@ -107,7 +107,7 @@ int rc_avpair_assign (VALUE_PAIR *vp, void *pval, int len) * */ -VALUE_PAIR *rc_avpair_new (int attrid, void *pval, int len, int vendorcode) +VALUE_PAIR *rc_avpair_new (int attrid, const void *pval, int len, int vendorcode) { VALUE_PAIR *vp = (VALUE_PAIR *) NULL; DICT_ATTR *pda; @@ -161,7 +161,7 @@ VALUE_PAIR *rc_avpair_gen (AUTH_HDR *auth) DICT_ATTR *attr; VALUE_PAIR *vp; VALUE_PAIR *pair; - unsigned char hex[3]; /* For hex string conversion. */ + char hex[3]; /* For hex string conversion. */ char buffer[512]; /* @@ -175,12 +175,12 @@ VALUE_PAIR *rc_avpair_gen (AUTH_HDR *auth) { attribute = *ptr++; attrlen = *ptr++; - attrlen -= 2; - if (attrlen < 0) + if (attrlen < 2 || attrlen > length) { error("rc_avpair_gen: received attribute with invalid length"); break; } + attrlen -= 2; /* Handle vendor-specific specially */ if (attribute == PW_VENDOR_SPECIFIC) { @@ -222,6 +222,9 @@ VALUE_PAIR *rc_avpair_gen (AUTH_HDR *auth) { case PW_TYPE_STRING: + case PW_TYPE_IFID: + case PW_TYPE_IPV6ADDR: + case PW_TYPE_IPV6PREFIX: memcpy (pair->strvalue, (char *) ptr, (size_t) attrlen); pair->strvalue[attrlen] = '\0'; pair->lvalue = attrlen; @@ -423,7 +426,7 @@ void rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b) else /* look for the "p" entry in the "a" list (or run to end) */ { this_node = *a; - while (this_node != (VALUE_PAIR *) NULL) + while (this_node->next != (VALUE_PAIR *) NULL) { if (this_node == p) { @@ -597,7 +600,7 @@ int rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair) { case PW_TYPE_STRING: - strcpy (pair->strvalue, valstr); + strcpy ((char*) pair->strvalue, valstr); pair->lvalue = strlen(valstr); break; @@ -692,9 +695,10 @@ int rc_avpair_parse (char *buffer, VALUE_PAIR **first_pair) int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv) { DICT_VALUE *dval; - char buffer[32]; + char buffer[INET6_ADDRSTRLEN + 4]; // for a prefix: addr + '/' + prefixlen struct in_addr inad; unsigned char *ptr; + char *str; *name = *value = '\0'; @@ -721,7 +725,7 @@ int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv) } else { - strncat(value, ptr, 1); + strncat(value, (char*) ptr, 1); lv--; if (lv < 0) break; } @@ -753,6 +757,26 @@ int rc_avpair_tostr (VALUE_PAIR *pair, char *name, int ln, char *value, int lv) strncpy(value, buffer, lv-1); break; + case PW_TYPE_IFID: + ptr = pair->strvalue; + snprintf(buffer, sizeof (buffer), "%x:%x:%x:%x", + (ptr[0] << 8) + ptr[1], (ptr[2] << 8) + ptr[3], + (ptr[4] << 8) + ptr[5], (ptr[6] << 8) + ptr[7]); + strncpy(value, buffer, lv-1); + break; + + case PW_TYPE_IPV6ADDR: + inet_ntop(AF_INET6, pair->strvalue, buffer, sizeof (buffer)); + strncpy(value, buffer, lv-1); + break; + + case PW_TYPE_IPV6PREFIX: + inet_ntop(AF_INET6, pair->strvalue + 2, buffer, sizeof (buffer)); + str = buffer + strlen(buffer); + snprintf(str, sizeof (buffer) - (str - buffer), "/%d", *(pair->strvalue + 1)); + strncpy(value, buffer, lv-1); + break; + default: error("rc_avpair_tostr: unknown attribute type %d", pair->type); return (-1);