今日、Visual Studio 2008 と 2010 の CRT ライブラリのソース コードを調べていたら、mtdll.h ファイルにバグが見つかりました。問題はマクロ FLS_GETVALUE にあります。x86 システムでは、このマクロは、変数 gpFlsGetValue に割り当てられた関数を呼び出す代わりに、TlsGetValue を直接呼び出します。
まず第一に、FlsAlloc、FlsGetValue、FlsFree、および FlsSetValue がすべてのシステム (Windows Vista 以降および Windows Server 2003 以降) で使用できるわけではないため、これは問題です。これらの関数は、TlsAlloc、TlsGetValue、TlsFree、および TlsSetValue のように動作しますが、ファイバー (一種のユーザー スレッド) をサポートします。Tls 関数の代わりに Fls* 関数を使用する必要があるため、VS の C ランタイム ライブラリは、プロセスまたは dll がロードされたときに Fls 関数が使用可能かどうかをチェックし、gpFls* 変数を初期化します。Fls* が利用できない場合、CRT はこれらの変数を同等の Tls* 関数で初期化します。
ランタイム ライブラリによって内部的に使用されるため、マクロ FLS_GETVALUE をコード内で直接使用することはできません。ランタイムは、このマクロを使用して、ランタイム ライブラリのスレッド データごとに初期化します。
私の質問は、このバグの影響についてです。ファイバーが広く使用されていないことは承知していますが、ファイバーを使用するアプリケーション内で使用される DLL を開発すると、どのような影響がありますか? このバグはアプリケーションのクラッシュを引き起こす可能性がありますか、それとも誤った結果しか生成しませんか? この問題は、SQL Server のような広く使用されているアプリケーションで問題を引き起こす可能性がありますか? どう思いますか?このバグはセキュリティ上のリスクになる可能性がありますか? IIS または ASP.Net は、クラッシュの原因となるファイバーを使用していますか?
好奇心旺盛な人のために、mtdll.h の問題のある行の現在のソースを以下に示します。
#define FLS_GETVALUE ((PFLS_GETVALUE_FUNCTION)TlsGetValue(__getvalueindex))
以下は、マクロ FLS_GETVALUE の修正版です。
#define FLS_GETVALUE (((PFLS_GETVALUE_FUNCTION)DecodePointer(gpFlsGetValue))(__getvalueindex))
今のところ、Microsoft にバグを送信する方法を見つける必要があります。