Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d06dbaf6 authored by Sage Weil's avatar Sage Weil
Browse files

ceph: fix printing of ipv6 addrs



The buffer was too small.  Make it bigger, use snprintf(), put brackets
around the ipv6 address to avoid mixing it up with the :port, and use the
ever-so-handy %pI[46] formats.

Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent b0bbb0be
Loading
Loading
Loading
Loading
+6 −18
Original line number Original line Diff line number Diff line
@@ -43,7 +43,8 @@ static void ceph_fault(struct ceph_connection *con);
 * nicely render a sockaddr as a string.
 * nicely render a sockaddr as a string.
 */
 */
#define MAX_ADDR_STR 20
#define MAX_ADDR_STR 20
static char addr_str[MAX_ADDR_STR][40];
#define MAX_ADDR_STR_LEN 60
static char addr_str[MAX_ADDR_STR][MAX_ADDR_STR_LEN];
static DEFINE_SPINLOCK(addr_str_lock);
static DEFINE_SPINLOCK(addr_str_lock);
static int last_addr_str;
static int last_addr_str;


@@ -52,7 +53,6 @@ const char *pr_addr(const struct sockaddr_storage *ss)
	int i;
	int i;
	char *s;
	char *s;
	struct sockaddr_in *in4 = (void *)ss;
	struct sockaddr_in *in4 = (void *)ss;
	unsigned char *quad = (void *)&in4->sin_addr.s_addr;
	struct sockaddr_in6 *in6 = (void *)ss;
	struct sockaddr_in6 *in6 = (void *)ss;


	spin_lock(&addr_str_lock);
	spin_lock(&addr_str_lock);
@@ -64,24 +64,12 @@ const char *pr_addr(const struct sockaddr_storage *ss)


	switch (ss->ss_family) {
	switch (ss->ss_family) {
	case AF_INET:
	case AF_INET:
		sprintf(s, "%u.%u.%u.%u:%u",
		snprintf(s, MAX_ADDR_STR_LEN, "%pI4:%u", &in4->sin_addr,
			(unsigned int)quad[0],
			(unsigned int)quad[1],
			(unsigned int)quad[2],
			(unsigned int)quad[3],
			 (unsigned int)ntohs(in4->sin_port));
			 (unsigned int)ntohs(in4->sin_port));
		break;
		break;


	case AF_INET6:
	case AF_INET6:
		sprintf(s, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%u",
		snprintf(s, MAX_ADDR_STR_LEN, "[%pI6c]:%u", &in6->sin6_addr,
			in6->sin6_addr.s6_addr16[0],
			in6->sin6_addr.s6_addr16[1],
			in6->sin6_addr.s6_addr16[2],
			in6->sin6_addr.s6_addr16[3],
			in6->sin6_addr.s6_addr16[4],
			in6->sin6_addr.s6_addr16[5],
			in6->sin6_addr.s6_addr16[6],
			in6->sin6_addr.s6_addr16[7],
			 (unsigned int)ntohs(in6->sin6_port));
			 (unsigned int)ntohs(in6->sin6_port));
		break;
		break;