1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-27 22:50:26 +03:00

Merge in the developer string options from HEAD. We need to ensure 3.0

is as stable as possible in the string department and some pain now
will help later :-).
Jeremy.
(This used to be commit 86e3eddac698d90f4666b8492b4603a4efbbd67b)
This commit is contained in:
Jeremy Allison 2003-03-18 01:48:11 +00:00
parent a8eaea53ed
commit d332200c25
5 changed files with 240 additions and 181 deletions

View File

@ -48,29 +48,48 @@
#endif /* !_SPLINT_ */
/* We need a number of different prototypes for our
non-existant fuctions */
char * __unsafe_string_function_usage_here__(void);
#if 0 && defined __GNUC__ && __GNUC__ >= 2 && defined __OPTIMIZE__
size_t __unsafe_string_function_usage_here_size_t__(void);
#define pstrcpy(d,s) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcpy((d), (s),sizeof(pstring)-1))
#define pstrcat(d,s) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcat((d), (s),sizeof(pstring)-1))
#define fstrcpy(d,s) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcpy((d),(s),sizeof(fstring)-1))
#define fstrcat(d,s) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : safe_strcat((d),(s),sizeof(fstring)-1))
size_t __unsafe_string_function_usage_here_char__(void);
#define fstrterminate(d) ((sizeof(d) != sizeof(fstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : (((d)[sizeof(fstring)-1]) = '\0'))
#define pstrterminate(d) ((sizeof(d) != sizeof(pstring) && sizeof(d) != sizeof(char *)) ? __unsafe_string_function_usage_here__() : (((d)[sizeof(pstring)-1]) = '\0'))
#ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS
#define wpstrcpy(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcpy_w((d),(s),sizeof(wpstring)))
#define wpstrcat(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcat_w((d),(s),sizeof(wpstring)))
#define wfstrcpy(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcpy_w((d),(s),sizeof(wfstring)))
#define wfstrcat(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) ? __unsafe_string_function_usage_here__() : safe_strcat_w((d),(s),sizeof(wfstring)))
/* if the compiler will optimize out function calls, then use this to tell if we are
have the correct types (this works only where sizeof() returns the size of the buffer, not
the size of the pointer). */
#else
#define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *))
#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1)
#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1)
#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1)
#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1)
#define fstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(fstring)) \
? __unsafe_string_function_usage_here_char__() \
: (((d)[sizeof(fstring)-1]) = '\0'))
#define pstrterminate(d) (CHECK_STRING_SIZE(d, sizeof(pstring)) \
? __unsafe_string_function_usage_here_char__() \
: (((d)[sizeof(pstring)-1]) = '\0'))
#define wpstrcpy(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \
? __unsafe_string_function_usage_here__() \
: safe_strcpy_w((d),(s),sizeof(wpstring)))
#define wpstrcat(d,s) ((sizeof(d) != sizeof(wpstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \
? __unsafe_string_function_usage_here__() \
: safe_strcat_w((d),(s),sizeof(wpstring)))
#define wfstrcpy(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \
? __unsafe_string_function_usage_here__() \
: safe_strcpy_w((d),(s),sizeof(wfstring)))
#define wfstrcat(d,s) ((sizeof(d) != sizeof(wfstring) && sizeof(d) != sizeof(smb_ucs2_t *)) \
? __unsafe_string_function_usage_here__() \
: safe_strcat_w((d),(s),sizeof(wfstring)))
#define push_pstring_base(dest, src, pstring_base) \
(CHECK_STRING_SIZE(pstring_base, sizeof(pstring)) \
? __unsafe_string_function_usage_here_size_t__() \
: push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE))
#else /* HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS */
#define fstrterminate(d) (((d)[sizeof(fstring)-1]) = '\0')
#define pstrterminate(d) (((d)[sizeof(pstring)-1]) = '\0')
@ -80,12 +99,10 @@ char * __unsafe_string_function_usage_here__(void);
#define wfstrcpy(d,s) safe_strcpy_w((d),(s),sizeof(wfstring))
#define wfstrcat(d,s) safe_strcat_w((d),(s),sizeof(wfstring))
#endif
#define push_pstring_base(dest, src, pstring_base) \
push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE)
/* replace some string functions with multi-byte
versions */
#define strlower(s) strlower_m(s)
#define strupper(s) strupper_m(s)
#endif /* HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS */
/* the addition of the DEVELOPER checks in safe_strcpy means we must
* update a lot of code. To make this a little easier here are some
@ -93,8 +110,109 @@ char * __unsafe_string_function_usage_here__(void);
#define pstrcpy_base(dest, src, pstring_base) \
safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1)
#define push_pstring_base(dest, src, pstring_base) \
push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE)
#define safe_strcpy_base(dest, src, base, size) \
safe_strcpy(dest, src, size-PTR_DIFF(dest,base)-1)
/* String copy functions - macro hell below adds 'type checking' (limited, but the best we can
do in C) and may tag with function name/number to record the last 'clobber region' on
that string */
#define pstrcpy(d,s) safe_strcpy((d), (s),sizeof(pstring)-1)
#define pstrcat(d,s) safe_strcat((d), (s),sizeof(pstring)-1)
#define fstrcpy(d,s) safe_strcpy((d),(s),sizeof(fstring)-1)
#define fstrcat(d,s) safe_strcat((d),(s),sizeof(fstring)-1)
/* the addition of the DEVELOPER checks in safe_strcpy means we must
* update a lot of code. To make this a little easier here are some
* functions that provide the lengths with less pain */
#define pstrcpy_base(dest, src, pstring_base) \
safe_strcpy(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1)
/* inside the _fn varients of these is a call to 'clobber_region' - which might
destory the stack on a buggy function. Help the debugging process by putting
the function and line it was last called from into a static buffer
But only for developers */
#ifdef DEVELOPER
#define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(__FUNCTION__,__LINE__,dest,src,maxlength)
#define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(__FUNCTION__,__LINE__,dest,src,maxlength)
#define safe_strcat(dest,src,maxlength) safe_strcat_fn2(__FUNCTION__,__LINE__,dest,src,maxlength)
#define push_string(base_ptr, dest, src, dest_len, flags) push_string_fn2(__FUNCTION__, __LINE__, base_ptr, dest, src, dest_len, flags)
#define pull_string(base_ptr, dest, src, dest_len, src_len, flags) pull_string_fn2(__FUNCTION__, __LINE__, base_ptr, dest, src, dest_len, src_len, flags)
#define clistr_push(cli, dest, src, dest_len, flags) clistr_push_fn2(__FUNCTION__, __LINE__, cli, dest, src, dest_len, flags)
#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_pull_fn2(__FUNCTION__, __LINE__, cli, dest, src, dest_len, src_len, flags)
#define alpha_strcpy(dest,src,other_safe_chars,maxlength) alpha_strcpy_fn(__FUNCTION__,__LINE__,dest,src,other_safe_chars,maxlength)
#define StrnCpy(dest,src,n) StrnCpy_fn(__FUNCTION__,__LINE__,dest,src,n)
#else
#define overmalloc_safe_strcpy(dest,src,maxlength) safe_strcpy_fn(NULL,0,dest,src,maxlength)
#define safe_strcpy(dest,src,maxlength) safe_strcpy_fn2(NULL,0,dest,src,maxlength)
#define safe_strcat(dest,src,maxlength) safe_strcat_fn2(NULL,0,dest,src,maxlength)
#define push_string(base_ptr, dest, src, dest_len, flags) push_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, flags)
#define pull_string(base_ptr, dest, src, dest_len, src_len, flags) pull_string_fn2(NULL, 0, base_ptr, dest, src, dest_len, src_len, flags)
#define clistr_push(cli, dest, src, dest_len, flags) clistr_push_fn2(NULL, 0, cli, dest, src, dest_len, flags)
#define clistr_pull(cli, dest, src, dest_len, src_len, flags) clistr_pull_fn2(NULL, 0, cli, dest, src, dest_len, src_len, flags)
#define alpha_strcpy(dest,src,other_safe_chars,maxlength) alpha_strcpy_fn(NULL,0,dest,src,other_safe_chars,maxlength)
#define StrnCpy(dest,src,n) StrnCpy_fn(NULL,0,dest,src,n)
#endif /* DEVELOPER */
#ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS
/* if the compiler will optimize out function calls, then use this to tell if we are
have the correct types (this works only where sizeof() returns the size of the buffer, not
the size of the pointer). */
#define safe_strcpy_fn2(fn_name, fn_line, d, s, max_len) \
(CHECK_STRING_SIZE(d, max_len+1) \
? __unsafe_string_function_usage_here__() \
: safe_strcpy_fn(fn_name, fn_line, (d), (s), (max_len)))
#define safe_strcat_fn2(fn_name, fn_line, d, s, max_len) \
(CHECK_STRING_SIZE(d, max_len+1) \
? __unsafe_string_function_usage_here__() \
: safe_strcat_fn(fn_name, fn_line, (d), (s), (max_len)))
#define push_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, flags) \
(CHECK_STRING_SIZE(dest, dest_len) \
? __unsafe_string_function_usage_here_size_t__() \
: push_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, flags))
#define pull_string_fn2(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags) \
(CHECK_STRING_SIZE(dest, dest_len) \
? __unsafe_string_function_usage_here_size_t__() \
: pull_string_fn(fn_name, fn_line, base_ptr, dest, src, dest_len, src_len, flags))
#define clistr_push_fn2(fn_name, fn_line, cli, dest, src, dest_len, flags) \
(CHECK_STRING_SIZE(dest, dest_len) \
? __unsafe_string_function_usage_here_size_t__() \
: clistr_push_fn(fn_name, fn_line, cli, dest, src, dest_len, flags))
#define clistr_pull_fn2(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags) \
(CHECK_STRING_SIZE(dest, dest_len) \
? __unsafe_string_function_usage_here_size_t__() \
: clistr_pull_fn(fn_name, fn_line, cli, dest, src, dest_len, srclen, flags))
#else
#define safe_strcpy_fn2 safe_strcpy_fn
#define safe_strcat_fn2 safe_strcat_fn
#define push_string_fn2 push_string_fn
#define pull_string_fn2 pull_string_fn
#define clistr_push_fn2 clistr_push_fn
#define clistr_pull_fn2 clistr_pull_fn
#endif
/* replace some string functions with multi-byte
versions */
#define strlower(s) strlower_m(s)
#define strupper(s) strupper_m(s)
#define safe_strcpy_base(dest, src, base, size) \
safe_strcpy(dest, src, size-PTR_DIFF(dest,base)-1)

