continue;
}
- if (*service->executable == '\0') {
- *error_r = t_strdup_printf("service(%s): "
- "executable is empty", service->name);
- return FALSE;
- }
- if (*service->executable != '/') {
+ if (*service->executable != '/' &&
+ *service->executable != '\0') {
service->executable =
p_strconcat(pool, set->libexec_dir, "/",
service->executable, NULL);
service->idle_kill = set->idle_kill != 0 ? set->idle_kill :
set->master_set->default_idle_kill;
service->type = service->set->parsed_type;
- service->executable = set->executable;
if (set->process_limit == 0) {
/* use default */
return NULL;
}
+ service->executable = set->executable;
if (access(t_strcut(service->executable, ' '), X_OK) < 0) {
*error_r = t_strdup_printf("access(%s) failed: %m",
t_strcut(service->executable, ' '));
{
char *const *proto;
+ if (*set->executable == '\0') {
+ /* silently allow service {} blocks for disabled extensions
+ (e.g. service managesieve {} block without pigeonhole
+ installed) */
+ return FALSE;
+ }
+
if (*set->protocol == '\0')
return TRUE;