svn commit: r249408 - head/sys/kern

Navdeep Parhar np at FreeBSD.org
Fri Apr 12 21:42:28 UTC 2013


This prevents my system from booting up properly.  Backing out this
change restores normal operation.

The symptoms are that the kernel doesn't find the root fs itself but
waits at the mountroot> prompt instead.  I'm able to specify the
filesystem to use and then the boot proceeds as normal.  Once the
system has booted up I see only two entries in kenv, indicating that
something clobbered the environment.

# kenv
kern.devalias.ada0="ad4"
kern.devalias.ada1="ad6"

Regards,
Navdeep

On Fri, Apr 12, 2013 at 8:58 AM, Jayachandran C. <jchandra at freebsd.org> wrote:
> Author: jchandra
> Date: Fri Apr 12 15:58:53 2013
> New Revision: 249408
> URL: http://svnweb.freebsd.org/changeset/base/249408
>
> Log:
>   Fix kenv behavior when there is no static environment
>
>   In case where there are no static kernel environment entries, the
>   function init_dynamic_kenv() adds an incorrect entry at position 0 of
>   the dynamic kernel environment. This in turn causes kenv(1) to print
>   and empty list even though there are dynamic entries added later.
>
>   Fix this by checking env_pos in init_dynamic_kenv() and adding dynamic
>   entries only if there are static entries.
>
> Modified:
>   head/sys/kern/kern_environment.c
>
> Modified: head/sys/kern/kern_environment.c
> ==============================================================================
> --- head/sys/kern/kern_environment.c    Fri Apr 12 15:19:35 2013        (r249407)
> +++ head/sys/kern/kern_environment.c    Fri Apr 12 15:58:53 2013        (r249408)
> @@ -231,20 +231,23 @@ init_dynamic_kenv(void *data __unused)
>         kenvp = malloc((KENV_SIZE + 1) * sizeof(char *), M_KENV,
>                 M_WAITOK | M_ZERO);
>         i = 0;
> -       for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
> -               len = strlen(cp) + 1;
> -               if (len > KENV_MNAMELEN + 1 + KENV_MVALLEN + 1) {
> -                       printf("WARNING: too long kenv string, ignoring %s\n",
> -                           cp);
> -                       continue;
> +       if (env_pos > 0) {
> +               for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
> +                       len = strlen(cp) + 1;
> +                       if (len > KENV_MNAMELEN + 1 + KENV_MVALLEN + 1) {
> +                               printf(
> +                               "WARNING: too long kenv string, ignoring %s\n",
> +                                   cp);
> +                               continue;
> +                       }
> +                       if (i < KENV_SIZE) {
> +                               kenvp[i] = malloc(len, M_KENV, M_WAITOK);
> +                               strcpy(kenvp[i++], cp);
> +                       } else
> +                               printf(
> +                               "WARNING: too many kenv strings, ignoring %s\n",
> +                                   cp);
>                 }
> -               if (i < KENV_SIZE) {
> -                       kenvp[i] = malloc(len, M_KENV, M_WAITOK);
> -                       strcpy(kenvp[i++], cp);
> -               } else
> -                       printf(
> -                           "WARNING: too many kenv strings, ignoring %s\n",
> -                           cp);
>         }
>         kenvp[i] = NULL;
>


More information about the svn-src-all mailing list