Print IPv6 all 0s correctly (Rob Austein).
[openssl.git] / crypto / x509v3 / v3_addr.c
index 8ba22548560f9ef48416c3207dfd0c775f168718..9a13469a998635751f43bac043c0fd51d2c1feb6 100644 (file)
 #include <openssl/conf.h>
 #include <openssl/asn1.h>
 #include <openssl/asn1t.h>
+#include <openssl/buffer.h>
 #include <openssl/x509v3.h>
 
-#ifdef OPENSSL_RFC3779
+#ifndef OPENSSL_NO_RFC3779
 
 /*
  * OpenSSL ASN.1 template translation of RFC 3779 2.2.3.
@@ -189,6 +190,8 @@ static int i2r_address(BIO *out,
       BIO_printf(out, "%x%s", (addr[i] << 8) | addr[i+1], (i < 14 ? ":" : ""));
     if (i < 16)
       BIO_puts(out, ":");
+    if (i == 0)
+      BIO_puts(out, ":");
     break;
   default:
     for (i = 0; i < bs->length; i++)
@@ -233,7 +236,7 @@ static int i2r_IPAddressOrRanges(BIO *out,
 /*
  * i2r handler for an IPAddrBlocks extension.
  */
-static int i2r_IPAddrBlocks(X509V3_EXT_METHOD *method,
+static int i2r_IPAddrBlocks(const X509V3_EXT_METHOD *method,
                            void *ext,
                            BIO *out,
                            int indent)
@@ -876,6 +879,7 @@ int v3_addr_canonize(IPAddrBlocks *addr)
                                    v3_addr_get_afi(f)))
       return 0;
   }
+  sk_IPAddressFamily_set_cmp_func(addr, IPAddressFamily_cmp);
   sk_IPAddressFamily_sort(addr);
   assert(v3_addr_is_canonical(addr));
   return 1;
@@ -884,7 +888,7 @@ int v3_addr_canonize(IPAddrBlocks *addr)
 /*
  * v2i handler for the IPAddrBlocks extension.
  */
-static void *v2i_IPAddrBlocks(struct v3_ext_method *method,
+static void *v2i_IPAddrBlocks(const struct v3_ext_method *method,
                              struct v3_ext_ctx *ctx,
                              STACK_OF(CONF_VALUE) *values)
 {
@@ -934,7 +938,7 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method,
     length = length_from_afi(afi);
 
     /*
-     * Handle SAFI, if any, and strdup() so we can null-terminate
+     * Handle SAFI, if any, and BUF_strdup() so we can null-terminate
      * the other input values.
      */
     if (safi != NULL) {
@@ -946,9 +950,9 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method,
        goto err;
       }
       t += strspn(t, " \t");
-      s = strdup(t);
+      s = BUF_strdup(t);
     } else {
-      s = strdup(val->value);
+      s = BUF_strdup(val->value);
     }
     if (s == NULL) {
       X509V3err(X509V3_F_V2I_IPADDRBLOCKS, ERR_R_MALLOC_FAILURE);
@@ -1044,7 +1048,7 @@ static void *v2i_IPAddrBlocks(struct v3_ext_method *method,
 /*
  * OpenSSL dispatch
  */
-X509V3_EXT_METHOD v3_addr = {
+const X509V3_EXT_METHOD v3_addr = {
   NID_sbgp_ipAddrBlock,                /* nid */
   0,                           /* flags */
   ASN1_ITEM_ref(IPAddrBlocks), /* template */
@@ -1277,4 +1281,4 @@ int v3_addr_validate_resource_set(STACK_OF(X509) *chain,
   return v3_addr_validate_path_internal(NULL, chain, ext);
 }
 
-#endif /* OPENSSL_RFC3779 */
+#endif /* OPENSSL_NO_RFC3779 */