projects
/
carl9170fw.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
carl9170: fix printf.c file permission
[carl9170fw.git]
/
config
/
preprocess.c
diff --git
a/config/preprocess.c
b/config/preprocess.c
index 0574039238c65cf1df6bb1dba86b9fff8c989375..592dfbfa9fb30d6804043a5bad23b9f683adefd8 100644
(file)
--- a/
config/preprocess.c
+++ b/
config/preprocess.c
@@
-2,6
+2,7
@@
//
// Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com>
//
// Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com>
+#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
@@
-9,6
+10,7
@@
#include <string.h>
#include "list.h"
#include <string.h>
#include "list.h"
+#include "lkc.h"
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
@@
-156,7
+158,7
@@
static char *do_shell(int argc, char *argv[])
nread--;
/* remove trailing new lines */
nread--;
/* remove trailing new lines */
- while (buf[nread - 1] == '\n')
+ while (
nread > 0 &&
buf[nread - 1] == '\n')
nread--;
buf[nread] = 0;
nread--;
buf[nread] = 0;
@@
-229,6
+231,7
@@
struct variable {
char *name;
char *value;
enum variable_flavor flavor;
char *name;
char *value;
enum variable_flavor flavor;
+ int exp_count;
struct list_head node;
};
struct list_head node;
};
@@
-253,11
+256,22
@@
static char *variable_expand(const char *name, int argc, char *argv[])
if (!v)
return NULL;
if (!v)
return NULL;
+ if (argc == 0 && v->exp_count)
+ pperror("Recursive variable '%s' references itself (eventually)",
+ name);
+
+ if (v->exp_count > 1000)
+ pperror("Too deep recursive expansion");
+
+ v->exp_count++;
+
if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
+ v->exp_count--;
+
return res;
}
return res;
}
@@
-284,6
+298,7
@@
void variable_add(const char *name, const char *value,
v = xmalloc(sizeof(*v));
v->name = xstrdup(name);
v = xmalloc(sizeof(*v));
v->name = xstrdup(name);
+ v->exp_count = 0;
list_add_tail(&v->node, &variable_list);
}
list_add_tail(&v->node, &variable_list);
}
@@
-542,8
+557,7
@@
char *expand_string(const char *in)
static bool is_end_of_token(char c)
{
static bool is_end_of_token(char c)
{
- /* Why are '.' and '/' valid characters for symbols? */
- return !(isalnum(c) || c == '_' || c == '-' || c == '.' || c == '/');
+ return !(isalnum(c) || c == '_' || c == '-');
}
/*
}
/*