Commit 8e4416af458b5fdfc81950005e358de02511eb9f

Authored by aliguori
1 parent ea053add

net: Add parameter checks for VLAN clients (Jan Kiszka)

This aims at helping the user to find typos or other mistakes in
parameter lists passed for VLAN client initialization. The existing
parsing infrastructure does not allow a leaner approach, but this is
better than nothing IMHO.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7197 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 83 additions and 0 deletions
@@ -1622,6 +1622,9 @@ void qemu_check_nic_model_list(NICInfo *nd, const char * const *models, @@ -1622,6 +1622,9 @@ void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
1622 1622
1623 int net_client_init(const char *device, const char *p) 1623 int net_client_init(const char *device, const char *p)
1624 { 1624 {
  1625 + static const char * const fd_params[] = {
  1626 + "vlan", "name", "fd", NULL
  1627 + };
1625 char buf[1024]; 1628 char buf[1024];
1626 int vlan_id, ret; 1629 int vlan_id, ret;
1627 VLANState *vlan; 1630 VLANState *vlan;
@@ -1637,10 +1640,18 @@ int net_client_init(const char *device, const char *p) @@ -1637,10 +1640,18 @@ int net_client_init(const char *device, const char *p)
1637 name = strdup(buf); 1640 name = strdup(buf);
1638 } 1641 }
1639 if (!strcmp(device, "nic")) { 1642 if (!strcmp(device, "nic")) {
  1643 + static const char * const nic_params[] = {
  1644 + "vlan", "name", "macaddr", "model", NULL
  1645 + };
1640 NICInfo *nd; 1646 NICInfo *nd;
1641 uint8_t *macaddr; 1647 uint8_t *macaddr;
1642 int idx = nic_get_free_idx(); 1648 int idx = nic_get_free_idx();
1643 1649
  1650 + if (check_params(buf, sizeof(buf), nic_params, p) < 0) {
  1651 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1652 + buf, p);
  1653 + return -1;
  1654 + }
1644 if (idx == -1 || nb_nics >= MAX_NICS) { 1655 if (idx == -1 || nb_nics >= MAX_NICS) {
1645 fprintf(stderr, "Too Many NICs\n"); 1656 fprintf(stderr, "Too Many NICs\n");
1646 ret = -1; 1657 ret = -1;
@@ -1674,12 +1685,24 @@ int net_client_init(const char *device, const char *p) @@ -1674,12 +1685,24 @@ int net_client_init(const char *device, const char *p)
1674 ret = idx; 1685 ret = idx;
1675 } else 1686 } else
1676 if (!strcmp(device, "none")) { 1687 if (!strcmp(device, "none")) {
  1688 + if (*p != '\0') {
  1689 + fprintf(stderr, "qemu: 'none' takes no parameters\n");
  1690 + return -1;
  1691 + }
1677 /* does nothing. It is needed to signal that no network cards 1692 /* does nothing. It is needed to signal that no network cards
1678 are wanted */ 1693 are wanted */
1679 ret = 0; 1694 ret = 0;
1680 } else 1695 } else
1681 #ifdef CONFIG_SLIRP 1696 #ifdef CONFIG_SLIRP
1682 if (!strcmp(device, "user")) { 1697 if (!strcmp(device, "user")) {
  1698 + static const char * const slirp_params[] = {
  1699 + "vlan", "name", "hostname", "restrict", "ip", NULL
  1700 + };
  1701 + if (check_params(buf, sizeof(buf), slirp_params, p) < 0) {
  1702 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1703 + buf, p);
  1704 + return -1;
  1705 + }
1683 if (get_param_value(buf, sizeof(buf), "hostname", p)) { 1706 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
1684 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf); 1707 pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
1685 } 1708 }
@@ -1721,7 +1744,16 @@ int net_client_init(const char *device, const char *p) @@ -1721,7 +1744,16 @@ int net_client_init(const char *device, const char *p)
1721 #endif 1744 #endif
1722 #ifdef _WIN32 1745 #ifdef _WIN32
1723 if (!strcmp(device, "tap")) { 1746 if (!strcmp(device, "tap")) {
  1747 + static const char * const tap_params[] = {
  1748 + "vlan", "name", "ifname", NULL
  1749 + };
1724 char ifname[64]; 1750 char ifname[64];
  1751 +
  1752 + if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
  1753 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1754 + buf, p);
  1755 + return -1;
  1756 + }
1725 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) { 1757 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1726 fprintf(stderr, "tap: no interface name\n"); 1758 fprintf(stderr, "tap: no interface name\n");
1727 ret = -1; 1759 ret = -1;
@@ -1738,11 +1770,24 @@ int net_client_init(const char *device, const char *p) @@ -1738,11 +1770,24 @@ int net_client_init(const char *device, const char *p)
1738 int fd; 1770 int fd;
1739 vlan->nb_host_devs++; 1771 vlan->nb_host_devs++;
1740 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) { 1772 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
  1773 + if (check_params(buf, sizeof(buf), fd_params, p) < 0) {
  1774 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1775 + buf, p);
  1776 + return -1;
  1777 + }
