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)));
|
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.
|
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 */
|
/* 'normal' push into size-specified buffer */
|
||||||
return push_string_fn(function, line, base_ptr, dest, src, dest_len, flags);
|
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