ifconfig patch
Andrew Thompson
thompsa at FreeBSD.org
Thu Sep 20 17:56:27 PDT 2007
On Thu, Sep 20, 2007 at 07:39:27PM -0500, Brooks Davis wrote:
> On Fri, Sep 21, 2007 at 11:54:27AM +1200, Andrew Thompson wrote:
> > Hi,
> >
> >
> > I have been digging into why the edsc module wasnt being loaded by
> > ifconfig and now have a patch.
> >
> > A few printfs showed the problem.
> >
> > # ifconfig edsc0 create
> > ifmaybeload(edsc0)
> > trying to find if_edsc or edsc0
> > found @ ed
> >
> > Its comparing using the string length of the module name so any partial
> > matches are going through. I have changed it so it strips the number
> > from the interface name and uses the full string to match.
> >
> > I want to ask re@ soon so any feedback would be great.
>
> Conceptually the patch seems right. A couple comments below (I saw the strlcpy
> change).
>
> -- Brooks
>
> > Index: ifconfig.c
> > ===================================================================
> > RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.c,v
> > retrieving revision 1.133
> > diff -u -p -r1.133 ifconfig.c
> > --- ifconfig.c 13 Jun 2007 18:07:59 -0000 1.133
> > +++ ifconfig.c 20 Sep 2007 23:47:28 -0000
> > @@ -897,7 +897,7 @@ ifmaybeload(const char *name)
> > {
> > struct module_stat mstat;
> > int fileid, modid;
> > - char ifkind[35], *dp;
> > + char ifkind[35], ifname[32], *dp;
> > const char *cp;
>
> Any reason ifname[32] shouldn't be ifname[IF_NAMESIZE]?
> Should the if statement terminate the loop?
fixed.
I have found that the loop to create ifkind does not properly check the
bounds of the passed string. I have reorganised the code to fix this,
patch attached.
Andrew
-------------- next part --------------
Index: ifconfig.c
===================================================================
RCS file: /home/ncvs/src/sbin/ifconfig/ifconfig.c,v
retrieving revision 1.133
diff -u -p -r1.133 ifconfig.c
--- ifconfig.c 13 Jun 2007 18:07:59 -0000 1.133
+++ ifconfig.c 21 Sep 2007 00:49:45 -0000
@@ -897,19 +897,24 @@ ifmaybeload(const char *name)
{
struct module_stat mstat;
int fileid, modid;
- char ifkind[35], *dp;
+ char ifkind[IFNAMSIZ + 3], 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 + 3, ifname, sizeof(ifkind) - 3);
/* scan files in kernel */
mstat.version = sizeof(struct module_stat);
@@ -926,8 +931,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)) == 0 ||
+ strncmp(ifkind, cp, strlen(ifkind)) == 0)
return;
}
}
More information about the freebsd-net
mailing list