summaryrefslogtreecommitdiff
path: root/source4/lib/stream/packet.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-11-10 11:10:40 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:46:03 -0500
commit872b821fca36bf543f2c3baf1296f25d1cb7e5a7 (patch)
tree3cab1b873acdaf976d22627515f5c11d8faf56be /source4/lib/stream/packet.c
parent7118df6df0970ce3403056a2ee073c18d0b06bd7 (diff)
downloadsamba-872b821fca36bf543f2c3baf1296f25d1cb7e5a7.tar.gz
samba-872b821fca36bf543f2c3baf1296f25d1cb7e5a7.tar.bz2
samba-872b821fca36bf543f2c3baf1296f25d1cb7e5a7.zip
r11636: a bit neater solution to the nt_cancel problem
(This used to be commit ba7864b07eebecd4d4eb2ce515412a49964ae179)
Diffstat (limited to 'source4/lib/stream/packet.c')
-rw-r--r--source4/lib/stream/packet.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/source4/lib/stream/packet.c b/source4/lib/stream/packet.c
index 7a453add53..a272b28c0c 100644
--- a/source4/lib/stream/packet.c
+++ b/source4/lib/stream/packet.c
@@ -45,6 +45,7 @@ struct packet_context {
BOOL serialise;
BOOL processing;
BOOL recv_disable;
+ BOOL nofree;
struct send_element {
struct send_element *next, *prev;
@@ -144,6 +145,14 @@ void packet_set_initial_read(struct packet_context *pc, uint32_t initial_read)
pc->initial_read = initial_read;
}
+/*
+ tell the packet system not to steal/free blobs given to packet_send()
+*/
+void packet_set_nofree(struct packet_context *pc)
+{
+ pc->nofree = True;
+}
+
/*
tell the caller we have an error
@@ -427,7 +436,14 @@ NTSTATUS packet_send(struct packet_context *pc, DATA_BLOB blob)
DLIST_ADD_END(pc->send_queue, el, struct send_element *);
el->blob = blob;
el->nsent = 0;
- talloc_steal(el, blob.data);
+
+ /* if we aren't going to free the packet then we must reference it
+ to ensure it doesn't disappear before going out */
+ if (pc->nofree) {
+ talloc_reference(el, blob.data);
+ } else {
+ talloc_steal(el, blob.data);
+ }
EVENT_FD_WRITEABLE(pc->fde);