Skip to content

Commit 0732aa1

Browse files
authored
Merge pull request #31 from endresshauser-lp/hotfix/mdio_shell_buffer_overflow
drivers: mdio: shell: Fix various buffer overflows
2 parents 600099a + 4787d94 commit 0732aa1

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

drivers/mdio/mdio_shell.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,13 @@ static void device_name_get(size_t idx, struct shell_static_entry *entry)
3232

3333
SHELL_DYNAMIC_CMD_CREATE(dsub_device_name, device_name_get);
3434

35-
static int parse_device_arg(const struct shell *sh, char **argv, const struct device **dev)
35+
static int parse_device_arg(const struct shell *sh, size_t argc,
36+
char **argv, const struct device **dev)
3637
{
38+
if (argc < 2) {
39+
shell_error(sh, "not enough arguments");
40+
return -EINVAL;
41+
}
3742
*dev = shell_device_get_binding(argv[1]);
3843
if (!*dev) {
3944
shell_error(sh, "device %s not found", argv[1]);
@@ -55,12 +60,12 @@ static int cmd_mdio_scan(const struct shell *sh, size_t argc, char **argv)
5560
uint16_t reg_addr;
5661
int ret;
5762

58-
ret = parse_device_arg(sh, argv, &dev);
63+
ret = parse_device_arg(sh, argc, argv, &dev);
5964
if (ret < 0) {
6065
return ret;
6166
}
6267

63-
if (argc >= 2) {
68+
if (argc >= 3) {
6469
reg_addr = strtol(argv[2], NULL, 16);
6570
} else {
6671
reg_addr = 0;
@@ -98,11 +103,16 @@ static int cmd_mdio_write(const struct shell *sh, size_t argc, char **argv)
98103
uint16_t port_addr;
99104
int ret;
100105

101-
ret = parse_device_arg(sh, argv, &dev);
106+
ret = parse_device_arg(sh, argc, argv, &dev);
102107
if (ret < 0) {
103108
return ret;
104109
}
105110

111+
if (argc < 5) {
112+
shell_error(sh, "not enough arguments");
113+
return -EINVAL;
114+
}
115+
106116
port_addr = strtol(argv[2], NULL, 16);
107117
reg_addr = strtol(argv[3], NULL, 16);
108118
data = strtol(argv[4], NULL, 16);
@@ -130,11 +140,16 @@ static int cmd_mdio_read(const struct shell *sh, size_t argc, char **argv)
130140
uint16_t port_addr;
131141
int ret;
132142

133-
ret = parse_device_arg(sh, argv, &dev);
143+
ret = parse_device_arg(sh, argc, argv, &dev);
134144
if (ret < 0) {
135145
return ret;
136146
}
137147

148+
if (argc < 4) {
149+
shell_error(sh, "not enough arguments");
150+
return -EINVAL;
151+
}
152+
138153
port_addr = strtol(argv[2], NULL, 16);
139154
reg_addr = strtol(argv[3], NULL, 16);
140155

@@ -164,11 +179,16 @@ static int cmd_mdio_write_45(const struct shell *sh, size_t argc, char **argv)
164179
uint8_t port_addr;
165180
int ret;
166181

167-
ret = parse_device_arg(sh, argv, &dev);
182+
ret = parse_device_arg(sh, argc, argv, &dev);
168183
if (ret < 0) {
169184
return ret;
170185
}
171186

187+
if (argc < 6) {
188+
shell_error(sh, "not enough arguments");
189+
return -EINVAL;
190+
}
191+
172192
port_addr = strtol(argv[2], NULL, 16);
173193
dev_addr = strtol(argv[3], NULL, 16);
174194
reg_addr = strtol(argv[4], NULL, 16);
@@ -198,11 +218,16 @@ static int cmd_mdio_read_c45(const struct shell *sh, size_t argc, char **argv)
198218
uint8_t port_addr;
199219
int ret;
200220

201-
ret = parse_device_arg(sh, argv, &dev);
221+
ret = parse_device_arg(sh, argc, argv, &dev);
202222
if (ret < 0) {
203223
return ret;
204224
}
205225

226+
if (argc < 5) {
227+
shell_error(sh, "not enough arguments");
228+
return -EINVAL;
229+
}
230+
206231
port_addr = strtol(argv[2], NULL, 16);
207232
dev_addr = strtol(argv[3], NULL, 16);
208233
reg_addr = strtol(argv[4], NULL, 16);

0 commit comments

Comments
 (0)