Skip to content

Commit

Permalink
Fix Image.applyFilters to do an AND logic
Browse files Browse the repository at this point in the history
When multiple filters are given, only return objects
that match all the filters given by the user.
This matches Docker behavior.

Signed-off-by: Urvashi Mohnani <[email protected]>
  • Loading branch information
umohnani8 committed Jan 15, 2024
1 parent 2972cf9 commit d7dd506
Showing 1 changed file with 8 additions and 16 deletions.
24 changes: 8 additions & 16 deletions libimage/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,33 +20,25 @@ import (
// indicates that the image matches the criteria.
type filterFunc func(*Image) (bool, error)

// Apply the specified filters. At least one filter of each key must apply.
// Apply the specified filters. All filters of each key must apply.
func (i *Image) applyFilters(ctx context.Context, filters map[string][]filterFunc) (bool, error) {
matches := false
for key := range filters { // and
matches = false
for _, filter := range filters[key] { // or
var err error
matches, err = filter(i)
for key := range filters {
for _, filter := range filters[key] {
matches, err := filter(i)
if err != nil {
// Some images may have been corrupted in the
// meantime, so do an extra check and make the
// error non-fatal (see containers/podman/issues/12582).
if errCorrupted := i.isCorrupted(ctx, ""); errCorrupted != nil {
logrus.Errorf(errCorrupted.Error())
return false, nil
}
return false, err
}
if matches {
break
// If any filter within a group doesn't match, return false
if !matches {
return false, nil
}
}
if !matches {
return false, nil
}
}
return matches, nil
return true, nil
}

// filterImages returns a slice of images which are passing all specified
Expand Down

0 comments on commit d7dd506

Please sign in to comment.