| Index: openssl/crypto/asn1/tasn_new.c
 | 
| ===================================================================
 | 
| --- openssl/crypto/asn1/tasn_new.c	(revision 105093)
 | 
| +++ openssl/crypto/asn1/tasn_new.c	(working copy)
 | 
| @@ -68,7 +68,7 @@
 | 
|  								int combine);
 | 
|  static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
 | 
|  static void asn1_template_clear(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
 | 
| -void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
 | 
| +static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
 | 
|  
 | 
|  ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
 | 
|  	{
 | 
| @@ -146,7 +146,7 @@
 | 
|  		case ASN1_ITYPE_CHOICE:
 | 
|  		if (asn1_cb)
 | 
|  			{
 | 
| -			i = asn1_cb(ASN1_OP_NEW_PRE, pval, it);
 | 
| +			i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
 | 
|  			if (!i)
 | 
|  				goto auxerr;
 | 
|  			if (i==2)
 | 
| @@ -166,7 +166,7 @@
 | 
|  			memset(*pval, 0, it->size);
 | 
|  			}
 | 
|  		asn1_set_choice_selector(pval, -1, it);
 | 
| -		if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it))
 | 
| +		if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
 | 
|  				goto auxerr;
 | 
|  		break;
 | 
|  
 | 
| @@ -174,7 +174,7 @@
 | 
|  		case ASN1_ITYPE_SEQUENCE:
 | 
|  		if (asn1_cb)
 | 
|  			{
 | 
| -			i = asn1_cb(ASN1_OP_NEW_PRE, pval, it);
 | 
| +			i = asn1_cb(ASN1_OP_NEW_PRE, pval, it, NULL);
 | 
|  			if (!i)
 | 
|  				goto auxerr;
 | 
|  			if (i==2)
 | 
| @@ -201,7 +201,7 @@
 | 
|  			if (!ASN1_template_new(pseqval, tt))
 | 
|  				goto memerr;
 | 
|  			}
 | 
| -		if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it))
 | 
| +		if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
 | 
|  				goto auxerr;
 | 
|  		break;
 | 
|  	}
 | 
| @@ -325,6 +325,7 @@
 | 
|  int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
 | 
|  	{
 | 
|  	ASN1_TYPE *typ;
 | 
| +	ASN1_STRING *str;
 | 
|  	int utype;
 | 
|  
 | 
|  	if (it && it->funcs)
 | 
| @@ -345,10 +346,7 @@
 | 
|  		return 1;
 | 
|  
 | 
|  		case V_ASN1_BOOLEAN:
 | 
| -		if (it)
 | 
| -			*(ASN1_BOOLEAN *)pval = it->size;
 | 
| -		else
 | 
| -			*(ASN1_BOOLEAN *)pval = -1;
 | 
| +		*(ASN1_BOOLEAN *)pval = it->size;
 | 
|  		return 1;
 | 
|  
 | 
|  		case V_ASN1_NULL:
 | 
| @@ -365,7 +363,10 @@
 | 
|  		break;
 | 
|  
 | 
|  		default:
 | 
| -		*pval = (ASN1_VALUE *)ASN1_STRING_type_new(utype);
 | 
| +		str = ASN1_STRING_type_new(utype);
 | 
| +		if (it->itype == ASN1_ITYPE_MSTRING && str)
 | 
| +			str->flags |= ASN1_STRING_FLAG_MSTRING;
 | 
| +		*pval = (ASN1_VALUE *)str;
 | 
|  		break;
 | 
|  		}
 | 
|  	if (*pval)
 | 
| @@ -373,7 +374,7 @@
 | 
|  	return 0;
 | 
|  	}
 | 
|  
 | 
| -void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
 | 
| +static void asn1_primitive_clear(ASN1_VALUE **pval, const ASN1_ITEM *it)
 | 
|  	{
 | 
|  	int utype;
 | 
|  	if (it && it->funcs)
 | 
| 
 |