New option to CA.pl to sign request using CA extensions.
[openssl.git] / crypto / asn1 / a_mbstr.c
index 2fe658e085e7f3eecdcbf38e5d23aac56132156c..9842b653e62b8b5ad8747a8140eeb42a7c0af7ee 100644 (file)
@@ -72,25 +72,6 @@ static int cpy_univ(unsigned long value, void *arg);
 static int cpy_utf8(unsigned long value, void *arg);
 static int is_printable(unsigned long value);
 
-/* This is the default mask for the mbstring functions: it is designed
- * to be a "safe" DirectoryString. Netscape messenger crashes when it
- * receives a certificate containing a BMPString so by default we don't
- * use them unless we have to.
- */
-
-static long dirstring_mask = B_ASN1_PRINTABLESTRING
-                               | B_ASN1_T61STRING | B_ASN1_BMPSTRING;
-
-void ASN1_STRING_set_default_mask(unsigned long mask)
-{
-       dirstring_mask = mask;
-}
-
-unsigned long ASN1_STRING_get_default_mask(void)
-{
-       return dirstring_mask;
-}
-
 /* These functions take a string in UTF8, ASCII or multibyte form and
  * a mask of permissible ASN1 string types. It then works out the minimal
  * type (using the order Printable < IA5 < T61 < BMP < Universal < UTF8)
@@ -111,14 +92,15 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
 {
        int str_type;
        int ret;
+       char free_out;
        int outform, outlen;
        ASN1_STRING *dest;
        unsigned char *p;
        int nchar;
-       unsigned char strbuf[32];
+       char strbuf[32];
        int (*cpyfunc)(unsigned long,void *) = NULL;
        if(len == -1) len = strlen((const char *)in);
-       if(!mask) mask = dirstring_mask;
+       if(!mask) mask = DIRSTRING_TYPE;
 
        /* First do a string check and work out the number of characters */
        switch(inform) {
@@ -161,14 +143,14 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
                return -1;
        }
 
-       if(minsize && (nchar < minsize)) {
+       if((minsize > 0) && (nchar < minsize)) {
                ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_SHORT);
                sprintf(strbuf, "%ld", minsize);
                ERR_add_error_data(2, "minsize=", strbuf);
                return -1;
        }
 
-       if(maxsize && (nchar > maxsize)) {
+       if((maxsize > 0) && (nchar > maxsize)) {
                ASN1err(ASN1_F_ASN1_MBSTRING_COPY, ASN1_R_STRING_TOO_LONG);
                sprintf(strbuf, "%ld", maxsize);
                ERR_add_error_data(2, "maxsize=", strbuf);
@@ -199,14 +181,16 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
        }
        if(!out) return str_type;
        if(*out) {
+               free_out = 0;
                dest = *out;
                if(dest->data) {
                        dest->length = 0;
-                       Free(dest->data);
+                       OPENSSL_free(dest->data);
                        dest->data = NULL;
                }
                dest->type = str_type;
        } else {
+               free_out = 1;
                dest = ASN1_STRING_type_new(str_type);
                if(!dest) {
                        ASN1err(ASN1_F_ASN1_MBSTRING_COPY,
@@ -247,8 +231,8 @@ int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
                cpyfunc = cpy_utf8;
                break;
        }
-       if(!(p = Malloc(outlen + 1))) {
-               ASN1_STRING_free(dest);
+       if(!(p = OPENSSL_malloc(outlen + 1))) {
+               if(free_out) ASN1_STRING_free(dest);
                ASN1err(ASN1_F_ASN1_MBSTRING_COPY,ERR_R_MALLOC_FAILURE);
                return -1;
        }
@@ -277,8 +261,8 @@ static int traverse_string(const unsigned char *p, int len, int inform,
                        value |= *p++;
                        len -= 2;
                } else if(inform == MBSTRING_UNIV) {
-                       value = *p++ << 24;
-                       value |= *p++ << 16;
+                       value = ((unsigned long)*p++) << 24;
+                       value |= ((unsigned long)*p++) << 16;
                        value |= *p++ << 8;
                        value |= *p++;
                        len -= 4;