An Azure service that is used to control and help secure email, documents, and sensitive data that are shared outside the company.
Hello Tamir Aviv
Greetings! Thanks for raising this question in Q&A forum.
This is an exceptionally well-investigated bug report you've done a thorough job isolating the issue right down to the kernel TCP state and thread-level analysis. Let me summarise what's happening and guide you on the best path forward.
Based on your findings, the root cause is clear: MIP SDK 1.18.124's default HTTP delegate (the internal libcurl multi-handle / event-loop wrapper) is failing to poll the socket for responses after the HTTP request is submitted. The CLOSE_WAIT TCP state confirms the server sent its response and closed the connection, but no MIP thread is reading it all 60+ MIP threads are sleeping on a futex, and the epoll thread belongs to your Go runtime, not MIP. The network, libcurl, OpenSSL, and your auth token are all confirmed healthy. This is a regression in MIP's internal HTTP layer introduced between version 1.16.126 (working) and 1.18.124 (broken).
Here's the recommended course of action:
Step 1: Keep Your Custom HttpDelegate as the Immediate Workaround
Your custom mip::HttpDelegate using curl_easy_perform is the correct and fully supported workaround for now. Since it resolves the hang completely and surfaces errors properly, continue using it in production while this SDK bug is being fixed. This is not a hack registering a custom HttpDelegate via MipConfiguration::SetHttpDelegate(...) is an officially supported pattern in MIP SDK.
Step 2: Report This as a Bug to Microsoft via the MIP SDK GitHub Repository
This is clearly a product bug and needs to be reported so the MIP SDK team can fix it in an upcoming release. Please open a bug report at the official Microsoft Information Protection SDK GitHub repository: https://github.com/MicrosoftDocs/Azure-RMSDocs/issues
In your bug report, include all the excellent diagnostic details you've already gathered — the SDK version, OS, the CLOSE_WAIT TCP state evidence, the futex thread dump, the confirmation that 1.16.126 works, and that the custom delegate resolves the issue. This level of detail will help the SDK team reproduce and fix it quickly.
Step 3: Open a Microsoft Support Ticket to Escalate the Fix
In parallel, open a support ticket at https://aka.ms/azuresupport under Azure Information Protection / MIP SDK. Reference this Q&A thread and your GitHub issue. Escalating through support in addition to GitHub increases visibility with the product team and may result in a faster fix or a hotfix build being prioritised. Ask specifically whether a fixed build or a newer patch version is available or on the roadmap for the libcurl multi-handle event loop regression in 1.18.124.
Step 4: Test Against 1.17.x if Available
If your deployment constraints allow, try the SDK version 1.17.x (if available for Ubuntu 24.04) to confirm the regression was introduced in 1.18.x versus 1.17.x. This binary bisect information will be very useful for the SDK team to identify exactly which commit introduced the event-loop bug.
Step 5: Check for a Newer Patch Version
Check the MIP SDK NuGet/package feed and the release notes for any patch version newer than 1.18.124 that may have already addressed this: https://learn.microsoft.com/en-us/information-protection/develop/version-release-history
If a newer build is available, test it with the default HttpDelegate to see if the regression has been fixed upstream.
Again, your diagnosis is excellent and your workaround is solid. The custom HttpDelegate approach is the right short-term fix, and getting this reported through both GitHub and Microsoft Support is the right way to get a permanent fix in the SDK itself.
If this answer helps you kindly accept the answer which will help others who have similar questions.
Best Regards,
Jerald Felix.