On Fri, Nov 03, 2017 at 06:46:57PM +0000, Peter Maydell wrote:
On 8 August 2017 at 21:38, Jens Freimann <jfreim...@redhat.com> wrote:
@@ -333,8 +333,13 @@ static NetSocketState 
*net_socket_fd_init_dgram(NetClientState *peer,
      * by ONLY ONE process: we must "clone" this dgram socket --jjo
      */

-    if (is_connected) {
-        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
+    if (is_connected && mcast != NULL) {

This changes the condition() under which we fill in the struct sockaddr_in saddr
from "if (is_connected)" to "if (is_connected && mcast != NULL)"...

+            if (parse_host_port(&saddr, mcast) < 0) {
+                fprintf(stderr,
+                        "qemu: error: init_dgram: fd=%d failed 
parse_host_port()\n",
+                        fd);
+                goto err;
+            }
             /* must be bound */
             if (saddr.sin_addr.s_addr == 0) {
                 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, "

...but later in the function we do:

   /* mcast: save bound address as dst */
   if (is_connected) {

This should be changed to "if (is_connected && mcast != NULL)" because
it is only necessary to do this if there is a multicast address specified.
       s->dgram_dst = saddr;
       snprintf(nc->info_str, sizeof(nc->info_str),
                "socket: fd=%d (cloned mcast=%s:%d)",
                fd, inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
   } else {
       snprintf(nc->info_str, sizeof(nc->info_str),
                "socket: fd=%d", fd);
   }

and coverity correctly points out that if is_connected is true
but mcast is NULL then we use 'saddr' without having initialized
it properly.

Any suggestions for the correct fix for this?

I think we should initialize saddr to 0 and do the above change. I'll send a
patch.

Thanks!

regards,
Jens

Reply via email to