add chmod() to set client unix domain socket to group writable regardless of umask
This commit is contained in:
parent
dc570d0c06
commit
09d6ee75fe
@ -92,6 +92,8 @@ do_disconnect (struct TALER_CRYPTO_DenominationHelper *dh)
|
|||||||
static void
|
static void
|
||||||
try_connect (struct TALER_CRYPTO_DenominationHelper *dh)
|
try_connect (struct TALER_CRYPTO_DenominationHelper *dh)
|
||||||
{
|
{
|
||||||
|
char *tmpdir;
|
||||||
|
|
||||||
if (-1 != dh->sock)
|
if (-1 != dh->sock)
|
||||||
return;
|
return;
|
||||||
dh->sock = socket (AF_UNIX,
|
dh->sock = socket (AF_UNIX,
|
||||||
@ -103,46 +105,53 @@ try_connect (struct TALER_CRYPTO_DenominationHelper *dh)
|
|||||||
"socket");
|
"socket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
tmpdir = GNUNET_DISK_mktemp (dh->template);
|
||||||
|
if (NULL == tmpdir)
|
||||||
{
|
{
|
||||||
char *tmpdir;
|
do_disconnect (dh);
|
||||||
|
return;
|
||||||
tmpdir = GNUNET_DISK_mktemp (dh->template);
|
|
||||||
if (NULL == tmpdir)
|
|
||||||
{
|
|
||||||
do_disconnect (dh);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* we use >= here because we want the sun_path to always
|
|
||||||
be 0-terminated */
|
|
||||||
if (strlen (tmpdir) >= sizeof (dh->sa.sun_path))
|
|
||||||
{
|
|
||||||
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
|
||||||
"PATHS",
|
|
||||||
"TALER_RUNTIME_DIR",
|
|
||||||
"path too long");
|
|
||||||
GNUNET_free (tmpdir);
|
|
||||||
do_disconnect (dh);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dh->my_sa.sun_family = AF_UNIX;
|
|
||||||
strncpy (dh->my_sa.sun_path,
|
|
||||||
tmpdir,
|
|
||||||
sizeof (dh->sa.sun_path));
|
|
||||||
if (0 != unlink (tmpdir))
|
|
||||||
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
|
||||||
"unlink",
|
|
||||||
tmpdir);
|
|
||||||
GNUNET_free (tmpdir);
|
|
||||||
}
|
}
|
||||||
|
/* we use >= here because we want the sun_path to always
|
||||||
|
be 0-terminated */
|
||||||
|
if (strlen (tmpdir) >= sizeof (dh->sa.sun_path))
|
||||||
|
{
|
||||||
|
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
||||||
|
"PATHS",
|
||||||
|
"TALER_RUNTIME_DIR",
|
||||||
|
"path too long");
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
|
do_disconnect (dh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dh->my_sa.sun_family = AF_UNIX;
|
||||||
|
strncpy (dh->my_sa.sun_path,
|
||||||
|
tmpdir,
|
||||||
|
sizeof (dh->sa.sun_path));
|
||||||
|
if (0 != unlink (tmpdir))
|
||||||
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
|
"unlink",
|
||||||
|
tmpdir);
|
||||||
if (0 != bind (dh->sock,
|
if (0 != bind (dh->sock,
|
||||||
(const struct sockaddr *) &dh->my_sa,
|
(const struct sockaddr *) &dh->my_sa,
|
||||||
sizeof (dh->my_sa)))
|
sizeof (dh->my_sa)))
|
||||||
{
|
{
|
||||||
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
"bind");
|
"bind",
|
||||||
|
tmpdir);
|
||||||
do_disconnect (dh);
|
do_disconnect (dh);
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* Fix permissions on UNIX domain socket, just
|
||||||
|
in case umask() is not set to enable group write */
|
||||||
|
if (0 != chmod (tmpdir,
|
||||||
|
S_IRUSR | S_IWUSR | S_IWGRP))
|
||||||
|
{
|
||||||
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
|
"chmod",
|
||||||
|
tmpdir);
|
||||||
|
}
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
{
|
{
|
||||||
struct GNUNET_MessageHeader hdr = {
|
struct GNUNET_MessageHeader hdr = {
|
||||||
.size = htons (sizeof (hdr)),
|
.size = htons (sizeof (hdr)),
|
||||||
@ -242,6 +251,15 @@ TALER_CRYPTO_helper_denom_connect (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
dh->template = template;
|
dh->template = template;
|
||||||
|
if (strlen (template) >= sizeof (dh->sa.sun_path))
|
||||||
|
{
|
||||||
|
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
||||||
|
"PATHS",
|
||||||
|
"TALER_RUNTIME_DIR",
|
||||||
|
"path too long");
|
||||||
|
TALER_CRYPTO_helper_denom_disconnect (dh);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
TALER_CRYPTO_helper_denom_poll (dh);
|
TALER_CRYPTO_helper_denom_poll (dh);
|
||||||
return dh;
|
return dh;
|
||||||
|
@ -93,6 +93,8 @@ do_disconnect (struct TALER_CRYPTO_ExchangeSignHelper *esh)
|
|||||||
static void
|
static void
|
||||||
try_connect (struct TALER_CRYPTO_ExchangeSignHelper *esh)
|
try_connect (struct TALER_CRYPTO_ExchangeSignHelper *esh)
|
||||||
{
|
{
|
||||||
|
char *tmpdir;
|
||||||
|
|
||||||
if (-1 != esh->sock)
|
if (-1 != esh->sock)
|
||||||
return;
|
return;
|
||||||
esh->sock = socket (AF_UNIX,
|
esh->sock = socket (AF_UNIX,
|
||||||
@ -104,46 +106,53 @@ try_connect (struct TALER_CRYPTO_ExchangeSignHelper *esh)
|
|||||||
"socket");
|
"socket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
tmpdir = GNUNET_DISK_mktemp (esh->template);
|
||||||
|
if (NULL == tmpdir)
|
||||||
{
|
{
|
||||||
char *tmpdir;
|
do_disconnect (esh);
|
||||||
|
return;
|
||||||
tmpdir = GNUNET_DISK_mktemp (esh->template);
|
|
||||||
if (NULL == tmpdir)
|
|
||||||
{
|
|
||||||
do_disconnect (esh);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* we use >= here because we want the sun_path to always
|
|
||||||
be 0-terminated */
|
|
||||||
if (strlen (tmpdir) >= sizeof (esh->sa.sun_path))
|
|
||||||
{
|
|
||||||
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
|
||||||
"PATHS",
|
|
||||||
"TALER_RUNTIME_DIR",
|
|
||||||
"path too long");
|
|
||||||
GNUNET_free (tmpdir);
|
|
||||||
do_disconnect (esh);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
esh->my_sa.sun_family = AF_UNIX;
|
|
||||||
strncpy (esh->my_sa.sun_path,
|
|
||||||
tmpdir,
|
|
||||||
sizeof (esh->sa.sun_path));
|
|
||||||
if (0 != unlink (tmpdir))
|
|
||||||
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
|
||||||
"unlink",
|
|
||||||
tmpdir);
|
|
||||||
GNUNET_free (tmpdir);
|
|
||||||
}
|
}
|
||||||
|
/* we use >= here because we want the sun_path to always
|
||||||
|
be 0-terminated */
|
||||||
|
if (strlen (tmpdir) >= sizeof (esh->sa.sun_path))
|
||||||
|
{
|
||||||
|
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
|
||||||
|
"PATHS",
|
||||||
|
"TALER_RUNTIME_DIR",
|
||||||
|
"path too long");
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
|
do_disconnect (esh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
esh->my_sa.sun_family = AF_UNIX;
|
||||||
|
strncpy (esh->my_sa.sun_path,
|
||||||
|
tmpdir,
|
||||||
|
sizeof (esh->sa.sun_path));
|
||||||
|
if (0 != unlink (tmpdir))
|
||||||
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
|
"unlink",
|
||||||
|
tmpdir);
|
||||||
if (0 != bind (esh->sock,
|
if (0 != bind (esh->sock,
|
||||||
(const struct sockaddr *) &esh->my_sa,
|
(const struct sockaddr *) &esh->my_sa,
|
||||||
sizeof (esh->my_sa)))
|
sizeof (esh->my_sa)))
|
||||||
{
|
{
|
||||||
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
"bind");
|
"bind",
|
||||||
|
tmpdir);
|
||||||
do_disconnect (esh);
|
do_disconnect (esh);
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* Fix permissions on UNIX domain socket, just
|
||||||
|
in case umask() is not set to enable group write */
|
||||||
|
if (0 != chmod (tmpdir,
|
||||||
|
S_IRUSR | S_IWUSR | S_IWGRP))
|
||||||
|
{
|
||||||
|
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
|
||||||
|
"chmod",
|
||||||
|
tmpdir);
|
||||||
|
}
|
||||||
|
GNUNET_free (tmpdir);
|
||||||
{
|
{
|
||||||
struct GNUNET_MessageHeader hdr = {
|
struct GNUNET_MessageHeader hdr = {
|
||||||
.size = htons (sizeof (hdr)),
|
.size = htons (sizeof (hdr)),
|
||||||
|
Loading…
Reference in New Issue
Block a user