@ -54,6 +54,29 @@
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# define CODE_INVALID_ARGS     "org.freedesktop.DBus.Error.InvalidArgs" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# define ERROR_INVALID_APPNAME "Invalid application name: " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				/* Directories */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# define BINDIR " / usr / bin" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				const  gchar  * 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				path_basename ( const  gchar  * path ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				{ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    const  gchar  * base  =  NULL ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if (  path  )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        gchar  * end  =  strrchr ( path ,  ' / ' ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        base  =  end  ?  end  +  1  :  path ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  base ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				static  bool 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				path_dirname_eq ( const  char  * path ,  const  char  * target ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				{ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    gchar  * dir_path  =  g_path_get_dirname ( path ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    bool  result  =  ! strcmp ( dir_path ,  target ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    g_free ( dir_path ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  result ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				static  DBusConnection  * 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				sailjail_connect_bus ( void ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				{ 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -341,12 +364,6 @@ sailjailclient_match_argv(const char **tpl_argv, const char **app_argv)
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				{ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    bool  matching  =  false ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    /* Rule out template starting with a field code */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( sailjailclient_get_field_code ( * tpl_argv ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        error ( " Exec line starts with field code " ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        goto  EXIT ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    /* Match each arg in template */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  ( ; ; )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        const  char  * want  =  * tpl_argv + + ; 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -486,19 +503,31 @@ sailjailclient_validate_argv(const char *exec, const gchar **app_argv)
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    /* Expectation: Exec line might have leading 'wrapper' executables
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  such  as  sailjail ,  invoker ,  etc  - >  make  an  attempt  to  skip  those 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  by  looking  for  argv [ 0 ]  for  command  we  are  about  to  launch . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     * 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  App  may  also  be  defined  without  absolute  path ,  in  which  case  it 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  must  reside  in  BINDIR  and  it  must  not  have  any  ' wrapper ' 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  executables .  Thus  check  the  path  of  app_argv [ 0 ]  and  compare  Exec 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     *  line  to  the  binary  name . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    const  char  * * tpl_argv  =  ( const  char  * * ) exec_argv ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  ( ;  * tpl_argv ;  + + tpl_argv )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  ( ! g_strcmp0 ( * tpl_argv ,  app_argv [ 0 ] ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            break ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! path_dirname_eq ( app_argv [ 0 ] ,  BINDIR )  | | 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            g_strcmp0 ( * tpl_argv ,  path_basename ( app_argv [ 0 ] ) ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        /* App is not specified without path as the first argument,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				         *  = >  there  might  be  ' wrappers '  and  we  match  to  full  path . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				         */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        for (  ;  * tpl_argv ;  + + tpl_argv  )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            if (  ! g_strcmp0 ( * tpl_argv ,  app_argv [ 0 ] )  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                break ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! * tpl_argv )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        error ( " Exec line does not contain '%s' " ,  * app_argv ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        goto  EXIT ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if (  ! * tpl_argv  )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            error ( " Exec line does not contain '%s' " ,  * app_argv ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            goto  EXIT ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! sailjailclient_match_argv ( tpl_argv ,  app_argv ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    /* Argument zero has been checked already */ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! sailjailclient_match_argv ( tpl_argv  +  1 ,  app_argv  +  1 ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        gchar  * args  =  g_strjoinv ( "   " ,  ( gchar  * * ) app_argv ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        error ( " Application args do not match Exec line template " ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        error ( " exec: %s " ,  exec ) ;