diff --git a/.changes/next-release/bugfix-24d6621e-32d3-45c5-a996-66232724e425.json b/.changes/next-release/bugfix-24d6621e-32d3-45c5-a996-66232724e425.json new file mode 100644 index 0000000000..4bd408ec09 --- /dev/null +++ b/.changes/next-release/bugfix-24d6621e-32d3-45c5-a996-66232724e425.json @@ -0,0 +1,4 @@ +{ + "type" : "bugfix", + "description" : "Amazon Q: Prevent IndexOutOfBoundsException by adding boundary checks for invalid range markers (#5187)" +} diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt index 80fa6c769a..b5ce5048c4 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererUserModificationTracker.kt @@ -19,6 +19,7 @@ import org.assertj.core.util.VisibleForTesting import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger +import software.aws.toolkits.core.utils.warn import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator @@ -154,7 +155,7 @@ class CodeWhispererUserModificationTracker(private val project: Project) : Dispo private fun emitTelemetryOnSuggestion(acceptedSuggestion: AcceptedSuggestionEntry) { val file = acceptedSuggestion.vFile - if (file == null || (!file.isValid)) { + if (file == null || (!file.isValid) || !acceptedSuggestion.range.isValid) { sendModificationTelemetry(acceptedSuggestion, null) sendUserModificationTelemetryToServiceAPI(acceptedSuggestion) } else { @@ -162,6 +163,20 @@ class CodeWhispererUserModificationTracker(private val project: Project) : Dispo val document = runReadAction { FileDocumentManager.getInstance().getDocument(file) } + val start = acceptedSuggestion.range.startOffset + val end = acceptedSuggestion.range.endOffset + if (document != null) { + if (start < 0 || end < start || end > document.textLength) { + LOG.warn { + "Invalid range for suggestion ${acceptedSuggestion.requestId}: " + + "start=$start, end=$end, docLength=${document.textLength}" + } + sendModificationTelemetry(acceptedSuggestion, null) + sendUserModificationTelemetryToServiceAPI(acceptedSuggestion) + return + } + } + val currentString = document?.getText( TextRange(acceptedSuggestion.range.startOffset, acceptedSuggestion.range.endOffset) )