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]?

>       /* loading suppressed by the user */
> @@ -911,6 +911,12 @@ ifmaybeload(const char *name)
>               *dp = *cp;
>       *dp = 0;
>  
> +     /* trim the interface number off the end */
> +     strcpy(ifname, name);
> +     for (dp = ifname; *dp != 0; dp++)
> +             if (isdigit(*dp))
> +                     *dp = '\0';
> +

Should the if statement terminate the loop?

>       /* scan files in kernel */
>       mstat.version = sizeof(struct module_stat);
>       for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) {
> @@ -926,8 +932,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;
>               }
>       }

Attachment: pgpbbQkrpdO2D.pgp
Description: PGP signature

Reply via email to