apps/ca.c:932: error: INTEGER_OVERFLOW_L2
  ([0, +oo] - 6):unsigned64 by call to `TXT_DB_write`.
Showing all 12 steps of the trace


apps/ca.c:875:7: Call
873.   		goto err;
874.   		}
875.   	db = load_index(dbfile, &db_attr);
             ^
876.   	if (db == NULL) goto err;
877.   

apps/apps.c:1740:15: Call
  1738.   		goto err;
  1739.   		}
  1740.   	if ((tmpdb = TXT_DB_read(in,DB_NUMBER)) == NULL)
                        ^
  1741.   		goto err;
  1742.   

crypto/txt_db/txt_db.c:71:1: Parameter `num`
    69.   const char TXT_DB_version[]="TXT_DB" OPENSSL_VERSION_PTEXT;
    70.   
    71. > TXT_DB *TXT_DB_read(BIO *in, int num)
    72.   	{
    73.   	TXT_DB *ret=NULL;

crypto/txt_db/txt_db.c:88:2: Assignment
    86.   	if ((ret=(TXT_DB *)OPENSSL_malloc(sizeof(TXT_DB))) == NULL)
    87.   		goto err;
    88.   	ret->num_fields=num;
           ^
    89.   	ret->index=NULL;
    90.   	ret->qual=NULL;

apps/ca.c:932:3: Call
930.   		}
931.   #endif
932.   		TXT_DB_write(out,db->db);
         ^
933.   		BIO_printf(bio_err,"%d entries loaded from the database\n",
934.   			db->db->data->num);

crypto/txt_db/txt_db.c:269:8: Assignment
  267.   
  268.   		l=0;
  269.   		for (j=0; j<nn; j++)
                ^
  270.   			{
  271.   			if (pp[j] != NULL)

crypto/txt_db/txt_db.c:274:8: Call
  272.   				l+=strlen(pp[j]);
  273.   			}
  274.   		if (!BUF_MEM_grow_clean(buf,(int)(l*2+nn))) goto err;
                ^
  275.   
  276.   		p=buf->data;

