Commit 0aa7a205c899c516d906673efbe9457f7af0dd3c
Committed by
Mark McLoughlin
1 parent
cda94b27
net: Real fix for check_params users
OK, last try: 8e4416af broke -net socket, ffad4116 tried to fix it but broke error reporting of invalid parameters. So this patch widely reverts ffad4116 again and intead fixes those callers of check_params that originally suffered from overwritten buffers by using separate ones. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Showing
3 changed files
with
28 additions
and
37 deletions
net.c
| ... | ... | @@ -1911,7 +1911,7 @@ int net_client_init(const char *device, const char *p) |
| 1911 | 1911 | uint8_t *macaddr; |
| 1912 | 1912 | int idx = nic_get_free_idx(); |
| 1913 | 1913 | |
| 1914 | - if (check_params(nic_params, p) < 0) { | |
| 1914 | + if (check_params(buf, sizeof(buf), nic_params, p) < 0) { | |
| 1915 | 1915 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 1916 | 1916 | buf, p); |
| 1917 | 1917 | return -1; |
| ... | ... | @@ -1962,7 +1962,7 @@ int net_client_init(const char *device, const char *p) |
| 1962 | 1962 | static const char * const slirp_params[] = { |
| 1963 | 1963 | "vlan", "name", "hostname", "restrict", "ip", NULL |
| 1964 | 1964 | }; |
| 1965 | - if (check_params(slirp_params, p) < 0) { | |
| 1965 | + if (check_params(buf, sizeof(buf), slirp_params, p) < 0) { | |
| 1966 | 1966 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 1967 | 1967 | buf, p); |
| 1968 | 1968 | return -1; |
| ... | ... | @@ -2013,7 +2013,7 @@ int net_client_init(const char *device, const char *p) |
| 2013 | 2013 | }; |
| 2014 | 2014 | char ifname[64]; |
| 2015 | 2015 | |
| 2016 | - if (check_params(tap_params, p) < 0) { | |
| 2016 | + if (check_params(buf, sizeof(buf), tap_params, p) < 0) { | |
| 2017 | 2017 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2018 | 2018 | buf, p); |
| 2019 | 2019 | return -1; |
| ... | ... | @@ -2029,12 +2029,12 @@ int net_client_init(const char *device, const char *p) |
| 2029 | 2029 | #elif defined (_AIX) |
| 2030 | 2030 | #else |
| 2031 | 2031 | if (!strcmp(device, "tap")) { |
| 2032 | - char ifname[64]; | |
| 2032 | + char ifname[64], chkbuf[64]; | |
| 2033 | 2033 | char setup_script[1024], down_script[1024]; |
| 2034 | 2034 | int fd; |
| 2035 | 2035 | vlan->nb_host_devs++; |
| 2036 | 2036 | if (get_param_value(buf, sizeof(buf), "fd", p) > 0) { |
| 2037 | - if (check_params(fd_params, p) < 0) { | |
| 2037 | + if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) { | |
| 2038 | 2038 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2039 | 2039 | buf, p); |
| 2040 | 2040 | return -1; |
| ... | ... | @@ -2047,7 +2047,7 @@ int net_client_init(const char *device, const char *p) |
| 2047 | 2047 | static const char * const tap_params[] = { |
| 2048 | 2048 | "vlan", "name", "ifname", "script", "downscript", NULL |
| 2049 | 2049 | }; |
| 2050 | - if (check_params(tap_params, p) < 0) { | |
| 2050 | + if (check_params(chkbuf, sizeof(chkbuf), tap_params, p) < 0) { | |
| 2051 | 2051 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2052 | 2052 | buf, p); |
| 2053 | 2053 | return -1; |
| ... | ... | @@ -2066,9 +2066,10 @@ int net_client_init(const char *device, const char *p) |
| 2066 | 2066 | } else |
| 2067 | 2067 | #endif |
| 2068 | 2068 | if (!strcmp(device, "socket")) { |
| 2069 | + char chkbuf[64]; | |
| 2069 | 2070 | if (get_param_value(buf, sizeof(buf), "fd", p) > 0) { |
| 2070 | 2071 | int fd; |
| 2071 | - if (check_params(fd_params, p) < 0) { | |
| 2072 | + if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) { | |
| 2072 | 2073 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2073 | 2074 | buf, p); |
| 2074 | 2075 | return -1; |
| ... | ... | @@ -2081,7 +2082,7 @@ int net_client_init(const char *device, const char *p) |
| 2081 | 2082 | static const char * const listen_params[] = { |
| 2082 | 2083 | "vlan", "name", "listen", NULL |
| 2083 | 2084 | }; |
| 2084 | - if (check_params(listen_params, p) < 0) { | |
| 2085 | + if (check_params(chkbuf, sizeof(chkbuf), listen_params, p) < 0) { | |
| 2085 | 2086 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2086 | 2087 | buf, p); |
| 2087 | 2088 | return -1; |
| ... | ... | @@ -2091,7 +2092,7 @@ int net_client_init(const char *device, const char *p) |
| 2091 | 2092 | static const char * const connect_params[] = { |
| 2092 | 2093 | "vlan", "name", "connect", NULL |
| 2093 | 2094 | }; |
| 2094 | - if (check_params(connect_params, p) < 0) { | |
| 2095 | + if (check_params(chkbuf, sizeof(chkbuf), connect_params, p) < 0) { | |
| 2095 | 2096 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2096 | 2097 | buf, p); |
| 2097 | 2098 | return -1; |
| ... | ... | @@ -2101,7 +2102,7 @@ int net_client_init(const char *device, const char *p) |
| 2101 | 2102 | static const char * const mcast_params[] = { |
| 2102 | 2103 | "vlan", "name", "mcast", NULL |
| 2103 | 2104 | }; |
| 2104 | - if (check_params(mcast_params, p) < 0) { | |
| 2105 | + if (check_params(chkbuf, sizeof(chkbuf), mcast_params, p) < 0) { | |
| 2105 | 2106 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2106 | 2107 | buf, p); |
| 2107 | 2108 | return -1; |
| ... | ... | @@ -2122,7 +2123,7 @@ int net_client_init(const char *device, const char *p) |
| 2122 | 2123 | char vde_sock[1024], vde_group[512]; |
| 2123 | 2124 | int vde_port, vde_mode; |
| 2124 | 2125 | |
| 2125 | - if (check_params(vde_params, p) < 0) { | |
| 2126 | + if (check_params(buf, sizeof(buf), vde_params, p) < 0) { | |
| 2126 | 2127 | fprintf(stderr, "qemu: invalid parameter '%s' in '%s'\n", |
| 2127 | 2128 | buf, p); |
| 2128 | 2129 | return -1; | ... | ... |
sysemu.h
| ... | ... | @@ -270,7 +270,8 @@ void usb_info(Monitor *mon); |
| 270 | 270 | |
| 271 | 271 | int get_param_value(char *buf, int buf_size, |
| 272 | 272 | const char *tag, const char *str); |
| 273 | -int check_params(const char * const *params, const char *str); | |
| 273 | +int check_params(char *buf, int buf_size, | |
| 274 | + const char * const *params, const char *str); | |
| 274 | 275 | |
| 275 | 276 | void register_devices(void); |
| 276 | 277 | ... | ... |
vl.c
| ... | ... | @@ -1836,45 +1836,34 @@ int get_param_value(char *buf, int buf_size, |
| 1836 | 1836 | return 0; |
| 1837 | 1837 | } |
| 1838 | 1838 | |
| 1839 | -int check_params(const char * const *params, const char *str) | |
| 1839 | +int check_params(char *buf, int buf_size, | |
| 1840 | + const char * const *params, const char *str) | |
| 1840 | 1841 | { |
| 1841 | - int name_buf_size = 1; | |
| 1842 | 1842 | const char *p; |
| 1843 | - char *name_buf; | |
| 1844 | - int i, len; | |
| 1845 | - int ret = 0; | |
| 1846 | - | |
| 1847 | - for (i = 0; params[i] != NULL; i++) { | |
| 1848 | - len = strlen(params[i]) + 1; | |
| 1849 | - if (len > name_buf_size) { | |
| 1850 | - name_buf_size = len; | |
| 1851 | - } | |
| 1852 | - } | |
| 1853 | - name_buf = qemu_malloc(name_buf_size); | |
| 1843 | + int i; | |
| 1854 | 1844 | |
| 1855 | 1845 | p = str; |
| 1856 | 1846 | while (*p != '\0') { |
| 1857 | - p = get_opt_name(name_buf, name_buf_size, p, '='); | |
| 1847 | + p = get_opt_name(buf, buf_size, p, '='); | |
| 1858 | 1848 | if (*p != '=') { |
| 1859 | - ret = -1; | |
| 1860 | - break; | |
| 1849 | + return -1; | |
| 1861 | 1850 | } |
| 1862 | 1851 | p++; |
| 1863 | - for(i = 0; params[i] != NULL; i++) | |
| 1864 | - if (!strcmp(params[i], name_buf)) | |
| 1852 | + for (i = 0; params[i] != NULL; i++) { | |
| 1853 | + if (!strcmp(params[i], buf)) { | |
| 1865 | 1854 | break; |
| 1855 | + } | |
| 1856 | + } | |
| 1866 | 1857 | if (params[i] == NULL) { |
| 1867 | - ret = -1; | |
| 1868 | - break; | |
| 1858 | + return -1; | |
| 1869 | 1859 | } |
| 1870 | 1860 | p = get_opt_value(NULL, 0, p); |
| 1871 | - if (*p != ',') | |
| 1861 | + if (*p != ',') { | |
| 1872 | 1862 | break; |
| 1863 | + } | |
| 1873 | 1864 | p++; |
| 1874 | 1865 | } |
| 1875 | - | |
| 1876 | - qemu_free(name_buf); | |
| 1877 | - return ret; | |
| 1866 | + return 0; | |
| 1878 | 1867 | } |
| 1879 | 1868 | |
| 1880 | 1869 | /***********************************************************/ |
| ... | ... | @@ -2227,7 +2216,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) |
| 2227 | 2216 | "cache", "format", "serial", "werror", |
| 2228 | 2217 | NULL }; |
| 2229 | 2218 | |
| 2230 | - if (check_params(params, str) < 0) { | |
| 2219 | + if (check_params(buf, sizeof(buf), params, str) < 0) { | |
| 2231 | 2220 | fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", |
| 2232 | 2221 | buf, str); |
| 2233 | 2222 | return -1; | ... | ... |