diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c index 891e922171..62d12f4986 100644 --- a/src/core/or/connection_edge.c +++ b/src/core/or/connection_edge.c @@ -623,8 +623,10 @@ export_hs_client_circuit_id_haproxy(const edge_connection_t *edge_conn, } /* Build the string */ - tor_asprintf(&buf, "PROXY TCP6 %s:%x %s %d %d\r\n", - src_ipv6_prefix, gid, dst_ipv6, src_port, dst_port); + tor_asprintf(&buf, "PROXY TCP6 %s:%x:%x %s %d %d\r\n", + src_ipv6_prefix, + gid >> 16, gid & 0x0000ffff, + dst_ipv6, src_port, dst_port); connection_buf_add(buf, strlen(buf), conn); diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 0a1c866d6b..2b8d6e597a 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -2061,6 +2061,32 @@ test_export_client_circuit_id(void *arg) export_hs_client_circuit_id_haproxy(edge_conn, conn); cp2 = buf_get_contents(conn->outbuf, &sz); tt_str_op(cp1, OP_NE, cp2); + tor_free(cp1); + + /* Check that GID with UINT32_MAX works. */ + or_circ->global_identifier = UINT32_MAX; + + export_hs_client_circuit_id_haproxy(edge_conn, conn); + cp1 = buf_get_contents(conn->outbuf, &sz); + tt_str_op(cp1, OP_EQ, + "PROXY TCP6 fc00:dead:beef:4dad::ffff:ffff ::1 65535 42\r\n"); + tor_free(cp1); + + /* Check that GID with UINT16_MAX works. */ + or_circ->global_identifier = UINT16_MAX; + + export_hs_client_circuit_id_haproxy(edge_conn, conn); + cp1 = buf_get_contents(conn->outbuf, &sz); + tt_str_op(cp1, OP_EQ, + "PROXY TCP6 fc00:dead:beef:4dad::0:ffff ::1 65535 42\r\n"); + tor_free(cp1); + + /* Check that GID with UINT16_MAX + 7 works. */ + or_circ->global_identifier = UINT16_MAX + 7; + + export_hs_client_circuit_id_haproxy(edge_conn, conn); + cp1 = buf_get_contents(conn->outbuf, &sz); + tt_str_op(cp1, OP_EQ, "PROXY TCP6 fc00:dead:beef:4dad::1:6 ::1 6 42\r\n"); done: UNMOCK(connection_write_to_buf_impl_);