Skip to content

Commit 1fea204

Browse files
committed
Fix NullPointerException when publishing an SNS batch without a topic ARN
1 parent 4b3e216 commit 1fea204

4 files changed

Lines changed: 30 additions & 0 deletions

File tree

‎dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/main/java/datadog/trace/instrumentation/aws/v1/sns/SnsInterceptor.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ public AmazonWebServiceRequest beforeMarshalling(AmazonWebServiceRequest request
9090
PublishBatchRequest pmbRequest = (PublishBatchRequest) request;
9191
// Extract the topic name from the ARN for DSM
9292
String topicName = pmbRequest.getTopicArn();
93+
if (null == topicName) {
94+
return request; // no topic to attribute the batch to, leave it untouched
95+
}
9396
topicName = topicName.substring(topicName.lastIndexOf(':') + 1);
9497

9598
final ByteBuffer bytebuffer = this.getMessageAttributeValueToInject(request, topicName);

‎dd-java-agent/instrumentation/aws-java/aws-java-sns-1.0/src/test/groovy/SnsClientTest.groovy‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import com.amazonaws.AmazonClientException
12
import com.amazonaws.auth.AWSStaticCredentialsProvider
23
import com.amazonaws.auth.BasicAWSCredentials
34
import com.amazonaws.client.builder.AwsClientBuilder
45
import com.amazonaws.services.sns.AmazonSNSClient
56
import com.amazonaws.services.sns.AmazonSNSClientBuilder
67
import com.amazonaws.services.sns.model.MessageAttributeValue
8+
import com.amazonaws.services.sns.model.PublishBatchRequest
9+
import com.amazonaws.services.sns.model.PublishBatchRequestEntry
710
import com.amazonaws.services.sns.model.PublishRequest
811
import datadog.trace.agent.test.naming.VersionedNamingTestBase
912
import datadog.trace.agent.test.utils.TraceUtils
@@ -235,6 +238,15 @@ abstract class SnsClientTest extends VersionedNamingTestBase {
235238
then:
236239
noExceptionThrown()
237240
}
241+
242+
def "SNS batch without topic ARN doesn't leak exception"() {
243+
when:
244+
snsClient.publishBatch(new PublishBatchRequest()
245+
.withPublishBatchRequestEntries(new PublishBatchRequestEntry().withId("1").withMessage('sometext')))
246+
247+
then:
248+
thrown(AmazonClientException)
249+
}
238250
}
239251

240252
class SnsClientV0Test extends SnsClientTest {

‎dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sns/SnsInterceptor.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ public SdkRequest modifyRequest(ModifyRequest context, ExecutionAttributes execu
8181
PublishBatchRequest request = (PublishBatchRequest) context.request();
8282
// Get topic name for DSM
8383
String snsTopicArn = request.topicArn();
84+
if (null == snsTopicArn) {
85+
return request; // no topic to attribute the batch to, leave it untouched
86+
}
8487
String snsTopicName = snsTopicArn.substring(snsTopicArn.lastIndexOf(':') + 1);
8588
ArrayList<PublishBatchRequestEntry> entries = new ArrayList<>();
8689
SdkBytes value = this.getMessageAttributeValueToInject(executionAttributes, snsTopicName);

‎dd-java-agent/instrumentation/aws-java/aws-java-sns-2.0/src/test/groovy/SnsClientTest.groovy‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
1313
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
1414
import software.amazon.awssdk.regions.Region
1515
import software.amazon.awssdk.services.sns.SnsClient
16+
import software.amazon.awssdk.core.exception.SdkException
17+
import software.amazon.awssdk.services.sns.model.PublishBatchRequestEntry
1618
import software.amazon.awssdk.services.sns.model.PublishResponse
1719
import software.amazon.awssdk.services.sqs.SqsClient
1820
import software.amazon.awssdk.services.sqs.model.QueueAttributeName
@@ -184,6 +186,16 @@ abstract class SnsClientTest extends VersionedNamingTestBase {
184186
noExceptionThrown()
185187
}
186188

189+
def "SNS batch without topic ARN doesn't leak exception"() {
190+
when:
191+
snsClient.publishBatch {
192+
it.publishBatchRequestEntries(PublishBatchRequestEntry.builder().id("1").message("sometext").build())
193+
}
194+
195+
then:
196+
thrown(SdkException)
197+
}
198+
187199
def "test propagation styles"() {
188200
when:
189201
TEST_WRITER.clear()

0 commit comments

Comments
 (0)