2011-03-24 03:40:43 +03:00
/*
Unix SMB / CIFS implementation .
string wrappers , for checking string sizes
Copyright ( C ) Andrew Tridgell 1994 - 2011
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/>.
*/
# ifndef _STRING_WRAPPERS_H
# define _STRING_WRAPPERS_H
2020-08-07 21:14:57 +03:00
# include "lib/replace/replace.h" /* for config symbols */
2011-05-04 00:14:46 +04:00
# define strlcpy_base(dest, src, base, size) \
2011-05-17 02:47:49 +04:00
do { \
const char * _strlcpy_base_src = ( const char * ) src ; \
strlcpy ( ( dest ) , _strlcpy_base_src ? _strlcpy_base_src : " " , ( size ) - PTR_DIFF ( ( dest ) , ( base ) ) ) ; \
} while ( 0 )
2011-03-24 03:40:43 +03:00
/* String copy functions - macro hell below adds 'type checking' (limited,
but the best we can do in C ) */
2011-05-17 02:47:49 +04:00
# define fstrcpy(d,s) \
do { \
const char * _fstrcpy_src = ( const char * ) ( s ) ; \
strlcpy ( ( d ) , _fstrcpy_src ? _fstrcpy_src : " " , sizeof ( fstring ) ) ; \
} while ( 0 )
# define fstrcat(d,s) \
do { \
const char * _fstrcat_src = ( const char * ) ( s ) ; \
strlcat ( ( d ) , _fstrcat_src ? _fstrcat_src : " " , sizeof ( fstring ) ) ; \
} while ( 0 )
# define unstrcpy(d,s) \
do { \
const char * _unstrcpy_src = ( const char * ) ( s ) ; \
2014-07-22 09:02:00 +04:00
strlcpy ( ( d ) , _unstrcpy_src ? _unstrcpy_src : " " , sizeof ( unstring ) ) ; \
2011-05-17 02:47:49 +04:00
} while ( 0 )
2011-03-24 03:40:43 +03:00
# ifdef HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS
2011-06-24 23:49:16 +04:00
/* We need a number of different prototypes for our
2023-04-13 14:29:32 +03:00
non - existent functions */
2011-06-24 23:49:16 +04:00
char * __unsafe_string_function_usage_here__ ( void ) ;
size_t __unsafe_string_function_usage_here_size_t__ ( void ) ;
2014-08-26 04:11:58 +04:00
NTSTATUS __unsafe_string_function_usage_here_NTSTATUS__ ( void ) ;
2011-06-24 23:49:16 +04:00
# define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *))
2011-03-24 03:40:43 +03:00
/* 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 push_string_check(dest, src, dest_len, flags) \
( CHECK_STRING_SIZE ( dest , dest_len ) \
? __unsafe_string_function_usage_here_size_t__ ( ) \
: push_string_check_fn ( dest , src , dest_len , flags ) )
2014-08-26 04:11:58 +04:00
# define srvstr_push(base_ptr, smb_flags2, dest, src, dest_len, flags, ret_len) \
2011-03-24 03:40:43 +03:00
( CHECK_STRING_SIZE ( dest , dest_len ) \
2014-08-26 04:11:58 +04:00
? __unsafe_string_function_usage_here_NTSTATUS__ ( ) \
: srvstr_push_fn ( base_ptr , smb_flags2 , dest , src , dest_len , flags , ret_len ) )
2011-03-24 03:40:43 +03:00
/* This allows the developer to choose to check the arguments to
strlcpy . if the compiler will optimize out function calls , then
use this to tell if we are have the correct size buffer ( this works only
where sizeof ( ) returns the size of the buffer , not the size of the
pointer ) , so stack and static variables only */
# define checked_strlcpy(dest, src, size) \
( sizeof ( dest ) ! = ( size ) \
? __unsafe_string_function_usage_here_size_t__ ( ) \
: strlcpy ( dest , src , size ) )
# else
# define push_string_check push_string_check_fn
# define srvstr_push srvstr_push_fn
# define checked_strlcpy strlcpy
# endif
# endif