diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_obj.c')
-rw-r--r-- | src/lib/libcrypto/x509/x509_obj.c | 76 |
1 files changed, 29 insertions, 47 deletions
diff --git a/src/lib/libcrypto/x509/x509_obj.c b/src/lib/libcrypto/x509/x509_obj.c index 5f38315f22..d0c02f833e 100644 --- a/src/lib/libcrypto/x509/x509_obj.c +++ b/src/lib/libcrypto/x509/x509_obj.c | |||
@@ -64,7 +64,7 @@ | |||
64 | #include <openssl/buffer.h> | 64 | #include <openssl/buffer.h> |
65 | 65 | ||
66 | char *X509_NAME_oneline(X509_NAME *a, char *buf, int len) | 66 | char *X509_NAME_oneline(X509_NAME *a, char *buf, int len) |
67 | { | 67 | { |
68 | X509_NAME_ENTRY *ne; | 68 | X509_NAME_ENTRY *ne; |
69 | int i; | 69 | int i; |
70 | int n,lold,l,l1,l2,num,j,type; | 70 | int n,lold,l,l1,l2,num,j,type; |
@@ -76,103 +76,85 @@ int i; | |||
76 | int gs_doit[4]; | 76 | int gs_doit[4]; |
77 | char tmp_buf[80]; | 77 | char tmp_buf[80]; |
78 | 78 | ||
79 | if (buf == NULL) | 79 | if (buf == NULL) { |
80 | { | ||
81 | if ((b=BUF_MEM_new()) == NULL) goto err; | 80 | if ((b=BUF_MEM_new()) == NULL) goto err; |
82 | if (!BUF_MEM_grow(b,200)) goto err; | 81 | if (!BUF_MEM_grow(b,200)) goto err; |
83 | b->data[0]='\0'; | 82 | b->data[0]='\0'; |
84 | len=200; | 83 | len=200; |
84 | } | ||
85 | if (a == NULL) { | ||
86 | if(b) { | ||
87 | buf=b->data; | ||
88 | free(b); | ||
85 | } | 89 | } |
86 | if (a == NULL) | 90 | strlcpy(buf,"NO X509_NAME",len); |
87 | { | 91 | return buf; |
88 | if(b) | 92 | } |
89 | { | ||
90 | buf=b->data; | ||
91 | free(b); | ||
92 | } | ||
93 | strlcpy(buf,"NO X509_NAME",len); | ||
94 | return buf; | ||
95 | } | ||
96 | 93 | ||
97 | len--; /* space for '\0' */ | 94 | len--; /* space for '\0' */ |
98 | l=0; | 95 | l=0; |
99 | for (i=0; i<sk_X509_NAME_ENTRY_num(a->entries); i++) | 96 | for (i=0; i<sk_X509_NAME_ENTRY_num(a->entries); i++) { |
100 | { | ||
101 | ne=sk_X509_NAME_ENTRY_value(a->entries,i); | 97 | ne=sk_X509_NAME_ENTRY_value(a->entries,i); |
102 | n=OBJ_obj2nid(ne->object); | 98 | n=OBJ_obj2nid(ne->object); |
103 | if ((n == NID_undef) || ((s=OBJ_nid2sn(n)) == NULL)) | 99 | if ((n == NID_undef) || ((s=OBJ_nid2sn(n)) == NULL)) { |
104 | { | ||
105 | i2t_ASN1_OBJECT(tmp_buf,sizeof(tmp_buf),ne->object); | 100 | i2t_ASN1_OBJECT(tmp_buf,sizeof(tmp_buf),ne->object); |
106 | s=tmp_buf; | 101 | s=tmp_buf; |
107 | } | 102 | } |
108 | l1=strlen(s); | 103 | l1=strlen(s); |
109 | 104 | ||
110 | type=ne->value->type; | 105 | type=ne->value->type; |
111 | num=ne->value->length; | 106 | num=ne->value->length; |
112 | q=ne->value->data; | 107 | q=ne->value->data; |
113 | if ((type == V_ASN1_GENERALSTRING) && ((num%4) == 0)) | 108 | if ((type == V_ASN1_GENERALSTRING) && ((num%4) == 0)) { |
114 | { | ||
115 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=0; | 109 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=0; |
116 | for (j=0; j<num; j++) | 110 | for (j=0; j<num; j++) |
117 | if (q[j] != 0) gs_doit[j&3]=1; | 111 | if (q[j] != 0) gs_doit[j&3]=1; |
118 | 112 | ||
119 | if (gs_doit[0]|gs_doit[1]|gs_doit[2]) | 113 | if (gs_doit[0]|gs_doit[1]|gs_doit[2]) |
120 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; | 114 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; |
121 | else | 115 | else { |
122 | { | ||
123 | gs_doit[0]=gs_doit[1]=gs_doit[2]=0; | 116 | gs_doit[0]=gs_doit[1]=gs_doit[2]=0; |
124 | gs_doit[3]=1; | 117 | gs_doit[3]=1; |
125 | } | ||
126 | } | 118 | } |
127 | else | 119 | } else |
128 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; | 120 | gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; |
129 | 121 | ||
130 | for (l2=j=0; j<num; j++) | 122 | for (l2=j=0; j<num; j++) { |
131 | { | ||
132 | if (!gs_doit[j&3]) continue; | 123 | if (!gs_doit[j&3]) continue; |
133 | l2++; | 124 | l2++; |
134 | if ((q[j] < ' ') || (q[j] > '~')) l2+=3; | 125 | if ((q[j] < ' ') || (q[j] > '~')) l2+=3; |
135 | } | 126 | } |
136 | 127 | ||
137 | lold=l; | 128 | lold=l; |
138 | l+=1+l1+1+l2; | 129 | l+=1+l1+1+l2; |
139 | if (b != NULL) | 130 | if (b != NULL) { |
140 | { | ||
141 | if (!BUF_MEM_grow(b,l+1)) goto err; | 131 | if (!BUF_MEM_grow(b,l+1)) goto err; |
142 | p= &(b->data[lold]); | 132 | p= &(b->data[lold]); |
143 | } | 133 | } else if (l > len) { |
144 | else if (l > len) | ||
145 | { | ||
146 | break; | 134 | break; |
147 | } | 135 | } else |
148 | else | ||
149 | p= &(buf[lold]); | 136 | p= &(buf[lold]); |
150 | *(p++)='/'; | 137 | *(p++)='/'; |
151 | memcpy(p,s,(unsigned int)l1); p+=l1; | 138 | memcpy(p,s,(unsigned int)l1); p+=l1; |
152 | *(p++)='='; | 139 | *(p++)='='; |
153 | q=ne->value->data; | 140 | q=ne->value->data; |
154 | for (j=0; j<num; j++) | 141 | for (j=0; j<num; j++) { |
155 | { | ||
156 | if (!gs_doit[j&3]) continue; | 142 | if (!gs_doit[j&3]) continue; |
157 | n=q[j]; | 143 | n=q[j]; |
158 | if ((n < ' ') || (n > '~')) | 144 | if ((n < ' ') || (n > '~')) { |
159 | { | ||
160 | *(p++)='\\'; | 145 | *(p++)='\\'; |
161 | *(p++)='x'; | 146 | *(p++)='x'; |
162 | *(p++)=hex[(n>>4)&0x0f]; | 147 | *(p++)=hex[(n>>4)&0x0f]; |
163 | *(p++)=hex[n&0x0f]; | 148 | *(p++)=hex[n&0x0f]; |
164 | } | 149 | } else |
165 | else | ||
166 | *(p++)=n; | 150 | *(p++)=n; |
167 | } | ||
168 | *p='\0'; | ||
169 | } | 151 | } |
170 | if (b != NULL) | 152 | *p='\0'; |
171 | { | 153 | } |
154 | if (b != NULL) { | ||
172 | p=b->data; | 155 | p=b->data; |
173 | free(b); | 156 | free(b); |
174 | } | 157 | } else |
175 | else | ||
176 | p=buf; | 158 | p=buf; |
177 | if (i == 0) | 159 | if (i == 0) |
178 | *p = '\0'; | 160 | *p = '\0'; |
@@ -181,5 +163,5 @@ err: | |||
181 | X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE); | 163 | X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE); |
182 | if (b != NULL) BUF_MEM_free(b); | 164 | if (b != NULL) BUF_MEM_free(b); |
183 | return(NULL); | 165 | return(NULL); |
184 | } | 166 | } |
185 | 167 | ||