Oracle Solaris セキュリティーサービス開発ガイド

ユーザーレベルのプロバイダにおけるデータクリーンアップ衝突の回避

暗号化フレームワークにプラグインするユーザーレベルライブラリでは、_fini() 関数を提供する必要があります。_fini() 関数は、ライブラリの読み込み解除時にローダによって呼び出されます。_fini() 関数は、すべてのクリーンアップが正しいタイミングで正しく実行されるために必要です。libpkcs11 を使用するライブラリが C_Finalize() を呼び出すことは想定されていません。なぜなら、libpkcs11 はアプリケーションによって使用されている可能性がある共有ライブラリだからです。

_fini() 関数を提供するには、再配置可能オブジェクトのプログラムデータセクション内に .fini セクションを作成する必要があります。.fini セクションは実行時終了コードブロックを提供します。『リンカーとライブラリ』を参照してください。次のコード例は .fini セクションの設計方法を示しています。


例 8–1 PKCS #11 ライブラリへの _fini() の提供

#pragma fini(pkcs11_fini)
static void pkcs11_fini();

/* [... (other library code omitted)] */

static void
pkcs11_fini()
{
        (void) pthread_mutex_lock(&pkcs11mutex);
        
        /* If CRYPTOKI is not initialized, do not clean up */
        if (!initialized) {
                (void) pthread_mutex_unlock(&pkcs11mutex);
                return;
        }
        
        (void) finalize_routine(NULL_PTR);
        
        (void) pthread_mutex_unlock(&pkcs11mutex);
}