View File

@ -186,7 +186,7 @@ size_t convert_string(charset_t from, charset_t to,
* @returns Size in bytes of the converted string; or -1 in case of error.
**/
size_t convert_string_allocate(charset_t from, charset_t to,
static size_t convert_string_allocate(charset_t from, charset_t to,
void const *src, size_t srclen, void **dest)
{
size_t i_len, o_len, destlen;
@ -265,7 +265,7 @@ convert:
*
* @returns Size in bytes of the converted string; or -1 in case of error.
**/
size_t convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to,
static size_t convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to,
void const *src, size_t srclen, void **dest)
{
void *alloced_string;
@ -303,7 +303,7 @@ size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
}
size_t ucs2_align(const void *base_ptr, const void *p, int flags)
static size_t ucs2_align(const void *base_ptr, const void *p, int flags)
{
if (flags & (STR_NOALIGN|STR_ASCII))
return 0;
@ -356,11 +356,6 @@ size_t push_ascii_pstring(void *dest, const char *src)
return push_ascii(dest, src, sizeof(pstring), STR_TERMINATE);
}
size_t push_pstring(void *dest, const char *src)
{
return push_ascii(dest, src, sizeof(pstring), STR_TERMINATE);
}
/**
* Copy a string from a dos codepage source to a unix char* destination.
*
@ -507,7 +502,7 @@ size_t push_ucs2_allocate(smb_ucs2_t **dest, const char *src)
is -1 then no maxiumum is used.
**/
size_t push_utf8(void *dest, const char *src, size_t dest_len, int flags)
static size_t push_utf8(void *dest, const char *src, size_t dest_len, int flags)
{
size_t src_len = strlen(src);
pstring tmpbuf;
@ -533,11 +528,6 @@ size_t push_utf8_fstring(void *dest, const char *src)
return push_utf8(dest, src, sizeof(fstring), STR_TERMINATE);
}
size_t push_utf8_pstring(void *dest, const char *src)
{
return push_utf8(dest, src, sizeof(pstring), STR_TERMINATE);
}
/**
* Copy a string from a unix char* src to a UTF-8 destination, allocating a buffer using talloc
*
@ -656,51 +646,6 @@ size_t pull_ucs2_allocate(void **dest, const smb_ucs2_t *src)
return convert_string_allocate(CH_UCS2, CH_UNIX, src, src_len, dest);
}
/**
Copy a string from a utf-8 source to a unix char* destination.
Flags can have:
STR_TERMINATE means the string in src is null terminated.
if STR_TERMINATE is set then src_len is ignored.
src_len is the length of the source area in bytes
Return the number of bytes occupied by the string in src.
The resulting string in "dest" is always null terminated.
**/
size_t pull_utf8(char *dest, const void *src, size_t dest_len, size_t src_len, int flags)
{
size_t ret;
if (dest_len == (size_t)-1)
dest_len = sizeof(pstring);
if (flags & STR_TERMINATE) {
if (src_len == (size_t)-1) {
src_len = strlen(src) + 1;
} else {
size_t len = strnlen(src, src_len);
if (len < src_len)
len++;
src_len = len;
}
}
ret = convert_string(CH_UTF8, CH_UNIX, src, src_len, dest, dest_len);
if (dest_len)
dest[MIN(ret, dest_len-1)] = 0;
return src_len;
}
size_t pull_utf8_pstring(char *dest, const void *src)
{
return pull_utf8(dest, src, sizeof(pstring), -1, STR_TERMINATE);
}
size_t pull_utf8_fstring(char *dest, const void *src)
{
return pull_utf8(dest, src, sizeof(fstring), -1, STR_TERMINATE);
}
/**
* Copy a string from a UTF-8 src to a unix char * destination, allocating a buffer using talloc
*
@ -745,8 +690,11 @@ size_t pull_utf8_allocate(void **dest, const char *src)
is -1 then no maxiumum is used.
**/
size_t push_string(const void *base_ptr, void *dest, const char *src, size_t dest_len, int flags)
size_t push_string_fn(const char *function, unsigned int line, const void *base_ptr, void *dest, const char *src, size_t dest_len, int flags)
{
if (dest_len != (size_t)-1)
clobber_region(function, line, dest, dest_len);
if (!(flags & STR_ASCII) && \
((flags & STR_UNICODE || \
(SVAL(base_ptr, smb_flg2) & FLAGS2_UNICODE_STRINGS)))) {
@ -770,8 +718,11 @@ size_t push_string(const void *base_ptr, void *dest, const char *src, size_t des
The resulting string in "dest" is always null terminated.
**/
size_t pull_string(const void *base_ptr, char *dest, const void *src, size_t dest_len, size_t src_len, int flags)
size_t pull_string_fn(const char *function, unsigned int line, const void *base_ptr, char *dest, const void *src, size_t dest_len, size_t src_len, int flags)
{
if (dest_len != (size_t)-1)
clobber_region(function, line, dest, dest_len);
if (!(flags & STR_ASCII) && \
((flags & STR_UNICODE || \
(SVAL(base_ptr, smb_flg2) & FLAGS2_UNICODE_STRINGS)))) {
@ -790,27 +741,6 @@ size_t align_string(const void *base_ptr, const char *p, int flags)
return 0;
}
/**
Convert from ucs2 to unix charset and return the
allocated and converted string or NULL if an error occurred.
You must provide a zero terminated string.
The returning string will be zero terminated.
**/
char *acnv_u2ux(const smb_ucs2_t *src)
{
size_t slen;
size_t dlen;
void *dest;
slen = (strlen_w(src) + 1) * sizeof(smb_ucs2_t);
dlen = convert_string_allocate(CH_UCS2, CH_UNIX, src, slen, &dest);
if (dlen == (size_t)-1)
return NULL;
else
return dest;
}
/**
Convert from unix to ucs2 charset and return the
allocated and converted string or NULL if an error occurred.
@ -832,27 +762,6 @@ smb_ucs2_t *acnv_uxu2(const char *src)
return dest;
}
/**
Convert from ucs2 to dos charset and return the
allocated and converted string or NULL if an error occurred.
You must provide a zero terminated string.
The returning string will be zero terminated.
**/
char *acnv_u2dos(const smb_ucs2_t *src)
{
size_t slen;
size_t dlen;
void *dest;
slen = (strlen_w(src) + 1) * sizeof(smb_ucs2_t);
dlen = convert_string_allocate(CH_UCS2, CH_DOS, src, slen, &dest);
if (dlen == (size_t)-1)
return NULL;
else
return dest;
}
/**
Convert from dos to ucs2 charset and return the
allocated and converted string or NULL if an error occurred.

View File

@ -1398,9 +1398,23 @@ gid_t nametogid(const char *name)
void smb_panic(const char *why)
{
char *cmd = lp_panic_action();
char *cmd;
int result;
#ifdef DEVELOPER
{
extern char *global_clobber_region_function;
extern unsigned int global_clobber_region_line;
if (global_clobber_region_function) {
DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
global_clobber_region_function,
global_clobber_region_line));
}
}
#endif
cmd = lp_panic_action();
if (cmd && *cmd) {
DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
result = system(cmd);

View File

@ -21,6 +21,11 @@
#include "includes.h"
#ifdef DEVELOPER
const char *global_clobber_region_function;
unsigned int global_clobber_region_line;
#endif
/**
* Get the next token from a string, return False if none found.
* Handles double-quotes.
@ -73,7 +78,7 @@ parameter so you can pass NULL. This is useful for user interface code
but beware the fact that it is not re-entrant!
**/
static char *last_ptr=NULL;
static const char *last_ptr=NULL;
BOOL next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
{
@ -410,32 +415,33 @@ size_t count_chars(const char *s,char c)
}
/**
Return True if a string consists only of one particular character.
**/
BOOL str_is_all(const char *s,char c)
* In developer builds, clobber a region of memory.
*
* If we think a string buffer is longer than it really is, this ought
* to make the failure obvious, by segfaulting (if in the heap) or by
* killing the return address (on the stack), or by trapping under a
* memory debugger.
*
* This is meant to catch possible string overflows, even if the
* actual string copied is not big enough to cause an overflow.
**/
void clobber_region(const char *fn, unsigned int line, char *dest, size_t len)
{
smb_ucs2_t *ptr;
if(s == NULL)
return False;
if(!*s)
return False;
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
for(ptr=tmpbuf;*ptr;ptr++)
if(*ptr!=UCS2_CHAR(c))
return False;
return True;
#ifdef DEVELOPER
/* F1 is odd and 0xf1f1f1f1 shouldn't be a valid pointer */
memset(dest, 0xF1, len);
global_clobber_region_function = fn;
global_clobber_region_line = line;
#endif
}
/**
Safe string copy into a known length string. maxlength does not
include the terminating zero.
**/
char *safe_strcpy(char *dest,const char *src, size_t maxlength)
char *safe_strcpy_fn(const char *fn, int line, char *dest,const char *src, size_t maxlength)
{
size_t len;
@ -444,13 +450,7 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength)
return NULL;
}
#ifdef DEVELOPER
/* We intentionally write out at the extremity of the destination
* string. If the destination is too short (e.g. pstrcpy into mallocd
* or fstring) then this should cause an error under a memory
* checker. */
dest[maxlength] = '\0';
#endif
clobber_region(fn,line,dest, maxlength+1);
if (!src) {
*dest = 0;
@ -474,8 +474,7 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength)
Safe string cat into a string. maxlength does not
include the terminating zero.
**/
char *safe_strcat(char *dest, const char *src, size_t maxlength)
char *safe_strcat_fn(const char *fn, int line, char *dest, const char *src, size_t maxlength)
{
size_t src_len, dest_len;
@ -490,6 +489,8 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength)
src_len = strlen(src);
dest_len = strlen(dest);
clobber_region(fn, line, dest + dest_len, maxlength + 1 - dest_len);
if (src_len + dest_len > maxlength) {
DEBUG(0,("ERROR: string overflow by %d in safe_strcat [%.50s]\n",
(int)(src_len + dest_len - maxlength), src));
@ -499,7 +500,7 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength)
dest[maxlength] = 0;
return NULL;
}
memcpy(&dest[dest_len], src, src_len);
dest[dest_len + src_len] = 0;
return dest;
@ -511,11 +512,12 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength)
and replaces with '_'. Deliberately does *NOT* check for multibyte
characters. Don't change it !
**/
char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
char *alpha_strcpy_fn(const char *fn, int line, char *dest, const char *src, const char *other_safe_chars, size_t maxlength)
{
size_t len, i;
clobber_region(fn, line, dest, maxlength);
if (!dest) {
DEBUG(0,("ERROR: NULL dest in alpha_strcpy\n"));
return NULL;
@ -550,12 +552,15 @@ char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, si
Like strncpy but always null terminates. Make sure there is room!
The variable n should always be one less than the available size.
**/
char *StrnCpy(char *dest,const char *src,size_t n)
char *StrnCpy_fn(const char *fn, int line,char *dest,const char *src,size_t n)
{
char *d = dest;
clobber_region(fn, line, dest, n+1);
if (!dest)
return(NULL);
if (!src) {
*dest = 0;
return(dest);
@ -566,16 +571,19 @@ char *StrnCpy(char *dest,const char *src,size_t n)
return(dest);
}
#if 0
/**
Like strncpy but copies up to the character marker. always null terminates.
returns a pointer to the character marker in the source string (src).
**/
char *strncpyn(char *dest, const char *src, size_t n, char c)
static char *strncpyn(char *dest, const char *src, size_t n, char c)
{
char *p;
size_t str_len;
clobber_region(dest, n+1);
p = strchr_m(src, c);
if (p == NULL) {
DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
@ -588,6 +596,7 @@ char *strncpyn(char *dest, const char *src, size_t n, char c)
return p;
}
#endif
/**
Routine to get hex characters and turn them into a 16 byte array.
@ -898,7 +907,7 @@ void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
Use with caution!
**/
smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
static smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
const smb_ucs2_t *insert)
{
smb_ucs2_t *r, *rp;
@ -956,11 +965,12 @@ smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
return all_string_sub_w(s, p, i);
}
#if 0
/**
Splits out the front and back at a separator.
**/
void split_at_last_component(char *path, char *front, char sep, char *back)
static void split_at_last_component(char *path, char *front, char sep, char *back)
{
char *p = strrchr_m(path, sep);
@ -979,6 +989,7 @@ void split_at_last_component(char *path, char *front, char sep, char *back)
back[0] = 0;
}
}
#endif
/**
Write an octal as a string.
@ -998,7 +1009,7 @@ const char *octal_string(int i)
Truncate a string at a specified length.
**/
char *string_truncate(char *s, int length)
char *string_truncate(char *s, unsigned int length)
{
if (s && strlen(s) > length)
s[length] = 0;
@ -1157,11 +1168,12 @@ char *binary_string(char *buf, int len)
return ret;
}
#if 0
/**
Just a typesafety wrapper for snprintf into a fstring.
**/
int fstr_sprintf(fstring s, const char *fmt, ...)
static int fstr_sprintf(fstring s, const char *fmt, ...)
{
va_list ap;
int ret;
@ -1171,6 +1183,7 @@ char *binary_string(char *buf, int len)
va_end(ap);
return ret;
}
#endif
#ifndef HAVE_STRNDUP
/**
@ -1642,12 +1655,3 @@ char * base64_encode_data_blob(DATA_BLOB data)
return result;
}
#ifdef VALGRIND
size_t valgrind_strlen(const char *s)
{
size_t count;
for(count = 0; *s++; count++)
;
return count;
}
#endif

View File

@ -20,24 +20,38 @@
#include "includes.h"
int clistr_push(struct cli_state *cli, void *dest, const char *src, int dest_len, int flags)
size_t clistr_push_fn(const char *function, unsigned int line,
struct cli_state *cli, void *dest,
const char *src, int dest_len, int flags)
{
return push_string(cli->outbuf, dest, src, dest_len, flags);
size_t buf_used = PTR_DIFF(dest, cli->outbuf);
if (dest_len == -1) {
if (((ptrdiff_t)dest < (ptrdiff_t)cli->outbuf) || (buf_used > cli->bufsize)) {
DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n"));
return push_string_fn(function, line, cli->outbuf, dest, src, -1, flags);
}
return push_string_fn(function, line, cli->outbuf, dest, src, cli->bufsize - buf_used, flags);
}
/* 'normal' push into size-specified buffer */
return push_string_fn(function, line, cli->outbuf, dest, src, dest_len, flags);
}
int clistr_pull(struct cli_state *cli, char *dest, const void *src, int dest_len, int src_len,
int flags)
size_t clistr_pull_fn(const char *function, unsigned int line,
struct cli_state *cli, char *dest, const void *src,
int dest_len, int src_len,
int flags)
{
return pull_string(cli->inbuf, dest, src, dest_len, src_len, flags);
return pull_string_fn(function, line, cli->inbuf, dest, src, dest_len, src_len, flags);
}
int clistr_align_out(struct cli_state *cli, const void *p, int flags)
size_t clistr_align_out(struct cli_state *cli, const void *p, int flags)
{
return align_string(cli->outbuf, p, flags);
}
int clistr_align_in(struct cli_state *cli, const void *p, int flags)
size_t clistr_align_in(struct cli_state *cli, const void *p, int flags)
{
return align_string(cli->inbuf, p, flags);
}