| Index: openssl/crypto/err/err_prn.c
|
| ===================================================================
|
| --- openssl/crypto/err/err_prn.c (revision 105093)
|
| +++ openssl/crypto/err/err_prn.c (working copy)
|
| @@ -72,8 +72,10 @@
|
| const char *file,*data;
|
| int line,flags;
|
| unsigned long es;
|
| + CRYPTO_THREADID cur;
|
|
|
| - es=CRYPTO_thread_id();
|
| + CRYPTO_THREADID_current(&cur);
|
| + es=CRYPTO_THREADID_hash(&cur);
|
| while ((l=ERR_get_error_line_data(&file,&line,&data,&flags)) != 0)
|
| {
|
| ERR_error_string_n(l, buf, sizeof buf);
|
| @@ -100,64 +102,13 @@
|
| }
|
| #endif
|
|
|
| -void ERR_error_string_n(unsigned long e, char *buf, size_t len)
|
| +static int print_bio(const char *str, size_t len, void *bp)
|
| {
|
| - char lsbuf[64], fsbuf[64], rsbuf[64];
|
| - const char *ls,*fs,*rs;
|
| - unsigned long l,f,r;
|
| -
|
| - l=ERR_GET_LIB(e);
|
| - f=ERR_GET_FUNC(e);
|
| - r=ERR_GET_REASON(e);
|
| -
|
| - ls=ERR_lib_error_string(e);
|
| - fs=ERR_func_error_string(e);
|
| - rs=ERR_reason_error_string(e);
|
| -
|
| - if (ls == NULL)
|
| - BIO_snprintf(lsbuf, sizeof(lsbuf), "lib(%lu)", l);
|
| - if (fs == NULL)
|
| - BIO_snprintf(fsbuf, sizeof(fsbuf), "func(%lu)", f);
|
| - if (rs == NULL)
|
| - BIO_snprintf(rsbuf, sizeof(rsbuf), "reason(%lu)", r);
|
| -
|
| - BIO_snprintf(buf, len,"error:%08lX:%s:%s:%s", e, ls?ls:lsbuf,
|
| - fs?fs:fsbuf, rs?rs:rsbuf);
|
| - if (strlen(buf) == len-1)
|
| - {
|
| - /* output may be truncated; make sure we always have 5
|
| - * colon-separated fields, i.e. 4 colons ... */
|
| -#define NUM_COLONS 4
|
| - if (len > NUM_COLONS) /* ... if possible */
|
| - {
|
| - int i;
|
| - char *s = buf;
|
| -
|
| - for (i = 0; i < NUM_COLONS; i++)
|
| - {
|
| - char *colon = strchr(s, ':');
|
| - if (colon == NULL || colon > &buf[len-1] - NUM_COLONS + i)
|
| - {
|
| - /* set colon no. i at last possible position
|
| - * (buf[len-1] is the terminating 0)*/
|
| - colon = &buf[len-1] - NUM_COLONS + i;
|
| - *colon = ':';
|
| - }
|
| - s = colon + 1;
|
| - }
|
| - }
|
| - }
|
| + return BIO_write((BIO *)bp, str, len);
|
| }
|
| -
|
| -/* BAD for multi-threading: uses a local buffer if ret == NULL */
|
| -/* ERR_error_string_n should be used instead for ret != NULL
|
| - * as ERR_error_string cannot know how large the buffer is */
|
| -char *ERR_error_string(unsigned long e, char *ret)
|
| +void ERR_print_errors(BIO *bp)
|
| {
|
| - static char buf[256];
|
| -
|
| - if (ret == NULL) ret=buf;
|
| - ERR_error_string_n(e, ret, 256);
|
| -
|
| - return ret;
|
| + ERR_print_errors_cb(print_bio, bp);
|
| }
|
| +
|
| +
|
|
|