gen_init_cpio: avoid NULL pointer dereference and rework env expanding
[sfrench/cifs-2.6.git] / usr / gen_init_cpio.c
index af8c925e93ebd4536e41897c5fcfff10f3fffda8..225ad244cf8833371543c6fb3f0f2df8d54b48dc 100644 (file)
@@ -382,24 +382,15 @@ error:
 static char *cpio_replace_env(char *new_location)
 {
        char expanded[PATH_MAX + 1];
-       char env_var[PATH_MAX + 1];
-       char *start;
-       char *end;
-
-       for (start = NULL; (start = strstr(new_location, "${")); ) {
-               end = strchr(start, '}');
-               if (start < end) {
-                       *env_var = *expanded = '\0';
-                       strncat(env_var, start + 2, end - start - 2);
-                       strncat(expanded, new_location, start - new_location);
-                       strncat(expanded, getenv(env_var),
-                               PATH_MAX - strlen(expanded));
-                       strncat(expanded, end + 1,
-                               PATH_MAX - strlen(expanded));
-                       strncpy(new_location, expanded, PATH_MAX);
-                       new_location[PATH_MAX] = 0;
-               } else
-                       break;
+       char *start, *end, *var;
+
+       while ((start = strstr(new_location, "${")) &&
+              (end = strchr(start + 2, '}'))) {
+               *start = *end = 0;
+               var = getenv(start + 2);
+               snprintf(expanded, sizeof expanded, "%s%s%s",
+                        new_location, var ? var : "", end + 1);
+               strcpy(new_location, expanded);
        }
 
        return new_location;