From: Brian McFarland Date: Thu, 12 Mar 2015 15:52:49 +0000 (-0400) Subject: Patch to mkenvimage to handle text files with length that exceed env size X-Git-Tag: v2015.04-rc5~17 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=80ee0196a63d5f1bc013b0dddc830cda464c075f;p=u-boot Patch to mkenvimage to handle text files with length that exceed env size 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 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. --- diff --git a/tools/mkenvimage.c b/tools/mkenvimage.c index 6971b91314..8eee72e257 100644 --- a/tools/mkenvimage.c +++ b/tools/mkenvimage.c @@ -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.