From: Chris Mikkelson Date: Wed, 8 Feb 2012 19:14:11 +0000 (-0600) Subject: Handle tagged attributes with multiple values in rlm_perl. X-Git-Tag: release_3_0_0_beta1~1636 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ac66c98135322b076ea77fad65ea6aa8c9a8a67;p=thirdparty%2Ffreeradius-server.git Handle tagged attributes with multiple values in rlm_perl. --- diff --git a/src/modules/rlm_perl/rlm_perl.c b/src/modules/rlm_perl/rlm_perl.c index aec3f465280..4eca104f648 100644 --- a/src/modules/rlm_perl/rlm_perl.c +++ b/src/modules/rlm_perl/rlm_perl.c @@ -549,51 +549,40 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance) */ static void perl_store_vps(VALUE_PAIR *vp, HV *rad_hv) { - VALUE_PAIR *nvp, *vpa, *vpn; - AV *av; - char namebuf[256], *name; - char buffer[1024]; - int attr, vendor, len; + VALUE_PAIR *nvp, *vpa, *vpn; + AV *av; + char namebuf[256], *name; + char buffer[1024]; + int len; hv_undef(rad_hv); nvp = paircopy(vp); while (nvp != NULL) { - name = nvp->name; - attr = nvp->attribute; - vendor = nvp->vendor; - vpa = paircopy2(nvp, attr, vendor, -1); + if (nvp->flags.has_tag && (nvp->flags.tag != 0)) { + snprintf(namebuf, sizeof(namebuf), "%s:%d", + nvp->name, nvp->flags.tag); + name = namebuf; + } else { + name = nvp->name; + } + + vpa = paircopy2(nvp, nvp->attribute, nvp->vendor, nvp->flags.tag); if (vpa->next) { av = newAV(); - vpn = vpa; - while (vpn) { - len = vp_prints_value(buffer, sizeof(buffer), - vpn, FALSE); + for (vpn = vpa; vpn; vpn = vpn->next) { + len = vp_prints_value(buffer, sizeof(buffer), vpn, FALSE); av_push(av, newSVpv(buffer, len)); - vpn = vpn->next; } - hv_store(rad_hv, nvp->name, strlen(nvp->name), - newRV_noinc((SV *) av), 0); + hv_store(rad_hv, name, strlen(name), newRV_noinc((SV *)av), 0); } else { - if ((vpa->flags.has_tag) && - (vpa->flags.tag != 0)) { - snprintf(namebuf, sizeof(namebuf), "%s:%d", - nvp->name, nvp->flags.tag); - name = namebuf; - } - - len = vp_prints_value(buffer, sizeof(buffer), - vpa, FALSE); - hv_store(rad_hv, name, strlen(name), - newSVpv(buffer, len), 0); + len = vp_prints_value(buffer, sizeof(buffer), vpa, FALSE); + hv_store(rad_hv, name, strlen(name), newSVpv(buffer, len), 0); } pairfree(&vpa); - vpa = nvp; while ((vpa != NULL) && (vpa->attribute == attr) && (vpa->vendor == vendor)) - vpa = vpa->next; - pairdelete(&nvp, attr, vendor, -1); - nvp = vpa; + pairdelete(&nvp, nvp->attribute, nvp->vendor, nvp->flags.tag); } }