If comment is passed to rte_pcapng_copy(), additional space
maybe needed at the end of the mbuf. To handle this case generate
a segmented mbuf with additional space for the options.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 lib/pcapng/rte_pcapng.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/lib/pcapng/rte_pcapng.c b/lib/pcapng/rte_pcapng.c
index 3067033e89..7c3c400c71 100644
--- a/lib/pcapng/rte_pcapng.c
+++ b/lib/pcapng/rte_pcapng.c
@@ -540,11 +540,24 @@ rte_pcapng_copy(uint16_t port_id, uint32_t queue,
        if (comment)
                optlen += pcapng_optlen(strlen(comment));
 
-       /* reserve trailing options and block length */
+       /*
+        * Try to put options at the end of this mbuf.
+        * If not use an mbuf chain.
+        */
        opt = (struct pcapng_option *)
                rte_pktmbuf_append(mc, optlen + sizeof(uint32_t));
-       if (unlikely(opt == NULL))
-               goto fail;
+       if (unlikely(opt == NULL)) {
+               struct rte_mbuf *ml = rte_pktmbuf_alloc(mp);
+
+               if (unlikely(ml == NULL))
+                       goto fail;
+
+               opt = (struct pcapng_option *)rte_pktmbuf_append(ml, optlen + 
sizeof(uint32_t));
+               if (unlikely(opt == NULL || rte_pktmbuf_chain(mc, ml) != 0)) {
+                       rte_pktmbuf_free(ml);
+                       goto fail;
+               }
+       }
 
        switch (direction) {
        case RTE_PCAPNG_DIRECTION_IN:
-- 
2.51.0

Reply via email to