crypto/buffer/buffer.c:128:1: <LHS trace>
126.   	}
127.   
128. > int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
129.   	{
130.   	char *ret;

crypto/buffer/buffer.c:128:1: Parameter `len`
    126.   	}
    127.   
    128. > int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
    129.   	{
    130.   	char *ret;

crypto/buffer/buffer.c:128:1: <RHS trace>
126.   	}
127.   
128. > int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
129.   	{
130.   	char *ret;

crypto/buffer/buffer.c:128:1: Parameter `len`
    126.   	}
    127.   
    128. > int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
    129.   	{
    130.   	char *ret;

crypto/buffer/buffer.c:135:3: Binary operation: ([0, +oo] - 6):unsigned64 by call to `TXT_DB_write` 
    133.   	if (str->length >= len)
    134.   		{
    135.   		memset(&str->data[len],0,str->length-len);
             ^
    136.   		str->length=len;
    137.   		return(len);

int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
	{
	char *ret;
	size_t n;
	if (str->length >= len)
		{
		memset(&str->data[len],0,str->length-len);
		str->length=len;
		return(len);
		}
	if (str->max >= len)
		{
		memset(&str->data[str->length],0,len-str->length);
		str->length=len;
		return(len);
		}
	n=(len+3)/3*4;
	if (str->data == NULL)
		ret=OPENSSL_malloc(n);
	else
		ret=OPENSSL_realloc_clean(str->data,str->max,n);
	if (ret == NULL)
		{
		BUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE);
		len=0;
		}
	else
		{
		str->data=ret;
		str->max=n;
		memset(&str->data[str->length],0,len-str->length);
		str->length=len;
		}
	return(len);
	}
['int MAIN(int argc, char **argv)\n\t{\n\tENGINE *e = NULL;\n\tchar *key=NULL,*passargin=NULL;\n\tint create_ser = 0;\n\tint free_key = 0;\n\tint total=0;\n\tint total_done=0;\n\tint badops=0;\n\tint ret=1;\n\tint email_dn=1;\n\tint req=0;\n\tint verbose=0;\n\tint gencrl=0;\n\tint dorevoke=0;\n\tint doupdatedb=0;\n\tlong crldays=0;\n\tlong crlhours=0;\n\tlong crlsec=0;\n\tlong errorline= -1;\n\tchar *configfile=NULL;\n\tchar *md=NULL;\n\tchar *policy=NULL;\n\tchar *keyfile=NULL;\n\tchar *certfile=NULL;\n\tint keyform=FORMAT_PEM;\n\tchar *infile=NULL;\n\tchar *spkac_file=NULL;\n\tchar *ss_cert_file=NULL;\n\tchar *ser_status=NULL;\n\tEVP_PKEY *pkey=NULL;\n\tint output_der = 0;\n\tchar *outfile=NULL;\n\tchar *outdir=NULL;\n\tchar *serialfile=NULL;\n\tchar *crlnumberfile=NULL;\n\tchar *extensions=NULL;\n\tchar *extfile=NULL;\n\tchar *subj=NULL;\n\tunsigned long chtype = MBSTRING_ASC;\n\tint multirdn = 0;\n\tchar *tmp_email_dn=NULL;\n\tchar *crl_ext=NULL;\n\tint rev_type = REV_NONE;\n\tchar *rev_arg = NULL;\n\tBIGNUM *serial=NULL;\n\tBIGNUM *crlnumber=NULL;\n\tchar *startdate=NULL;\n\tchar *enddate=NULL;\n\tlong days=0;\n\tint batch=0;\n\tint notext=0;\n\tunsigned long nameopt = 0, certopt = 0;\n\tint default_op = 1;\n\tint ext_copy = EXT_COPY_NONE;\n\tint selfsign = 0;\n\tX509 *x509=NULL, *x509p = NULL;\n\tX509 *x=NULL;\n\tBIO *in=NULL,*out=NULL,*Sout=NULL,*Cout=NULL;\n\tchar *dbfile=NULL;\n\tCA_DB *db=NULL;\n\tX509_CRL *crl=NULL;\n\tX509_REVOKED *r=NULL;\n\tASN1_TIME *tmptm;\n\tASN1_INTEGER *tmpser;\n\tchar *f;\n\tconst char *p, **pp;\n\tint i,j;\n\tconst EVP_MD *dgst=NULL;\n\tSTACK_OF(CONF_VALUE) *attribs=NULL;\n\tSTACK_OF(X509) *cert_sk=NULL;\n#undef BSIZE\n#define BSIZE 256\n\tMS_STATIC char buf[3][BSIZE];\n\tchar *randfile=NULL;\n#ifndef OPENSSL_NO_ENGINE\n\tchar *engine = NULL;\n#endif\n\tchar *tofree=NULL;\n\tDB_ATTR db_attr;\n#ifdef EFENCE\nEF_PROTECT_FREE=1;\nEF_PROTECT_BELOW=1;\nEF_ALIGNMENT=0;\n#endif\n\tapps_startup();\n\tconf = NULL;\n\tkey = NULL;\n\tsection = NULL;\n\tpreserve=0;\n\tmsie_hack=0;\n\tif (bio_err == NULL)\n\t\tif ((bio_err=BIO_new(BIO_s_file())) != NULL)\n\t\t\tBIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);\n\targc--;\n\targv++;\n\twhile (argc >= 1)\n\t\t{\n\t\tif\t(strcmp(*argv,"-verbose") == 0)\n\t\t\tverbose=1;\n\t\telse if\t(strcmp(*argv,"-config") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tconfigfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-name") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tsection= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-subj") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tsubj= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-utf8") == 0)\n\t\t\tchtype = MBSTRING_UTF8;\n\t\telse if (strcmp(*argv,"-create_serial") == 0)\n\t\t\tcreate_ser = 1;\n\t\telse if (strcmp(*argv,"-multivalue-rdn") == 0)\n\t\t\tmultirdn=1;\n\t\telse if (strcmp(*argv,"-startdate") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tstartdate= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-enddate") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tenddate= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-days") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tdays=atoi(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-md") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tmd= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-policy") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tpolicy= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-keyfile") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tkeyfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-keyform") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tkeyform=str2fmt(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-passin") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tpassargin= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-key") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tkey= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-cert") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tcertfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-selfsign") == 0)\n\t\t\tselfsign=1;\n\t\telse if (strcmp(*argv,"-in") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tinfile= *(++argv);\n\t\t\treq=1;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-out") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\toutfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-outdir") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\toutdir= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-notext") == 0)\n\t\t\tnotext=1;\n\t\telse if (strcmp(*argv,"-batch") == 0)\n\t\t\tbatch=1;\n\t\telse if (strcmp(*argv,"-preserveDN") == 0)\n\t\t\tpreserve=1;\n\t\telse if (strcmp(*argv,"-noemailDN") == 0)\n\t\t\temail_dn=0;\n\t\telse if (strcmp(*argv,"-gencrl") == 0)\n\t\t\tgencrl=1;\n\t\telse if (strcmp(*argv,"-msie_hack") == 0)\n\t\t\tmsie_hack=1;\n\t\telse if (strcmp(*argv,"-crldays") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tcrldays= atol(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crlhours") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tcrlhours= atol(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crlsec") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tcrlsec = atol(*(++argv));\n\t\t\t}\n\t\telse if (strcmp(*argv,"-infiles") == 0)\n\t\t\t{\n\t\t\targc--;\n\t\t\targv++;\n\t\t\treq=1;\n\t\t\tbreak;\n\t\t\t}\n\t\telse if (strcmp(*argv, "-ss_cert") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tss_cert_file = *(++argv);\n\t\t\treq=1;\n\t\t\t}\n\t\telse if (strcmp(*argv, "-spkac") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tspkac_file = *(++argv);\n\t\t\treq=1;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-revoke") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tinfile= *(++argv);\n\t\t\tdorevoke=1;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-extensions") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\textensions= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-extfile") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\textfile= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-status") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tser_status= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-updatedb") == 0)\n\t\t\t{\n\t\t\tdoupdatedb=1;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crlexts") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tcrl_ext= *(++argv);\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crl_reason") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\trev_arg = *(++argv);\n\t\t\trev_type = REV_CRL_REASON;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crl_hold") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\trev_arg = *(++argv);\n\t\t\trev_type = REV_HOLD;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crl_compromise") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\trev_arg = *(++argv);\n\t\t\trev_type = REV_KEY_COMPROMISE;\n\t\t\t}\n\t\telse if (strcmp(*argv,"-crl_CA_compromise") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\trev_arg = *(++argv);\n\t\t\trev_type = REV_CA_COMPROMISE;\n\t\t\t}\n#ifndef OPENSSL_NO_ENGINE\n\t\telse if (strcmp(*argv,"-engine") == 0)\n\t\t\t{\n\t\t\tif (--argc < 1) goto bad;\n\t\t\tengine= *(++argv);\n\t\t\t}\n#endif\n\t\telse\n\t\t\t{\nbad:\n\t\t\tBIO_printf(bio_err,"unknown option %s\\n",*argv);\n\t\t\tbadops=1;\n\t\t\tbreak;\n\t\t\t}\n\t\targc--;\n\t\targv++;\n\t\t}\n\tif (badops)\n\t\t{\n\t\tfor (pp=ca_usage; (*pp != NULL); pp++)\n\t\t\tBIO_printf(bio_err,"%s",*pp);\n\t\tgoto err;\n\t\t}\n\tERR_load_crypto_strings();\n\ttofree=NULL;\n\tif (configfile == NULL) configfile = getenv("OPENSSL_CONF");\n\tif (configfile == NULL) configfile = getenv("SSLEAY_CONF");\n\tif (configfile == NULL)\n\t\t{\n\t\tconst char *s=X509_get_default_cert_area();\n\t\tsize_t len;\n#ifdef OPENSSL_SYS_VMS\n\t\tlen = strlen(s)+sizeof(CONFIG_FILE);\n\t\ttofree=OPENSSL_malloc(len);\n\t\tstrcpy(tofree,s);\n#else\n\t\tlen = strlen(s)+sizeof(CONFIG_FILE)+1;\n\t\ttofree=OPENSSL_malloc(len);\n\t\tBUF_strlcpy(tofree,s,len);\n\t\tBUF_strlcat(tofree,"/",len);\n#endif\n\t\tBUF_strlcat(tofree,CONFIG_FILE,len);\n\t\tconfigfile=tofree;\n\t\t}\n\tBIO_printf(bio_err,"Using configuration from %s\\n",configfile);\n\tconf = NCONF_new(NULL);\n\tif (NCONF_load(conf,configfile,&errorline) <= 0)\n\t\t{\n\t\tif (errorline <= 0)\n\t\t\tBIO_printf(bio_err,"error loading the config file \'%s\'\\n",\n\t\t\t\tconfigfile);\n\t\telse\n\t\t\tBIO_printf(bio_err,"error on line %ld of config file \'%s\'\\n"\n\t\t\t\t,errorline,configfile);\n\t\tgoto err;\n\t\t}\n\tif(tofree)\n\t\t{\n\t\tOPENSSL_free(tofree);\n\t\ttofree = NULL;\n\t\t}\n\tif (!load_config(bio_err, conf))\n\t\tgoto err;\n#ifndef OPENSSL_NO_ENGINE\n\te = setup_engine(bio_err, engine, 0);\n#endif\n\tif (section == NULL)\n\t\t{\n\t\tsection=NCONF_get_string(conf,BASE_SECTION,ENV_DEFAULT_CA);\n\t\tif (section == NULL)\n\t\t\t{\n\t\t\tlookup_fail(BASE_SECTION,ENV_DEFAULT_CA);\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\tif (conf != NULL)\n\t\t{\n\t\tp=NCONF_get_string(conf,NULL,"oid_file");\n\t\tif (p == NULL)\n\t\t\tERR_clear_error();\n\t\tif (p != NULL)\n\t\t\t{\n\t\t\tBIO *oid_bio;\n\t\t\toid_bio=BIO_new_file(p,"r");\n\t\t\tif (oid_bio == NULL)\n\t\t\t\t{\n\t\t\t\tERR_clear_error();\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tOBJ_create_objects(oid_bio);\n\t\t\t\tBIO_free(oid_bio);\n\t\t\t\t}\n\t\t\t}\n\t\tif (!add_oid_section(bio_err,conf))\n\t\t\t{\n\t\t\tERR_print_errors(bio_err);\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\trandfile = NCONF_get_string(conf, BASE_SECTION, "RANDFILE");\n\tif (randfile == NULL)\n\t\tERR_clear_error();\n\tapp_RAND_load_file(randfile, bio_err, 0);\n\tf = NCONF_get_string(conf, section, STRING_MASK);\n\tif (!f)\n\t\tERR_clear_error();\n\tif(f && !ASN1_STRING_set_default_mask_asc(f)) {\n\t\tBIO_printf(bio_err, "Invalid global string mask setting %s\\n", f);\n\t\tgoto err;\n\t}\n\tif (chtype != MBSTRING_UTF8){\n\t\tf = NCONF_get_string(conf, section, UTF8_IN);\n\t\tif (!f)\n\t\t\tERR_clear_error();\n\t\telse if (!strcmp(f, "yes"))\n\t\t\tchtype = MBSTRING_UTF8;\n\t}\n\tdb_attr.unique_subject = 1;\n\tp = NCONF_get_string(conf, section, ENV_UNIQUE_SUBJECT);\n\tif (p)\n\t\t{\n#ifdef RL_DEBUG\n\t\tBIO_printf(bio_err, "DEBUG: unique_subject = \\"%s\\"\\n", p);\n#endif\n\t\tdb_attr.unique_subject = parse_yesno(p,1);\n\t\t}\n\telse\n\t\tERR_clear_error();\n#ifdef RL_DEBUG\n\tif (!p)\n\t\tBIO_printf(bio_err, "DEBUG: unique_subject undefined\\n", p);\n#endif\n#ifdef RL_DEBUG\n\tBIO_printf(bio_err, "DEBUG: configured unique_subject is %d\\n",\n\t\tdb_attr.unique_subject);\n#endif\n\tin=BIO_new(BIO_s_file());\n\tout=BIO_new(BIO_s_file());\n\tSout=BIO_new(BIO_s_file());\n\tCout=BIO_new(BIO_s_file());\n\tif ((in == NULL) || (out == NULL) || (Sout == NULL) || (Cout == NULL))\n\t\t{\n\t\tERR_print_errors(bio_err);\n\t\tgoto err;\n\t\t}\n\tif (ser_status)\n\t{\n\t\tif ((dbfile=NCONF_get_string(conf,section,ENV_DATABASE)) == NULL)\n\t\t\t{\n\t\t\tlookup_fail(section,ENV_DATABASE);\n\t\t\tgoto err;\n\t\t\t}\n\t\tdb = load_index(dbfile,&db_attr);\n\t\tif (db == NULL) goto err;\n\t\tif (!index_index(db)) goto err;\n\t\tif (get_certificate_status(ser_status,db) != 1)\n\t\t\tBIO_printf(bio_err,"Error verifying serial %s!\\n",\n\t\t\t\t ser_status);\n\t\tgoto err;\n\t}\n\tif ((keyfile == NULL) && ((keyfile=NCONF_get_string(conf,\n\t\tsection,ENV_PRIVATE_KEY)) == NULL))\n\t\t{\n\t\tlookup_fail(section,ENV_PRIVATE_KEY);\n\t\tgoto err;\n\t\t}\n\tif (!key)\n\t\t{\n\t\tfree_key = 1;\n\t\tif (!app_passwd(bio_err, passargin, NULL, &key, NULL))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"Error getting password\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\tpkey = load_key(bio_err, keyfile, keyform, 0, key, e,\n\t\t"CA private key");\n\tif (key) OPENSSL_cleanse(key,strlen(key));\n\tif (pkey == NULL)\n\t\t{\n\t\tgoto err;\n\t\t}\n\tif (!selfsign || spkac_file || ss_cert_file || gencrl)\n\t\t{\n\t\tif ((certfile == NULL)\n\t\t\t&& ((certfile=NCONF_get_string(conf,\n\t\t\t\t     section,ENV_CERTIFICATE)) == NULL))\n\t\t\t{\n\t\t\tlookup_fail(section,ENV_CERTIFICATE);\n\t\t\tgoto err;\n\t\t\t}\n\t\tx509=load_cert(bio_err, certfile, FORMAT_PEM, NULL, e,\n\t\t\t"CA certificate");\n\t\tif (x509 == NULL)\n\t\t\tgoto err;\n\t\tif (!X509_check_private_key(x509,pkey))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"CA certificate and CA private key do not match\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\tif (!selfsign) x509p = x509;\n\tf=NCONF_get_string(conf,BASE_SECTION,ENV_PRESERVE);\n\tif (f == NULL)\n\t\tERR_clear_error();\n\tif ((f != NULL) && ((*f == \'y\') || (*f == \'Y\')))\n\t\tpreserve=1;\n\tf=NCONF_get_string(conf,BASE_SECTION,ENV_MSIE_HACK);\n\tif (f == NULL)\n\t\tERR_clear_error();\n\tif ((f != NULL) && ((*f == \'y\') || (*f == \'Y\')))\n\t\tmsie_hack=1;\n\tf=NCONF_get_string(conf,section,ENV_NAMEOPT);\n\tif (f)\n\t\t{\n\t\tif (!set_name_ex(&nameopt, f))\n\t\t\t{\n\t\t\tBIO_printf(bio_err, "Invalid name options: \\"%s\\"\\n", f);\n\t\t\tgoto err;\n\t\t\t}\n\t\tdefault_op = 0;\n\t\t}\n\telse\n\t\tERR_clear_error();\n\tf=NCONF_get_string(conf,section,ENV_CERTOPT);\n\tif (f)\n\t\t{\n\t\tif (!set_cert_ex(&certopt, f))\n\t\t\t{\n\t\t\tBIO_printf(bio_err, "Invalid certificate options: \\"%s\\"\\n", f);\n\t\t\tgoto err;\n\t\t\t}\n\t\tdefault_op = 0;\n\t\t}\n\telse\n\t\tERR_clear_error();\n\tf=NCONF_get_string(conf,section,ENV_EXTCOPY);\n\tif (f)\n\t\t{\n\t\tif (!set_ext_copy(&ext_copy, f))\n\t\t\t{\n\t\t\tBIO_printf(bio_err, "Invalid extension copy option: \\"%s\\"\\n", f);\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\telse\n\t\tERR_clear_error();\n\tif ((outdir == NULL) && (req))\n\t\t{\n\t\tif ((outdir=NCONF_get_string(conf,section,ENV_NEW_CERTS_DIR))\n\t\t\t== NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"there needs to be defined a directory for new certificate to be placed in\\n");\n\t\t\tgoto err;\n\t\t\t}\n#ifndef OPENSSL_SYS_VMS\n\t\tif (access(outdir,R_OK|W_OK|X_OK) != 0)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"I am unable to access the %s directory\\n",outdir);\n\t\t\tperror(outdir);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (app_isdir(outdir)<=0)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"%s need to be a directory\\n",outdir);\n\t\t\tperror(outdir);\n\t\t\tgoto err;\n\t\t\t}\n#endif\n\t\t}\n\tif ((dbfile=NCONF_get_string(conf,section,ENV_DATABASE)) == NULL)\n\t\t{\n\t\tlookup_fail(section,ENV_DATABASE);\n\t\tgoto err;\n\t\t}\n\tdb = load_index(dbfile, &db_attr);\n\tif (db == NULL) goto err;\n\tfor (i=0; i<sk_num(db->db->data); i++)\n\t\t{\n\t\tpp=(const char **)sk_value(db->db->data,i);\n\t\tif ((pp[DB_type][0] != DB_TYPE_REV) &&\n\t\t\t(pp[DB_rev_date][0] != \'\\0\'))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"entry %d: not revoked yet, but has a revocation date\\n",i+1);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif ((pp[DB_type][0] == DB_TYPE_REV) &&\n\t\t\t!make_revoked(NULL, pp[DB_rev_date]))\n\t\t\t{\n\t\t\tBIO_printf(bio_err," in entry %d\\n", i+1);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (!check_time_format((char *)pp[DB_exp_date]))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"entry %d: invalid expiry date\\n",i+1);\n\t\t\tgoto err;\n\t\t\t}\n\t\tp=pp[DB_serial];\n\t\tj=strlen(p);\n\t\tif (*p == \'-\')\n\t\t\t{\n\t\t\tp++;\n\t\t\tj--;\n\t\t\t}\n\t\tif ((j&1) || (j < 2))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"entry %d: bad serial number length (%d)\\n",i+1,j);\n\t\t\tgoto err;\n\t\t\t}\n\t\twhile (*p)\n\t\t\t{\n\t\t\tif (!(\t((*p >= \'0\') && (*p <= \'9\')) ||\n\t\t\t\t((*p >= \'A\') && (*p <= \'F\')) ||\n\t\t\t\t((*p >= \'a\') && (*p <= \'f\')))  )\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"entry %d: bad serial number characters, char pos %ld, char is \'%c\'\\n",i+1,(long)(p-pp[DB_serial]),*p);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tp++;\n\t\t\t}\n\t\t}\n\tif (verbose)\n\t\t{\n\t\tBIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT);\n#ifdef OPENSSL_SYS_VMS\n\t\t{\n\t\tBIO *tmpbio = BIO_new(BIO_f_linebuffer());\n\t\tout = BIO_push(tmpbio, out);\n\t\t}\n#endif\n\t\tTXT_DB_write(out,db->db);\n\t\tBIO_printf(bio_err,"%d entries loaded from the database\\n",\n\t\t\tdb->db->data->num);\n\t\tBIO_printf(bio_err,"generating index\\n");\n\t\t}\n\tif (!index_index(db)) goto err;\n\tif (doupdatedb)\n\t\t{\n\t\tif (verbose)\n\t\t\tBIO_printf(bio_err, "Updating %s ...\\n",\n\t\t\t\t\t\t\tdbfile);\n\t\ti = do_updatedb(db);\n\t\tif (i == -1)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\telse if (i == 0)\n\t\t\t{\n\t\t\tif (verbose) BIO_printf(bio_err,\n\t\t\t\t\t"No entries found to mark expired\\n");\n\t\t\t}\n\t    \telse\n\t\t\t{\n\t\t\tif (!save_index(dbfile,"new",db)) goto err;\n\t\t\tif (!rotate_index(dbfile,"new","old")) goto err;\n\t\t\tif (verbose) BIO_printf(bio_err,\n\t\t\t\t"Done. %d entries marked as expired\\n",i);\n\t      \t\t}\n\t  \t}\n\tif (extfile)\n\t\t{\n\t\textconf = NCONF_new(NULL);\n\t\tif (NCONF_load(extconf,extfile,&errorline) <= 0)\n\t\t\t{\n\t\t\tif (errorline <= 0)\n\t\t\t\tBIO_printf(bio_err, "ERROR: loading the config file \'%s\'\\n",\n\t\t\t\t\textfile);\n\t\t\telse\n\t\t\t\tBIO_printf(bio_err, "ERROR: on line %ld of config file \'%s\'\\n",\n\t\t\t\t\terrorline,extfile);\n\t\t\tret = 1;\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (verbose)\n\t\t\tBIO_printf(bio_err, "Successfully loaded extensions file %s\\n", extfile);\n\t\tif (!extensions && !(extensions = NCONF_get_string(extconf, "default", "extensions")))\n\t\t\textensions = "default";\n\t\t}\n\tif (req || gencrl)\n\t\t{\n\t\tif (outfile != NULL)\n\t\t\t{\n\t\t\tif (BIO_write_filename(Sout,outfile) <= 0)\n\t\t\t\t{\n\t\t\t\tperror(outfile);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tBIO_set_fp(Sout,stdout,BIO_NOCLOSE|BIO_FP_TEXT);\n#ifdef OPENSSL_SYS_VMS\n\t\t\t{\n\t\t\tBIO *tmpbio = BIO_new(BIO_f_linebuffer());\n\t\t\tSout = BIO_push(tmpbio, Sout);\n\t\t\t}\n#endif\n\t\t\t}\n\t\t}\n\tif ((md == NULL) && ((md=NCONF_get_string(conf,\n\t\tsection,ENV_DEFAULT_MD)) == NULL))\n\t\t{\n\t\tlookup_fail(section,ENV_DEFAULT_MD);\n\t\tgoto err;\n\t\t}\n\tif (!strcmp(md, "default"))\n\t\t{\n\t\tint def_nid;\n\t\tif (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) <= 0)\n\t\t\t{\n\t\t\tBIO_puts(bio_err,"no default digest\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tmd = (char *)OBJ_nid2sn(def_nid);\n\t\t}\n\tif ((dgst=EVP_get_digestbyname(md)) == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"%s is an unsupported message digest type\\n",md);\n\t\tgoto err;\n\t\t}\n\tif (req)\n\t\t{\n\t\tif ((email_dn == 1) && ((tmp_email_dn=NCONF_get_string(conf,\n\t\t\tsection,ENV_DEFAULT_EMAIL_DN)) != NULL ))\n\t\t\t{\n\t\t\tif(strcmp(tmp_email_dn,"no") == 0)\n\t\t\t\temail_dn=0;\n\t\t\t}\n\t\tif (verbose)\n\t\t\tBIO_printf(bio_err,"message digest is %s\\n",\n\t\t\t\tOBJ_nid2ln(dgst->type));\n\t\tif ((policy == NULL) && ((policy=NCONF_get_string(conf,\n\t\t\tsection,ENV_POLICY)) == NULL))\n\t\t\t{\n\t\t\tlookup_fail(section,ENV_POLICY);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (verbose)\n\t\t\tBIO_printf(bio_err,"policy is %s\\n",policy);\n\t\tif ((serialfile=NCONF_get_string(conf,section,ENV_SERIAL))\n\t\t\t== NULL)\n\t\t\t{\n\t\t\tlookup_fail(section,ENV_SERIAL);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (!extconf)\n\t\t\t{\n\t\t\tif (!extensions)\n\t\t\t\t{\n\t\t\t\textensions=NCONF_get_string(conf,section,\n\t\t\t\t\t\t\t\tENV_EXTENSIONS);\n\t\t\t\tif (!extensions)\n\t\t\t\t\tERR_clear_error();\n\t\t\t\t}\n\t\t\tif (extensions)\n\t\t\t\t{\n\t\t\t\tX509V3_CTX ctx;\n\t\t\t\tX509V3_set_ctx_test(&ctx);\n\t\t\t\tX509V3_set_nconf(&ctx, conf);\n\t\t\t\tif (!X509V3_EXT_add_nconf(conf, &ctx, extensions,\n\t\t\t\t\t\t\t\tNULL))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,\n\t\t\t\t \t"Error Loading extension section %s\\n",\n\t\t\t\t\t\t\t\t extensions);\n\t\t\t\t\tret = 1;\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tif (startdate == NULL)\n\t\t\t{\n\t\t\tstartdate=NCONF_get_string(conf,section,\n\t\t\t\tENV_DEFAULT_STARTDATE);\n\t\t\tif (startdate == NULL)\n\t\t\t\tERR_clear_error();\n\t\t\t}\n\t\tif (startdate && !ASN1_UTCTIME_set_string(NULL,startdate))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"start date is invalid, it should be YYMMDDHHMMSSZ\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (startdate == NULL) startdate="today";\n\t\tif (enddate == NULL)\n\t\t\t{\n\t\t\tenddate=NCONF_get_string(conf,section,\n\t\t\t\tENV_DEFAULT_ENDDATE);\n\t\t\tif (enddate == NULL)\n\t\t\t\tERR_clear_error();\n\t\t\t}\n\t\tif (enddate && !ASN1_UTCTIME_set_string(NULL,enddate))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"end date is invalid, it should be YYMMDDHHMMSSZ\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (days == 0)\n\t\t\t{\n\t\t\tif(!NCONF_get_number(conf,section, ENV_DEFAULT_DAYS, &days))\n\t\t\t\tdays = 0;\n\t\t\t}\n\t\tif (!enddate && (days == 0))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"cannot lookup how many days to certify for\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif ((serial=load_serial(serialfile, create_ser, NULL)) == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"error while loading serial number\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (verbose)\n\t\t\t{\n\t\t\tif (BN_is_zero(serial))\n\t\t\t\tBIO_printf(bio_err,"next serial number is 00\\n");\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tif ((f=BN_bn2hex(serial)) == NULL) goto err;\n\t\t\t\tBIO_printf(bio_err,"next serial number is %s\\n",f);\n\t\t\t\tOPENSSL_free(f);\n\t\t\t\t}\n\t\t\t}\n\t\tif ((attribs=NCONF_get_section(conf,policy)) == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"unable to find \'section\' for %s\\n",policy);\n\t\t\tgoto err;\n\t\t\t}\n\t\tif ((cert_sk=sk_X509_new_null()) == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (spkac_file != NULL)\n\t\t\t{\n\t\t\ttotal++;\n\t\t\tj=certify_spkac(&x,spkac_file,pkey,x509,dgst,attribs,db,\n\t\t\t\tserial,subj,chtype,multirdn,email_dn,startdate,enddate,days,extensions,\n\t\t\t\tconf,verbose,certopt,nameopt,default_op,ext_copy);\n\t\t\tif (j < 0) goto err;\n\t\t\tif (j > 0)\n\t\t\t\t{\n\t\t\t\ttotal_done++;\n\t\t\t\tBIO_printf(bio_err,"\\n");\n\t\t\t\tif (!BN_add_word(serial,1)) goto err;\n\t\t\t\tif (!sk_X509_push(cert_sk,x))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\tif (outfile)\n\t\t\t\t\t{\n\t\t\t\t\toutput_der = 1;\n\t\t\t\t\tbatch = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tif (ss_cert_file != NULL)\n\t\t\t{\n\t\t\ttotal++;\n\t\t\tj=certify_cert(&x,ss_cert_file,pkey,x509,dgst,attribs,\n\t\t\t\tdb,serial,subj,chtype,multirdn,email_dn,startdate,enddate,days,batch,\n\t\t\t\textensions,conf,verbose, certopt, nameopt,\n\t\t\t\tdefault_op, ext_copy, e);\n\t\t\tif (j < 0) goto err;\n\t\t\tif (j > 0)\n\t\t\t\t{\n\t\t\t\ttotal_done++;\n\t\t\t\tBIO_printf(bio_err,"\\n");\n\t\t\t\tif (!BN_add_word(serial,1)) goto err;\n\t\t\t\tif (!sk_X509_push(cert_sk,x))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tif (infile != NULL)\n\t\t\t{\n\t\t\ttotal++;\n\t\t\tj=certify(&x,infile,pkey,x509p,dgst,attribs,db,\n\t\t\t\tserial,subj,chtype,multirdn,email_dn,startdate,enddate,days,batch,\n\t\t\t\textensions,conf,verbose, certopt, nameopt,\n\t\t\t\tdefault_op, ext_copy, selfsign);\n\t\t\tif (j < 0) goto err;\n\t\t\tif (j > 0)\n\t\t\t\t{\n\t\t\t\ttotal_done++;\n\t\t\t\tBIO_printf(bio_err,"\\n");\n\t\t\t\tif (!BN_add_word(serial,1)) goto err;\n\t\t\t\tif (!sk_X509_push(cert_sk,x))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tfor (i=0; i<argc; i++)\n\t\t\t{\n\t\t\ttotal++;\n\t\t\tj=certify(&x,argv[i],pkey,x509p,dgst,attribs,db,\n\t\t\t\tserial,subj,chtype,multirdn,email_dn,startdate,enddate,days,batch,\n\t\t\t\textensions,conf,verbose, certopt, nameopt,\n\t\t\t\tdefault_op, ext_copy, selfsign);\n\t\t\tif (j < 0) goto err;\n\t\t\tif (j > 0)\n\t\t\t\t{\n\t\t\t\ttotal_done++;\n\t\t\t\tBIO_printf(bio_err,"\\n");\n\t\t\t\tif (!BN_add_word(serial,1)) goto err;\n\t\t\t\tif (!sk_X509_push(cert_sk,x))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"Memory allocation failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tif (sk_X509_num(cert_sk) > 0)\n\t\t\t{\n\t\t\tif (!batch)\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"\\n%d out of %d certificate requests certified, commit? [y/n]",total_done,total);\n\t\t\t\t(void)BIO_flush(bio_err);\n\t\t\t\tbuf[0][0]=\'\\0\';\n\t\t\t\tfgets(buf[0],10,stdin);\n\t\t\t\tif ((buf[0][0] != \'y\') && (buf[0][0] != \'Y\'))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"CERTIFICATION CANCELED\\n");\n\t\t\t\t\tret=0;\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tBIO_printf(bio_err,"Write out database with %d new entries\\n",sk_X509_num(cert_sk));\n\t\t\tif (!save_serial(serialfile,"new",serial,NULL)) goto err;\n\t\t\tif (!save_index(dbfile, "new", db)) goto err;\n\t\t\t}\n\t\tif (verbose)\n\t\t\tBIO_printf(bio_err,"writing new certificates\\n");\n\t\tfor (i=0; i<sk_X509_num(cert_sk); i++)\n\t\t\t{\n\t\t\tint k;\n\t\t\tchar *n;\n\t\t\tx=sk_X509_value(cert_sk,i);\n\t\t\tj=x->cert_info->serialNumber->length;\n\t\t\tp=(const char *)x->cert_info->serialNumber->data;\n\t\t\tif(strlen(outdir) >= (size_t)(j ? BSIZE-j*2-6 : BSIZE-8))\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"certificate file name too long\\n");\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tstrcpy(buf[2],outdir);\n#ifndef OPENSSL_SYS_VMS\n\t\t\tBUF_strlcat(buf[2],"/",sizeof(buf[2]));\n#endif\n\t\t\tn=(char *)&(buf[2][strlen(buf[2])]);\n\t\t\tif (j > 0)\n\t\t\t\t{\n\t\t\t\tfor (k=0; k<j; k++)\n\t\t\t\t\t{\n\t\t\t\t\tif (n >= &(buf[2][sizeof(buf[2])]))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tBIO_snprintf(n,\n\t\t\t\t\t\t     &buf[2][0] + sizeof(buf[2]) - n,\n\t\t\t\t\t\t     "%02X",(unsigned char)*(p++));\n\t\t\t\t\tn+=2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\t*(n++)=\'0\';\n\t\t\t\t*(n++)=\'0\';\n\t\t\t\t}\n\t\t\t*(n++)=\'.\'; *(n++)=\'p\'; *(n++)=\'e\'; *(n++)=\'m\';\n\t\t\t*n=\'\\0\';\n\t\t\tif (verbose)\n\t\t\t\tBIO_printf(bio_err,"writing %s\\n",buf[2]);\n\t\t\tif (BIO_write_filename(Cout,buf[2]) <= 0)\n\t\t\t\t{\n\t\t\t\tperror(buf[2]);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\twrite_new_certificate(Cout,x, 0, notext);\n\t\t\twrite_new_certificate(Sout,x, output_der, notext);\n\t\t\t}\n\t\tif (sk_X509_num(cert_sk))\n\t\t\t{\n\t\t\tif (!rotate_serial(serialfile,"new","old")) goto err;\n\t\t\tif (!rotate_index(dbfile,"new","old")) goto err;\n\t\t\tBIO_printf(bio_err,"Data Base Updated\\n");\n\t\t\t}\n\t\t}\n\tif (gencrl)\n\t\t{\n\t\tint crl_v2 = 0;\n\t\tif (!crl_ext)\n\t\t\t{\n\t\t\tcrl_ext=NCONF_get_string(conf,section,ENV_CRLEXT);\n\t\t\tif (!crl_ext)\n\t\t\t\tERR_clear_error();\n\t\t\t}\n\t\tif (crl_ext)\n\t\t\t{\n\t\t\tX509V3_CTX ctx;\n\t\t\tX509V3_set_ctx_test(&ctx);\n\t\t\tX509V3_set_nconf(&ctx, conf);\n\t\t\tif (!X509V3_EXT_add_nconf(conf, &ctx, crl_ext, NULL))\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,\n\t\t\t\t "Error Loading CRL extension section %s\\n",\n\t\t\t\t\t\t\t\t crl_ext);\n\t\t\t\tret = 1;\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\t}\n\t\tif ((crlnumberfile=NCONF_get_string(conf,section,ENV_CRLNUMBER))\n\t\t\t!= NULL)\n\t\t\tif ((crlnumber=load_serial(crlnumberfile,0,NULL)) == NULL)\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"error while loading CRL number\\n");\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\tif (!crldays && !crlhours && !crlsec)\n\t\t\t{\n\t\t\tif (!NCONF_get_number(conf,section,\n\t\t\t\tENV_DEFAULT_CRL_DAYS, &crldays))\n\t\t\t\tcrldays = 0;\n\t\t\tif (!NCONF_get_number(conf,section,\n\t\t\t\tENV_DEFAULT_CRL_HOURS, &crlhours))\n\t\t\t\tcrlhours = 0;\n\t\t\t}\n\t\tif ((crldays == 0) && (crlhours == 0) && (crlsec == 0))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"cannot lookup how long until the next CRL is issued\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tif (verbose) BIO_printf(bio_err,"making CRL\\n");\n\t\tif ((crl=X509_CRL_new()) == NULL) goto err;\n\t\tif (!X509_CRL_set_issuer_name(crl, X509_get_subject_name(x509))) goto err;\n\t\ttmptm = ASN1_TIME_new();\n\t\tif (!tmptm) goto err;\n\t\tX509_gmtime_adj(tmptm,0);\n\t\tX509_CRL_set_lastUpdate(crl, tmptm);\n\t\tX509_gmtime_adj(tmptm,(crldays*24+crlhours)*60*60 + crlsec);\n\t\tX509_CRL_set_nextUpdate(crl, tmptm);\n\t\tASN1_TIME_free(tmptm);\n\t\tfor (i=0; i<sk_num(db->db->data); i++)\n\t\t\t{\n\t\t\tpp=(const char **)sk_value(db->db->data,i);\n\t\t\tif (pp[DB_type][0] == DB_TYPE_REV)\n\t\t\t\t{\n\t\t\t\tif ((r=X509_REVOKED_new()) == NULL) goto err;\n\t\t\t\tj = make_revoked(r, pp[DB_rev_date]);\n\t\t\t\tif (!j) goto err;\n\t\t\t\tif (j == 2) crl_v2 = 1;\n\t\t\t\tif (!BN_hex2bn(&serial, pp[DB_serial]))\n\t\t\t\t\tgoto err;\n\t\t\t\ttmpser = BN_to_ASN1_INTEGER(serial, NULL);\n\t\t\t\tBN_free(serial);\n\t\t\t\tserial = NULL;\n\t\t\t\tif (!tmpser)\n\t\t\t\t\tgoto err;\n\t\t\t\tX509_REVOKED_set_serialNumber(r, tmpser);\n\t\t\t\tASN1_INTEGER_free(tmpser);\n\t\t\t\tX509_CRL_add0_revoked(crl,r);\n\t\t\t\t}\n\t\t\t}\n\t\tX509_CRL_sort(crl);\n\t\tif (verbose) BIO_printf(bio_err,"signing CRL\\n");\n\t\tif (crl_ext || crlnumberfile != NULL)\n\t\t\t{\n\t\t\tX509V3_CTX crlctx;\n\t\t\tX509V3_set_ctx(&crlctx, x509, NULL, NULL, crl, 0);\n\t\t\tX509V3_set_nconf(&crlctx, conf);\n\t\t\tif (crl_ext)\n\t\t\t\tif (!X509V3_EXT_CRL_add_nconf(conf, &crlctx,\n\t\t\t\t\tcrl_ext, crl)) goto err;\n\t\t\tif (crlnumberfile != NULL)\n\t\t\t\t{\n\t\t\t\ttmpser = BN_to_ASN1_INTEGER(crlnumber, NULL);\n\t\t\t\tif (!tmpser) goto err;\n\t\t\t\tX509_CRL_add1_ext_i2d(crl,NID_crl_number,tmpser,0,0);\n\t\t\t\tASN1_INTEGER_free(tmpser);\n\t\t\t\tcrl_v2 = 1;\n\t\t\t\tif (!BN_add_word(crlnumber,1)) goto err;\n\t\t\t\t}\n\t\t\t}\n\t\tif (crl_ext || crl_v2)\n\t\t\t{\n\t\t\tif (!X509_CRL_set_version(crl, 1))\n\t\t\t\tgoto err;\n\t\t\t}\n\t\tif (crlnumberfile != NULL)\n\t\t\tif (!save_serial(crlnumberfile,"new",crlnumber,NULL)) goto err;\n\t\tif (crlnumber)\n\t\t\t{\n\t\t\tBN_free(crlnumber);\n\t\t\tcrlnumber = NULL;\n\t\t\t}\n\t\tif (!X509_CRL_sign(crl,pkey,dgst)) goto err;\n\t\tPEM_write_bio_X509_CRL(Sout,crl);\n\t\tif (crlnumberfile != NULL)\n\t\t\tif (!rotate_serial(crlnumberfile,"new","old")) goto err;\n\t\t}\n\tif (dorevoke)\n\t\t{\n\t\tif (infile == NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"no input files\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tX509 *revcert;\n\t\t\trevcert=load_cert(bio_err, infile, FORMAT_PEM,\n\t\t\t\tNULL, e, infile);\n\t\t\tif (revcert == NULL)\n\t\t\t\tgoto err;\n\t\t\tj=do_revoke(revcert,db, rev_type, rev_arg);\n\t\t\tif (j <= 0) goto err;\n\t\t\tX509_free(revcert);\n\t\t\tif (!save_index(dbfile, "new", db)) goto err;\n\t\t\tif (!rotate_index(dbfile, "new", "old")) goto err;\n\t\t\tBIO_printf(bio_err,"Data Base Updated\\n");\n\t\t\t}\n\t\t}\n\tret=0;\nerr:\n\tif(tofree)\n\t\tOPENSSL_free(tofree);\n\tBIO_free_all(Cout);\n\tBIO_free_all(Sout);\n\tBIO_free_all(out);\n\tBIO_free_all(in);\n\tif (cert_sk)\n\t\tsk_X509_pop_free(cert_sk,X509_free);\n\tif (ret) ERR_print_errors(bio_err);\n\tapp_RAND_write_file(randfile, bio_err);\n\tif (free_key && key)\n\t\tOPENSSL_free(key);\n\tBN_free(serial);\n\tBN_free(crlnumber);\n\tfree_index(db);\n\tEVP_PKEY_free(pkey);\n\tif (x509) X509_free(x509);\n\tX509_CRL_free(crl);\n\tNCONF_free(conf);\n\tNCONF_free(extconf);\n\tOBJ_cleanup();\n\tapps_shutdown();\n\tOPENSSL_EXIT(ret);\n\t}', 'CA_DB *load_index(char *dbfile, DB_ATTR *db_attr)\n\t{\n\tCA_DB *retdb = NULL;\n\tTXT_DB *tmpdb = NULL;\n\tBIO *in = BIO_new(BIO_s_file());\n\tCONF *dbattr_conf = NULL;\n\tchar buf[1][BSIZE];\n\tlong errorline= -1;\n\tif (in == NULL)\n\t\t{\n\t\tERR_print_errors(bio_err);\n\t\tgoto err;\n\t\t}\n\tif (BIO_read_filename(in,dbfile) <= 0)\n\t\t{\n\t\tperror(dbfile);\n\t\tBIO_printf(bio_err,"unable to open \'%s\'\\n",dbfile);\n\t\tgoto err;\n\t\t}\n\tif ((tmpdb = TXT_DB_read(in,DB_NUMBER)) == NULL)\n\t\tgoto err;\n#ifndef OPENSSL_SYS_VMS\n\tBIO_snprintf(buf[0], sizeof buf[0], "%s.attr", dbfile);\n#else\n\tBIO_snprintf(buf[0], sizeof buf[0], "%s-attr", dbfile);\n#endif\n\tdbattr_conf = NCONF_new(NULL);\n\tif (NCONF_load(dbattr_conf,buf[0],&errorline) <= 0)\n\t\t{\n\t\tif (errorline > 0)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,\n\t\t\t\t"error on line %ld of db attribute file \'%s\'\\n"\n\t\t\t\t,errorline,buf[0]);\n\t\t\tgoto err;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tNCONF_free(dbattr_conf);\n\t\t\tdbattr_conf = NULL;\n\t\t\t}\n\t\t}\n\tif ((retdb = OPENSSL_malloc(sizeof(CA_DB))) == NULL)\n\t\t{\n\t\tfprintf(stderr, "Out of memory\\n");\n\t\tgoto err;\n\t\t}\n\tretdb->db = tmpdb;\n\ttmpdb = NULL;\n\tif (db_attr)\n\t\tretdb->attributes = *db_attr;\n\telse\n\t\t{\n\t\tretdb->attributes.unique_subject = 1;\n\t\t}\n\tif (dbattr_conf)\n\t\t{\n\t\tchar *p = NCONF_get_string(dbattr_conf,NULL,"unique_subject");\n\t\tif (p)\n\t\t\t{\n#ifdef RL_DEBUG\n\t\t\tBIO_printf(bio_err, "DEBUG[load_index]: unique_subject = \\"%s\\"\\n", p);\n#endif\n\t\t\tretdb->attributes.unique_subject = parse_yesno(p,1);\n\t\t\t}\n\t\t}\n err:\n\tif (dbattr_conf) NCONF_free(dbattr_conf);\n\tif (tmpdb) TXT_DB_free(tmpdb);\n\tif (in) BIO_free_all(in);\n\treturn retdb;\n\t}', 'TXT_DB *TXT_DB_read(BIO *in, int num)\n\t{\n\tTXT_DB *ret=NULL;\n\tint er=1;\n\tint esc=0;\n\tlong ln=0;\n\tint i,add,n;\n\tint size=BUFSIZE;\n\tint offset=0;\n\tchar *p,**pp,*f;\n\tBUF_MEM *buf=NULL;\n\tif ((buf=BUF_MEM_new()) == NULL) goto err;\n\tif (!BUF_MEM_grow(buf,size)) goto err;\n\tif ((ret=(TXT_DB *)OPENSSL_malloc(sizeof(TXT_DB))) == NULL)\n\t\tgoto err;\n\tret->num_fields=num;\n\tret->index=NULL;\n\tret->qual=NULL;\n\tif ((ret->data=sk_new_null()) == NULL)\n\t\tgoto err;\n\tif ((ret->index=(LHASH **)OPENSSL_malloc(sizeof(LHASH *)*num)) == NULL)\n\t\tgoto err;\n\tif ((ret->qual=(int (**)(char **))OPENSSL_malloc(sizeof(int (**)(char **))*num)) == NULL)\n\t\tgoto err;\n\tfor (i=0; i<num; i++)\n\t\t{\n\t\tret->index[i]=NULL;\n\t\tret->qual[i]=NULL;\n\t\t}\n\tadd=(num+1)*sizeof(char *);\n\tbuf->data[size-1]=\'\\0\';\n\toffset=0;\n\tfor (;;)\n\t\t{\n\t\tif (offset != 0)\n\t\t\t{\n\t\t\tsize+=BUFSIZE;\n\t\t\tif (!BUF_MEM_grow_clean(buf,size)) goto err;\n\t\t\t}\n\t\tbuf->data[offset]=\'\\0\';\n\t\tBIO_gets(in,&(buf->data[offset]),size-offset);\n\t\tln++;\n\t\tif (buf->data[offset] == \'\\0\') break;\n\t\tif ((offset == 0) && (buf->data[0] == \'#\')) continue;\n\t\ti=strlen(&(buf->data[offset]));\n\t\toffset+=i;\n\t\tif (buf->data[offset-1] != \'\\n\')\n\t\t\tcontinue;\n\t\telse\n\t\t\t{\n\t\t\tbuf->data[offset-1]=\'\\0\';\n\t\t\tif (!(p=(char *)OPENSSL_malloc(add+offset))) goto err;\n\t\t\toffset=0;\n\t\t\t}\n\t\tpp=(char **)p;\n\t\tp+=add;\n\t\tn=0;\n\t\tpp[n++]=p;\n\t\ti=0;\n\t\tf=buf->data;\n\t\tesc=0;\n\t\tfor (;;)\n\t\t\t{\n\t\t\tif (*f == \'\\0\') break;\n\t\t\tif (*f == \'\\t\')\n\t\t\t\t{\n\t\t\t\tif (esc)\n\t\t\t\t\tp--;\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t*(p++)=\'\\0\';\n\t\t\t\t\tf++;\n\t\t\t\t\tif (n >=  num) break;\n\t\t\t\t\tpp[n++]=p;\n\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tesc=(*f == \'\\\\\');\n\t\t\t*(p++)= *(f++);\n\t\t\t}\n\t\t*(p++)=\'\\0\';\n\t\tif ((n != num) || (*f != \'\\0\'))\n\t\t\t{\n#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)\n\t\t\tfprintf(stderr,"wrong number of fields on line %ld (looking for field %d, got %d, \'%s\' left)\\n",ln,num,n,f);\n#endif\n\t\t\ter=2;\n\t\t\tgoto err;\n\t\t\t}\n\t\tpp[n]=p;\n\t\tif (!sk_push(ret->data,(char *)pp))\n\t\t\t{\n#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)\n\t\t\tfprintf(stderr,"failure in sk_push\\n");\n#endif\n\t\t\ter=2;\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n\ter=0;\nerr:\n\tBUF_MEM_free(buf);\n\tif (er)\n\t\t{\n#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)\n\t\tif (er == 1) fprintf(stderr,"OPENSSL_malloc failure\\n");\n#endif\n\t\tif (ret != NULL)\n\t\t\t{\n\t\t\tif (ret->data != NULL) sk_free(ret->data);\n\t\t\tif (ret->index != NULL) OPENSSL_free(ret->index);\n\t\t\tif (ret->qual != NULL) OPENSSL_free(ret->qual);\n\t\t\tif (ret != NULL) OPENSSL_free(ret);\n\t\t\t}\n\t\treturn(NULL);\n\t\t}\n\telse\n\t\treturn(ret);\n\t}', "long TXT_DB_write(BIO *out, TXT_DB *db)\n\t{\n\tlong i,j,n,nn,l,tot=0;\n\tchar *p,**pp,*f;\n\tBUF_MEM *buf=NULL;\n\tlong ret= -1;\n\tif ((buf=BUF_MEM_new()) == NULL)\n\t\tgoto err;\n\tn=sk_num(db->data);\n\tnn=db->num_fields;\n\tfor (i=0; i<n; i++)\n\t\t{\n\t\tpp=(char **)sk_value(db->data,i);\n\t\tl=0;\n\t\tfor (j=0; j<nn; j++)\n\t\t\t{\n\t\t\tif (pp[j] != NULL)\n\t\t\t\tl+=strlen(pp[j]);\n\t\t\t}\n\t\tif (!BUF_MEM_grow_clean(buf,(int)(l*2+nn))) goto err;\n\t\tp=buf->data;\n\t\tfor (j=0; j<nn; j++)\n\t\t\t{\n\t\t\tf=pp[j];\n\t\t\tif (f != NULL)\n\t\t\t\tfor (;;)\n\t\t\t\t\t{\n\t\t\t\t\tif (*f == '\\0') break;\n\t\t\t\t\tif (*f == '\\t') *(p++)='\\\\';\n\t\t\t\t\t*(p++)= *(f++);\n\t\t\t\t\t}\n\t\t\t*(p++)='\\t';\n\t\t\t}\n\t\tp[-1]='\\n';\n\t\tj=p-buf->data;\n\t\tif (BIO_write(out,buf->data,(int)j) != j)\n\t\t\tgoto err;\n\t\ttot+=j;\n\t\t}\n\tret=tot;\nerr:\n\tif (buf != NULL) BUF_MEM_free(buf);\n\treturn(ret);\n\t}", 'int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)\n\t{\n\tchar *ret;\n\tsize_t n;\n\tif (str->length >= len)\n\t\t{\n\t\tmemset(&str->data[len],0,str->length-len);\n\t\tstr->length=len;\n\t\treturn(len);\n\t\t}\n\tif (str->max >= len)\n\t\t{\n\t\tmemset(&str->data[str->length],0,len-str->length);\n\t\tstr->length=len;\n\t\treturn(len);\n\t\t}\n\tn=(len+3)/3*4;\n\tif (str->data == NULL)\n\t\tret=OPENSSL_malloc(n);\n\telse\n\t\tret=OPENSSL_realloc_clean(str->data,str->max,n);\n\tif (ret == NULL)\n\t\t{\n\t\tBUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE);\n\t\tlen=0;\n\t\t}\n\telse\n\t\t{\n\t\tstr->data=ret;\n\t\tstr->max=n;\n\t\tmemset(&str->data[str->length],0,len-str->length);\n\t\tstr->length=len;\n\t\t}\n\treturn(len);\n\t}']