[bug report] sctp: Replace sockaddr with sockaddr_inet in sctp_addr union

Dan Carpenter <[email protected]>
Newsgroups org.kernel.vger.linux-sctp
Message-ID <[email protected]>
Hello Kees Cook,

Commit 511d10b4c2f9 ("sctp: Replace sockaddr with sockaddr_inet in
sctp_addr union") from Jul 22, 2025 (linux-next), leads to the
following Smatch static checker warnings:

net/sctp/socket.c:396 sctp_do_bind() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/socket.c:851 sctp_send_asconf_del_ip() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/protocol.c:642 sctp_addr_wq_timeout_handler() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/protocol.c:761 sctp_addr_wq_mgmt() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/protocol.c:781 sctp_addr_wq_mgmt() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/sm_sideeffect.c:602 sctp_do_8_2_transport_strike() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/associola.c:489 sctp_assoc_rm_peer() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/associola.c:597 sctp_assoc_add_peer() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
net/sctp/associola.c:1291 sctp_assoc_update_retran_path() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/socket.c:76 send4() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/socket.c:143 send6() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/peer.c:204 kref_release() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/timers.c:47 wg_expired_retransmit_handshake() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/timers.c:65 wg_expired_retransmit_handshake() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/timers.c:97 wg_expired_new_handshake() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/timers.c:130 wg_queued_expired_zero_key_material() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/send.c:30 wg_packet_send_handshake_initiation() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/send.c:90 wg_packet_send_handshake_response() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/send.c:116 wg_packet_send_handshake_cookie() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/send.c:234 wg_packet_send_keepalive() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:105 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:129 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:146 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:151 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:168 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:173 wg_receive_handshake_packet() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:359 wg_packet_consume_data_done() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:416 wg_packet_consume_data_done() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:416 wg_packet_consume_data_done() error: '%pIS' expects argument of type struct sockaddr *, argument 6 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:423 wg_packet_consume_data_done() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:429 wg_packet_consume_data_done() error: '%pIS' expects argument of type struct sockaddr *, argument 5 has type 'struct sockaddr_inet*'
drivers/net/wireguard/receive.c:563 wg_packet_receive() error: '%pIS' expects argument of type struct sockaddr *, argument 4 has type 'struct sockaddr_inet*'

net/sctp/socket.c
    850 
--> 851                         pr_debug("%s: keep the last address asoc:%p %pISc at %p\n",
    852                                  __func__, asoc, &asoc->asconf_addr_del_pending->sa,
    853                                  asoc->asconf_addr_del_pending);
    854 

The "asoc->asconf_addr_del_pending" variable is a sctp_addr union defined
like this.

include/net/sctp/structs.h
    51  /* A convenience structure for handling sockaddr structures.
    52   * We should wean ourselves off this.
    53   */
    54  union sctp_addr {
    55          struct sockaddr_inet sa;        /* Large enough for both address families */
    56          struct sockaddr_in v4;
    57          struct sockaddr_in6 v6;
    58  };

Before it was sockaddr but the patch changed it to sockaddr_inet. I think
the 'c' in "%pISc" means it should actually be the sockaddr_in6...  It's
a union so this is all fine...  Should I just silence the warning for
sockaddr_inet?  The code to print it is in lib/vsprintf.c.

lib/vsprintf.c
  1622  static noinline_for_stack
  1623  char *ip_addr_string(char *buf, char *end, const void *ptr,
  1624                       struct printf_spec spec, const char *fmt)
  1625  {
  1626          char *err_fmt_msg;
  1627  
  1628          if (check_pointer(&buf, end, ptr, spec))
  1629                  return buf;
  1630  
  1631          switch (fmt[1]) {
  1632          case '6':
  1633                  return ip6_addr_string(buf, end, ptr, spec, fmt);
  1634          case '4':
  1635                  return ip4_addr_string(buf, end, ptr, spec, fmt);
  1636          case 'S': {
  1637                  const union {
  1638                          struct sockaddr         raw;
  1639                          struct sockaddr_in      v4;
  1640                          struct sockaddr_in6     v6;
  1641                  } *sa = ptr;
  1642  
  1643                  switch (sa->raw.sa_family) {
  1644                  case AF_INET:
  1645                          return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt);
  1646                  case AF_INET6:
  1647                          return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
  1648                  default:
  1649                          return error_string(buf, end, "(einval)", spec);
  1650                  }}
  1651          }
  1652  
  1653          err_fmt_msg = fmt[0] == 'i' ? "(%pi?)" : "(%pI?)";
  1654          return error_string(buf, end, err_fmt_msg, spec);
  1655  }

regards,
dan carpenter
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.