summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-07-23 10:52:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:28:54 -0500
commit944fe69d03f1fcd6ab680fcb672d06036f89f251 (patch)
tree9160931b1fc8b1a391bad7d39f3bdb05e33d7ee3 /source3
parent9e40557047b32dae012b0b5a3450c2c23b7895e5 (diff)
downloadsamba-944fe69d03f1fcd6ab680fcb672d06036f89f251.tar.gz
samba-944fe69d03f1fcd6ab680fcb672d06036f89f251.tar.bz2
samba-944fe69d03f1fcd6ab680fcb672d06036f89f251.zip
r24000: Add message_push_blob() and message_push_string().
The proposed new API convention is to start with a 0 bcc length and then push things step by step. These routines reallocate the outbuf and adjust the length and bcc fields as necessary. (This used to be commit 624f1fe4f6e022d73e78fa8c9646f6f64035f3ee)
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/util.c21
-rw-r--r--source3/smbd/srvstr.c40
2 files changed, 61 insertions, 0 deletions
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 5d583f25c3..25b60dc9ef 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -587,6 +587,27 @@ int set_message_end(const char *frombuf, void *outbuf,void *end_ptr)
}
/*******************************************************************
+ Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
+ Return the bytes added
+********************************************************************/
+
+ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
+{
+ size_t newlen = smb_len(*outbuf) + 4 + blob.length;
+ uint8 *tmp;
+
+ if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
+ DEBUG(0, ("talloc failed\n"));
+ return -1;
+ }
+ *outbuf = tmp;
+
+ memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
+ set_message_bcc(NULL, (char *)tmp, smb_buflen(tmp) + blob.length);
+ return blob.length;
+}
+
+/*******************************************************************
Reduce a file name, removing .. elements.
********************************************************************/
diff --git a/source3/smbd/srvstr.c b/source3/smbd/srvstr.c
index 4462a423c8..1daa25553f 100644
--- a/source3/smbd/srvstr.c
+++ b/source3/smbd/srvstr.c
@@ -41,3 +41,43 @@ size_t srvstr_push_fn(const char *function, unsigned int line,
/* 'normal' push into size-specified buffer */
return push_string_fn(function, line, base_ptr, dest, src, dest_len, flags);
}
+
+/*******************************************************************
+ Add a string to the end of a smb_buf, adjusting bcc and smb_len.
+ Return the bytes added
+********************************************************************/
+
+ssize_t message_push_string(uint8 **outbuf, const char *str, int flags)
+{
+ size_t buf_size = smb_len(*outbuf) + 4;
+ size_t grow_size;
+ size_t result;
+ uint8 *tmp;
+
+ /*
+ * We need to over-allocate, now knowing what srvstr_push will
+ * actually use. This is very generous by incorporating potential
+ * padding, the terminating 0 and at most 4 chars per UTF-16 code
+ * point.
+ */
+ grow_size = (strlen(str) + 2) * 4;
+
+ if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8,
+ buf_size + grow_size))) {
+ DEBUG(0, ("talloc failed\n"));
+ return -1;
+ }
+
+ result = srvstr_push((char *)tmp, tmp + buf_size, str, grow_size,
+ flags);
+
+ if (result == (size_t)-1) {
+ DEBUG(0, ("srvstr_push failed\n"));
+ return -1;
+ }
+ set_message_bcc(NULL, (char *)tmp, smb_buflen(tmp) + result);
+
+ *outbuf = tmp;
+
+ return result;
+}