Always pass correct name to argv[0]. Ignore GPG_AGENT_INFO for gpg2.
* src/dirinfo.c (WANT_GPG_ONE_MODE): New. (struct dirinfo): Add field "gpg_one_mode". (get_gpgconf_item): Set that field and return it if requested. (_gpgme_in_gpg_one_mode): New. * src/engine-gpg.c (build_argv): Check GPG_AGENT_INFO only in gpg-1 mode. * src/dirinfo.c (_gpgme_get_basename): New. * src/engine-g13.c (g13_new): Take argv[0] from the pgmname. * src/engine-gpgsm.c (gpgsm_new): Ditto. * src/engine-gpg.c (build_argv): Ditto. Add arg PGMNAME. (start): Pass PGMNAME to buildargv.
This commit is contained in:
parent
f916ab753b
commit
651d9e1c6b
@ -42,7 +42,8 @@ enum
|
|||||||
WANT_GPG_NAME,
|
WANT_GPG_NAME,
|
||||||
WANT_GPGSM_NAME,
|
WANT_GPGSM_NAME,
|
||||||
WANT_G13_NAME,
|
WANT_G13_NAME,
|
||||||
WANT_UISRV_SOCKET
|
WANT_UISRV_SOCKET,
|
||||||
|
WANT_GPG_ONE_MODE
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Values retrieved via gpgconf and cached here. */
|
/* Values retrieved via gpgconf and cached here. */
|
||||||
@ -56,6 +57,7 @@ static struct {
|
|||||||
char *gpgsm_name;
|
char *gpgsm_name;
|
||||||
char *g13_name;
|
char *g13_name;
|
||||||
char *uisrv_socket;
|
char *uisrv_socket;
|
||||||
|
int gpg_one_mode; /* System is in gpg1 mode. */
|
||||||
} dirinfo;
|
} dirinfo;
|
||||||
|
|
||||||
|
|
||||||
@ -223,12 +225,14 @@ get_gpgconf_item (int what)
|
|||||||
{
|
{
|
||||||
/* Probably gpgconf is not installed. Assume we are using
|
/* Probably gpgconf is not installed. Assume we are using
|
||||||
GnuPG-1. */
|
GnuPG-1. */
|
||||||
|
dirinfo.gpg_one_mode = 1;
|
||||||
pgmname = _gpgme_get_gpg_path ();
|
pgmname = _gpgme_get_gpg_path ();
|
||||||
if (pgmname)
|
if (pgmname)
|
||||||
dirinfo.gpg_name = pgmname;
|
dirinfo.gpg_name = pgmname;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
dirinfo.gpg_one_mode = 0;
|
||||||
read_gpgconf_dirs (pgmname, 0);
|
read_gpgconf_dirs (pgmname, 0);
|
||||||
read_gpgconf_dirs (pgmname, 1);
|
read_gpgconf_dirs (pgmname, 1);
|
||||||
dirinfo.gpgconf_name = pgmname;
|
dirinfo.gpgconf_name = pgmname;
|
||||||
@ -268,6 +272,7 @@ get_gpgconf_item (int what)
|
|||||||
case WANT_GPGSM_NAME: result = dirinfo.gpgsm_name; break;
|
case WANT_GPGSM_NAME: result = dirinfo.gpgsm_name; break;
|
||||||
case WANT_G13_NAME: result = dirinfo.g13_name; break;
|
case WANT_G13_NAME: result = dirinfo.g13_name; break;
|
||||||
case WANT_UISRV_SOCKET: result = dirinfo.uisrv_socket; break;
|
case WANT_UISRV_SOCKET: result = dirinfo.uisrv_socket; break;
|
||||||
|
case WANT_GPG_ONE_MODE: result = dirinfo.gpg_one_mode? "1":NULL; break;
|
||||||
}
|
}
|
||||||
UNLOCK (dirinfo_lock);
|
UNLOCK (dirinfo_lock);
|
||||||
return result;
|
return result;
|
||||||
@ -323,3 +328,31 @@ _gpgme_get_default_uisrv_socket (void)
|
|||||||
{
|
{
|
||||||
return get_gpgconf_item (WANT_UISRV_SOCKET);
|
return get_gpgconf_item (WANT_UISRV_SOCKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true if we are in GnuPG-1 mode - ie. no gpgconf and agent
|
||||||
|
being optional. */
|
||||||
|
int
|
||||||
|
_gpgme_in_gpg_one_mode (void)
|
||||||
|
{
|
||||||
|
return !!get_gpgconf_item (WANT_GPG_ONE_MODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Helper function to return the basename of the passed filename. */
|
||||||
|
const char *
|
||||||
|
_gpgme_get_basename (const char *name)
|
||||||
|
{
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
if (!name || !*name)
|
||||||
|
return name;
|
||||||
|
for (s = name + strlen (name) -1; s >= name; s--)
|
||||||
|
if (*s == '/'
|
||||||
|
#ifdef HAVE_W32_SYSTEM
|
||||||
|
|| *s == '\\' || *s == ':'
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
return s+1;
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
@ -216,6 +216,7 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
{
|
{
|
||||||
gpgme_error_t err = 0;
|
gpgme_error_t err = 0;
|
||||||
engine_g13_t g13;
|
engine_g13_t g13;
|
||||||
|
const char *pgmname;
|
||||||
int argc;
|
int argc;
|
||||||
const char *argv[5];
|
const char *argv[5];
|
||||||
char *dft_display = NULL;
|
char *dft_display = NULL;
|
||||||
@ -232,8 +233,9 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
g13->status_cb.tag = 0;
|
g13->status_cb.tag = 0;
|
||||||
g13->status_cb.data = g13;
|
g13->status_cb.data = g13;
|
||||||
|
|
||||||
|
pgmname = file_name ? file_name : _gpgme_get_default_g13_name ();
|
||||||
argc = 0;
|
argc = 0;
|
||||||
argv[argc++] = "g13";
|
argv[argc++] = _gpgme_get_basename (pgmname);
|
||||||
if (home_dir)
|
if (home_dir)
|
||||||
{
|
{
|
||||||
argv[argc++] = "--homedir";
|
argv[argc++] = "--homedir";
|
||||||
@ -250,13 +252,11 @@ g13_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
assuan_ctx_set_system_hooks (g13->assuan_ctx, &_gpgme_assuan_system_hooks);
|
assuan_ctx_set_system_hooks (g13->assuan_ctx, &_gpgme_assuan_system_hooks);
|
||||||
|
|
||||||
#if USE_DESCRIPTOR_PASSING
|
#if USE_DESCRIPTOR_PASSING
|
||||||
err = assuan_pipe_connect
|
err = assuan_pipe_connect (g13->assuan_ctx, pgmname, argv,
|
||||||
(g13->assuan_ctx, file_name ? file_name : _gpgme_get_default_g13_name (),
|
NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
|
||||||
argv, NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
|
|
||||||
#else
|
#else
|
||||||
err = assuan_pipe_connect
|
err = assuan_pipe_connect (g13->assuan_ctx, pgmname, argv,
|
||||||
(g13->assuan_ctx, file_name ? file_name : _gpgme_get_default_g13_name (),
|
NULL, NULL, NULL, 0);
|
||||||
argv, NULL, NULL, NULL, 0);
|
|
||||||
#endif
|
#endif
|
||||||
if (err)
|
if (err)
|
||||||
goto leave;
|
goto leave;
|
||||||
|
@ -718,7 +718,7 @@ gpg_set_command_handler (void *engine, engine_command_handler_t fnc,
|
|||||||
|
|
||||||
|
|
||||||
static gpgme_error_t
|
static gpgme_error_t
|
||||||
build_argv (engine_gpg_t gpg)
|
build_argv (engine_gpg_t gpg, const char *pgmname)
|
||||||
{
|
{
|
||||||
gpgme_error_t err;
|
gpgme_error_t err;
|
||||||
struct arg_and_data_s *a;
|
struct arg_and_data_s *a;
|
||||||
@ -729,15 +729,20 @@ build_argv (engine_gpg_t gpg)
|
|||||||
int use_agent = 0;
|
int use_agent = 0;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
/* We don't want to use the agent with a malformed environment
|
if (_gpgme_in_gpg_one_mode ())
|
||||||
variable. This is only a very basic test but sufficient to make
|
{
|
||||||
our life in the regression tests easier. */
|
/* In GnuPG-1 mode we don't want to use the agent with a
|
||||||
|
malformed environment variable. This is only a very basic
|
||||||
|
test but sufficient to make our life in the regression tests
|
||||||
|
easier. With GnuPG-2 the agent is anyway required and on
|
||||||
|
modern installations GPG_AGENT_INFO is optional. */
|
||||||
err = _gpgme_getenv ("GPG_AGENT_INFO", &p);
|
err = _gpgme_getenv ("GPG_AGENT_INFO", &p);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
use_agent = (p && strchr (p, ':'));
|
use_agent = (p && strchr (p, ':'));
|
||||||
if (p)
|
if (p)
|
||||||
free (p);
|
free (p);
|
||||||
|
}
|
||||||
|
|
||||||
if (gpg->argv)
|
if (gpg->argv)
|
||||||
{
|
{
|
||||||
@ -788,7 +793,7 @@ build_argv (engine_gpg_t gpg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
argc = datac = 0;
|
argc = datac = 0;
|
||||||
argv[argc] = strdup ("gpg"); /* argv[0] */
|
argv[argc] = strdup (_gpgme_get_basename (pgmname)); /* argv[0] */
|
||||||
if (!argv[argc])
|
if (!argv[argc])
|
||||||
{
|
{
|
||||||
int saved_err = gpg_error_from_syserror ();
|
int saved_err = gpg_error_from_syserror ();
|
||||||
@ -1292,6 +1297,7 @@ start (engine_gpg_t gpg)
|
|||||||
int status;
|
int status;
|
||||||
struct spawn_fd_item_s *fd_list;
|
struct spawn_fd_item_s *fd_list;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
const char *pgmname;
|
||||||
|
|
||||||
if (!gpg)
|
if (!gpg)
|
||||||
return gpg_error (GPG_ERR_INV_VALUE);
|
return gpg_error (GPG_ERR_INV_VALUE);
|
||||||
@ -1317,7 +1323,8 @@ start (engine_gpg_t gpg)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = build_argv (gpg);
|
pgmname = gpg->file_name ? gpg->file_name : _gpgme_get_default_gpg_name ();
|
||||||
|
rc = build_argv (gpg, pgmname);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@ -1351,8 +1358,7 @@ start (engine_gpg_t gpg)
|
|||||||
fd_list[n].fd = -1;
|
fd_list[n].fd = -1;
|
||||||
fd_list[n].dup_to = -1;
|
fd_list[n].dup_to = -1;
|
||||||
|
|
||||||
status = _gpgme_io_spawn (gpg->file_name ? gpg->file_name :
|
status = _gpgme_io_spawn (pgmname, gpg->argv,
|
||||||
_gpgme_get_default_gpg_name (), gpg->argv,
|
|
||||||
IOSPAWN_FLAG_ALLOW_SET_FG,
|
IOSPAWN_FLAG_ALLOW_SET_FG,
|
||||||
fd_list, NULL, NULL, &pid);
|
fd_list, NULL, NULL, &pid);
|
||||||
{
|
{
|
||||||
|
@ -239,6 +239,7 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
{
|
{
|
||||||
gpgme_error_t err = 0;
|
gpgme_error_t err = 0;
|
||||||
engine_gpgsm_t gpgsm;
|
engine_gpgsm_t gpgsm;
|
||||||
|
const char *pgmname;
|
||||||
const char *argv[5];
|
const char *argv[5];
|
||||||
int argc;
|
int argc;
|
||||||
#if !USE_DESCRIPTOR_PASSING
|
#if !USE_DESCRIPTOR_PASSING
|
||||||
@ -321,8 +322,10 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
child_fds[3] = -1;
|
child_fds[3] = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pgmname = file_name ? file_name : _gpgme_get_default_gpgsm_name ();
|
||||||
|
|
||||||
argc = 0;
|
argc = 0;
|
||||||
argv[argc++] = "gpgsm";
|
argv[argc++] = _gpgme_get_basename (pgmname);
|
||||||
if (home_dir)
|
if (home_dir)
|
||||||
{
|
{
|
||||||
argv[argc++] = "--homedir";
|
argv[argc++] = "--homedir";
|
||||||
@ -339,10 +342,8 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
assuan_ctx_set_system_hooks (gpgsm->assuan_ctx, &_gpgme_assuan_system_hooks);
|
assuan_ctx_set_system_hooks (gpgsm->assuan_ctx, &_gpgme_assuan_system_hooks);
|
||||||
|
|
||||||
#if USE_DESCRIPTOR_PASSING
|
#if USE_DESCRIPTOR_PASSING
|
||||||
err = assuan_pipe_connect
|
err = assuan_pipe_connect (gpgsm->assuan_ctx, pgmname, argv,
|
||||||
(gpgsm->assuan_ctx,
|
NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
|
||||||
file_name ? file_name : _gpgme_get_default_gpgsm_name (),
|
|
||||||
argv, NULL, NULL, NULL, ASSUAN_PIPE_CONNECT_FDPASSING);
|
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
assuan_fd_t achild_fds[4];
|
assuan_fd_t achild_fds[4];
|
||||||
@ -352,10 +353,8 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)
|
|||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
achild_fds[i] = (assuan_fd_t) child_fds[i];
|
achild_fds[i] = (assuan_fd_t) child_fds[i];
|
||||||
|
|
||||||
err = assuan_pipe_connect
|
err = assuan_pipe_connect (gpgsm->assuan_ctx, pgmname, argv,
|
||||||
(gpgsm->assuan_ctx,
|
achild_fds, NULL, NULL, 0);
|
||||||
file_name ? file_name : _gpgme_get_default_gpgsm_name (),
|
|
||||||
argv, achild_fds, NULL, NULL, 0);
|
|
||||||
|
|
||||||
/* For now... */
|
/* For now... */
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
|
@ -60,6 +60,9 @@ const char *_gpgme_get_default_gpgsm_name (void);
|
|||||||
const char *_gpgme_get_default_g13_name (void);
|
const char *_gpgme_get_default_g13_name (void);
|
||||||
const char *_gpgme_get_default_gpgconf_name (void);
|
const char *_gpgme_get_default_gpgconf_name (void);
|
||||||
const char *_gpgme_get_default_uisrv_socket (void);
|
const char *_gpgme_get_default_uisrv_socket (void);
|
||||||
|
int _gpgme_in_gpg_one_mode (void);
|
||||||
|
|
||||||
|
const char *_gpgme_get_basename (const char *name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user