87 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 9f335750af9e46d6597de0cea5b8a2f7db951dc1 Mon Sep 17 00:00:00 2001
 | |
| From: Ray Strode <rstrode@redhat.com>
 | |
| Date: Mon, 15 Oct 2018 21:07:01 -0400
 | |
| Subject: [PATCH 3/6] event-loop: fix leak in error path
 | |
| 
 | |
| ply_event_loop_new fails to clean itself up if it's unable to
 | |
| create a pipe for dispatching signals.
 | |
| 
 | |
| This commit fixes that.
 | |
| ---
 | |
|  src/libply/ply-event-loop.c | 4 +++-
 | |
|  1 file changed, 3 insertions(+), 1 deletion(-)
 | |
| 
 | |
| diff --git a/src/libply/ply-event-loop.c b/src/libply/ply-event-loop.c
 | |
| index 9736dae..0e8ad7c 100644
 | |
| --- a/src/libply/ply-event-loop.c
 | |
| +++ b/src/libply/ply-event-loop.c
 | |
| @@ -469,62 +469,64 @@ ply_event_loop_remove_destination_by_fd_watch (ply_event_loop_t *loop,
 | |
|          source = destination->source;
 | |
|          assert (source != NULL);
 | |
|  
 | |
|          ply_list_remove_data (source->destinations, destination);
 | |
|          ply_event_source_drop_reference (source);
 | |
|          assert (ply_list_find_node (source->destinations, destination) == NULL);
 | |
|          ply_event_loop_update_source_event_mask (loop, source);
 | |
|  }
 | |
|  
 | |
|  ply_event_loop_t *
 | |
|  ply_event_loop_new (void)
 | |
|  {
 | |
|          ply_event_loop_t *loop;
 | |
|  
 | |
|          loop = calloc (1, sizeof(ply_event_loop_t));
 | |
|  
 | |
|          loop->epoll_fd = epoll_create1 (EPOLL_CLOEXEC);
 | |
|          loop->wakeup_time = PLY_EVENT_LOOP_NO_TIMED_WAKEUP;
 | |
|  
 | |
|          assert (loop->epoll_fd >= 0);
 | |
|  
 | |
|          loop->should_exit = false;
 | |
|          loop->exit_code = 0;
 | |
|  
 | |
|          loop->sources = ply_list_new ();
 | |
|          loop->exit_closures = ply_list_new ();
 | |
|          loop->timeout_watches = ply_list_new ();
 | |
|  
 | |
|          loop->signal_dispatcher = ply_signal_dispatcher_new ();
 | |
|  
 | |
| -        if (loop->signal_dispatcher == NULL)
 | |
| +        if (loop->signal_dispatcher == NULL) {
 | |
| +                ply_event_loop_free (loop);
 | |
|                  return NULL;
 | |
| +        }
 | |
|  
 | |
|          ply_event_loop_watch_fd (loop,
 | |
|                                   ply_signal_dispatcher_receiver_fd,
 | |
|                                   PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
 | |
|                                   (ply_event_handler_t)
 | |
|                                   ply_signal_dispatcher_dispatch_signal,
 | |
|                                   (ply_event_handler_t)
 | |
|                                   ply_signal_dispatcher_reset_signal_sources,
 | |
|                                   loop->signal_dispatcher);
 | |
|  
 | |
|          return loop;
 | |
|  }
 | |
|  
 | |
|  ply_event_loop_t *
 | |
|  ply_event_loop_get_default (void)
 | |
|  {
 | |
|          static ply_event_loop_t *loop = NULL;
 | |
|  
 | |
|          if (loop == NULL)
 | |
|                  loop = ply_event_loop_new ();
 | |
|  
 | |
|          return loop;
 | |
|  }
 | |
|  
 | |
|  static void
 | |
|  ply_event_loop_free_exit_closures (ply_event_loop_t *loop)
 | |
|  {
 | |
|          ply_list_node_t *node;
 | |
|  
 | |
|          node = ply_list_get_first_node (loop->exit_closures);
 | |
| -- 
 | |
| 2.17.1
 | |
| 
 |