diff options
author | sobomax <sobomax@FreeBSD.org> | 2015-06-19 22:24:58 +0000 |
---|---|---|
committer | sobomax <sobomax@FreeBSD.org> | 2015-06-19 22:24:58 +0000 |
commit | 200a3fb3721aaba084023572ebe9d53bff39946d (patch) | |
tree | 6ab965899dd0c0e76e6eed76507221cae2a8bcaa /contrib/llvm/tools/clang/lib/Sema | |
parent | 84a04be05a97430d664c4924b6ddbc6245035c20 (diff) | |
download | FreeBSD-src-200a3fb3721aaba084023572ebe9d53bff39946d.zip FreeBSD-src-200a3fb3721aaba084023572ebe9d53bff39946d.tar.gz |
Provide bug4bug workaround for certain dumbiness of the u-boot's API_env_enum
function, which is expected to set returned env to NULL upon reaching the end
of the environment list but fails to do so in certain cases. The respective
u-boot code looks like the following (HEAD at the time of this commit):
--- api.c ---
496 static int API_env_enum(va_list ap)
...
510 *next = last;
511
512 for (i = 0; env_get_char(i) != '\0'; i = n + 1) {
513 for (n = i; env_get_char(n) != '\0'; ++n) {
514 if (n >= CONFIG_ENV_SIZE) {
515 /* XXX shouldn't we set *next = NULL?? */
516 return 0;
517 }
518 }
-------------
The net result is that any unfortunate user of the loader's ub_env_enum()
function hitting this condition would be trapped in the infinite loop, as
the main use pattern of ub_env_enum() is basically the following:
while ((env = ub_env_enum(env)) != NULL) { DO STUFF }
Which would stuck forever with the last element.
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Sema')
0 files changed, 0 insertions, 0 deletions