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
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; } }
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "[EMAIL PROTECTED]"