From f4a2d25c0fca166c4009be9ce2b3fa9aae2066b3 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <rothberg@redhat.com>
Date: Tue, 7 Jul 2020 16:22:22 +0200
Subject: fix race condition in `libpod.GetEvents(...)`

Fix a race that could cause read errors to be masked.  Masking such
errors is likely to report red herrings since users don't see that
reading failed for some reasons but that a given event could not be
found.

Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
---
 libpod/events.go | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

(limited to 'libpod')

diff --git a/libpod/events.go b/libpod/events.go
index 7560940a5..3cbde8c5e 100644
--- a/libpod/events.go
+++ b/libpod/events.go
@@ -3,6 +3,7 @@ package libpod
 import (
 	"context"
 	"fmt"
+	"sync"
 
 	"github.com/containers/libpod/v2/libpod/events"
 	"github.com/pkg/errors"
@@ -86,7 +87,6 @@ func (r *Runtime) Events(ctx context.Context, options events.ReadOptions) error
 
 // GetEvents reads the event log and returns events based on input filters
 func (r *Runtime) GetEvents(ctx context.Context, filters []string) ([]*events.Event, error) {
-	var readErr error
 	eventChannel := make(chan *events.Event)
 	options := events.ReadOptions{
 		EventChannel: eventChannel,
@@ -98,17 +98,20 @@ func (r *Runtime) GetEvents(ctx context.Context, filters []string) ([]*events.Ev
 	if err != nil {
 		return nil, err
 	}
+
+	logEvents := make([]*events.Event, 0, len(eventChannel))
+	readLock := sync.Mutex{}
+	readLock.Lock()
 	go func() {
-		readErr = eventer.Read(ctx, options)
+		for e := range eventChannel {
+			logEvents = append(logEvents, e)
+		}
+		readLock.Unlock()
 	}()
-	if readErr != nil {
-		return nil, readErr
-	}
-	logEvents := make([]*events.Event, 0, len(eventChannel))
-	for e := range eventChannel {
-		logEvents = append(logEvents, e)
-	}
-	return logEvents, nil
+
+	readErr := eventer.Read(ctx, options)
+	readLock.Lock() // Wait for the events to be consumed.
+	return logEvents, readErr
 }
 
 // GetLastContainerEvent takes a container name or ID and an event status and returns
-- 
cgit v1.2.3-54-g00ecf