aboutsummaryrefslogtreecommitdiffstats
path: root/g10/g10.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/g10.c')
-rw-r--r--g10/g10.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/g10/g10.c b/g10/g10.c
index 77ba9bc4a..8082fe2eb 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -182,6 +182,7 @@ enum cmd_values { aNull = 0,
aDeArmor, aEnArmor, aGenRandom,
aTest };
+static int maybe_setuid = 1;
static char *build_list( const char *text,
const char *(*mapf)(int), int (*chkf)(int) );
@@ -264,6 +265,9 @@ build_list( const char *text, const char * (*mapf)(int), int (*chkf)(int) )
size_t n=strlen(text)+2;
char *list, *p;
+ if( maybe_setuid )
+ secmem_init( 0 ); /* drop setuid */
+
for(i=1; i < 110; i++ )
if( !chkf(i) && (s=mapf(i)) )
n += strlen(s) + 2;
@@ -381,7 +385,7 @@ main( int argc, char **argv )
char **orig_argv;
const char *fname;
STRLIST sl, remusr= NULL, locusr=NULL;
- int nrings=0, sec_nrings=0;
+ STRLIST nrings=NULL, sec_nrings=NULL;
armor_filter_context_t afx;
int detached_sig = 0;
FILE *configfp = NULL;
@@ -394,10 +398,13 @@ main( int argc, char **argv )
int greeting = 1;
enum cmd_values cmd = 0;
const char *trustdb_name = NULL;
+ char *def_cipher_string = NULL;
+ char *def_digest_string = NULL;
trap_unaligned();
#ifdef IS_G10MAINT
secmem_init( 0 ); /* disable use of secmem */
+ maybe_setuid = 0;
log_set_name("gpgm");
#else
/* Please note that we may running SUID(ROOT), so be very CAREFUL
@@ -509,12 +516,8 @@ main( int argc, char **argv )
case 523: set_passphrase_fd( pargs.r.ret_int ); break;
case 524: set_cmd( &cmd, aEditKey); break;
case 525: set_cmd( &cmd, aChangePass); break;
- case 527:
- opt.def_cipher_algo = string_to_cipher_algo(pargs.r.ret_str);
- break;
- case 529:
- opt.def_digest_algo = string_to_digest_algo(pargs.r.ret_str);
- break;
+ case 527: def_cipher_string = m_strdup(pargs.r.ret_str); break;
+ case 529: def_digest_string = m_strdup(pargs.r.ret_str); break;
case 539: set_cmd( &cmd, aClearsign); break;
case 540: secmem_set_flags( secmem_get_flags() | 1 ); break;
case 542: set_cmd( &cmd, aGenRevoke); break;
@@ -548,12 +551,12 @@ main( int argc, char **argv )
case 501: opt.answer_yes = 1; break;
case 502: opt.answer_no = 1; break;
case 508: set_cmd( &cmd, aCheckKeys); break;
- case 509: add_keyring(pargs.r.ret_str); nrings++; break;
+ case 509: append_to_strlist( &nrings, pargs.r.ret_str); break;
case 510: opt.debug |= pargs.r.ret_ulong; break;
case 511: opt.debug = ~0; break;
case 512: set_status_fd( pargs.r.ret_int ); break;
case 515: opt.fingerprint = 1; break;
- case 517: add_secret_keyring(pargs.r.ret_str); sec_nrings++; break;
+ case 517: append_to_strlist( &sec_nrings, pargs.r.ret_str); break;
case 518:
/* config files may not be nested (silently ignore them) */
if( !configfp ) {
@@ -603,7 +606,6 @@ main( int argc, char **argv )
goto next_pass;
}
m_free( configname ); configname = NULL;
- check_opts();
if( log_get_errorcount(0) )
g10_exit(2);
@@ -615,12 +617,28 @@ main( int argc, char **argv )
#ifdef IS_G10
/* initialize the secure memory. */
secmem_init( 16384 );
+ maybe_setuid = 0;
/* Okay, we are now working under our real uid */
#endif
/*write_status( STATUS_ENTER );*/
set_debug();
+
+ /* must do this after dropping setuid, because string_to...
+ * may try to load an module */
+ if( def_cipher_string ) {
+ opt.def_cipher_algo = string_to_cipher_algo(def_cipher_string);
+ m_free(def_cipher_string); def_cipher_string = NULL;
+ }
+ if( def_digest_string ) {
+ opt.def_digest_algo = string_to_digest_algo(def_digest_string);
+ m_free(def_digest_string); def_digest_string = NULL;
+ }
+ check_opts();
+ if( log_get_errorcount(0) )
+ g10_exit(2);
+
if( !cmd && opt.fingerprint )
set_cmd( &cmd, aListKeys);
@@ -651,11 +669,18 @@ main( int argc, char **argv )
* not in case of "-kvv userid keyring" */
if( cmd != aDeArmor && cmd != aEnArmor
&& !(cmd == aKMode && argc == 2 ) ) {
+
if( !sec_nrings || default_keyring ) /* add default secret rings */
add_secret_keyring("secring.gpg");
+ for(sl = sec_nrings; sl; sl = sl->next )
+ add_secret_keyring( sl->d );
if( !nrings || default_keyring ) /* add default ring */
add_keyring("pubring.gpg");
+ for(sl = nrings; sl; sl = sl->next )
+ add_keyring( sl->d );
}
+ FREE_STRLIST(nrings);
+ FREE_STRLIST(sec_nrings);
if( argc )
fname = *argv;