This is not related to linking, but this seems to be a bug of 3.14.1, maybe 
related to Bug 811928 ?

to reproduce on Windows Visual C++ 2010, with cert8.db, key3.db, secmod.db in 
the path (no pkcs11.txt), checked also renaming secmod.db (different error code)

====BEGIN CODE
#include <stdio.h>
#include <string.h>
#include <nspr.h>
#include <nss.h>
#include <ssl.h>
#include <pk11pub.h>

namespace {

void get_cert(const char *nickname)
{
        CERTCertificate *cert = PK11_FindCertFromNickname(nickname, NULL);
        if (!cert) {
                printf("Cannot find '%s' certificate, error %d.\n", nickname, 
PR_GetError());
        } else {
                printf("Certificate '%s', SN: %s\n", nickname, 
cert->subjectName);
        }
}

NSSInitContext *init_context(char *dbdir, char *desc)
{
        NSSInitParameters initParams;
        memset((void*) &initParams, '\0', sizeof(initParams));
        initParams.length = sizeof(initParams);
        NSSInitContext *ctx = NSS_InitContext(dbdir, "", "", SECMOD_DB, 
&initParams, NSS_INIT_READONLY);
        return ctx;
}


int tests_simple_2(char *path)
{
        NSSInitParameters initParams;
        memset((void*) &initParams, '\0', sizeof(initParams));
        initParams.length = sizeof(initParams);

        NSSInitContext *ctx = NSS_InitContext("", "", "", SECMOD_DB, 
&initParams,
                                
NSS_INIT_READONLY|NSS_INIT_NOCERTDB|NSS_INIT_NOMODDB);
        
        if (!ctx) {
                printf("NSS_InitContext error %d\n", PR_GetError());
                return 1;
        }
        char conf[256];
        sprintf(conf, "configDir='%s' tokenDescription='db1' flags=readOnly", 
path);
        PK11SlotInfo *slot_1 = SECMOD_OpenUserDB(conf);
        if (!slot_1)
                printf("SECMOD_OpenUserDB %d\n", PR_GetError());
        if (slot_1)
                SECMOD_CloseUserDB(slot_1);
        NSS_ShutdownContext(ctx);
        printf("tests_simple_2 OK\n");

        return 0;
}

int tests_simple_1(char *path, char *key)
{
        NSSInitContext *ctx1 = init_context(path, "db1");
        if (!ctx1) {
                printf("init context error %d\n", PR_GetError());
                return 1;
        }
        get_cert(key);
        NSS_ShutdownContext(ctx1);
        printf("tests_simple_1 OK\n");
        return 0;
}

} // namespace

int main(int argc, char* argv[])
{
        char *path = "some_path";
        char *key = "some_key_in_the_db";
        tests_simple_2(path);
        tests_simple_1(path, key);
        tests_simple_2(path);
        return 0;
}
====END CODE

this will output:

tests_simple_2 OK
init context error -8015
NSS_InitContext error -8018

Changing the order in the main gives the same error !
I am going to check that on 3.14.2
-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to