mirror of
https://github.com/samba-team/samba.git
synced 2025-01-25 06:04:04 +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 624f1fe4f6e022d73e78fa8c9646f6f64035f3ee)
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…
x
Reference in New Issue
Block a user