row[DB_name]=X509_NAME_oneline(x509->cert_info->subject,NULL,0); row[DB_serial]=BN_bn2hex(ASN1_INTEGER_to_BN(x509->cert_info->serialNumber,NULL));
row[DB_name]=X509_NAME_oneline(X509_get_subject_name(x509),NULL,0); bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(x509),NULL); row[DB_serial]=BN_bn2hex(bn); BN_free(bn);
static int do_revoke(X509 *x509, TXT_DB *db){	ASN1_UTCTIME *tm=NULL;	char *row[DB_NUMBER],**rrow,**irow;	int ok=-1,i;	for (i=0; i<DB_NUMBER; i++)		row[i]=NULL;	row[DB_name]=X509_NAME_oneline(x509->cert_info->subject,NULL,0);	row[DB_serial]=BN_bn2hex(ASN1_INTEGER_to_BN(x509->cert_info->serialNumber,NULL));	if ((row[DB_name] == NULL) || (row[DB_serial] == NULL))		{		BIO_printf(bio_err,"Malloc failure\n");		goto err;		}	rrow=TXT_DB_get_by_index(db,DB_name,row);	if (rrow == NULL)		{		BIO_printf(bio_err,"Adding Entry to DB for %s\n", row[DB_name]);		/* We now just add it to the database */		row[DB_type]=(char *)Malloc(2);		tm=X509_get_notAfter(x509);		row[DB_exp_date]=(char *)Malloc(tm->length+1);		memcpy(row[DB_exp_date],tm->data,tm->length);		row[DB_exp_date][tm->length]='\0';		row[DB_rev_date]=NULL;		/* row[DB_serial] done already */		row[DB_file]=(char *)Malloc(8);		/* row[DB_name] done already */		if ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||			(row[DB_file] == NULL))			{			BIO_printf(bio_err,"Malloc failure\n");			goto err;			}		strcpy(row[DB_file],"unknown");		row[DB_type][0]='V';		row[DB_type][1]='\0';		if ((irow=(char **)Malloc(sizeof(char *)*(DB_NUMBER+1))) == NULL)			{			BIO_printf(bio_err,"Malloc failure\n");			goto err;			}		for (i=0; i<DB_NUMBER; i++)			{			irow[i]=row[i];			row[i]=NULL;			}		irow[DB_NUMBER]=NULL;		if (!TXT_DB_insert(db,irow))			{			BIO_printf(bio_err,"failed to update database\n");			BIO_printf(bio_err,"TXT_DB error number %ld\n",db->error);			goto err;			}		/* Revoke Certificate */		do_revoke(x509,db);		ok=1;		goto err;		}	else if (index_serial_cmp(row,rrow))		{		BIO_printf(bio_err,"ERROR:no same serial number %s\n",			   row[DB_serial]);		goto err;		}	else if (rrow[DB_type][0]=='R')		{		BIO_printf(bio_err,"ERROR:Already revoked, serial number %s\n",			   row[DB_serial]);		goto err;		}	else		{		BIO_printf(bio_err,"Revoking Certificate %s.\n", rrow[DB_serial]);		tm=X509_gmtime_adj(tm,0);		rrow[DB_type][0]='R';		rrow[DB_type][1]='\0';		rrow[DB_rev_date]=(char *)Malloc(tm->length+1);		memcpy(rrow[DB_rev_date],tm->data,tm->length);		rrow[DB_rev_date][tm->length]='\0';		}	ok=1;err:	for (i=0; i<DB_NUMBER; i++)		{		if (row[i] != NULL) 			Free(row[i]);		}	ASN1_UTCTIME_free(tm);	return(ok);}