]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Handle tagged attributes with multiple values in rlm_perl.
authorChris Mikkelson <cmikk@qwest.net>
Wed, 8 Feb 2012 19:14:11 +0000 (13:14 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 28 Oct 2012 13:42:28 +0000 (13:42 +0000)
src/modules/rlm_perl/rlm_perl.c

index aec3f465280f2c83fe0ed11bfbb361680824406d..4eca104f6480502c83c4918eb86a53d6c7daea82 100644 (file)
@@ -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);
        }
 }