{"record":{"id":"0820f82ea114493b","repo":"microsoft/semantic-kernel","slug":"binary-content-uri-is-empty","errorCode":null,"errorMessage":"Binary content URI is empty.","messagePattern":"Binary content URI is empty\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"info","filePath":"dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs","lineNumber":411,"sourceCode":"        {\n            return new GeminiPart\n            {\n                InlineData = new GeminiPart.InlineDataPart\n                {\n                    MimeType = GetMimeTypeFromBinaryContent(binaryContent),\n                    InlineData = Convert.ToBase64String(binaryContent.Data.Value.ToArray())\n                }\n            };\n        }\n\n        if (binaryContent.Uri is not null)\n        {\n            return new GeminiPart\n            {\n                FileData = new GeminiPart.FileDataPart\n                {\n                    MimeType = GetMimeTypeFromBinaryContent(binaryContent),\n                    FileUri = binaryContent.Uri ?? throw new InvalidOperationException(\"Binary content URI is empty.\")\n                }\n            };\n        }\n\n        throw new InvalidOperationException(\"Binary content does not contain any data or uri.\");\n    }\n\n    private static string GetMimeTypeFromBinaryContent(BinaryContent binaryContent)\n    {\n        return binaryContent.MimeType\n               ?? throw new InvalidOperationException(\"Binary content MimeType is empty.\");\n    }\n\n    private static void AddConfiguration(GeminiPromptExecutionSettings executionSettings, GeminiRequest request)\n    {\n        request.Configuration = new ConfigurationElement\n        {\n            Temperature = executionSettings.Temperature,","sourceCodeStart":393,"sourceCodeEnd":429,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs#L393-L429","documentation":"Thrown by CreateGeminiPartFromBinary when building a FileDataPart for a BinaryContent that has a URI. The binaryContent.Uri ?? throw guards against a null URI but sits inside an 'if (binaryContent.Uri is not null)' block, so it is effectively unreachable defensive code. It would only fire under concurrent mutation of the content object during serialization.","triggerScenarios":"Only fires if binaryContent.Uri is reset to null between the 'is not null' check (line 404) and the FileUri assignment (line 411) — a race condition on a shared, mutated BinaryContent.","commonSituations":"Reusing a single BinaryContent across parallel tasks where one clears the Uri while another serializes. Never occurs in single-threaded code.","solutions":["Do not mutate a BinaryContent instance concurrently with serializing it; treat it as immutable once passed to the kernel.","Construct a fresh BinaryContent per request instead of reusing/clearing one.","Audit shared-content patterns across parallel invocations."],"exampleFix":"// before (race)\nvar bin = new BinaryContent(uri: myUri, mimeType: \"application/octet-stream\");\n// task A serializes bin; task B sets bin.Uri = null\n\n// after\nvar bin = new BinaryContent(uri: myUri, mimeType: \"application/octet-stream\");\nawait kernel.InvokeAsync(... bin ...);  // no concurrent mutation","handlingStrategy":"validation","validationCode":"// Validate BinaryContent immutability before invoking\nstatic bool IsBinaryContentSafe(BinaryContent c)\n    => c.Uri is not null && !string.IsNullOrEmpty(c.MimeType);\n// Ensure no concurrent mutation of c.Uri during the call.","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat BinaryContent as immutable once passed to the kernel.","Never share and mutate a BinaryContent across parallel requests.","Build a fresh BinaryContent per request."],"tags":["gemini","binary","unreachable","concurrency"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}