[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-mailutils] update GnuTLS usage
From: |
Sergey Poznyakoff |
Subject: |
Re: [bug-mailutils] update GnuTLS usage |
Date: |
Fri, 23 Mar 2012 14:02:50 +0200 |
Simon Josefsson <address@hidden> ha escrit:
> Trying to test this, I got a crash, but I get the crash without the
> patch too. Have you tested imap4d with STARTTLS?
Sure, but:
> and the crash happens when I invoke '. STARTTLS'. Backtrace below. Ideas?
Please undo e75e9123 (the patch attached). Please let me know if it
works for you. I will provide a better alternative in the short run.
Regards,
Sergey
diff --git a/imap4d/imap4d.c b/imap4d/imap4d.c
index 03af348..645b4e8 100644
--- a/imap4d/imap4d.c
+++ b/imap4d/imap4d.c
@@ -408,70 +408,7 @@ get_client_address (int fd, struct sockaddr_in *pcs)
}
return 0;
}
-
-static int
-set_strerr_flt ()
-{
- mu_stream_t flt, trans[2];
- int rc;
-
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- char sessidstr[10];
- char *argv[] = { "inline-comment", NULL, "-S", NULL };
-
- snprintf (sessidstr, sizeof sessidstr, "%08lx:", mu_session_id);
- argv[1] = sessidstr;
- rc = mu_filter_create_args (&flt, trans[0], "inline-comment", 3,
- (const char **)argv,
- MU_FILTER_ENCODE, MU_STREAM_WRITE);
- mu_stream_unref (trans[0]);
- if (rc == 0)
- {
- mu_stream_set_buffer (flt, mu_buffer_line, 0);
- trans[0] = flt;
- trans[1] = NULL;
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
- MU_IOCTL_OP_SET, trans);
- mu_stream_unref (trans[0]);
- if (rc)
- mu_error (_("%s failed: %s"), "MU_IOCTL_SET_STREAM",
- mu_stream_strerror (mu_strerr, rc));
- }
- else
- mu_error (_("cannot create log filter stream: %s"), mu_strerror (rc));
- }
- else
- {
- mu_error (_("%s failed: %s"), "MU_IOCTL_GET_STREAM",
- mu_stream_strerror (mu_strerr, rc));
- }
- return rc;
-}
-static void
-clr_strerr_flt ()
-{
- mu_stream_t flt, trans[2];
- int rc;
-
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- flt = trans[0];
-
- rc = mu_stream_ioctl (flt, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- mu_stream_unref (trans[0]);
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
- MU_IOCTL_OP_SET, trans);
- if (rc == 0)
- mu_stream_unref (flt);
- }
- }
-}
void
imap4d_child_signal_setup (RETSIGTYPE (*handler) (int signo))
@@ -570,21 +507,10 @@ imap4d_connection (int fd, struct sockaddr *sa, int salen,
struct mu_srv_config *pconf, void *data)
{
struct imap4d_srv_config *cfg = (struct imap4d_srv_config *) pconf;
- int rc;
-
+
idle_timeout = pconf->timeout;
imap4d_transcript = pconf->transcript;
-
- if (mu_log_session_id)
- rc = set_strerr_flt ();
- else
- rc = 1;
-
imap4d_mainloop (fd, fd, cfg->tls);
-
- if (rc == 0)
- clr_strerr_flt ();
-
return 0;
}
diff --git a/imap4d/io.c b/imap4d/io.c
index 47bb048..b703ff8 100644
--- a/imap4d/io.c
+++ b/imap4d/io.c
@@ -76,7 +76,6 @@ io_setio (int ifd, int ofd, int tls)
else
{
rc = mu_xscript_stream_create (&xstr, iostream, dstr, NULL);
- mu_stream_unref (dstr);
if (rc)
mu_error (_("cannot create transcript stream: %s"),
mu_strerror (rc));
diff --git a/include/mailutils/acl.h b/include/mailutils/acl.h
index e1708d6..daf8fc4 100644
--- a/include/mailutils/acl.h
+++ b/include/mailutils/acl.h
@@ -63,8 +63,4 @@ int mu_acl_check_fd (mu_acl_t acl, int fd, mu_acl_result_t
*pres);
int mu_acl_action_to_string (mu_acl_action_t act, const char **pstr);
int mu_acl_string_to_action (const char *str, mu_acl_action_t *pres);
-int mu_acl_setenv (mu_acl_t acl, const char *name, const char *val);
-const char *mu_acl_getenv (mu_acl_t acl, const char *name);
-int mu_acl_set_session_id (mu_acl_t acl);
-
#endif
diff --git a/include/mailutils/server.h b/include/mailutils/server.h
index cd87609..d53cf64 100644
--- a/include/mailutils/server.h
+++ b/include/mailutils/server.h
@@ -21,8 +21,6 @@
#include <mailutils/types.h>
#include <signal.h>
-extern unsigned long mu_session_id;
-
typedef int (*mu_conn_loop_fp) (int fd, void *conn_data, void *server_data);
typedef void (*mu_conn_free_fp) (void *conn_data, void *server_data);
typedef int (*mu_server_idle_fp) (void *server_data);
@@ -126,7 +124,7 @@ const char * mu_m_server_pidfile (mu_m_server_t srv);
void mu_m_server_get_sigset (mu_m_server_t srv, sigset_t *sigset);
int mu_m_server_get_srvlist (mu_m_server_t srv, mu_list_t *plist);
-void mu_m_server_configured_count (mu_m_server_t msrv, size_t *count);
+void mu_m_server_configured_count (mu_m_server_t msrv, size_t count);
void mu_m_server_begin (mu_m_server_t msrv);
int mu_m_server_run (mu_m_server_t msrv);
diff --git a/include/mailutils/syslog.h b/include/mailutils/syslog.h
index 5cf79b1..9ad874f 100644
--- a/include/mailutils/syslog.h
+++ b/include/mailutils/syslog.h
@@ -29,7 +29,6 @@ extern int mu_log_facility;
extern char *mu_log_tag;
extern int mu_log_print_severity;
extern unsigned mu_log_severity_threshold;
-extern int mu_log_session_id;
#define MU_LOG_TAG() (mu_log_tag ? mu_log_tag : mu_program_name)
diff --git a/libmailutils/diag/syslog.c b/libmailutils/diag/syslog.c
index 77a6667..c98ba84 100644
--- a/libmailutils/diag/syslog.c
+++ b/libmailutils/diag/syslog.c
@@ -133,4 +133,3 @@ int mu_log_facility = LOG_FACILITY;
char *mu_log_tag = NULL;
int mu_log_print_severity = 0;
unsigned mu_log_severity_threshold = MU_LOG_DEBUG;
-int mu_log_session_id;
diff --git a/libmailutils/server/acl.c b/libmailutils/server/acl.c
index 6f3e4df..1bfe193 100644
--- a/libmailutils/server/acl.c
+++ b/libmailutils/server/acl.c
@@ -58,21 +58,6 @@ struct _mu_acl_entry
struct _mu_acl
{
mu_list_t aclist;
- char **envv;
- size_t envc;
- size_t envn;
-};
-
-struct run_closure
-{
- unsigned idx;
- struct mu_cidr addr;
-
- char **env;
- char ipstr[40];
- char *addrstr;
- char *numbuf;
- mu_acl_result_t *result;
};
@@ -132,16 +117,11 @@ mu_acl_count (mu_acl_t acl, size_t *pcount)
int
mu_acl_destroy (mu_acl_t *pacl)
{
- size_t i;
-
mu_acl_t acl;
if (!pacl || !*pacl)
return EINVAL;
acl = *pacl;
mu_list_destroy (&acl->aclist);
- for (i = 0; i < acl->envc && acl->envv[i]; i++)
- free (acl->envv[i]);
- free (acl->envv);
free (acl);
*pacl = acl;
return 0;
@@ -269,6 +249,17 @@ mu_acl_string_to_action (const char *str, mu_acl_action_t
*pres)
return rc;
}
+struct run_closure
+{
+ unsigned idx;
+ struct mu_cidr addr;
+
+ char ipstr[40];
+ char *addrstr;
+ char *numbuf;
+ mu_acl_result_t *result;
+};
+
int
_acl_match (struct _mu_acl_entry *ent, struct run_closure *rp)
{
@@ -306,26 +297,6 @@ acl_getvar (const char *name, size_t nlen, void *data)
{
struct run_closure *rp = data;
- if (SEQ ("family", name, nlen))
- {
- switch (rp->addr.family)
- {
- case AF_INET:
- return "AF_INET";
-
-#ifdef MAILUTILS_IPV6
- case AF_INET6:
- return "AF_INET6";
-#endif
-
- case AF_UNIX:
- return "AF_UNIX";
-
- default:
- return NULL;
- }
- }
-
if (SEQ ("aclno", name, nlen))
{
if (!rp->numbuf && mu_asprintf (&rp->numbuf, "%u", rp->idx))
@@ -359,19 +330,33 @@ expand_arg (const char *cmdline, struct run_closure *rp,
char **s)
{
int rc;
struct mu_wordsplit ws;
- int envflag = 0;
+ const char *env[3];
mu_debug (MU_DEBCAT_ACL, MU_DEBUG_TRACE, ("Expanding \"%s\"", cmdline));
- if (rp->env)
+ env[0] = "family";
+ switch (rp->addr.family)
{
- ws.ws_env = (const char **) rp->env;
- envflag = MU_WRDSF_ENV;
+ case AF_INET:
+ env[1] = "AF_INET";
+ break;
+
+#ifdef MAILUTILS_IPV6
+ case AF_INET6:
+ env[1] = "AF_INET6";
+ break;
+#endif
+
+ case AF_UNIX:
+ env[1] = "AF_UNIX";
+ break;
}
+ env[2] = NULL;
+ ws.ws_env = env;
ws.ws_getvar = acl_getvar;
ws.ws_closure = rp;
rc = mu_wordsplit (cmdline, &ws,
MU_WRDSF_NOSPLIT | MU_WRDSF_NOCMD |
- envflag | MU_WRDSF_ENV_KV |
+ MU_WRDSF_ENV | MU_WRDSF_ENV_KV |
MU_WRDSF_GETVAR | MU_WRDSF_CLOSURE);
if (rc == 0)
@@ -568,7 +553,6 @@ mu_acl_check_sockaddr (mu_acl_t acl, const struct sockaddr
*sa, int salen,
r.idx = 0;
r.result = pres;
- r.env = acl->envv;
*r.result = mu_acl_result_undefined;
r.numbuf = NULL;
mu_list_foreach (acl->aclist, _run_entry, &r);
@@ -623,94 +607,3 @@ mu_acl_check_fd (mu_acl_t acl, int fd, mu_acl_result_t
*pres)
return mu_acl_check_sockaddr (acl, &addr.sa, len, pres);
}
-static int
-_acl_getenv (mu_acl_t acl, const char *name, size_t *pres)
-{
- size_t i;
-
- if (!acl->envv)
- return MU_ERR_NOENT;
- for (i = 0; i < acl->envc; i++)
- if (strcmp (acl->envv[i], name) == 0)
- {
- *pres = i;
- return 0;
- }
- return MU_ERR_NOENT;
-}
-
-const char *
-mu_acl_getenv (mu_acl_t acl, const char *name)
-{
- size_t i;
-
- if (_acl_getenv (acl, name, &i) == 0)
- {
- return acl->envv[i + 1];
- }
- return NULL;
-}
-
-static int
-_acl_env_store (mu_acl_t acl, int i, const char *val)
-{
- char *copy = strdup (val);
- if (!copy)
- return ENOMEM;
- free (acl->envv[i]);
- acl->envv[i] = copy;
- return 0;
-}
-
-int
-mu_acl_setenv (mu_acl_t acl, const char *name, const char *val)
-{
- size_t i;
-
- if (_acl_getenv (acl, name, &i) == 0)
- {
- if (!val)
- {
- free (acl->envv[i]);
- free (acl->envv[i + 1]);
- memmove (acl->envv + i, acl->envv + i + 3,
- (acl->envn + 1 - (i + 3)) * sizeof (acl->envv[0]));
- acl->envn -= 2;
- return 0;
- }
- return _acl_env_store (acl, i + 1, val);
- }
-
- if (!acl->envv || acl->envn + 1 == acl->envc)
- {
- char **p;
-
- if (!val)
- return 0;
-
- if (acl->envv == NULL)
- p = calloc (3, sizeof (acl->envv[0]));
- else
- {
- p = realloc (acl->envv, (acl->envc + 3) * sizeof (acl->envv[0]));
- if (!p)
- return ENOMEM;
- p[acl->envc] = NULL;
- }
-
- acl->envv = p;
- acl->envc += 3;
- }
-
- if (_acl_env_store (acl, acl->envn, name))
- return ENOMEM;
- if (_acl_env_store (acl, acl->envn + 1, val))
- {
- free (acl->envv[acl->envn]);
- acl->envv[acl->envn] = NULL;
- return ENOMEM;
- }
- acl->envn += 2;
-
- return 0;
-}
diff --git a/libmailutils/server/ipsrv.c b/libmailutils/server/ipsrv.c
index fa70863..7f0fea1 100644
--- a/libmailutils/server/ipsrv.c
+++ b/libmailutils/server/ipsrv.c
@@ -372,10 +372,7 @@ mu_ip_tcp_accept (mu_ip_server_t srv, void *call_data)
if (srv->acl)
{
mu_acl_result_t res;
- int rc;
-
- mu_acl_set_session_id (srv->acl);
- rc = mu_acl_check_sockaddr (srv->acl, &client.sa, size, &res);
+ int rc = mu_acl_check_sockaddr (srv->acl, &client.sa, size, &res);
if (rc)
mu_debug (MU_DEBCAT_SERVER, MU_DEBUG_ERROR,
("%s: mu_acl_check_sockaddr: %s",
@@ -456,10 +453,7 @@ mu_ip_udp_accept (mu_ip_server_t srv, void *call_data)
if (srv->acl)
{
mu_acl_result_t res;
- int rc;
-
- mu_acl_set_session_id (srv->acl);
- rc = mu_acl_check_sockaddr (srv->acl, &client.sa, size, &res);
+ int rc = mu_acl_check_sockaddr (srv->acl, &client.sa, size, &res);
if (rc)
mu_debug (MU_DEBCAT_SERVER, MU_DEBUG_ERROR,
("%s: mu_acl_check_sockaddr: %s\n",
diff --git a/libmailutils/server/msrv.c b/libmailutils/server/msrv.c
index a8080da..d7c639e 100644
--- a/libmailutils/server/msrv.c
+++ b/libmailutils/server/msrv.c
@@ -91,7 +91,7 @@ struct _mu_m_server
struct mu_sockaddr_hints hints; /* Default address hints. */
time_t timeout; /* Default idle timeout. */
mu_acl_t acl; /* Global access control list. */
-
+
sigset_t sigmask; /* A set of signals to handle by the
m-server. */
mu_sig_handler_t sigtab[NSIG]; /* Keeps old signal handlers. */
@@ -343,12 +343,9 @@ mu_m_server_set_max_children (mu_m_server_t srv, size_t
num)
int
mu_m_server_set_pidfile (mu_m_server_t srv, const char *pidfile)
{
- char *p = strdup (pidfile);
- if (!p)
- return errno;
free (srv->pidfile);
- srv->pidfile = p;
- return 0;
+ srv->pidfile = strdup (pidfile);
+ return srv->pidfile ? 0 : errno;
}
int
@@ -479,9 +476,9 @@ add_server (mu_m_server_t msrv, struct mu_sockaddr *s, int
type)
}
void
-mu_m_server_configured_count (mu_m_server_t msrv, size_t *count)
+mu_m_server_configured_count (mu_m_server_t msrv, size_t count)
{
- mu_list_count (msrv->srvlist, count);
+ mu_list_count (msrv->srvlist, &count);
}
void
@@ -648,10 +645,7 @@ mu_m_server_check_acl (mu_m_server_t msrv, struct sockaddr
*s, int salen)
if (msrv->acl)
{
mu_acl_result_t res;
- int rc;
-
- mu_acl_set_session_id (msrv->acl);
- rc = mu_acl_check_sockaddr (msrv->acl, s, salen, &res);
+ int rc = mu_acl_check_sockaddr (msrv->acl, s, salen, &res);
if (rc)
{
char *p = mu_sockaddr_to_astr (s, salen);
@@ -694,7 +688,7 @@ m_srv_conn (int fd, struct sockaddr *sa, int salen,
{
int status;
struct mu_srv_config *pconf = server_data;
-
+
if (mu_m_server_check_acl (pconf->msrv, sa, salen))
return 0;
diff --git a/libmailutils/server/server.c b/libmailutils/server/server.c
index 6fcc1f8..3c9b149 100644
--- a/libmailutils/server/server.c
+++ b/libmailutils/server/server.c
@@ -38,8 +38,6 @@ struct _mu_connection
#define MU_SERVER_TIMEOUT 0x1
-unsigned long mu_session_id;
-
struct _mu_server
{
int nfd;
@@ -106,10 +104,7 @@ connection_loop (mu_server_t srv, fd_set *fdset)
struct _mu_connection *next = conn->next;
if (FD_ISSET (conn->fd, fdset))
{
- int rc;
-
- ++mu_session_id;
- rc = conn->f_loop (conn->fd, conn->data, srv->server_data);
+ int rc = conn->f_loop (conn->fd, conn->data, srv->server_data);
switch (rc)
{
case 0:
@@ -296,12 +291,3 @@ mu_server_add_connection (mu_server_t srv,
srv->tail = p;
return 0;
}
-
-int
-mu_acl_set_session_id (mu_acl_t acl)
-{
- char sessidstr[9];
- snprintf (sessidstr, sizeof sessidstr, "%08lx", mu_session_id);
- return mu_acl_setenv (acl, "sessid", sessidstr);
-}
-
diff --git a/libmailutils/stream/fltstream.c b/libmailutils/stream/fltstream.c
index 8b26d27..5fd1ea1 100644
--- a/libmailutils/stream/fltstream.c
+++ b/libmailutils/stream/fltstream.c
@@ -421,32 +421,6 @@ filter_ctl (struct _mu_stream *stream, int code, int
opcode, void *ptr)
return ENOSYS;
}
break;
-
- case MU_IOCTL_SUBSTREAM:
- if (!ptr)
- return EINVAL;
- else
- {
- mu_stream_t *pstr = ptr;
- switch (opcode)
- {
- case MU_IOCTL_OP_GET:
- pstr[0] = fs->transport;
- mu_stream_ref (pstr[0]);
- pstr[1] = NULL;
- break;
-
- case MU_IOCTL_OP_SET:
- mu_stream_unref (fs->transport);
- fs->transport = pstr[0];
- mu_stream_ref (fs->transport);
- break;
-
- default:
- return EINVAL;
- }
- }
- break;
case MU_IOCTL_TRANSPORT:
switch (opcode)
diff --git a/libmailutils/stream/logstream.c b/libmailutils/stream/logstream.c
index 3bcc684..dd9a31f 100644
--- a/libmailutils/stream/logstream.c
+++ b/libmailutils/stream/logstream.c
@@ -309,32 +309,6 @@ _log_ctl (struct _mu_stream *str, int code, int opcode,
void *arg)
}
break;
- case MU_IOCTL_SUBSTREAM:
- if (!arg)
- return EINVAL;
- else
- {
- mu_stream_t *pstr = arg;
- switch (opcode)
- {
- case MU_IOCTL_OP_GET:
- pstr[0] = sp->transport;
- mu_stream_ref (pstr[0]);
- pstr[1] = NULL;
- break;
-
- case MU_IOCTL_OP_SET:
- mu_stream_unref (sp->transport);
- sp->transport = pstr[0];
- mu_stream_ref (sp->transport);
- break;
-
- default:
- return EINVAL;
- }
- }
- break;
-
case MU_IOCTL_LOGSTREAM:
switch (opcode)
{
diff --git a/libmu_cfg/common.c b/libmu_cfg/common.c
index fb0b7bf..08c3599 100644
--- a/libmu_cfg/common.c
+++ b/libmu_cfg/common.c
@@ -171,8 +171,6 @@ static struct mu_cfg_param mu_logging_param[] = {
N_("Set syslog facility. Arg is one of the following: user, daemon, "
"auth, authpriv, mail, cron, local0 through local7 (case-insensitive), "
"or a facility number.") },
- { "session-id", mu_cfg_bool, &mu_log_session_id, 0, NULL,
- N_("Log session ID") },
{ "tag", mu_cfg_string, &mu_log_tag, 0, NULL,
N_("Tag syslog messages with this string.") },
{ NULL }
diff --git a/pop3d/extra.c b/pop3d/extra.c
index f225d4f..b06c2dc 100644
--- a/pop3d/extra.c
+++ b/pop3d/extra.c
@@ -185,7 +185,6 @@ pop3d_setio (int ifd, int ofd, int tls)
else
{
rc = mu_xscript_stream_create (&xstr, iostream, dstr, NULL);
- mu_stream_unref (dstr);
if (rc)
mu_error (_("cannot create transcript stream: %s"),
mu_strerror (rc));
diff --git a/pop3d/pop3d.c b/pop3d/pop3d.c
index 223db35..3fe6c4e 100644
--- a/pop3d/pop3d.c
+++ b/pop3d/pop3d.c
@@ -366,90 +366,17 @@ pop3d_mainloop (int ifd, int ofd, int tls)
return status;
}
-static int
-set_strerr_flt ()
-{
- mu_stream_t flt, trans[2];
- int rc;
-
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- char sessidstr[10];
- char *argv[] = { "inline-comment", NULL, "-S", NULL };
-
- snprintf (sessidstr, sizeof sessidstr, "%08lx:", mu_session_id);
- argv[1] = sessidstr;
- rc = mu_filter_create_args (&flt, trans[0], "inline-comment", 3,
- (const char **)argv,
- MU_FILTER_ENCODE, MU_STREAM_WRITE);
- mu_stream_unref (trans[0]);
- if (rc == 0)
- {
- mu_stream_set_buffer (flt, mu_buffer_line, 0);
- trans[0] = flt;
- trans[1] = NULL;
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
- MU_IOCTL_OP_SET, trans);
- mu_stream_unref (trans[0]);
- if (rc)
- mu_error (_("%s failed: %s"), "MU_IOCTL_SET_STREAM",
- mu_stream_strerror (mu_strerr, rc));
- }
- else
- mu_error (_("cannot create log filter stream: %s"), mu_strerror (rc));
- }
- else
- {
- mu_error (_("%s failed: %s"), "MU_IOCTL_GET_STREAM",
- mu_stream_strerror (mu_strerr, rc));
- }
- return rc;
-}
-
-static void
-clr_strerr_flt ()
-{
- mu_stream_t flt, trans[2];
- int rc;
-
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- flt = trans[0];
-
- rc = mu_stream_ioctl (flt, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
- if (rc == 0)
- {
- mu_stream_unref (trans[0]);
- rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
- MU_IOCTL_OP_SET, trans);
- if (rc == 0)
- mu_stream_unref (flt);
- }
- }
-}
-
int
pop3d_connection (int fd, struct sockaddr *sa, int salen,
struct mu_srv_config *pconf,
void *data)
{
struct pop3d_srv_config *cfg = (struct pop3d_srv_config *) pconf;
- int rc;
idle_timeout = pconf->timeout;
pop3d_transcript = pconf->transcript;
- if (mu_log_session_id)
- rc = set_strerr_flt ();
- else
- rc = 1;
-
pop3d_mainloop (fd, fd, cfg->tls);
-
- if (rc == 0)
- clr_strerr_flt ();
return 0;
}