OSDN Git Service

2008-09-26 Craig Howland <howland@LGSInnovations.com>
authorjjohnstn <jjohnstn>
Fri, 26 Sep 2008 16:23:58 +0000 (16:23 +0000)
committerjjohnstn <jjohnstn>
Fri, 26 Sep 2008 16:23:58 +0000 (16:23 +0000)
        * libc/stdlib/getenv_r.c (_getenv_r): Modify to not match if name
        contains an equal sign.

newlib/ChangeLog
newlib/libc/stdlib/getenv_r.c

index eb1f88b..61383e9 100644 (file)
@@ -1,3 +1,8 @@
+2008-09-26  Craig Howland  <howland@LGSInnovations.com>
+
+       * libc/stdlib/getenv_r.c (_getenv_r): Modify to not match if name
+       contains an equal sign.
+
 2008-09-25  Raphael Derossa Pereira  <raphaelpereira@gmail.com>
 
        * libc/include/pthread.h[_UNIX98_THREAD_MUTEX_ATTRIBUTES]: Add
index bfa9682..272b097 100644 (file)
@@ -29,7 +29,8 @@ A pointer to the (string) value of the environment variable, or
 
 PORTABILITY
 <<_getenv_r>> is not ANSI; the rules for properly forming names of environment
-variables vary from one system to another.
+variables vary from one system to another.  This implementation does not
+permit '=' to be in identifiers.
 
 <<_getenv_r>> requires a global pointer <<environ>>.
 */
@@ -98,17 +99,22 @@ _DEFUN (_findenv_r, (reent_ptr, name, offset),
       return NULL;
     }
 
-  len = strlen(name);
-  c = name + len;
-
-  for (p = *p_environ; *p; ++p)
-    if (!strncmp (*p, name, len))
-      if (*(c = *p + len) == '=')
+  c = name;
+  while (*c && *c != '=')  c++;
+  /* Identifiers may not contain an '=', so cannot match if does */
+  if(*c != '=')
+    {
+    len = c - name;
+    for (p = *p_environ; *p; ++p)
+      if (!strncmp (*p, name, len))
+        if (*(c = *p + len) == '=')
        {
          *offset = p - *p_environ;
-          ENV_UNLOCK;
+         ENV_UNLOCK;
          return (char *) (++c);
        }
+    }
   ENV_UNLOCK;
   return NULL;
 }