]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Handle pair_list created by fr_pair_list_afrom_str in proto_detail.c
authorNick Porter <nick@portercomputing.co.uk>
Wed, 6 Jan 2021 17:45:52 +0000 (17:45 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 21 Jan 2021 23:05:49 +0000 (23:05 +0000)
src/modules/proto_detail/proto_detail.c

index ed155ff1ccdb0ef364aecad07589bc27944bc180..fc94bf4b363ad309d09bcd27628d674aa74fe85d 100644 (file)
@@ -224,6 +224,7 @@ static int mod_decode(void const *instance, request_t *request, uint8_t *const d
        int                     num, lineno;
        uint8_t const           *p, *end;
        fr_pair_t               *vp;
+       fr_pair_list_t          tmp_list;
        fr_dcursor_t            cursor;
        time_t                  timestamp = 0;
 
@@ -261,6 +262,7 @@ static int mod_decode(void const *instance, request_t *request, uint8_t *const d
        lineno = 1;
        fr_dcursor_init(&cursor, &request->request_pairs);
        fr_dcursor_tail(&cursor);       /* Ensure we only free what we add on error */
+       fr_pair_list_init(&tmp_list);
 
        /*
         *      Parse each individual line.
@@ -321,15 +323,14 @@ static int mod_decode(void const *instance, request_t *request, uint8_t *const d
                }
 
                /*
-                *      The parsing function appends the created VPs
-                *      to the input list, so we need to set 'vp =
-                *      NULL'.  We don't want to have multiple cursor
-                *      functions walking over the list.
+                *      Ensure temporary list is empty before each use
                 */
-               vp = NULL;
-               if ((fr_pair_list_afrom_str(request->request_ctx, request->dict, (char const *) p, &vp) > 0) && vp) {
-                       fr_cursor_append(&cursor, vp);
+               fr_pair_list_clear(&tmp_list);
+               if ((fr_pair_list_afrom_str(request->request_ctx, request->dict, (char const *) p, &tmp_list) > 0) && !fr_pair_list_empty(&tmp_list)) {
+                       vp = fr_pair_list_head(&tmp_list);
+                       fr_tmp_pair_list_move(&request->request_pairs, &tmp_list);
                } else {
+                       vp = NULL;
                        RWDEBUG("Ignoring line %d - :%s", lineno, p);
                }