@ -61,9 +61,23 @@
check the pointer , use " ----args-separator---- " here to ease debug
if someone misused it .
The args seprator will only be added when
my_getopt_use_args_seprator is set to TRUE before calling
load_defaults ( ) ;
See BUG # 25192
*/
const char * args_separator = " ----args-separator---- " ;
static const char * args_separator = " ----args-separator---- " ;
inline static void set_args_separator ( char * * arg )
{
DBUG_ASSERT ( my_getopt_use_args_separator ) ;
* arg = ( char * ) args_separator ;
}
my_bool my_getopt_use_args_separator = FALSE ;
my_bool my_getopt_is_args_separator ( const char * arg )
{
return ( arg = = args_separator ) ;
}
const char * my_defaults_file = 0 ;
const char * my_defaults_group_suffix = 0 ;
const char * my_defaults_extra_file = 0 ;
@ -503,6 +517,7 @@ int my_load_defaults(const char *conf_file, const char **groups,
char * ptr , * * res ;
struct handle_option_ctx ctx ;
const char * * dirs ;
uint args_sep = my_getopt_use_args_separator ? 1 : 0 ;
DBUG_ENTER ( " load_defaults " ) ;
init_alloc_root ( & alloc , 512 , 0 ) ;
@ -515,17 +530,28 @@ int my_load_defaults(const char *conf_file, const char **groups,
if ( * argc > = 2 & & ! strcmp ( argv [ 0 ] [ 1 ] , " --no-defaults " ) )
{
/* remove the --no-defaults argument and return only the other arguments */
uint i ;
uint i , j ;
if ( ! ( ptr = ( char * ) alloc_root ( & alloc , sizeof ( alloc ) +
( * argc + 1 ) * sizeof ( char * ) ) ) )
goto err ;
res = ( char * * ) ( ptr + sizeof ( alloc ) ) ;
res [ 0 ] = * * argv ; /* Copy program name */
/* set arguments separator */
res [ 1 ] = ( char * ) args_separator ;
for ( i = 2 ; i < ( uint ) * argc ; i + + )
res [ i ] = argv [ 0 ] [ i ] ;
res [ i ] = 0 ; /* End pointer */
j = 1 ; /* Start from 1 for the reset result args */
if ( my_getopt_use_args_separator )
{
/* set arguments separator */
set_args_separator ( & res [ 1 ] ) ;
j + + ;
}
for ( i = 2 ; i < ( uint ) * argc ; i + + , j + + )
res [ j ] = argv [ 0 ] [ i ] ;
res [ j ] = 0 ; /* End pointer */
/*
Update the argc , if have not added args separator , then we have
to decrease argc because we have removed the " --no-defaults " .
*/
if ( ! my_getopt_use_args_separator )
( * argc ) - - ;
* argv = res ;
* ( MEM_ROOT * ) ptr = alloc ; /* Save alloc root for free */
if ( default_directories )
@ -559,7 +585,7 @@ int my_load_defaults(const char *conf_file, const char **groups,
or a forced default file
*/
if ( ! ( ptr = ( char * ) alloc_root ( & alloc , sizeof ( alloc ) +
( args . elements + * argc + 1 + 1 ) * sizeof ( char * ) ) ) )
( args . elements + * argc + 1 + args_sep ) * sizeof ( char * ) ) ) )
goto err ;
res = ( char * * ) ( ptr + sizeof ( alloc ) ) ;
@ -580,16 +606,19 @@ int my_load_defaults(const char *conf_file, const char **groups,
- - * argc ; + + * argv ; /* skip argument */
}
/* set arguments separator for arguments from config file and
command line */
res [ args . elements + 1 ] = ( char * ) args_separator ;
if ( my_getopt_use_args_separator )
{
/* set arguments separator for arguments from config file and
command line */
set_args_separator ( & res [ args . elements + 1 ] ) ;
}
if ( * argc )
memcpy ( ( uchar * ) ( res + 1 + args . elements + 1 ) , ( char * ) ( ( * argv ) + 1 ) ,
memcpy ( ( uchar * ) ( res + 1 + args . elements + args_sep ) , ( char * ) ( ( * argv ) + 1 ) ,
( * argc - 1 ) * sizeof ( char * ) ) ;
res [ args . elements + * argc + 1 ] = 0 ; /* last null */
res [ args . elements + * argc + args_sep ] = 0 ; /* last null */
( * argc ) + = args . elements + 1 ;
( * argc ) + = args . elements + args_sep ;
* argv = ( char * * ) res ;
* ( MEM_ROOT * ) ptr = alloc ; /* Save alloc root for free */
delete_dynamic ( & args ) ;
@ -599,7 +628,7 @@ int my_load_defaults(const char *conf_file, const char **groups,
printf ( " %s would have been started with the following arguments: \n " ,
* * argv ) ;
for ( i = 1 ; i < * argc ; i + + )
if ( ( * argv ) [ i ] ! = args_separator ) /* skip arguments separator */
if ( ! my_getopt_is_args_separator ( ( * argv ) [ i ] ) ) /* skip arguments separator */
printf ( " %s " , ( * argv ) [ i ] ) ;
puts ( " " ) ;
exit ( 0 ) ;