1 |
|
|
/* $OpenBSD: b_print.c,v 1.25 2014/06/12 15:49:28 deraadt Exp $ */ |
2 |
|
|
|
3 |
|
|
/* Theo de Raadt places this file in the public domain. */ |
4 |
|
|
|
5 |
|
|
#include <openssl/bio.h> |
6 |
|
|
|
7 |
|
|
int |
8 |
|
|
BIO_printf(BIO *bio, const char *format, ...) |
9 |
|
|
{ |
10 |
|
270348 |
va_list args; |
11 |
|
|
int ret; |
12 |
|
|
|
13 |
|
135174 |
va_start(args, format); |
14 |
|
135174 |
ret = BIO_vprintf(bio, format, args); |
15 |
|
135174 |
va_end(args); |
16 |
|
135174 |
return (ret); |
17 |
|
135174 |
} |
18 |
|
|
|
19 |
|
|
#ifdef HAVE_FUNOPEN |
20 |
|
|
static int |
21 |
|
|
_BIO_write(void *cookie, const char *buf, int nbytes) |
22 |
|
|
{ |
23 |
|
270348 |
return BIO_write(cookie, buf, nbytes); |
24 |
|
|
} |
25 |
|
|
|
26 |
|
|
int |
27 |
|
|
BIO_vprintf(BIO *bio, const char *format, va_list args) |
28 |
|
|
{ |
29 |
|
|
int ret; |
30 |
|
|
FILE *fp; |
31 |
|
|
|
32 |
|
270348 |
fp = funopen(bio, NULL, &_BIO_write, NULL, NULL); |
33 |
✗✓ |
135174 |
if (fp == NULL) { |
34 |
|
|
ret = -1; |
35 |
|
|
goto fail; |
36 |
|
|
} |
37 |
|
135174 |
ret = vfprintf(fp, format, args); |
38 |
|
135174 |
fclose(fp); |
39 |
|
|
fail: |
40 |
|
135174 |
return (ret); |
41 |
|
|
} |
42 |
|
|
|
43 |
|
|
#else /* !HAVE_FUNOPEN */ |
44 |
|
|
|
45 |
|
|
int |
46 |
|
|
BIO_vprintf(BIO *bio, const char *format, va_list args) |
47 |
|
|
{ |
48 |
|
|
int ret; |
49 |
|
|
char *buf = NULL; |
50 |
|
|
|
51 |
|
|
ret = vasprintf(&buf, format, args); |
52 |
|
|
if (buf == NULL) { |
53 |
|
|
ret = -1; |
54 |
|
|
goto fail; |
55 |
|
|
} |
56 |
|
|
BIO_write(bio, buf, ret); |
57 |
|
|
free(buf); |
58 |
|
|
fail: |
59 |
|
|
return (ret); |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
#endif /* HAVE_FUNOPEN */ |
63 |
|
|
|
64 |
|
|
/* |
65 |
|
|
* BIO_snprintf and BIO_vsnprintf return -1 for overflow, |
66 |
|
|
* due to the history of this API. Justification: |
67 |
|
|
* |
68 |
|
|
* Traditional snprintf surfaced in 4.4BSD, and returned |
69 |
|
|
* "number of bytes wanted". Solaris and Windows opted to |
70 |
|
|
* return -1. A draft standard was written which returned -1. |
71 |
|
|
* Due to the large volume of code already using the first |
72 |
|
|
* semantics, the draft was repaired before standardization to |
73 |
|
|
* specify "number of bytes wanted" plus "-1 for character conversion |
74 |
|
|
* style errors". Solaris adapted to this rule, but Windows stuck |
75 |
|
|
* with -1. |
76 |
|
|
* |
77 |
|
|
* Original OpenSSL comment which is full of lies: |
78 |
|
|
* |
79 |
|
|
* "In case of truncation, return -1 like traditional snprintf. |
80 |
|
|
* (Current drafts for ISO/IEC 9899 say snprintf should return |
81 |
|
|
* the number of characters that would have been written, |
82 |
|
|
* had the buffer been large enough.)" |
83 |
|
|
*/ |
84 |
|
|
int |
85 |
|
|
BIO_snprintf(char *buf, size_t n, const char *format, ...) |
86 |
|
|
{ |
87 |
|
|
va_list args; |
88 |
|
|
int ret; |
89 |
|
|
|
90 |
|
|
va_start(args, format); |
91 |
|
|
ret = vsnprintf(buf, n, format, args); |
92 |
|
|
va_end(args); |
93 |
|
|
|
94 |
|
|
if (ret >= n || ret == -1) |
95 |
|
|
return (-1); |
96 |
|
|
return (ret); |
97 |
|
|
} |
98 |
|
|
|
99 |
|
|
int |
100 |
|
|
BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) |
101 |
|
|
{ |
102 |
|
|
int ret; |
103 |
|
|
|
104 |
|
|
ret = vsnprintf(buf, n, format, args); |
105 |
|
|
|
106 |
|
|
if (ret >= n || ret == -1) |
107 |
|
|
return (-1); |
108 |
|
|
return (ret); |
109 |
|
|
} |