From c1b9d7714cc797d0be89d1e482ab5c4027c37f08 Mon Sep 17 00:00:00 2001 From: hantmac Date: Tue, 22 Feb 2022 10:15:52 +0800 Subject: [PATCH] fix nil pointer dereference in TopicNameWithoutPartitionPart Signed-off-by: hantmac add error check Signed-off-by: hantmac --- pulsar/consumer_partition_test.go | 4 +--- pulsar/internal/metrics.go | 5 ++++- pulsar/internal/topic_name.go | 3 +++ pulsar/internal/topic_name_test.go | 12 ++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/pulsar/consumer_partition_test.go b/pulsar/consumer_partition_test.go index e7fcd5ddd2..2255e52e8b 100644 --- a/pulsar/consumer_partition_test.go +++ b/pulsar/consumer_partition_test.go @@ -21,11 +21,9 @@ import ( "sync" "testing" + "github.com/apache/pulsar-client-go/pulsar/internal" "github.com/apache/pulsar-client-go/pulsar/internal/crypto" - "github.com/stretchr/testify/assert" - - "github.com/apache/pulsar-client-go/pulsar/internal" ) func TestSingleMessageIDNoAckTracker(t *testing.T) { diff --git a/pulsar/internal/metrics.go b/pulsar/internal/metrics.go index ec1a96e127..1cab470960 100644 --- a/pulsar/internal/metrics.go +++ b/pulsar/internal/metrics.go @@ -482,7 +482,10 @@ func NewMetricsProvider(metricsCardinality int, userDefinedLabels map[string]str func (mp *Metrics) GetLeveledMetrics(t string) *LeveledMetrics { labels := make(map[string]string, 3) - tn, _ := ParseTopicName(t) + tn, err := ParseTopicName(t) + if err != nil { + return nil + } topic := TopicNameWithoutPartitionPart(tn) switch mp.metricsLevel { case 4: diff --git a/pulsar/internal/topic_name.go b/pulsar/internal/topic_name.go index 86a1ebe246..481e41f5bb 100644 --- a/pulsar/internal/topic_name.go +++ b/pulsar/internal/topic_name.go @@ -107,6 +107,9 @@ func ParseTopicName(topic string) (*TopicName, error) { } func TopicNameWithoutPartitionPart(tn *TopicName) string { + if tn == nil { + return "" + } if tn.Partition < 0 { return tn.Name } diff --git a/pulsar/internal/topic_name_test.go b/pulsar/internal/topic_name_test.go index f08fcd0ef8..ab6537b3d7 100644 --- a/pulsar/internal/topic_name_test.go +++ b/pulsar/internal/topic_name_test.go @@ -104,20 +104,24 @@ func TestParseTopicNameErrors(t *testing.T) { func TestTopicNameWithoutPartitionPart(t *testing.T) { tests := []struct { - tn TopicName + tn *TopicName expected string }{ { - tn: TopicName{Name: "persistent://public/default/my-topic", Partition: -1}, + tn: &TopicName{Name: "persistent://public/default/my-topic", Partition: -1}, expected: "persistent://public/default/my-topic", }, { - tn: TopicName{Name: "persistent://public/default/my-topic-partition-0", Partition: 0}, + tn: &TopicName{Name: "persistent://public/default/my-topic-partition-0", Partition: 0}, expected: "persistent://public/default/my-topic", }, + { + tn: nil, + expected: "", + }, } for _, test := range tests { - assert.Equal(t, test.expected, TopicNameWithoutPartitionPart(&test.tn)) + assert.Equal(t, test.expected, TopicNameWithoutPartitionPart(test.tn)) } }