diff mbox

net: disallow to specify multicast MAC address

Message ID CAJN_NGZ_CosR42CkUiPMd56DW2x1P6gCUAroyib62Howy1OuFA@mail.gmail.com
State New
Headers show

Commit Message

Dmitry Krivenok Oct. 17, 2013, 3:06 p.m. UTC
Added explicit check of MAC address specified via macaddr option.
Multicast MAC addresses are no longer allowed.
This fixes bug #495566.

Signed-off-by: Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
---
 net/net.c  | 5 +++++
 net/util.c | 5 +++++
 net/util.h | 2 ++
 3 files changed, 12 insertions(+)

Comments

Eric Blake Oct. 17, 2013, 3:19 p.m. UTC | #1
On 10/17/2013 09:06 AM, Dmitry Krivenok wrote:
> Added explicit check of MAC address specified via macaddr option.
> Multicast MAC addresses are no longer allowed.
> This fixes bug #495566.
> 
> Signed-off-by: Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
> ---

>  }
> +
> +bool net_macaddr_is_multicast(uint8_t *macaddr)
> +{
> +    return (macaddr[0] % 2) ? true : false;

Personally, I find 'expr ? true : false' rather verbose; why not just:

return macaddr[0] % 2;

But as you're not the first person to do this (a quick grep found two
other offenders in the code base), it's not a strong reason for a respin.
Dmitry Krivenok Oct. 17, 2013, 6:44 p.m. UTC | #2
> Personally, I find 'expr ? true : false' rather verbose; why not just:
>
> return macaddr[0] % 2;

I agree, your variant is shorter and easier to read.
Stefan Hajnoczi Oct. 18, 2013, 11:25 a.m. UTC | #3
On Thu, Oct 17, 2013 at 07:06:28PM +0400, Dmitry Krivenok wrote:
> Added explicit check of MAC address specified via macaddr option.
> Multicast MAC addresses are no longer allowed.
> This fixes bug #495566.
> 
> Signed-off-by: Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
> ---
>  net/net.c  | 5 +++++
>  net/util.c | 5 +++++
>  net/util.h | 2 ++
>  3 files changed, 12 insertions(+)

I dropped the ? true : false when merging the patch.

Thanks, applied to my net tree:
https://github.com/stefanha/qemu/commits/net

Stefan
Stefan Hajnoczi Oct. 18, 2013, 4:40 p.m. UTC | #4
On Thu, Oct 17, 2013 at 07:06:28PM +0400, Dmitry Krivenok wrote:
> +bool net_macaddr_is_multicast(uint8_t *macaddr)
> +{
> +    return (macaddr[0] % 2) ? true : false;
> +}

Please use is_multicast_ether_addr() instead.  Thanks Amos for pointing
out this function is duplicated.

I have dropped this patch and will merge the next revision instead.
diff mbox

Patch

diff --git a/net/net.c b/net/net.c
index c330c9a..b3a42e5 100644
--- a/net/net.c
+++ b/net/net.c
@@ -689,6 +689,11 @@  static int net_init_nic(const NetClientOptions
*opts, const char *name,
         error_report("invalid syntax for ethernet address");
         return -1;
     }
+    if (nic->has_macaddr &&
+        net_macaddr_is_multicast(nd->macaddr.a)) {
+        error_report("NIC cannot have multicast MAC address (odd 1st byte)");
+        return -1;
+    }
     qemu_macaddr_default_if_unset(&nd->macaddr);

     if (nic->has_vectors) {
diff --git a/net/util.c b/net/util.c
index 7e95076..b86ac03 100644
--- a/net/util.c
+++ b/net/util.c
@@ -58,3 +58,8 @@  int net_parse_macaddr(uint8_t *macaddr, const char *p)

     return 0;
 }
+
+bool net_macaddr_is_multicast(uint8_t *macaddr)
+{
+    return (macaddr[0] % 2) ? true : false;
+}
diff --git a/net/util.h b/net/util.h
index 10c7da9..4581cb7 100644
--- a/net/util.h
+++ b/net/util.h
@@ -26,7 +26,9 @@ 
 #define QEMU_NET_UTIL_H

 #include <stdint.h>
+#include <stdbool.h>

 int net_parse_macaddr(uint8_t *macaddr, const char *p);
+bool net_macaddr_is_multicast(uint8_t *macaddr);

 #endif /* QEMU_NET_UTIL_H */