diff --git a/g10/ChangeLog b/g10/ChangeLog index d959c5110..349779413 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,9 @@ +2002-07-03 David Shaw + + * exec.h, exec.c (set_exec_path, exec_write), g10.c (main): If + USE_EXEC_PATH is defined at compile time, use it to lock the + exec-path and not allow the user to change it. + 2002-07-02 David Shaw * options.h, g10.c (main), keyserver.c (keyserver_refresh): diff --git a/g10/exec.c b/g10/exec.c index 893718ad1..cfdf6d057 100644 --- a/g10/exec.c +++ b/g10/exec.c @@ -51,6 +51,7 @@ int exec_write(struct exec_info **info,const char *program, int exec_read(struct exec_info *info) { return G10ERR_GENERAL; } int exec_finish(struct exec_info *info) { return G10ERR_GENERAL; } +int set_exec_path(const char *path) { return G10ERR_GENERAL; } #else /* ! NO_EXEC */ @@ -90,6 +91,19 @@ static int win_system(const char *command) } #endif +int set_exec_path(const char *path) +{ + /* Notice that path is never freed. That is intentional due to the + way putenv() works. */ + char *p=m_alloc(5+strlen(path)+1); + strcpy(p,"PATH="); + strcat(p,path); + if(putenv(p)!=0) + return G10ERR_GENERAL; + else + return 0; +} + /* Makes a temp directory and filenames */ static int make_tempdir(struct exec_info *info) { @@ -298,6 +312,10 @@ int exec_write(struct exec_info **info,const char *program, if(program==NULL && args_in==NULL) BUG(); +#ifdef USE_EXEC_PATH + set_exec_path(USE_EXEC_PATH); +#endif + *info=m_alloc_clear(sizeof(struct exec_info)); if(name) diff --git a/g10/exec.h b/g10/exec.h index 2e0be460b..442952804 100644 --- a/g10/exec.h +++ b/g10/exec.h @@ -18,5 +18,6 @@ int exec_write(struct exec_info **info,const char *program, const char *args_in,const char *name,int writeonly,int binary); int exec_read(struct exec_info *info); int exec_finish(struct exec_info *info); +int set_exec_path(const char *path); #endif /* !_EXEC_H_ */ diff --git a/g10/g10.c b/g10/g10.c index 641cde636..707b54dc1 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -46,6 +46,7 @@ #include "status.h" #include "g10defs.h" #include "keyserver-internal.h" +#include "exec.h" enum cmd_and_opt_values { aNull = 0, oArmor = 'a', @@ -1331,15 +1332,10 @@ main( int argc, char **argv ) break; case oTempDir: opt.temp_dir=pargs.r.ret_str; break; case oExecPath: - { - /* Notice that path is never freed. That is - intentional due to the way putenv() works. */ - char *path=m_alloc(5+strlen(pargs.r.ret_str)+1); - strcpy(path,"PATH="); - strcat(path,pargs.r.ret_str); - if(putenv(path)!=0) - log_error(_("unable to set exec-path to %s\n"),path); - } +#ifndef USE_EXEC_PATH + if(set_exec_path(pargs.r.ret_str)) + log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str); +#endif break; case oNotation: add_notation_data( pargs.r.ret_str, 0 );