Patch to mkenvimage to handle text files with length that exceed env size
authorBrian McFarland <mcfarlandjb@gmail.com>
Thu, 12 Mar 2015 15:52:49 +0000 (11:52 -0400)
committerTom Rini <trini@konsulko.com>
Sat, 28 Mar 2015 16:07:47 +0000 (12:07 -0400)
The current head revision of mkenvimage
(e72be8947e129f5ab274c0a9f235d2cc0014b2ea) will prevent you from creating
an env image from a text file that is larger than the env length specified
by the '-s' option.  That doesn't make sense given that the tool now allows
comments and blank lines.  This patch removes that limitation and allows
longer text files to be used.

I don't have time / desire at the moment to figure out "patman" and could
really care less if this is adopted up stream.  Just figured I would share
in case anybody else finds it useful enough to take time to do a proper
patch.

>From 39ff30190c2bf687861f4b4b33230f1944fb64f9 Mon Sep 17 00:00:00 2001
From: Brian McFarland <bmcfarland@rldrake.com>
Date: Thu, 12 Mar 2015 11:37:19 -0400
Subject: [PATCH] In mkenvimage, removed the check that prevented using a
 source text file larger than the output environment image.  Instead, the main
 parsing loop checks to see if the environment buffer is full, and quits if it
 is.  After the main parse loop, a second loop swallows comments and
 whitespace until either the EOF is reached or more env vars are found, in
 which case an error will be thrown.

tools/mkenvimage.c

index 6971b91314fc1707ef78fc2bf2714d13b8f5cb81..8eee72e2572e321bbcf70d516d884708724f7fa4 100644 (file)
@@ -214,14 +214,10 @@ int main(int argc, char **argv)
                }
                ret = close(txt_fd);
        }
-       /* The +1 is for the additionnal ending \0. See below. */
-       if (filesize + 1 > envsize) {
-               fprintf(stderr, "The input file is larger than the environment partition size\n");
-               return EXIT_FAILURE;
-       }
 
-       /* Replace newlines separating variables with \0 */
-       for (fp = 0, ep = 0 ; fp < filesize ; fp++) {
+       /* Parse a byte at time until reaching the file OR until the environment fills
+        * up. Check ep against envsize - 1 to allow for extra trailing '\0'. */
+       for (fp = 0, ep = 0 ; fp < filesize && ep < envsize - 1; fp++) {
                if (filebuf[fp] == '\n') {
                        if (fp == 0 || filebuf[fp-1] == '\n') {
                                /*
@@ -249,6 +245,25 @@ int main(int argc, char **argv)
                        envptr[ep++] = filebuf[fp];
                }
        }
+       /* If there are more bytes in the file still, it means the env filled up
+        * before parsing the whole file.  Eat comments & whitespace here to see if
+        * there was anything meaning full left in the file, and if so, throw a error
+        * and exit. */
+       for( ; fp < filesize; fp++ )
+       {
+               if (filebuf[fp] == '\n') {
+                       if (fp == 0 || filebuf[fp-1] == '\n') {
+                               /* Ignore blank lines */
+                               continue;
+                       }
+               } else if ((fp == 0 || filebuf[fp-1] == '\n') && filebuf[fp] == '#') {
+                       while (++fp < filesize && filebuf[fp] != '\n')
+                       continue;
+               } else {
+                       fprintf(stderr, "The environment file is too large for the target environment storage\n");
+                       return EXIT_FAILURE;
+               }
+       }
        /*
         * Make sure there is a final '\0'
         * And do it again on the next byte to mark the end of the environment.