XMLValueList handling

diff --git a/ChangeLog b/ChangeLog
index 24aff75..da52c44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,11 @@
 
 0.9.10:	2005-Feb-24
 
-	* Fixes #1150856 (vvvy@users.sourceforge.net).
+	* Fixed #1150856.
+	  Reported by <vvvy@users.sourceforge.net>.
+	* Fixed XER XMLValueList encoding and decoding.
+	  (Test case 70) (Severity: high, Secruity impact: low)
+	  Reported by <siden@ul-gsm.ru>.
 
 0.9.9:	2005-Feb-22
 
@@ -42,8 +46,8 @@
 
 0.9.7:	2004-Oct-11
 
-	* Finished CANONICAL-XER implementation by adding SET and SET OF
-	  canonical ordering support.
+	* Finished CXER implementation by adding SET and SET OF canonical
+	  ordering support.
 	* Fixed unber(1) limits controlling logic.
 	* Removed C99'izm from the x509dump, now understood by older compilers.
 	* Enhanced UTF8String constraint validation, now it checks
diff --git a/skeletons/constr_SEQUENCE_OF.c b/skeletons/constr_SEQUENCE_OF.c
index f126d78..027f5ec 100644
--- a/skeletons/constr_SEQUENCE_OF.c
+++ b/skeletons/constr_SEQUENCE_OF.c
@@ -117,6 +117,13 @@
 		tmper = element->type->xer_encoder(element->type, memb_ptr,
 				ilevel + 1, flags, cb, app_key);
 		if(tmper.encoded == -1) return tmper;
+                if(tmper.encoded == 0 && specs->as_XMLValueList) {
+                        const char *name = (*element->name)
+                                ? element->name : element->type->xml_tag;
+			size_t len = strlen(name);
+			if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1);
+			_ASN_CALLBACK3("<", 1, name, len, "/>", 2);
+                }
 
 		if(mname) {
 			_ASN_CALLBACK3("</", 2, mname, mlen, ">", 1);
diff --git a/skeletons/constr_SET_OF.c b/skeletons/constr_SET_OF.c
index 37268dc..931aab2 100644
--- a/skeletons/constr_SET_OF.c
+++ b/skeletons/constr_SET_OF.c
@@ -469,9 +469,8 @@
 	 */
 	asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics;
 	asn_TYPE_member_t *element = td->elements;
-	const char *elm_tag = specs->as_XMLValueList
-		? 0 : ((*element->name)
-		? element->name : element->type->xml_tag);
+	const char *elm_tag = ((*element->name)
+			? element->name : element->type->xml_tag);
 	const char *xml_tag = opt_mname ? opt_mname : td->xml_tag;
 
 	/*
@@ -578,23 +577,12 @@
 		case XCT_UNKNOWN_BO:
 
 			ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase);
-			if(ctx->phase != 1)
-				break;	/* Really unexpected */
-
-			/*
-			 * Search which member corresponds to this tag.
-			 */
-			tcv = xer_check_tag(buf_ptr, ch_size, elm_tag);
-			switch(tcv) {
-			case XCT_BOTH:
-			case XCT_OPENING:
+			if(ctx->phase == 1) {
 				/*
-				 * Process this member.
+				 * Process a single possible member.
 				 */
 				ctx->phase = 2;
 				continue;
-			default:
-				break;	/* Phase out */
 			}
 			/* Fall through */
 		default:
@@ -703,6 +691,13 @@
 			sptr = tmper.structure_ptr;
 			goto cb_failed;
 		}
+		if(tmper.encoded == 0 && specs->as_XMLValueList) {
+			const char *name = (*element->name)
+				? element->name : element->type->xml_tag;
+			size_t len = strlen(name);
+			if(!xcan) _i_ASN_TEXT_INDENT(1, ilevel + 1);
+			_ASN_CALLBACK3("<", 1, name, len, "/>", 2);
+		}
 
 		if(mname) {
 			_ASN_CALLBACK3("</", 2, mname, mlen, ">", 1);
diff --git a/skeletons/xer_decoder.c b/skeletons/xer_decoder.c
index 9127679..82c084e 100644
--- a/skeletons/xer_decoder.c
+++ b/skeletons/xer_decoder.c
@@ -287,7 +287,7 @@
 			break;		/* Unexpected tag */
 		}
 
-		ASN_DEBUG("Unexpected XML tag");
+		ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag);
 		break;	/* Dark and mysterious things have just happened */
 	}