- Fix a couple of segfaults that may happen on reload
This commit is contained in:
		
							parent
							
								
									d0eb246884
								
							
						
					
					
						commit
						7522c31552
					
				
							
								
								
									
										113
									
								
								sssd-0.4.1-reload_conf.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								sssd-0.4.1-reload_conf.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | |||||||
|  | From 673c2ce9b3371241de872b2bd206f732485888cb Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Stephen Gallagher <sgallagh@redhat.com> | ||||||
|  | Date: Fri, 19 Jun 2009 11:09:33 -0400 | ||||||
|  | Subject: [PATCH] Fix segfault in update_monitor_config | ||||||
|  | 
 | ||||||
|  | We were stealing the memory context of only the first value in | ||||||
|  | the linked-list of domains (and also services). This patch adds a | ||||||
|  | memory context to hold the lists so that can be stolen along with | ||||||
|  | all of the entries. | ||||||
|  | ---
 | ||||||
|  |  server/confdb/confdb.c   |    4 ++++ | ||||||
|  |  server/monitor/monitor.c |   34 ++++++++++++++++++++++++++-------- | ||||||
|  |  2 files changed, 30 insertions(+), 8 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/server/confdb/confdb.c b/server/confdb/confdb.c
 | ||||||
|  | index 8eefcfb..8b8dc74 100644
 | ||||||
|  | --- a/server/confdb/confdb.c
 | ||||||
|  | +++ b/server/confdb/confdb.c
 | ||||||
