apps/ca.c:1618: error: BUFFER_OVERRUN_L3
  Offset: [-1, +oo] Size: [0, +oo] by call to `X509_NAME_add_entry`.
Showing all 9 steps of the trace


apps/ca.c:1522:15: Call
1520.   
1521.   	/* Ok, now we check the 'policy' stuff. */
1522.   	if ((subject=X509_NAME_new()) == NULL)
                      ^
1523.   		{
1524.   		BIO_printf(bio_err,"Malloc failure\n");

crypto/asn1/x_name.c:231:20: Call
  229.   
  230.   	M_ASN1_New_Malloc(ret,X509_NAME);
  231.   	if ((ret->entries=sk_new(NULL)) == NULL)
                            ^
  232.   		{ c.line=__LINE__; goto err2; }
  233.   	M_ASN1_New(ret->bytes,BUF_MEM_new);

crypto/stack/stack.c:130:2: Assignment
    128.   	ret->comp=c;
    129.   	ret->num_alloc=MIN_NODES;
    130.   	ret->num=0;
            ^
    131.   	ret->sorted=0;
    132.   	return(ret);

apps/ca.c:1618:10: Call
1616.   			if (push != NULL)
1617.   				{
1618.   				if (!X509_NAME_add_entry(subject,push,
                 ^
1619.   					X509_NAME_entry_count(subject),0))
1620.   					{

crypto/x509/x509name.c:174:1: <Offset trace>
172.   /* if set is -1, append to previous set, 0 'a new one', and 1,
173.    * prepend to the guy we are about to stomp on. */
174. > int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
175.   	     int set)
176.   	{

crypto/x509/x509name.c:174:1: Parameter `loc`
  172.   /* if set is -1, append to previous set, 0 'a new one', and 1,
  173.    * prepend to the guy we are about to stomp on. */
  174. > int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
  175.   	     int set)
  176.   	{

crypto/x509/x509name.c:174:1: <Length trace>
172.   /* if set is -1, append to previous set, 0 'a new one', and 1,
173.    * prepend to the guy we are about to stomp on. */
174. > int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
175.   	     int set)
176.   	{

crypto/x509/x509name.c:174:1: Parameter `*name->entries->data`
  172.   /* if set is -1, append to previous set, 0 'a new one', and 1,
  173.    * prepend to the guy we are about to stomp on. */
  174. > int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
  175.   	     int set)
  176.   	{

crypto/x509/x509name.c:198:28: Array access: Offset: [-1, +oo] Size: [0, +oo] by call to `X509_NAME_add_entry` 
  196.   		else
  197.   			{
  198.   			set=((X509_NAME_ENTRY *)sk_value(sk,loc-1))->set;
                                    ^
  199.   			inc=0;
  200.   			}

int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
	     int set)
	{
	X509_NAME_ENTRY *new_name=NULL;
	int n,i,inc;
	STACK *sk;
	if (name == NULL) return(0);
	sk=name->entries;
	n=sk_num(sk);
	if (loc > n) loc=n;
	else if (loc < 0) loc=n;
	name->modified=1;
	if (set == -1)
		{
		if (loc == 0)
			{
			set=0;
			inc=1;
			}
		else
			{
			set=((X509_NAME_ENTRY *)sk_value(sk,loc-1))->set;
			inc=0;
			}
		}
	else
		{
		if (loc >= n)
			{
			if (loc != 0)
				set=((X509_NAME_ENTRY *)
					sk_value(sk,loc-1))->set+1;
			else
				set=0;
			}
		else
			set=((X509_NAME_ENTRY *)sk_value(sk,loc))->set;
		inc=(set == 0)?1:0;
		}
	if ((new_name=X509_NAME_ENTRY_dup(ne)) == NULL)
		goto err;
	new_name->set=set;
	if (!sk_insert(sk,(char *)new_name,loc))
		{
		X509err(X509_F_X509_NAME_ADD_ENTRY,ERR_R_MALLOC_FAILURE);
		goto err;
		}
	if (inc)
		{
		n=sk_num(sk);
		for (i=loc+1; i<n; i++)
			((X509_NAME_ENTRY *)sk_value(sk,i-1))->set+=1;
		}
	return(1);
err:
	if (new_name != NULL)
		X509_NAME_ENTRY_free(new_name);
	return(0);
	}
['static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,\n\t     STACK *policy, TXT_DB *db, BIGNUM *serial, char *startdate, int days,\n\t     int batch, int verbose, X509_REQ *req, char *ext_sect, LHASH *lconf)\n\t{\n\tX509_NAME *name=NULL,*CAname=NULL,*subject=NULL;\n\tASN1_UTCTIME *tm,*tmptm;\n\tASN1_STRING *str,*str2;\n\tASN1_OBJECT *obj;\n\tX509 *ret=NULL;\n\tX509_CINF *ci;\n\tX509_NAME_ENTRY *ne;\n\tX509_NAME_ENTRY *tne,*push;\n\tEVP_PKEY *pktmp;\n\tint ok= -1,i,j,last,nid;\n\tchar *p;\n\tCONF_VALUE *cv;\n\tchar *row[DB_NUMBER],**rrow,**irow=NULL;\n\tchar buf[25],*pbuf;\n\ttmptm=ASN1_UTCTIME_new();\n\tif (tmptm == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"malloc error\\n");\n\t\treturn(0);\n\t\t}\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\trow[i]=NULL;\n\tBIO_printf(bio_err,"The Subjects Distinguished Name is as follows\\n");\n\tname=X509_REQ_get_subject_name(req);\n\tfor (i=0; i<X509_NAME_entry_count(name); i++)\n\t\t{\n\t\tne=(X509_NAME_ENTRY *)X509_NAME_get_entry(name,i);\n\t\tobj=X509_NAME_ENTRY_get_object(ne);\n\t\tj=i2a_ASN1_OBJECT(bio_err,obj);\n\t\tstr=X509_NAME_ENTRY_get_data(ne);\n\t\tpbuf=buf;\n\t\tfor (j=22-j; j>0; j--)\n\t\t\t*(pbuf++)=\' \';\n\t\t*(pbuf++)=\':\';\n\t\t*(pbuf++)=\'\\0\';\n\t\tBIO_puts(bio_err,buf);\n\t\tif (msie_hack)\n\t\t\t{\n\t\t\tnid=OBJ_obj2nid(ne->object);\n\t\t\tif (str->type == V_ASN1_UNIVERSALSTRING)\n\t\t\t\tASN1_UNIVERSALSTRING_to_string(str);\n\t\t\tif ((str->type == V_ASN1_IA5STRING) &&\n\t\t\t\t(nid != NID_pkcs9_emailAddress))\n\t\t\t\tstr->type=V_ASN1_T61STRING;\n\t\t\tif ((nid == NID_pkcs9_emailAddress) &&\n\t\t\t\t(str->type == V_ASN1_PRINTABLESTRING))\n\t\t\t\tstr->type=V_ASN1_IA5STRING;\n\t\t\t}\n\t\tif (str->type == V_ASN1_PRINTABLESTRING)\n\t\t\tBIO_printf(bio_err,"PRINTABLE:\'");\n\t\telse if (str->type == V_ASN1_T61STRING)\n\t\t\tBIO_printf(bio_err,"T61STRING:\'");\n\t\telse if (str->type == V_ASN1_IA5STRING)\n\t\t\tBIO_printf(bio_err,"IA5STRING:\'");\n\t\telse if (str->type == V_ASN1_UNIVERSALSTRING)\n\t\t\tBIO_printf(bio_err,"UNIVERSALSTRING:\'");\n\t\telse\n\t\t\tBIO_printf(bio_err,"ASN.1 %2d:\'",str->type);\n\t\tif ((OBJ_obj2nid(obj) == NID_pkcs9_emailAddress) &&\n\t\t\t(str->type != V_ASN1_IA5STRING))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"\\nemailAddress type needs to be of type IA5STRING\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tj=ASN1_PRINTABLE_type(str->data,str->length);\n\t\tif (\t((j == V_ASN1_T61STRING) &&\n\t\t\t (str->type != V_ASN1_T61STRING)) ||\n\t\t\t((j == V_ASN1_IA5STRING) &&\n\t\t\t (str->type == V_ASN1_PRINTABLESTRING)))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"\\nThe string contains characters that are illegal for the ASN.1 type\\n");\n\t\t\tgoto err;\n\t\t\t}\n\t\tp=(char *)str->data;\n\t\tfor (j=str->length; j>0; j--)\n\t\t\t{\n\t\t\tif ((*p >= \' \') && (*p <= \'~\'))\n\t\t\t\tBIO_printf(bio_err,"%c",*p);\n\t\t\telse if (*p & 0x80)\n\t\t\t\tBIO_printf(bio_err,"\\\\0x%02X",*p);\n\t\t\telse if ((unsigned char)*p == 0xf7)\n\t\t\t\tBIO_printf(bio_err,"^?");\n\t\t\telse\tBIO_printf(bio_err,"^%c",*p+\'@\');\n\t\t\tp++;\n\t\t\t}\n\t\tBIO_printf(bio_err,"\'\\n");\n\t\t}\n\tif ((subject=X509_NAME_new()) == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\tgoto err;\n\t\t}\n\tCAname=X509_NAME_dup(x509->cert_info->subject);\n\tif (CAname == NULL) goto err;\n\tstr=str2=NULL;\n\tfor (i=0; i<sk_num(policy); i++)\n\t\t{\n\t\tcv=(CONF_VALUE *)sk_value(policy,i);\n\t\tif ((j=OBJ_txt2nid(cv->name)) == NID_undef)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"%s:unknown object type in \'policy\' configuration\\n",cv->name);\n\t\t\tgoto err;\n\t\t\t}\n\t\tobj=OBJ_nid2obj(j);\n\t\tlast= -1;\n\t\tfor (;;)\n\t\t\t{\n\t\t\tj=X509_NAME_get_index_by_OBJ(name,obj,last);\n\t\t\tif (j < 0)\n\t\t\t\t{\n\t\t\t\tif (last != -1) break;\n\t\t\t\ttne=NULL;\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\ttne=X509_NAME_get_entry(name,j);\n\t\t\t\t}\n\t\t\tlast=j;\n\t\t\tpush=NULL;\n\t\t\tif (strcmp(cv->value,"optional") == 0)\n\t\t\t\t{\n\t\t\t\tif (tne != NULL)\n\t\t\t\t\tpush=tne;\n\t\t\t\t}\n\t\t\telse if (strcmp(cv->value,"supplied") == 0)\n\t\t\t\t{\n\t\t\t\tif (tne == NULL)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field needed to be supplied and was missing\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tpush=tne;\n\t\t\t\t}\n\t\t\telse if (strcmp(cv->value,"match") == 0)\n\t\t\t\t{\n\t\t\t\tint last2;\n\t\t\t\tif (tne == NULL)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The mandatory %s field was missing\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\tlast2= -1;\nagain2:\n\t\t\t\tj=X509_NAME_get_index_by_OBJ(CAname,obj,last2);\n\t\t\t\tif ((j < 0) && (last2 == -1))\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field does not exist in the CA certificate,\\nthe \'policy\' is misconfigured\\n",cv->name);\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\tif (j >= 0)\n\t\t\t\t\t{\n\t\t\t\t\tpush=X509_NAME_get_entry(CAname,j);\n\t\t\t\t\tstr=X509_NAME_ENTRY_get_data(tne);\n\t\t\t\t\tstr2=X509_NAME_ENTRY_get_data(push);\n\t\t\t\t\tlast2=j;\n\t\t\t\t\tif (ASN1_STRING_cmp(str,str2) != 0)\n\t\t\t\t\t\tgoto again2;\n\t\t\t\t\t}\n\t\t\t\tif (j < 0)\n\t\t\t\t\t{\n\t\t\t\t\tBIO_printf(bio_err,"The %s field needed to be the same in the\\nCA certificate (%s) and the request (%s)\\n",cv->name,((str == NULL)?"NULL":(char *)str->data),((str2 == NULL)?"NULL":(char *)str2->data));\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tBIO_printf(bio_err,"%s:invalid type in \'policy\' configuration\\n",cv->value);\n\t\t\t\tgoto err;\n\t\t\t\t}\n\t\t\tif (push != NULL)\n\t\t\t\t{\n\t\t\t\tif (!X509_NAME_add_entry(subject,push,\n\t\t\t\t\tX509_NAME_entry_count(subject),0))\n\t\t\t\t\t{\n\t\t\t\t\tif (push != NULL)\n\t\t\t\t\t\tX509_NAME_ENTRY_free(push);\n\t\t\t\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\t\t\t\tgoto err;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tif (j < 0) break;\n\t\t\t}\n\t\t}\n\tif (preserve)\n\t\t{\n\t\tX509_NAME_free(subject);\n\t\tsubject=X509_NAME_dup(X509_REQ_get_subject_name(req));\n\t\tif (subject == NULL) goto err;\n\t\t}\n\tif (verbose)\n\t\tBIO_printf(bio_err,"The subject name apears to be ok, checking data base for clashes\\n");\n\trow[DB_name]=X509_NAME_oneline(subject,NULL,0);\n\trow[DB_serial]=BN_bn2hex(serial);\n\tif ((row[DB_name] == NULL) || (row[DB_serial] == NULL))\n\t\t{\n\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\tgoto err;\n\t\t}\n\trrow=TXT_DB_get_by_index(db,DB_name,row);\n\tif (rrow != NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"ERROR:There is already a certificate for %s\\n",\n\t\t\trow[DB_name]);\n\t\t}\n\telse\n\t\t{\n\t\trrow=TXT_DB_get_by_index(db,DB_serial,row);\n\t\tif (rrow != NULL)\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"ERROR:Serial number %s has already been issued,\\n",\n\t\t\t\trow[DB_serial]);\n\t\t\tBIO_printf(bio_err,"      check the database/serial_file for corruption\\n");\n\t\t\t}\n\t\t}\n\tif (rrow != NULL)\n\t\t{\n\t\tBIO_printf(bio_err,\n\t\t\t"The matching entry has the following details\\n");\n\t\tif (rrow[DB_type][0] == \'E\')\n\t\t\tp="Expired";\n\t\telse if (rrow[DB_type][0] == \'R\')\n\t\t\tp="Revoked";\n\t\telse if (rrow[DB_type][0] == \'V\')\n\t\t\tp="Valid";\n\t\telse\n\t\t\tp="\\ninvalid type, Data base error\\n";\n\t\tBIO_printf(bio_err,"Type          :%s\\n",p);;\n\t\tif (rrow[DB_type][0] == \'R\')\n\t\t\t{\n\t\t\tp=rrow[DB_exp_date]; if (p == NULL) p="undef";\n\t\t\tBIO_printf(bio_err,"Was revoked on:%s\\n",p);\n\t\t\t}\n\t\tp=rrow[DB_exp_date]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Expires on    :%s\\n",p);\n\t\tp=rrow[DB_serial]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Serial Number :%s\\n",p);\n\t\tp=rrow[DB_file]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"File name     :%s\\n",p);\n\t\tp=rrow[DB_name]; if (p == NULL) p="undef";\n\t\tBIO_printf(bio_err,"Subject Name  :%s\\n",p);\n\t\tok= -1;\n\t\tgoto err;\n\t\t}\n\tif (verbose)\n\t\tBIO_printf(bio_err,"Everything appears to be ok, creating and signing the certificate\\n");\n\tif ((ret=X509_new()) == NULL) goto err;\n\tci=ret->cert_info;\n#ifdef X509_V3\n\tif (!X509_set_version(x509,2)) goto err;\n#endif\n\tif (BN_to_ASN1_INTEGER(serial,ci->serialNumber) == NULL)\n\t\tgoto err;\n\tif (!X509_set_issuer_name(ret,X509_get_subject_name(x509)))\n\t\tgoto err;\n\tBIO_printf(bio_err,"Certificate is to be certified until ");\n\tif (strcmp(startdate,"today") == 0)\n\t\t{\n\t\tX509_gmtime_adj(X509_get_notBefore(ret),0);\n\t\tX509_gmtime_adj(X509_get_notAfter(ret),(long)60*60*24*days);\n\t\t}\n\telse\n\t\t{\n\t\tASN1_UTCTIME_set_string(X509_get_notBefore(ret),startdate);\n\t\t}\n\tASN1_UTCTIME_print(bio_err,X509_get_notAfter(ret));\n\tBIO_printf(bio_err," (%d days)\\n",days);\n\tif (!X509_set_subject_name(ret,subject)) goto err;\n\tpktmp=X509_REQ_get_pubkey(req);\n\ti = X509_set_pubkey(ret,pktmp);\n\tEVP_PKEY_free(pktmp);\n\tif (!i) goto err;\n\tif (ext_sect)\n\t\t{\n\t\tX509V3_CTX ctx;\n\t\tif (ci->version == NULL)\n\t\t\tif ((ci->version=ASN1_INTEGER_new()) == NULL)\n\t\t\t\tgoto err;\n\t\tASN1_INTEGER_set(ci->version,2);\n\t\tif (ci->extensions != NULL)\n\t\t\tsk_pop_free(ci->extensions,X509_EXTENSION_free);\n\t\tci->extensions = NULL;\n\t\tX509V3_set_ctx(&ctx, x509, ret, req, NULL, 0);\n\t\tX509V3_set_conf_lhash(&ctx, lconf);\n\t\tif(!X509V3_EXT_add_conf(lconf, &ctx, ext_sect, ret)) goto err;\n\t\t}\n\tif (!batch)\n\t\t{\n\t\tBIO_printf(bio_err,"Sign the certificate? [y/n]:");\n\t\tBIO_flush(bio_err);\n\t\tbuf[0]=\'\\0\';\n\t\tfgets(buf,sizeof(buf)-1,stdin);\n\t\tif (!((buf[0] == \'y\') || (buf[0] == \'Y\')))\n\t\t\t{\n\t\t\tBIO_printf(bio_err,"CERTIFICATE WILL NOT BE CERTIFIED\\n");\n\t\t\tok=0;\n\t\t\tgoto err;\n\t\t\t}\n\t\t}\n#ifndef NO_DSA\n\tif (pkey->type == EVP_PKEY_DSA) dgst=EVP_dss1();\n        pktmp=X509_get_pubkey(ret);\n        if (EVP_PKEY_missing_parameters(pktmp) &&\n\t\t!EVP_PKEY_missing_parameters(pkey))\n\t\tEVP_PKEY_copy_parameters(pktmp,pkey);\n\tEVP_PKEY_free(pktmp);\n#endif\n\tif (!X509_sign(ret,pkey,dgst))\n\t\tgoto err;\n\trow[DB_type]=(char *)Malloc(2);\n\ttm=X509_get_notAfter(ret);\n\trow[DB_exp_date]=(char *)Malloc(tm->length+1);\n\tmemcpy(row[DB_exp_date],tm->data,tm->length);\n\trow[DB_exp_date][tm->length]=\'\\0\';\n\trow[DB_rev_date]=NULL;\n\trow[DB_file]=(char *)Malloc(8);\n\tif ((row[DB_type] == NULL) || (row[DB_exp_date] == NULL) ||\n\t\t(row[DB_file] == NULL))\n\t\t{\n\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\tgoto err;\n\t\t}\n\tstrcpy(row[DB_file],"unknown");\n\trow[DB_type][0]=\'V\';\n\trow[DB_type][1]=\'\\0\';\n\tif ((irow=(char **)Malloc(sizeof(char *)*(DB_NUMBER+1))) == NULL)\n\t\t{\n\t\tBIO_printf(bio_err,"Malloc failure\\n");\n\t\tgoto err;\n\t\t}\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\t{\n\t\tirow[i]=row[i];\n\t\trow[i]=NULL;\n\t\t}\n\tirow[DB_NUMBER]=NULL;\n\tif (!TXT_DB_insert(db,irow))\n\t\t{\n\t\tBIO_printf(bio_err,"failed to update database\\n");\n\t\tBIO_printf(bio_err,"TXT_DB error number %ld\\n",db->error);\n\t\tgoto err;\n\t\t}\n\tok=1;\nerr:\n\tfor (i=0; i<DB_NUMBER; i++)\n\t\tif (row[i] != NULL) Free(row[i]);\n\tif (CAname != NULL)\n\t\tX509_NAME_free(CAname);\n\tif (subject != NULL)\n\t\tX509_NAME_free(subject);\n\tif (ok <= 0)\n\t\t{\n\t\tif (ret != NULL) X509_free(ret);\n\t\tret=NULL;\n\t\t}\n\telse\n\t\t*xret=ret;\n\treturn(ok);\n\t}', 'X509_NAME *X509_NAME_new(void)\n\t{\n\tX509_NAME *ret=NULL;\n\tASN1_CTX c;\n\tM_ASN1_New_Malloc(ret,X509_NAME);\n\tif ((ret->entries=sk_new(NULL)) == NULL)\n\t\t{ c.line=__LINE__; goto err2; }\n\tM_ASN1_New(ret->bytes,BUF_MEM_new);\n\tret->modified=1;\n\treturn(ret);\n\tM_ASN1_New_Error(ASN1_F_X509_NAME_NEW);\n\t}', 'STACK *sk_new(int (*c)())\n\t{\n\tSTACK *ret;\n\tint i;\n\tif ((ret=(STACK *)Malloc(sizeof(STACK))) == NULL)\n\t\tgoto err0;\n\tif ((ret->data=(char **)Malloc(sizeof(char *)*MIN_NODES)) == NULL)\n\t\tgoto err1;\n\tfor (i=0; i<MIN_NODES; i++)\n\t\tret->data[i]=NULL;\n\tret->comp=c;\n\tret->num_alloc=MIN_NODES;\n\tret->num=0;\n\tret->sorted=0;\n\treturn(ret);\nerr1:\n\tFree((char *)ret);\nerr0:\n\treturn(NULL);\n\t}', 'int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,\n\t     int set)\n\t{\n\tX509_NAME_ENTRY *new_name=NULL;\n\tint n,i,inc;\n\tSTACK *sk;\n\tif (name == NULL) return(0);\n\tsk=name->entries;\n\tn=sk_num(sk);\n\tif (loc > n) loc=n;\n\telse if (loc < 0) loc=n;\n\tname->modified=1;\n\tif (set == -1)\n\t\t{\n\t\tif (loc == 0)\n\t\t\t{\n\t\t\tset=0;\n\t\t\tinc=1;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tset=((X509_NAME_ENTRY *)sk_value(sk,loc-1))->set;\n\t\t\tinc=0;\n\t\t\t}\n\t\t}\n\telse\n\t\t{\n\t\tif (loc >= n)\n\t\t\t{\n\t\t\tif (loc != 0)\n\t\t\t\tset=((X509_NAME_ENTRY *)\n\t\t\t\t\tsk_value(sk,loc-1))->set+1;\n\t\t\telse\n\t\t\t\tset=0;\n\t\t\t}\n\t\telse\n\t\t\tset=((X509_NAME_ENTRY *)sk_value(sk,loc))->set;\n\t\tinc=(set == 0)?1:0;\n\t\t}\n\tif ((new_name=X509_NAME_ENTRY_dup(ne)) == NULL)\n\t\tgoto err;\n\tnew_name->set=set;\n\tif (!sk_insert(sk,(char *)new_name,loc))\n\t\t{\n\t\tX509err(X509_F_X509_NAME_ADD_ENTRY,ERR_R_MALLOC_FAILURE);\n\t\tgoto err;\n\t\t}\n\tif (inc)\n\t\t{\n\t\tn=sk_num(sk);\n\t\tfor (i=loc+1; i<n; i++)\n\t\t\t((X509_NAME_ENTRY *)sk_value(sk,i-1))->set+=1;\n\t\t}\n\treturn(1);\nerr:\n\tif (new_name != NULL)\n\t\tX509_NAME_ENTRY_free(new_name);\n\treturn(0);\n\t}']