1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

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 624f1fe4f6)
This commit is contained in:
Volker Lendecke 2007-07-23 10:52:39 +00:00 committed by Gerald (Jerry) Carter
parent 9e40557047
commit 944fe69d03
2 changed files with 61 additions and 0 deletions

View File

@ -586,6 +586,27 @@ int set_message_end(const char *frombuf, void *outbuf,void *end_ptr)
PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
}
/*******************************************************************
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.
********************************************************************/

View File

@ -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;
}