Add tvb_set_child_real_data_tvbuff(), which allows you to tell the
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 14 Nov 2000 04:33:34 +0000 (04:33 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 14 Nov 2000 04:33:34 +0000 (04:33 +0000)
tvbuff routines that a particular TVBUFF_REAL_DATA tvbuff is a "child"
of another tvbuff. This link is utilized during a tvb_free_chain(), so that
the child is freed when no longer necessary.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@2642 f5534014-38df-0310-8fa8-9805f1628bb7

epan/tvbuff.c
epan/tvbuff.h

index 5e4fddaa444c4a41f42c3adf2c11b615de5c8bb3..4b3ab60bd8211acb28be69503ee16da53dfa47ff 100644 (file)
@@ -9,7 +9,7 @@
  *             the data of a backing tvbuff, or can be a composite of
  *             other tvbuffs.
  *
- * $Id: tvbuff.c,v 1.8 2000/11/13 07:19:35 guy Exp $
+ * $Id: tvbuff.c,v 1.9 2000/11/14 04:33:34 gram Exp $
  *
  * Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
  *
@@ -286,6 +286,22 @@ tvb_set_free_cb(tvbuff_t* tvb, tvbuff_free_cb_t func)
        tvb->free_cb = func;
 }
 
+static void
+add_to_used_in_list(tvbuff_t *tvb, tvbuff_t *used_in)
+{
+       tvb->used_in = g_slist_prepend(tvb->used_in, used_in);
+       tvb_increment_usage_count(tvb, 1);
+}
+
+void
+tvb_set_child_real_data_tvbuff(tvbuff_t* parent, tvbuff_t* child)
+{
+       g_assert(parent->initialized);
+       g_assert(child->initialized);
+       g_assert(child->type == TVBUFF_REAL_DATA);
+       add_to_used_in_list(parent, child);
+}
+
 void
 tvb_set_real_data(tvbuff_t* tvb, const guint8* data, guint length, gint reported_length)
 {
@@ -434,11 +450,6 @@ check_offset_length(tvbuff_t *tvb, gint offset, gint length,
        return;
 }
 
-static void
-add_to_used_in_list(tvbuff_t *tvb, tvbuff_t *used_in)
-{
-       tvb->used_in = g_slist_prepend(tvb->used_in, used_in);
-}
 
 void
 tvb_set_subset(tvbuff_t *tvb, tvbuff_t *backing,
@@ -455,7 +466,6 @@ tvb_set_subset(tvbuff_t *tvb, tvbuff_t *backing,
                        &tvb->tvbuffs.subset.offset,
                        &tvb->tvbuffs.subset.length);
 
-       tvb_increment_usage_count(backing, 1);
        tvb->tvbuffs.subset.tvb         = backing;
        tvb->length                     = tvb->tvbuffs.subset.length;
 
@@ -500,6 +510,7 @@ tvb_composite_append(tvbuff_t* tvb, tvbuff_t* member)
        g_assert(!tvb->initialized);
        composite = &tvb->tvbuffs.composite;
        composite->tvbs = g_slist_append( composite->tvbs, member );
+       add_to_used_in_list(member, tvb);
 }
 
 void
@@ -510,6 +521,7 @@ tvb_composite_prepend(tvbuff_t* tvb, tvbuff_t* member)
        g_assert(!tvb->initialized);
        composite = &tvb->tvbuffs.composite;
        composite->tvbs = g_slist_prepend( composite->tvbs, member );
+       add_to_used_in_list(member, tvb);
 }
 
 tvbuff_t*
index 5d43a0b4c477fe98c36f181431d75dda57f49059..3093ee3c43e79910c74f8d7550b33fc7345a2397 100644 (file)
@@ -9,7 +9,7 @@
  *             the data of a backing tvbuff, or can be a composite of
  *             other tvbuffs.
  *
- * $Id: tvbuff.h,v 1.6 2000/11/13 07:19:37 guy Exp $
+ * $Id: tvbuff.h,v 1.7 2000/11/14 04:33:34 gram Exp $
  *
  * Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
  *
@@ -85,7 +85,7 @@ tvbuff_t* tvb_new(tvbuff_type);
 
 /* Marks a tvbuff for freeing. The guint8* data of a TVBUFF_REAL_DATA
  * is *never* freed by the tvbuff routines. The tvbuff itself is actually freed
- * once its usage  count drops to 0.
+ * once its usage count drops to 0.
  *
  * Usage counts increment for any time the tvbuff is
  * used as a member of another tvbuff, i.e., as the backing buffer for
@@ -124,6 +124,17 @@ guint tvb_decrement_usage_count(tvbuff_t*, guint count);
 void tvb_set_free_cb(tvbuff_t*, tvbuff_free_cb_t);
 
 
+/* Attach a TVBUFF_REAL_DATA tvbuff to a parent tvbuff. This connection
+ * is used during a tvb_free_chain()... the "child" TVBUFF_REAL_DATA acts
+ * as if is part of the chain-of-creation of the parent tvbuff, although it
+ * isn't. This is useful if you need to take the data from some tvbuff,
+ * run some operation on it, like decryption or decompression, and make a new
+ * tvbuff from it, yet want the new tvbuff to be part of the chain. The reality
+ * is that the new tvbuff *is* part of the "chain of creation", but in a way
+ * that these tvbuff routines is ignorant of. Use this function to make
+ * the tvbuff routines knowledgable of this fact. */
+void tvb_set_child_real_data_tvbuff(tvbuff_t* parent, tvbuff_t* child);
+
 /* Sets parameters for TVBUFF_REAL_DATA. Can throw ReportedBoundsError. */
 void tvb_set_real_data(tvbuff_t*, const guint8* data, guint length, gint reported_length);