Split building RDN to a separate function.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@19596 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										108
									
								
								lib/hx509/name.c
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								lib/hx509/name.c
									
									
									
									
									
								
							| @@ -327,26 +327,72 @@ hx509_der_parse_name(const void *data, size_t length, hx509_name *name) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| hx509_parse_name(const char *str, hx509_name *name) | _hx509_name_modify(hx509_context context, | ||||||
|  | 		   Name *name,  | ||||||
|  | 		   int append, | ||||||
|  | 		   const heim_oid *oid,  | ||||||
|  | 		   const char *str) | ||||||
|  | { | ||||||
|  |     RelativeDistinguishedName *rdn; | ||||||
|  |     int ret; | ||||||
|  |     void *ptr; | ||||||
|  |  | ||||||
|  |     ptr = realloc(name->u.rdnSequence.val,  | ||||||
|  | 		  sizeof(name->u.rdnSequence.val[0]) *  | ||||||
|  | 		  (name->u.rdnSequence.len + 1)); | ||||||
|  |     if (ptr == NULL) { | ||||||
|  | 	hx509_set_error_string(context, 0, ENOMEM, "Out of memory"); | ||||||
|  | 	return ENOMEM; | ||||||
|  |     } | ||||||
|  |     name->u.rdnSequence.val = ptr; | ||||||
|  |  | ||||||
|  |     if (append) { | ||||||
|  | 	rdn = &name->u.rdnSequence.val[name->u.rdnSequence.len]; | ||||||
|  |     } else { | ||||||
|  | 	memmove(&name->u.rdnSequence.val[1], | ||||||
|  | 		&name->u.rdnSequence.val[0], | ||||||
|  | 		name->u.rdnSequence.len *  | ||||||
|  | 		sizeof(name->u.rdnSequence.val[0])); | ||||||
|  | 	 | ||||||
|  | 	rdn = &name->u.rdnSequence.val[0]; | ||||||
|  |     } | ||||||
|  |     rdn->val = malloc(sizeof(rdn->val[0])); | ||||||
|  |     if (rdn->val == NULL) | ||||||
|  | 	return ENOMEM; | ||||||
|  |     rdn->len = 1; | ||||||
|  |     ret = der_copy_oid(oid, &rdn->val[0].type); | ||||||
|  |     if (ret) | ||||||
|  | 	return ret; | ||||||
|  |     rdn->val[0].value.element = choice_DirectoryString_utf8String; | ||||||
|  |     rdn->val[0].value.u.utf8String = strdup(str); | ||||||
|  |     if (rdn->val[0].value.u.utf8String == NULL) | ||||||
|  | 	return ENOMEM; | ||||||
|  |     name->u.rdnSequence.len += 1; | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | hx509_parse_name(hx509_context context, const char *str, hx509_name *name) | ||||||
| { | { | ||||||
|     const char *p, *q; |     const char *p, *q; | ||||||
|     size_t len; |     size_t len; | ||||||
|     hx509_name n; |     hx509_name n; | ||||||
|     void *ptr; |  | ||||||
|     int ret; |     int ret; | ||||||
|  |  | ||||||
|     *name = NULL; |     *name = NULL; | ||||||
|  |  | ||||||
|     n = calloc(1, sizeof(*n)); |     n = calloc(1, sizeof(*n)); | ||||||
|     if (n == NULL) |     if (n == NULL) { | ||||||
|  | 	hx509_set_error_string(context, 0, ENOMEM, "out of memory"); | ||||||
| 	return ENOMEM; | 	return ENOMEM; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     n->der_name.element = choice_Name_rdnSequence; |     n->der_name.element = choice_Name_rdnSequence; | ||||||
|  |  | ||||||
|     p = str; |     p = str; | ||||||
|  |  | ||||||
|     while (p != NULL && *p != '\0') { |     while (p != NULL && *p != '\0') { | ||||||
| 	RelativeDistinguishedName *rdn; |  | ||||||
| 	heim_oid oid; | 	heim_oid oid; | ||||||
| 	int last; | 	int last; | ||||||
|  |  | ||||||
| @@ -361,52 +407,31 @@ hx509_parse_name(const char *str, hx509_name *name) | |||||||
|  |  | ||||||
| 	q = strchr(p, '='); | 	q = strchr(p, '='); | ||||||
| 	if (q == NULL) { | 	if (q == NULL) { | ||||||
| 	    /* _hx509_abort("missing = in %s", p); */ | 	    ret = HX509_PARSING_NAME_FAILED; | ||||||
|  | 	    hx509_set_error_string(context, 0, ret, "missing = in %s", p); | ||||||
| 	    goto out; | 	    goto out; | ||||||
| 	} | 	} | ||||||
| 	if (q == p) { | 	if (q == p) { | ||||||
| 	    /* _hx509_abort("missing name before = in %s", p); */ | 	    ret = HX509_PARSING_NAME_FAILED; | ||||||
|  | 	    hx509_set_error_string(context, 0, ret,  | ||||||
|  | 				   "missing name before = in %s", p); | ||||||
| 	    goto out; | 	    goto out; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	if ((q - p) > len) { | 	if ((q - p) > len) { | ||||||
| 	    /* _hx509_abort(" = after , in %s", p); */ | 	    ret = HX509_PARSING_NAME_FAILED; | ||||||
|  | 	    hx509_set_error_string(context, 0, ret, " = after , in %s", p); | ||||||
| 	    goto out; | 	    goto out; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ret = stringtooid(p, q - p, &oid); | 	ret = stringtooid(p, q - p, &oid); | ||||||
| 	if (ret) { | 	if (ret) { | ||||||
| 	    /* _hx509_abort("unknown type: %.*s", (int)(q - p), p); */ | 	    ret = HX509_PARSING_NAME_FAILED; | ||||||
|  | 	    hx509_set_error_string(context, 0, ret,  | ||||||
|  | 				   "unknown type: %.*s", (int)(q - p), p); | ||||||
| 	    goto out; | 	    goto out; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	ptr = realloc(n->der_name.u.rdnSequence.val,  |  | ||||||
| 		      sizeof(n->der_name.u.rdnSequence.val[0]) * |  | ||||||
| 		      (n->der_name.u.rdnSequence.len + 1)); |  | ||||||
| 	if (ptr == NULL) { |  | ||||||
| 	    /* _hx509_abort("realloc"); */ |  | ||||||
| 	    der_free_oid(&oid); |  | ||||||
| 	    goto out; |  | ||||||
| 	} |  | ||||||
| 	n->der_name.u.rdnSequence.val = ptr; |  | ||||||
|  |  | ||||||
| 	memmove(&n->der_name.u.rdnSequence.val[1], |  | ||||||
| 		&n->der_name.u.rdnSequence.val[0], |  | ||||||
| 		n->der_name.u.rdnSequence.len *  |  | ||||||
| 		sizeof(n->der_name.u.rdnSequence.val[0])); |  | ||||||
| 	 |  | ||||||
| 	rdn = &n->der_name.u.rdnSequence.val[0]; |  | ||||||
|  |  | ||||||
| 	rdn->val = malloc(sizeof(rdn->val[0])); |  | ||||||
| 	if (rdn->val == NULL) { |  | ||||||
| 	    /* _hx509_abort("malloc"); */ |  | ||||||
| 	    der_free_oid(&oid); |  | ||||||
| 	    goto out; |  | ||||||
| 	} |  | ||||||
| 	rdn->len = 1; |  | ||||||
|  |  | ||||||
| 	rdn->val[0].type = oid; |  | ||||||
|  |  | ||||||
| 	{ | 	{ | ||||||
| 	    size_t pstr_len = len - (q - p) - 1; | 	    size_t pstr_len = len - (q - p) - 1; | ||||||
| 	    const char *pstr = p + (q - p) + 1; | 	    const char *pstr = p + (q - p) + 1; | ||||||
| @@ -414,18 +439,21 @@ hx509_parse_name(const char *str, hx509_name *name) | |||||||
| 	     | 	     | ||||||
| 	    r = malloc(pstr_len + 1); | 	    r = malloc(pstr_len + 1); | ||||||
| 	    if (r == NULL) { | 	    if (r == NULL) { | ||||||
| 		/* _hx509_abort("malloc"); */ | 		der_free_oid(&oid); | ||||||
|  | 		ret = ENOMEM; | ||||||
|  | 		hx509_set_error_string(context, 0, ret, "out of memory"); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	    } | 	    } | ||||||
| 	    memcpy(r, pstr, pstr_len); | 	    memcpy(r, pstr, pstr_len); | ||||||
| 	    r[pstr_len] = '\0'; | 	    r[pstr_len] = '\0'; | ||||||
|  |  | ||||||
| 	    rdn->val[0].value.element = choice_DirectoryString_printableString; | 	    ret = _hx509_name_modify(context, &n->der_name, 0, &oid, r); | ||||||
| 	    rdn->val[0].value.u.printableString = r; | 	    free(r); | ||||||
|  | 	    der_free_oid(&oid); | ||||||
|  | 	    if(ret) | ||||||
|  | 		goto out; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	p += len + last; | 	p += len + last; | ||||||
| 	n->der_name.u.rdnSequence.len += 1; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     *name = n; |     *name = n; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand