fix: a crash in RemoveReplication target (#19640)

calling a remote target remove with a perfectly
well constructed ARN can lead to a crash for a bucket
with no replication configured.

This PR fixes, and adds a crash check for ImportMetadata
as well.
This commit is contained in:
Harshavardhana 2024-04-30 18:09:56 -07:00 committed by GitHub
parent f64dea2aac
commit 8161411c5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 5 additions and 5 deletions

View File

@ -735,7 +735,7 @@ func (a adminAPIHandlers) ImportBucketMetadataHandler(w http.ResponseWriter, r *
rpt.SetStatus(bucket, fileName, fmt.Errorf("An Object Lock configuration is present on this bucket, so the versioning state cannot be suspended.")) rpt.SetStatus(bucket, fileName, fmt.Errorf("An Object Lock configuration is present on this bucket, so the versioning state cannot be suspended."))
continue continue
} }
if _, err := getReplicationConfig(ctx, bucket); err == nil && v.Suspended() { if rcfg, _ := getReplicationConfig(ctx, bucket); rcfg != nil && v.Suspended() {
rpt.SetStatus(bucket, fileName, fmt.Errorf("A replication configuration is present on this bucket, so the versioning state cannot be suspended.")) rpt.SetStatus(bucket, fileName, fmt.Errorf("A replication configuration is present on this bucket, so the versioning state cannot be suspended."))
continue continue
} }

View File

@ -998,7 +998,7 @@ func replicateObject(ctx context.Context, ri ReplicateObjectInfo, objectAPI Obje
object := ri.Name object := ri.Name
cfg, err := getReplicationConfig(ctx, bucket) cfg, err := getReplicationConfig(ctx, bucket)
if err != nil { if err != nil || cfg == nil {
replLogOnceIf(ctx, err, "get-replication-config-"+bucket) replLogOnceIf(ctx, err, "get-replication-config-"+bucket)
sendEvent(eventArgs{ sendEvent(eventArgs{
EventName: event.ObjectReplicationNotTracked, EventName: event.ObjectReplicationNotTracked,

View File

@ -428,7 +428,7 @@ func (sys *BucketTargetSys) RemoveTarget(ctx context.Context, bucket, arnStr str
if arn.Type == madmin.ReplicationService { if arn.Type == madmin.ReplicationService {
// reject removal of remote target if replication configuration is present // reject removal of remote target if replication configuration is present
rcfg, err := getReplicationConfig(ctx, bucket) rcfg, err := getReplicationConfig(ctx, bucket)
if err == nil { if err == nil && rcfg != nil {
for _, tgtArn := range rcfg.FilterTargetArns(replication.ObjectOpts{OpType: replication.AllReplicationType}) { for _, tgtArn := range rcfg.FilterTargetArns(replication.ObjectOpts{OpType: replication.AllReplicationType}) {
if err == nil && (tgtArn == arnStr || rcfg.RoleArn == arnStr) { if err == nil && (tgtArn == arnStr || rcfg.RoleArn == arnStr) {
sys.RLock() sys.RLock()

View File

@ -958,7 +958,7 @@ func (i *scannerItem) applyLifecycle(ctx context.Context, o ObjectLayer, oi Obje
var vc *versioning.Versioning var vc *versioning.Versioning
var lr objectlock.Retention var lr objectlock.Retention
var rcfg *replication.Config var rcfg *replication.Config
if i.bucket != minioMetaBucket { if !isMinioMetaBucketName(i.bucket) {
vc, err = globalBucketVersioningSys.Get(i.bucket) vc, err = globalBucketVersioningSys.Get(i.bucket)
if err != nil { if err != nil {
scannerLogOnceIf(ctx, err, i.bucket) scannerLogOnceIf(ctx, err, i.bucket)

View File

@ -5781,7 +5781,7 @@ func (c *SiteReplicationSys) startResync(ctx context.Context, objAPI ObjectLayer
for _, bi := range buckets { for _, bi := range buckets {
bucket := bi.Name bucket := bi.Name
if _, err := getReplicationConfig(ctx, bucket); err != nil { if _, _, err := globalBucketMetadataSys.GetReplicationConfig(ctx, bucket); err != nil {
res.Buckets = append(res.Buckets, madmin.ResyncBucketStatus{ res.Buckets = append(res.Buckets, madmin.ResyncBucketStatus{
ErrDetail: err.Error(), ErrDetail: err.Error(),
Bucket: bucket, Bucket: bucket,