0

今日、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 にバグを送信する方法を見つける必要があります。

4

2 に答える 2

0

それについてはよくわかりません。CRTは、他のFLS関数とは異なる方法でFlsGetValueを処理するようです。CRTがFlsGetValue関数へのポインターをTLS(擬似コード)に格納しているようです。

void init_fls()
{
    FLS_GET_VALUE_PROC proc = GetProcAddress(kernel32, "FlsGetValue");
    if(!proc)
    {
        // FlsGetValue not implemented on this platform
        // use alternative implementation provided by CRT
        proc = __crtFlsGetValue;
    }
    // store pointer to FlsGetValue proc in TLS
    TlsSetValue(fls_get_value_index, proc);
}

void* get_fls_value(int index)
{
    // retrieve pointer to FlsGetValue proc from TLS
    FLS_GET_VALUE_PROC proc = TlsGetValue(fls_get_value_index);
    return proc(index);
}
于 2011-04-19T14:41:36.253 に答える
0

Microsoft Connect経由で Visual Studio のバグを報告します。

于 2011-04-19T03:55:24.607 に答える