diff options
author | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-09-08 14:05:40 +0000 |
---|---|---|
committer | jorton <jorton@13f79535-47bb-0310-9956-ffa450edef68> | 2005-09-08 14:05:40 +0000 |
commit | 4436e059298689555e30adb62ffb285f848f9ba9 (patch) | |
tree | b25519fe8d103416ad54e443936f4e47001ebe2f /strings | |
parent | 9554d2fb10fb85ee798de71d5c3172116a3b7e01 (diff) | |
download | libapr-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.c | 12 |
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 && |