mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-16 15:11:52 +00:00
Fix the module name matching to the drivers present in the kernel. Previously
it would return true on a partial match where it would think the edsc module was already present by having a positive match on 'ed'. This changes it so that it compares the full string including the nul terminators. This also fixes a buffer overflow in the ifkind variable where the length of the interface name in *argv wasnt checked for size. Reviewed by: brooks Approved by: re (gnn)
This commit is contained in:
parent
7924093f84
commit
265e8a9acc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=172438
@ -895,21 +895,28 @@ printb(const char *s, unsigned v, const char *bits)
|
||||
void
|
||||
ifmaybeload(const char *name)
|
||||
{
|
||||
#define MOD_PREFIX_LEN 3 /* "if_" */
|
||||
struct module_stat mstat;
|
||||
int fileid, modid;
|
||||
char ifkind[35], *dp;
|
||||
char ifkind[IFNAMSIZ + MOD_PREFIX_LEN], ifname[IFNAMSIZ], *dp;
|
||||
const char *cp;
|
||||
|
||||
/* loading suppressed by the user */
|
||||
if (noload)
|
||||
return;
|
||||
|
||||
/* trim the interface number off the end */
|
||||
strlcpy(ifname, name, sizeof(ifname));
|
||||
for (dp = ifname; *dp != 0; dp++)
|
||||
if (isdigit(*dp)) {
|
||||
*dp = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* turn interface and unit into module name */
|
||||
strcpy(ifkind, "if_");
|
||||
for (cp = name, dp = ifkind + 3;
|
||||
(*cp != 0) && !isdigit(*cp); cp++, dp++)
|
||||
*dp = *cp;
|
||||
*dp = 0;
|
||||
strlcpy(ifkind + MOD_PREFIX_LEN, ifname,
|
||||
sizeof(ifkind) - MOD_PREFIX_LEN);
|
||||
|
||||
/* scan files in kernel */
|
||||
mstat.version = sizeof(struct module_stat);
|
||||
@ -926,8 +933,8 @@ ifmaybeload(const char *name)
|
||||
cp = mstat.name;
|
||||
}
|
||||
/* already loaded? */
|
||||
if (strncmp(name, cp, strlen(cp)) == 0 ||
|
||||
strncmp(ifkind, cp, strlen(cp)) == 0)
|
||||
if (strncmp(ifname, cp, strlen(ifname) + 1) == 0 ||
|
||||
strncmp(ifkind, cp, strlen(ifkind) + 1) == 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user