add ERR_asprintf_error_data, A tool to be used to get rid of the far too
authorbeck <beck@openbsd.org>
Thu, 24 Apr 2014 15:07:20 +0000 (15:07 +0000)
committerbeck <beck@openbsd.org>
Thu, 24 Apr 2014 15:07:20 +0000 (15:07 +0000)
frequent construct of 30 lines of pointer and strlcat insanity followed
by an ERR_add_error_data. I will sweep through here like a chubby mongol
horde in the next few days pillaging crappy ERR_add_error_data's.
Oh and while we're at it fix the nasty vdata function to use something less
hard on the eyes.
ok jsing@

lib/libcrypto/err/err.c
lib/libcrypto/err/err.h
lib/libssl/src/crypto/err/err.c
lib/libssl/src/crypto/err/err.h

index eaafb29..ee4597e 100644 (file)
@@ -1068,6 +1068,20 @@ ERR_set_error_data(char *data, int flags)
        es->err_data_flags[i] = flags;
 }
 
+void
+ERR_asprintf_error_data(char * format, ...) {
+       char *errbuf = NULL;
+       va_list ap;
+       int r;
+
+       va_start(ap, format);
+       r = vasprintf(&errbuf, format, ap);
+       va_end(ap);
+       if (r == -1)
+               ERR_set_error_data("malloc failed", ERR_TXT_STRING);
+       else
+               ERR_set_error_data(errbuf, ERR_TXT_MALLOCED|ERR_TXT_STRING);
+}
 void
 ERR_add_error_data(int num, ...)
 {
@@ -1080,34 +1094,20 @@ ERR_add_error_data(int num, ...)
 void
 ERR_add_error_vdata(int num, va_list args)
 {
-       int i, n, s;
-       char *str, *p, *a;
-
-       s = 80;
-       str = malloc(s + 1);
-       if (str == NULL)
-               return;
-       str[0] = '\0';
-
-       n = 0;
+       char format[129];
+       char *errbuf;
+       format[0] = '\0';
+       int i;
        for (i = 0; i < num; i++) {
-               a = va_arg(args, char*);
-               /* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */
-               if (a != NULL) {
-                       n += strlen(a);
-                       if (n > s) {
-                               s = n + 20;
-                               p = realloc(str, s + 1);
-                               if (p == NULL) {
-                                       free(str);
-                                       return;
-                               } else
-                                       str = p;
-                       }
-                       strlcat(str, a, (size_t)s + 1);
+               if (strlcat(format, "%s", sizeof(format)) >= sizeof(format)) {
+                       ERR_set_error_data("too many errors", ERR_TXT_STRING);
+                       return;
                }
        }
-       ERR_set_error_data(str, ERR_TXT_MALLOCED|ERR_TXT_STRING);
+       if (vasprintf(&errbuf, format, args) == -1)
+               ERR_set_error_data("malloc failed", ERR_TXT_STRING);
+       else
+               ERR_set_error_data(errbuf, ERR_TXT_MALLOCED|ERR_TXT_STRING);
 }
 
 int
index 87dfef2..8facd62 100644 (file)
@@ -343,6 +343,7 @@ void ERR_print_errors_fp(FILE *fp);
 #ifndef OPENSSL_NO_BIO
 void ERR_print_errors(BIO *bp);
 #endif
+void ERR_asprintf_error_data(char * format, ...);
 void ERR_add_error_data(int num, ...);
 void ERR_add_error_vdata(int num, va_list args);
 void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
index eaafb29..ee4597e 100644 (file)
@@ -1068,6 +1068,20 @@ ERR_set_error_data(char *data, int flags)
        es->err_data_flags[i] = flags;
 }
 
+void
+ERR_asprintf_error_data(char * format, ...) {
+       char *errbuf = NULL;
+       va_list ap;
+       int r;
+
+       va_start(ap, format);
+       r = vasprintf(&errbuf, format, ap);
+       va_end(ap);
+       if (r == -1)
+               ERR_set_error_data("malloc failed", ERR_TXT_STRING);
+       else
+               ERR_set_error_data(errbuf, ERR_TXT_MALLOCED|ERR_TXT_STRING);
+}
 void
 ERR_add_error_data(int num, ...)
 {
@@ -1080,34 +1094,20 @@ ERR_add_error_data(int num, ...)
 void
 ERR_add_error_vdata(int num, va_list args)
 {
-       int i, n, s;
-       char *str, *p, *a;
-
-       s = 80;
-       str = malloc(s + 1);
-       if (str == NULL)
-               return;
-       str[0] = '\0';
-
-       n = 0;
+       char format[129];
+       char *errbuf;
+       format[0] = '\0';
+       int i;
        for (i = 0; i < num; i++) {
-               a = va_arg(args, char*);
-               /* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */
-               if (a != NULL) {
-                       n += strlen(a);
-                       if (n > s) {
-                               s = n + 20;
-                               p = realloc(str, s + 1);
-                               if (p == NULL) {
-                                       free(str);
-                                       return;
-                               } else
-                                       str = p;
-                       }
-                       strlcat(str, a, (size_t)s + 1);
+               if (strlcat(format, "%s", sizeof(format)) >= sizeof(format)) {
+                       ERR_set_error_data("too many errors", ERR_TXT_STRING);
+                       return;
                }
        }
-       ERR_set_error_data(str, ERR_TXT_MALLOCED|ERR_TXT_STRING);
+       if (vasprintf(&errbuf, format, args) == -1)
+               ERR_set_error_data("malloc failed", ERR_TXT_STRING);
+       else
+               ERR_set_error_data(errbuf, ERR_TXT_MALLOCED|ERR_TXT_STRING);
 }
 
 int
index 87dfef2..8facd62 100644 (file)
@@ -343,6 +343,7 @@ void ERR_print_errors_fp(FILE *fp);
 #ifndef OPENSSL_NO_BIO
 void ERR_print_errors(BIO *bp);
 #endif
+void ERR_asprintf_error_data(char * format, ...);
 void ERR_add_error_data(int num, ...);
 void ERR_add_error_vdata(int num, va_list args);
 void ERR_load_strings(int lib, ERR_STRING_DATA str[]);