summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2005-09-08 14:05:40 +0000
committerjorton <jorton@13f79535-47bb-0310-9956-ffa450edef68>2005-09-08 14:05:40 +0000
commit4436e059298689555e30adb62ffb285f848f9ba9 (patch)
treeb25519fe8d103416ad54e443936f4e47001ebe2f /strings
parent9554d2fb10fb85ee798de71d5c3172116a3b7e01 (diff)
downloadlibapr-4436e059298689555e30adb62ffb285f848f9ba9.tar.gz
Fix handling of %pI with psprintf; the psprintf implementation assumes
that the vformatter code will not palloc. * include/apr_network_io.h (apr_sockaddr_ip_getbuf): Declare new function. * network_io/unix/sockaddr.c (apr_sockaddr_ip_getbuf): Rewrite of apr_sockaddr_ip_get, taking a buffer argument. (apr_sockaddr_ip_get): Reimplement using apr_sockaddr_ip_getbuf. * strings/apr_snprintf.c (conv_apr_sockaddr): Use apr_sockaddr_ip_getbuf to avoid use of pool. * test/testsock.c (test_print_addr): New test case. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@279566 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'strings')
-rw-r--r--strings/apr_snprintf.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/strings/apr_snprintf.c b/strings/apr_snprintf.c
index bfd941e35..a98799a3a 100644
--- a/strings/apr_snprintf.c
+++ b/strings/apr_snprintf.c
@@ -464,7 +464,8 @@ static char *conv_in_addr(struct in_addr *ia, char *buf_end, apr_size_t *len)
}
-
+/* Must be passed a buffer of size NUM_BUF_SIZE where buf_end points
+ * to 1 byte past the end of the buffer. */
static char *conv_apr_sockaddr(apr_sockaddr_t *sa, char *buf_end, apr_size_t *len)
{
char *p = buf_end;
@@ -474,7 +475,14 @@ static char *conv_apr_sockaddr(apr_sockaddr_t *sa, char *buf_end, apr_size_t *le
p = conv_10(sa->port, TRUE, &is_negative, p, &sub_len);
*--p = ':';
- apr_sockaddr_ip_get(&ipaddr_str, sa);
+ ipaddr_str = buf_end - NUM_BUF_SIZE;
+ if (apr_sockaddr_ip_getbuf(ipaddr_str, sa->addr_str_len, sa)) {
+ /* Should only fail if the buffer is too small, which it
+ * should not be; but fail safe anyway: */
+ *--p = '?';
+ *len = buf_end - p;
+ return p;
+ }
sub_len = strlen(ipaddr_str);
#if APR_HAVE_IPV6
if (sa->family == APR_INET6 &&