Skip to content

Commit 839b05b

Browse files
committed
drivers: mdio: shell: Fix various buffer overflows
Need to check argument count to avoid buffer overflows and crashes. Signed-off-by: Cla Mattia Galliard <[email protected]>
1 parent 31ef45e commit 839b05b

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

drivers/mdio/mdio_shell.c

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,12 @@ 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, char **argv, const struct device **dev)
3636
{
37+
if (argc < 2) {
38+
shell_error(sh, "not enough arguments");
39+
return -EINVAL;
40+
}
3741
*dev = shell_device_get_binding(argv[1]);
3842
if (!*dev) {
3943
shell_error(sh, "device %s not found", argv[1]);
@@ -55,12 +59,12 @@ static int cmd_mdio_scan(const struct shell *sh, size_t argc, char **argv)
5559
uint16_t reg_addr;
5660
int ret;
5761

58-
ret = parse_device_arg(sh, argv, &dev);
62+
ret = parse_device_arg(sh, argc, argv, &dev);
5963
if (ret < 0) {
6064
return ret;
6165
}
6266

63-
if (argc >= 2) {
67+
if (argc >= 3) {
6468
reg_addr = strtol(argv[2], NULL, 16);
6569
} else {
6670
reg_addr = 0;
@@ -98,11 +102,16 @@ static int cmd_mdio_write(const struct shell *sh, size_t argc, char **argv)
98102
uint16_t port_addr;
99103
int ret;
100104

101-
ret = parse_device_arg(sh, argv, &dev);
105+
ret = parse_device_arg(sh, argc, argv, &dev);
102106
if (ret < 0) {
103107
return ret;
104108
}
105109

110+
if (argc < 5) {
111+
shell_error(sh, "not enough arguments");
112+
return -EINVAL;
113+
}
114+
106115
port_addr = strtol(argv[2], NULL, 16);
107116
reg_addr = strtol(argv[3], NULL, 16);
108117
data = strtol(argv[4], NULL, 16);
@@ -130,11 +139,16 @@ static int cmd_mdio_read(const struct shell *sh, size_t argc, char **argv)
130139
uint16_t port_addr;
131140
int ret;
132141

133-
ret = parse_device_arg(sh, argv, &dev);
142+
ret = parse_device_arg(sh, argc, argv, &dev);
134143
if (ret < 0) {
135144
return ret;
136145
}
137146

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

@@ -164,11 +178,16 @@ static int cmd_mdio_write_45(const struct shell *sh, size_t argc, char **argv)
164178
uint8_t port_addr;
165179
int ret;
166180

167-
ret = parse_device_arg(sh, argv, &dev);
181+
ret = parse_device_arg(sh, argc, argv, &dev);
168182
if (ret < 0) {
169183
return ret;
170184
}
171185

186+
if (argc < 6) {
187+
shell_error(sh, "not enough arguments");
188+
return -EINVAL;
189+
}
190+
172191
port_addr = strtol(argv[2], NULL, 16);
173192
dev_addr = strtol(argv[3], NULL, 16);
174193
reg_addr = strtol(argv[4], NULL, 16);
@@ -198,11 +217,16 @@ static int cmd_mdio_read_c45(const struct shell *sh, size_t argc, char **argv)
198217
uint8_t port_addr;
199218
int ret;
200219

201-
ret = parse_device_arg(sh, argv, &dev);
220+
ret = parse_device_arg(sh, argc, argv, &dev);
202221
if (ret < 0) {
203222
return ret;
204223
}
205224

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

0 commit comments

Comments
 (0)