|  | @@ -709,6 +709,10 @@ int confdb_get_domain(struct confdb_ctx *cdb,
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      domain = talloc_zero(mem_ctx, struct sss_domain_info); | ||||||
|  | +    if (!domain) {
 | ||||||
|  | +        ret = ENOMEM;
 | ||||||
|  | +        goto done;
 | ||||||
|  | +    }
 | ||||||
|  |   | ||||||
|  |      tmp = ldb_msg_find_attr_as_string(res->msgs[0], "cn", NULL); | ||||||
|  |      if (!tmp) { | ||||||
|  | diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c
 | ||||||
|  | index 906d157..e4fca25 100644
 | ||||||
|  | --- a/server/monitor/monitor.c
 | ||||||
|  | +++ b/server/monitor/monitor.c
 | ||||||
|  | @@ -84,7 +84,9 @@ struct mt_svc {
 | ||||||
|  |  struct mt_ctx { | ||||||
|  |      struct tevent_context *ev; | ||||||
|  |      struct confdb_ctx *cdb; | ||||||
|  | +    TALLOC_CTX *domain_ctx; /* Memory context for domain list */
 | ||||||
|  |      struct sss_domain_info *domains; | ||||||
|  | +    TALLOC_CTX *service_ctx; /* Memory context for services */
 | ||||||
|  |      char **services; | ||||||
|  |      struct mt_svc *svc_list; | ||||||
|  |      struct sbus_srv_ctx *sbus_srv; | ||||||
|  | @@ -619,8 +621,13 @@ int get_monitor_config(struct mt_ctx *ctx)
 | ||||||
|  |          return ret; | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | -    ret = confdb_get_string_as_list(ctx->cdb, ctx, SERVICE_CONF_ENTRY,
 | ||||||
|  | -                                    "activeServices", &ctx->services);
 | ||||||
|  | +    ctx->service_ctx = talloc_new(ctx);
 | ||||||
|  | +    if(!ctx->service_ctx) {
 | ||||||
|  | +        return ENOMEM;
 | ||||||
|  | +    }
 | ||||||
|  | +    ret = confdb_get_string_as_list(ctx->cdb, ctx->service_ctx,
 | ||||||
|  | +                                    SERVICE_CONF_ENTRY, "activeServices",
 | ||||||
|  | +                                    &ctx->services);
 | ||||||
|  |      if (ret != EOK) { | ||||||
|  |          DEBUG(0, ("No services configured!\n")); | ||||||
|  |          return EINVAL; | ||||||
|  | @@ -631,7 +638,11 @@ int get_monitor_config(struct mt_ctx *ctx)
 | ||||||
|  |          return ret; | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | -    ret = confdb_get_domains(ctx->cdb, ctx, &ctx->domains);
 | ||||||
|  | +    ctx->domain_ctx = talloc_new(ctx);
 | ||||||
|  | +    if(!ctx->domain_ctx) {
 | ||||||
|  | +        return ENOMEM;
 | ||||||
|  | +    }
 | ||||||
|  | +    ret = confdb_get_domains(ctx->cdb, ctx->domain_ctx, &ctx->domains);
 | ||||||
|  |      if (ret != EOK) { | ||||||
|  |          DEBUG(2, ("No domains configured. LOCAL should always exist!\n")); | ||||||
|  |          return ret; | ||||||
|  | @@ -861,7 +872,12 @@ static int update_monitor_config(struct mt_ctx *ctx)
 | ||||||
|  |      struct mt_svc *cur_svc; | ||||||
|  |      struct mt_svc *new_svc; | ||||||
|  |      struct sss_domain_info *dom, *new_dom; | ||||||
|  | -    struct mt_ctx *new_config = talloc_zero(NULL, struct mt_ctx);
 | ||||||
|  | +    struct mt_ctx *new_config;
 | ||||||
|  | +
 | ||||||
|  | +    new_config = talloc_zero(NULL, struct mt_ctx);
 | ||||||
|  | +    if(!new_config) {
 | ||||||
|  | +        return ENOMEM;
 | ||||||
|  | +    }
 | ||||||
|  |   | ||||||
|  |      new_config->ev = ctx->ev; | ||||||
|  |      new_config->cdb = ctx->cdb; | ||||||
|  | @@ -953,8 +969,9 @@ static int update_monitor_config(struct mt_ctx *ctx)
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      /* Replace the old service list with the new one */ | ||||||
|  | -    talloc_free(ctx->services);
 | ||||||
|  | -    ctx->services = talloc_steal(ctx, new_config->services);
 | ||||||
|  | +    talloc_free(ctx->service_ctx);
 | ||||||
|  | +    ctx->service_ctx = talloc_steal(ctx, new_config->service_ctx);
 | ||||||
|  | +    ctx->services = new_config->services;
 | ||||||
|  |   | ||||||
|  |      /* Compare data providers */ | ||||||
|  |      /* Have any providers been disabled? */ | ||||||
|  | @@ -1040,8 +1057,9 @@ static int update_monitor_config(struct mt_ctx *ctx)
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      /* Replace the old domain list with the new one */ | ||||||
|  | -    talloc_free(ctx->domains);
 | ||||||
|  | -    ctx->domains = talloc_steal(ctx, new_config->domains);
 | ||||||
|  | +    talloc_free(ctx->domain_ctx);
 | ||||||
|  | +    ctx->domain_ctx = talloc_steal(ctx, new_config->domain_ctx);
 | ||||||
|  | +    ctx->domains = new_config->domains;
 | ||||||
|  |   | ||||||
|  |      /* Signal all services to reload their configuration */ | ||||||
|  |      for(cur_svc = ctx->svc_list; cur_svc; cur_svc = cur_svc->next) { | ||||||
|  | -- 
 | ||||||
|  | 1.6.2.2 | ||||||
|  | 
 | ||||||
							
								
								
									
										36
									
								
								sssd-0.4.1-reload_conf_2.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								sssd-0.4.1-reload_conf_2.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | From 12cbba5545aefa59e27f683e17e05b8e80063718 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Stephen Gallagher <sgallagh@redhat.com> | ||||||
|  | Date: Fri, 19 Jun 2009 11:28:49 -0400 | ||||||
|  | Subject: [PATCH] Protect against segfault in service_signal_reload | ||||||
|  | 
 | ||||||
|  | There is a potential race condition where the monitor may attempt | ||||||
|  | to signal a reload of a child process before the communication | ||||||
|  | sbus channel is available. If this happens, we will just exit this | ||||||
|  | function and let the monitor kill and restart the child process. | ||||||
|  | ---
 | ||||||
|  |  server/monitor/monitor.c |    9 +++++++++ | ||||||
|  |  1 files changed, 9 insertions(+), 0 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c
 | ||||||
|  | index e4fca25..5cc73c8 100644
 | ||||||
|  | --- a/server/monitor/monitor.c
 | ||||||
|  | +++ b/server/monitor/monitor.c
 | ||||||
|  | @@ -525,6 +525,15 @@ static int service_signal_reload(struct mt_svc *svc)
 | ||||||
|  |          return EOK; | ||||||
|  |      } | ||||||
|  |   | ||||||
|  | +    if (!svc->mt_conn) {
 | ||||||
|  | +        /* Avoid a race condition where we are trying to
 | ||||||
|  | +         * order a service to reload that hasn't started
 | ||||||
|  | +         * yet.
 | ||||||
|  | +         */
 | ||||||
|  | +        DEBUG(1,("Could not reload service [%s].\n", svc->name));
 | ||||||
|  | +        return EIO;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  |      conn = sbus_get_connection(svc->mt_conn->conn_ctx); | ||||||
|  |      msg = dbus_message_new_method_call(NULL, | ||||||
|  |                                         SERVICE_PATH, | ||||||
|  | -- 
 | ||||||
|  | 1.6.2.2 | ||||||
|  | 
 | ||||||
| @ -1,6 +1,6 @@ | |||||||
| Name: sssd | Name: sssd | ||||||
| Version: 0.4.1 | Version: 0.4.1 | ||||||
| Release: 1%{?dist} | Release: 2%{?dist} | ||||||
| Group: Applications/System | Group: Applications/System | ||||||
| Summary: System Security Services Daemon | Summary: System Security Services Daemon | ||||||
| 
 | 
 | ||||||
| @ -14,6 +14,8 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) | |||||||
| ### Patches ### | ### Patches ### | ||||||
| Patch010: sssd-0.4.1-debug_fn.patch | Patch010: sssd-0.4.1-debug_fn.patch | ||||||
| Patch011: sssd-0.4.1-conf_check.patch | Patch011: sssd-0.4.1-conf_check.patch | ||||||
|  | Patch012: sssd-0.4.1-reload_conf.patch | ||||||
|  | Patch013: sssd-0.4.1-reload_conf_2.patch | ||||||
| 
 | 
 | ||||||
| ### Dependencies ### | ### Dependencies ### | ||||||
| 
 | 
 | ||||||
| @ -58,6 +60,8 @@ services for projects like FreeIPA. | |||||||
| 
 | 
 | ||||||
| %patch010 -p1 -b .debug_fn | %patch010 -p1 -b .debug_fn | ||||||
| %patch011 -p1 -b .conf_check | %patch011 -p1 -b .conf_check | ||||||
|  | %patch012 -p1 -b .reload_conf | ||||||
|  | %patch013 -p1 -b .reload_conf_2 | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| %configure \ | %configure \ | ||||||
| @ -131,6 +135,9 @@ if [ $1 -ge 1 ] ; then | |||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Mon Jun 22 2009 Simo Sorce <ssorce@redhat.com> - 0.4.1-2 | ||||||
|  | - Fix a couple of segfaults that may happen on reload | ||||||
|  | 
 | ||||||
| * Thu Jun 11 2009 Simo Sorce <ssorce@redhat.com> - 0.4.1-1 | * Thu Jun 11 2009 Simo Sorce <ssorce@redhat.com> - 0.4.1-1 | ||||||
| - add missing configure check that broke stopping the daemon | - add missing configure check that broke stopping the daemon | ||||||
| - also fix default config to add a missing required option | - also fix default config to add a missing required option | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user