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:
parent
9e40557047
commit
944fe69d03
@ -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.
|
||||
********************************************************************/
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user