1741 fd = strtol(buf, NULL, 0); 1778 fd = strtol(buf, NULL, 0);
1742 fcntl(fd, F_SETFL, O_NONBLOCK); 1779 fcntl(fd, F_SETFL, O_NONBLOCK);
1743 net_tap_fd_init(vlan, device, name, fd); 1780 net_tap_fd_init(vlan, device, name, fd);
1744 ret = 0; 1781 ret = 0;
1745 } else { 1782 } else {
  1783 + static const char * const tap_params[] = {
  1784 + "vlan", "name", "ifname", "script", "downscript", NULL
  1785 + };
  1786 + if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
  1787 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1788 + buf, p);
  1789 + return -1;
  1790 + }
1746 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) { 1791 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1747 ifname[0] = '\0'; 1792 ifname[0] = '\0';
1748 } 1793 }
@@ -1759,15 +1804,44 @@ int net_client_init(const char *device, const char *p) @@ -1759,15 +1804,44 @@ int net_client_init(const char *device, const char *p)
1759 if (!strcmp(device, "socket")) { 1804 if (!strcmp(device, "socket")) {
1760 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) { 1805 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
1761 int fd; 1806 int fd;
  1807 + if (check_params(buf, sizeof(buf), fd_params, p) < 0) {
  1808 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1809 + buf, p);
  1810 + return -1;
  1811 + }
1762 fd = strtol(buf, NULL, 0); 1812 fd = strtol(buf, NULL, 0);
1763 ret = -1; 1813 ret = -1;
1764 if (net_socket_fd_init(vlan, device, name, fd, 1)) 1814 if (net_socket_fd_init(vlan, device, name, fd, 1))
1765 ret = 0; 1815 ret = 0;
1766 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) { 1816 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
  1817 + static const char * const listen_params[] = {
  1818 + "vlan", "name", "listen", NULL
  1819 + };
  1820 + if (check_params(buf, sizeof(buf), listen_params, p) < 0) {
  1821 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1822 + buf, p);
  1823 + return -1;
  1824 + }
1767 ret = net_socket_listen_init(vlan, device, name, buf); 1825 ret = net_socket_listen_init(vlan, device, name, buf);
1768 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) { 1826 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
  1827 + static const char * const connect_params[] = {
  1828 + "vlan", "name", "connect", NULL
  1829 + };
  1830 + if (check_params(buf, sizeof(buf), connect_params, p) < 0) {
  1831 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1832 + buf, p);
  1833 + return -1;
  1834 + }
1769 ret = net_socket_connect_init(vlan, device, name, buf); 1835 ret = net_socket_connect_init(vlan, device, name, buf);
1770 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) { 1836 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
  1837 + static const char * const mcast_params[] = {
  1838 + "vlan", "name", "mcast", NULL
  1839 + };
  1840 + if (check_params(buf, sizeof(buf), mcast_params, p) < 0) {
  1841 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1842 + buf, p);
  1843 + return -1;
  1844 + }
1771 ret = net_socket_mcast_init(vlan, device, name, buf); 1845 ret = net_socket_mcast_init(vlan, device, name, buf);
1772 } else { 1846 } else {
1773 fprintf(stderr, "Unknown socket options: %s\n", p); 1847 fprintf(stderr, "Unknown socket options: %s\n", p);
@@ -1778,8 +1852,17 @@ int net_client_init(const char *device, const char *p) @@ -1778,8 +1852,17 @@ int net_client_init(const char *device, const char *p)
1778 } else 1852 } else
1779 #ifdef CONFIG_VDE 1853 #ifdef CONFIG_VDE
1780 if (!strcmp(device, "vde")) { 1854 if (!strcmp(device, "vde")) {
  1855 + static const char * const vde_params[] = {
  1856 + "vlan", "name", "sock", "port", "group", "mode", NULL
  1857 + };
1781 char vde_sock[1024], vde_group[512]; 1858 char vde_sock[1024], vde_group[512];
1782 int vde_port, vde_mode; 1859 int vde_port, vde_mode;
  1860 +
  1861 + if (check_params(buf, sizeof(buf), vde_params, p) < 0) {
  1862 + fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n",
  1863 + buf, p);
  1864 + return -1;
  1865 + }
1783 vlan->nb_host_devs++; 1866 vlan->nb_host_devs++;
1784 if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) { 1867 if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
1785 vde_sock[0] = '\0'; 1868 vde_sock[0] = '\0';