You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2014/06/26 18:30:29 UTC

svn commit: r1605844 - /subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c

Author: breser
Date: Thu Jun 26 16:30:28 2014
New Revision: 1605844

URL: http://svn.apache.org/r1605844
Log:
On svn-auth-x509 branch, rewrite x509parse_dn_gets() to use a svn_stringbuf_t.

* subversion/libsvn_subr/x509parse.c
  (x509parse_dn_gets): Rewrite to use svn_stringbuf_t, removing the error prone
    snprintf() calls.
  (svn_x509_parse_cert): Allocate a stringbuf for x509parse_dn_gets() to use
    and adjust the call to x509parse_dn_gets() appropriately.

Modified:
    subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c

Modified: subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c?rev=1605844&r1=1605843&r2=1605844&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_subr/x509parse.c Thu Jun 26 16:30:28 2014
@@ -46,6 +46,7 @@
 
 #include <apr_pools.h>
 #include "svn_hash.h"
+#include "svn_string.h"
 #include "svn_x509.h"
 
 #include "x509.h"
@@ -505,79 +506,70 @@ x509_skip_ext(const unsigned char **p,
  * than (end - buf) characters will be written
  */
 static void
-x509parse_dn_gets(char *buf, const char *end, const x509_name * dn)
+x509parse_dn_gets(svn_stringbuf_t *buf, const x509_name * dn, apr_pool_t *scratch_pool)
 {
   int i;
-  unsigned char c;
   const x509_name *name;
-  char s[128], *p;
-
-  memset(s, 0, sizeof(s));
+  const char *temp;
 
   name = dn;
-  p = buf;
 
   while (name != NULL) {
     if (name != dn)
-      p += snprintf(p, end - p, ", ");
+      svn_stringbuf_appendcstr(buf, ", ");
 
     if (memcmp(name->oid.p, OID_X520, 2) == 0) {
       switch (name->oid.p[2]) {
       case X520_COMMON_NAME:
-        p += snprintf(p, end - p, "CN=");
+        svn_stringbuf_appendcstr(buf, "CN=");
         break;
 
       case X520_COUNTRY:
-        p += snprintf(p, end - p, "C=");
+        svn_stringbuf_appendcstr(buf, "C=");
         break;
 
       case X520_LOCALITY:
-        p += snprintf(p, end - p, "L=");
+        svn_stringbuf_appendcstr(buf, "L=");
         break;
 
       case X520_STATE:
-        p += snprintf(p, end - p, "ST=");
+        svn_stringbuf_appendcstr(buf, "ST=");
         break;
 
       case X520_ORGANIZATION:
-        p += snprintf(p, end - p, "O=");
+        svn_stringbuf_appendcstr(buf, "O=");
         break;
 
       case X520_ORG_UNIT:
-        p += snprintf(p, end - p, "OU=");
+        svn_stringbuf_appendcstr(buf, "OU=");
         break;
 
       default:
-        p += snprintf(p, end - p, "0x%02X=",
-                name->oid.p[2]);
+        temp = apr_psprintf(scratch_pool, "0x%02X=", name->oid.p[2]);
+        svn_stringbuf_appendcstr(buf, temp);
         break;
       }
     } else if (memcmp(name->oid.p, OID_PKCS9, 8) == 0) {
       switch (name->oid.p[8]) {
       case PKCS9_EMAIL:
-        p += snprintf(p, end - p, "emailAddress=");
+        svn_stringbuf_appendcstr(buf, "emailAddress=");
         break;
 
       default:
-        p += snprintf(p, end - p, "0x%02X=",
-                name->oid.p[8]);
+        temp = apr_psprintf(scratch_pool, "0x%02X=", name->oid.p[8]);
+        svn_stringbuf_appendcstr(buf, temp);
         break;
       }
     } else
-      p += snprintf(p, end - p, "\?\?=");
+      svn_stringbuf_appendcstr(buf, "\?\?=");
 
     for (i = 0; i < name->val.len; i++) {
-      if (i >= (int)sizeof(s) - 1)
-        break;
-
-      c = name->val.p[i];
+      unsigned char c = name->val.p[i];
       if (c < 32 || c == 127 || (c > 128 && c < 160))
-        s[i] = '?';
+        svn_stringbuf_appendbyte(buf, '?');
       else
-        s[i] = c;
+        svn_stringbuf_appendbyte(buf, (char) c);
     }
-    s[i] = '\0';
-    p += snprintf(p, end - p, "%s", s);
     name = name->next;
   }
 }
@@ -597,7 +589,7 @@ svn_x509_parse_cert(apr_hash_t **certinf
   const unsigned char *p;
   const unsigned char *end;
   x509_cert *crt;
-  char name[1024];
+  svn_stringbuf_t *name;
 
   crt = apr_pcalloc(scratch_pool, sizeof(*crt));
   p = (const unsigned char *)buf;
@@ -742,9 +734,9 @@ svn_x509_parse_cert(apr_hash_t **certinf
 
   *certinfo = apr_hash_make(result_pool);
 
-  x509parse_dn_gets(name, name + sizeof(name), &crt->issuer);
-  svn_hash_sets(*certinfo, SVN_X509_CERTINFO_KEY_ISSUER,
-                apr_pstrdup(result_pool, name));
+  name = svn_stringbuf_create_empty(result_pool);
+  x509parse_dn_gets(name, &crt->issuer, scratch_pool);
+  svn_hash_sets(*certinfo, SVN_X509_CERTINFO_KEY_ISSUER, name->data);
 
   svn_hash_sets(*certinfo, SVN_X509_CERTINFO_KEY_VALID_FROM,
                 apr_psprintf(result_pool,