check in v3.8.1 source
This commit is contained in:
111
crypto/bio/b_print.c
Normal file
111
crypto/bio/b_print.c
Normal file
@@ -0,0 +1,111 @@
|
||||
/* $OpenBSD: b_print.c,v 1.27 2023/07/05 21:23:37 beck Exp $ */
|
||||
|
||||
/* Theo de Raadt places this file in the public domain. */
|
||||
|
||||
#include <openssl/bio.h>
|
||||
|
||||
int
|
||||
BIO_printf(BIO *bio, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
int ret;
|
||||
|
||||
va_start(args, format);
|
||||
ret = BIO_vprintf(bio, format, args);
|
||||
va_end(args);
|
||||
return (ret);
|
||||
}
|
||||
LCRYPTO_ALIAS(BIO_printf);
|
||||
|
||||
#ifdef HAVE_FUNOPEN
|
||||
static int
|
||||
_BIO_write(void *cookie, const char *buf, int nbytes)
|
||||
{
|
||||
return BIO_write(cookie, buf, nbytes);
|
||||
}
|
||||
|
||||
int
|
||||
BIO_vprintf(BIO *bio, const char *format, va_list args)
|
||||
{
|
||||
int ret;
|
||||
FILE *fp;
|
||||
|
||||
fp = funopen(bio, NULL, &_BIO_write, NULL, NULL);
|
||||
if (fp == NULL) {
|
||||
ret = -1;
|
||||
goto fail;
|
||||
}
|
||||
ret = vfprintf(fp, format, args);
|
||||
fclose(fp);
|
||||
fail:
|
||||
return (ret);
|
||||
}
|
||||
LCRYPTO_ALIAS(BIO_vprintf);
|
||||
|
||||
#else /* !HAVE_FUNOPEN */
|
||||
|
||||
int
|
||||
BIO_vprintf(BIO *bio, const char *format, va_list args)
|
||||
{
|
||||
int ret;
|
||||
char *buf = NULL;
|
||||
|
||||
ret = vasprintf(&buf, format, args);
|
||||
if (ret == -1)
|
||||
return (ret);
|
||||
BIO_write(bio, buf, ret);
|
||||
free(buf);
|
||||
return (ret);
|
||||
}
|
||||
LCRYPTO_ALIAS(BIO_vprintf);
|
||||
|
||||
#endif /* HAVE_FUNOPEN */
|
||||
|
||||
/*
|
||||
* BIO_snprintf and BIO_vsnprintf return -1 for overflow,
|
||||
* due to the history of this API. Justification:
|
||||
*
|
||||
* Traditional snprintf surfaced in 4.4BSD, and returned
|
||||
* "number of bytes wanted". Solaris and Windows opted to
|
||||
* return -1. A draft standard was written which returned -1.
|
||||
* Due to the large volume of code already using the first
|
||||
* semantics, the draft was repaired before standardization to
|
||||
* specify "number of bytes wanted" plus "-1 for character conversion
|
||||
* style errors". Solaris adapted to this rule, but Windows stuck
|
||||
* with -1.
|
||||
*
|
||||
* Original OpenSSL comment which is full of lies:
|
||||
*
|
||||
* "In case of truncation, return -1 like traditional snprintf.
|
||||
* (Current drafts for ISO/IEC 9899 say snprintf should return
|
||||
* the number of characters that would have been written,
|
||||
* had the buffer been large enough.)"
|
||||
*/
|
||||
int
|
||||
BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
int ret;
|
||||
|
||||
va_start(args, format);
|
||||
ret = vsnprintf(buf, n, format, args);
|
||||
va_end(args);
|
||||
|
||||
if (ret >= n || ret == -1)
|
||||
return (-1);
|
||||
return (ret);
|
||||
}
|
||||
LCRYPTO_ALIAS(BIO_snprintf);
|
||||
|
||||
int
|
||||
BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = vsnprintf(buf, n, format, args);
|
||||
|
||||
if (ret >= n || ret == -1)
|
||||
return (-1);
|
||||
return (ret);
|
||||
}
|
||||
LCRYPTO_ALIAS(BIO_vsnprintf);
|
Reference in New Issue
Block a user