[Dovecot] Dovecot-2.1.14 - pop3 processes always hangs forever - another follow-up
Axel Luttgens
AxelLuttgens at swing.be
Tue Feb 19 15:24:36 EET 2013
Le 18 févr. 2013 à 17:41, Axel Luttgens a écrit :
> Le 18 févr. 2013 à 10:28, Axel Luttgens a écrit :
>
>> [...]
>>
>> It seems it could be easily back ported to 2.1.x.
>> I'll try and report back here.
>
> Hello Timo,
>
> Please find hereafter a proposal based on 2.1.14.
> [...]
Oops... big mistake wrt getenv(); sorry.
I also noticed that I inadvertently backported a new behavior (i_error in 2.2 vs i_fatal in 2.1.14).
Axel
--- src/lib/hostpid.c.original 2013-02-18 12:46:25.000000000 +0100
+++ src/lib/hostpid.c 2013-02-19 12:40:47.000000000 +0100
@@ -3,9 +3,12 @@
#include "lib.h"
#include "hostpid.h"
+#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
+#define HOSTNAME_DISALLOWED_CHARS "/\r\n\t"
+
const char *my_hostname = NULL;
const char *my_pid = NULL;
@@ -14,14 +17,26 @@
void hostpid_init(void)
{
static char hostname[256], pid[MAX_INT_STRLEN];
+
+ const char * name;
- if (gethostname(hostname, sizeof(hostname)-1) == -1)
- i_strocpy(hostname, "unknown", sizeof(hostname));
- hostname[sizeof(hostname)-1] = '\0';
- my_hostname = hostname;
+ /* Children should find MY_HOSTNAME_ENV set by master process. */
+ /* Only master process should have to call gethostname() once. */
+ name = getenv(MY_HOSTNAME_ENV);
+ if (name == NULL) {
+ if (gethostname(hostname, sizeof(hostname)-1) < 0)
+ i_fatal("gethostname() failed: %m");
+ hostname[sizeof(hostname)-1] = '\0';
+ my_hostname = hostname;
+ }
+ else{
+ i_strocpy(hostname, name, sizeof(hostname));
+ my_hostname = hostname;
+ }
- if (strchr(hostname, '/') != NULL)
- i_fatal("Invalid system hostname: %s", hostname);
+ if (my_hostname[0] == '\0' ||
+ strcspn(my_hostname, HOSTNAME_DISALLOWED_CHARS) != strlen(my_hostname))
+ i_fatal("Invalid system hostname: '%s'", my_hostname);
/* allow calling hostpid_init() multiple times to reset hostname */
i_free_and_null(my_domain);
@@ -35,12 +50,17 @@
struct hostent *hent;
const char *name;
+ /* Children should find MY_HOSTDOMAIN_ENV set by master process. */
+ /* Only master process should have to call gethostbyname() once. */
if (my_domain == NULL) {
- hent = gethostbyname(my_hostname);
- name = hent != NULL ? hent->h_name : NULL;
+ name = getenv(MY_HOSTDOMAIN_ENV);
if (name == NULL) {
- /* failed, use just the hostname */
- name = my_hostname;
+ hent = gethostbyname(my_hostname);
+ name = hent != NULL ? hent->h_name : NULL;
+ if (name == NULL) {
+ /* failed, use just the hostname */
+ name = my_hostname;
+ }
}
my_domain = i_strdup(name);
}
--- src/lib/hostpid.h.original 2013-02-18 13:13:44.000000000 +0100
+++ src/lib/hostpid.h 2013-02-18 13:21:24.000000000 +0100
@@ -11,5 +11,10 @@
hostname. */
const char *my_hostdomain(void);
+/* When set, these environments override above my_hostname and static my_domain. */
+/* Master process normally sets these to child processes. */
+#define MY_HOSTNAME_ENV "DOVECOT_HOSTNAME"
+#define MY_HOSTDOMAIN_ENV "DOVECOT_HOSTDOMAIN"
+
#endif
--- src/master/service-process.c.original 2013-02-18 13:24:23.000000000 +0100
+++ src/master/service-process.c 2013-02-18 13:39:15.000000000 +0100
@@ -234,6 +234,8 @@
service->set->service_count));
}
env_put(t_strdup_printf(MASTER_UID_ENV"=%u", uid));
+ env_put(t_strdup_printf(MY_HOSTNAME_ENV"=%s", my_hostname));
+ env_put(t_strdup_printf(MY_HOSTDOMAIN_ENV"=%s", my_hostdomain()));
if (!service->set->master_set->version_ignore)
env_put(MASTER_DOVECOT_VERSION_ENV"="PACKAGE_VERSION);
More information about the dovecot
mailing list