mirror of
https://github.com/samba-team/samba.git
synced 2025-01-27 14:04:05 +03:00
944fe69d03
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)
84 lines
2.6 KiB
C
84 lines
2.6 KiB
C
/*
|
|
Unix SMB/CIFS implementation.
|
|
server specific string routines
|
|
Copyright (C) Andrew Tridgell 2001
|
|
Copyright (C) Andrew Bartlett <abartlet@samba.org> 2003
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
extern int max_send;
|
|
|
|
/* Make sure we can't write a string past the end of the buffer */
|
|
|
|
size_t srvstr_push_fn(const char *function, unsigned int line,
|
|
const char *base_ptr, void *dest,
|
|
const char *src, int dest_len, int flags)
|
|
{
|
|
size_t buf_used = PTR_DIFF(dest, base_ptr);
|
|
if (dest_len == -1) {
|
|
if (((ptrdiff_t)dest < (ptrdiff_t)base_ptr) || (buf_used > (size_t)max_send)) {
|
|
#if 0
|
|
DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n"));
|
|
#endif
|
|
return push_string_fn(function, line, base_ptr, dest, src, -1, flags);
|
|
}
|
|
return push_string_fn(function, line, base_ptr, dest, src, max_send - buf_used, flags);
|
|
}
|
|
|
|
/* '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;
|
|
}
|