aboutsummaryrefslogtreecommitdiffstats
path: root/main/busybox/busybox-1.23.0-modprobe.patch
blob: 69fa8510b4684bc650b27ec210d7b0f8f3781a6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
--- busybox-1.23.0/modutils/depmod.c
+++ busybox-1.23.0-modprobe/modutils/depmod.c
@@ -51,7 +51,11 @@ static int FAST_FUNC parse_module(const 
 
 	info->dnext = info->dprev = info;
 	info->name = xstrdup(fname + 2); /* skip "./" */
-	info->modname = xstrdup(filename2modname(fname, modname));
+	info->modname = xstrdup(
+		filename2modname(
+			bb_get_last_path_component_nostrip(fname),
+			modname
+	));
 	for (ptr = image; ptr < image + len - 10; ptr++) {
 		if (strncmp(ptr, "depends=", 8) == 0) {
 			char *u;
@@ -242,17 +246,18 @@ int depmod_main(int argc UNUSED_PARAM, c
 	if (!(option_mask32 & OPT_n))
 		xfreopen_write("modules.alias", stdout);
 	for (m = modules; m != NULL; m = m->next) {
+		char modname[MODULE_NAME_LEN];
 		const char *fname = bb_basename(m->name);
-		int fnlen = strchrnul(fname, '.') - fname;
+		filename2modname(fname, modname);
 		while (m->aliases) {
 			/* Last word can well be m->modname instead,
 			 * but depmod from module-init-tools 3.4
 			 * uses module basename, i.e., no s/-/_/g.
 			 * (pathname and .ko.* are still stripped)
 			 * Mimicking that... */
-			printf("alias %s %.*s\n",
+			printf("alias %s %s\n",
 				(char*)llist_pop(&m->aliases),
-				fnlen, fname);
+				modname);
 		}
 	}
 #endif
@@ -260,12 +265,13 @@ int depmod_main(int argc UNUSED_PARAM, c
 	if (!(option_mask32 & OPT_n))
 		xfreopen_write("modules.symbols", stdout);
 	for (m = modules; m != NULL; m = m->next) {
+		char modname[MODULE_NAME_LEN];
 		const char *fname = bb_basename(m->name);
-		int fnlen = strchrnul(fname, '.') - fname;
+		filename2modname(fname, modname);
 		while (m->symbols) {
-			printf("alias symbol:%s %.*s\n",
+			printf("alias symbol:%s %s\n",
 				(char*)llist_pop(&m->symbols),
-				fnlen, fname);
+				modname);
 		}
 	}
 #endif
--- busybox-1.23.0/modutils/modprobe.c
+++ busybox-1.23.0-modprobe/modutils/modprobe.c
@@ -229,26 +229,20 @@ static ALWAYS_INLINE struct module_entry
 {
 	return helper_get_module(module, 1);
 }
-static ALWAYS_INLINE struct module_entry *get_modentry(const char *module)
+/* So far this function always gets a module pathname, never an alias name.
+ * The crucial difference is that pathname needs dirname stripping,
+ * while alias name must NOT do it!
+ * Testcase where dirname stripping is likely to go wrong: "modprobe devname:snd/timer"
+ */
+static ALWAYS_INLINE struct module_entry *get_modentry(const char *pathname)
 {
-	return helper_get_module(module, 0);
+	return helper_get_module(bb_get_last_path_component_nostrip(pathname), 0);
 }
 
 static void add_probe(const char *name)
 {
 	struct module_entry *m;
 
-	/*
-	 * get_or_add_modentry() strips path from name and works
-	 * on remaining basename.
-	 * This would make "rmmod dir/name" and "modprobe dir/name"
-	 * to work like "rmmod name" and "modprobe name",
-	 * which is wrong, and can be abused via implicit modprobing:
-	 * "ifconfig /usbserial up" tries to modprobe netdev-/usbserial.
-	 */
-	if (strchr(name, '/'))
-		bb_error_msg_and_die("malformed module name '%s'", name);
-
 	m = get_or_add_modentry(name);
 	if (!(option_mask32 & (OPT_REMOVE | OPT_SHOW_DEPS))
 	 && (m->flags & MODULE_FLAG_LOADED)
@@ -510,7 +504,7 @@ static void load_modules_dep(void)
 		colon = last_char_is(tokens[0], ':');
 		if (colon == NULL)
 			continue;
-		*colon = 0;
+		*colon = '\0';
 
 		m = get_modentry(tokens[0]);
 		if (m == NULL)
@@ -557,7 +551,6 @@ int modprobe_main(int argc UNUSED_PARAM,
 
 	if (opt & OPT_LIST_ONLY) {
 		int i;
-		char name[MODULE_NAME_LEN];
 		char *colon, *tokens[2];
 		parser_t *p = config_open2(CONFIG_DEFAULT_DEPMOD_FILE, xfopen_for_read);
 
@@ -569,10 +562,14 @@ int modprobe_main(int argc UNUSED_PARAM,
 			if (!colon)
 				continue;
 			*colon = '\0';
-			filename2modname(tokens[0], name);
 			if (!argv[0])
 				puts(tokens[0]);
 			else {
+				char name[MODULE_NAME_LEN];
+				filename2modname(
+					bb_get_last_path_component_nostrip(tokens[0]),
+					name
+				);
 				for (i = 0; argv[i]; i++) {
 					if (fnmatch(argv[i], name, 0) == 0) {
 						puts(tokens[0]);
--- busybox-1.23.0/modutils/modprobe-small.c
+++ busybox-1.23.0-modprobe/modutils/modprobe-small.c
@@ -149,9 +149,13 @@ static void replace(char *s, char what, 
 static char *filename2modname(const char *filename, char *modname)
 {
 	int i;
-	char *from;
+	const char *from;
 
-	from = bb_get_last_path_component_nostrip(filename);
+	// Disabled since otherwise "modprobe dir/name" would work
+	// as if it is "modprobe name". It is unclear why
+	// 'basenamization' was here in the first place.
+	//from = bb_get_last_path_component_nostrip(filename);
+	from = filename;
 	for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++)
 		modname[i] = (from[i] == '-') ? '_' : from[i];
 	modname[i] = '\0';
@@ -631,6 +635,14 @@ static void process_module(char *name, c
 		infovec = find_alias(name);
 	}
 
+	if (!infovec) {
+		/* both dirscan and find_alias found nothing */
+		if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */
+			bb_error_msg("module '%s' not found", name);
+//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline?
+		goto ret;
+	}
+
 	/* There can be more than one module for the given alias. For example,
 	 * "pci:v00008086d00007010sv00000000sd00000000bc01sc01i80" matches
 	 * ata_piix because it has alias "pci:v00008086d00007010sv*sd*bc*sc*i*"
@@ -646,7 +658,8 @@ static void process_module(char *name, c
 			int r;
 			char modname[MODULE_NAME_LEN];
 
-			filename2modname(info->pathname, modname);
+			filename2modname(
+				bb_get_last_path_component_nostrip(info->pathname), modname);
 			r = delete_module(modname, O_NONBLOCK | O_EXCL);
 			dbg1_error_msg("delete_module('%s', O_NONBLOCK | O_EXCL):%d", modname, r);
 			if (r != 0) {
@@ -669,14 +682,6 @@ static void process_module(char *name, c
 		 */
 	}
 
-	if (!infovec) {
-		/* both dirscan and find_alias found nothing */
-		if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */
-			bb_error_msg("module '%s' not found", name);
-//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline?
-		goto ret;
-	}
-
 	infoidx = 0;
 	while ((info = infovec[infoidx++]) != NULL) {
 		/* Iterate thru dependencies, trying to (un)load them */
--- busybox-1.23.0/modutils/modutils.c
+++ busybox-1.23.0-modprobe/modutils/modutils.c
@@ -48,13 +48,17 @@ int FAST_FUNC string_to_llist(char *stri
 char* FAST_FUNC filename2modname(const char *filename, char *modname)
 {
 	int i;
-	char *from;
+	const char *from;
 
 	if (filename == NULL)
 		return NULL;
 	if (modname == NULL)
 		modname = xmalloc(MODULE_NAME_LEN);
-	from = bb_get_last_path_component_nostrip(filename);
+	// Disabled since otherwise "modprobe dir/name" would work
+	// as if it is "modprobe name". It is unclear why
+	// 'basenamization' was here in the first place.
+	//from = bb_get_last_path_component_nostrip(filename);
+	from = filename;
 	for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++)
 		modname[i] = (from[i] == '-') ? '_' : from[i];
 	modname[i] = '\0';