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);

}