diff --git a/legacy/edje/src/bin/edje_cc_sources.c b/legacy/edje/src/bin/edje_cc_sources.c index 081d264d76..d1da92fed0 100644 --- a/legacy/edje/src/bin/edje_cc_sources.c +++ b/legacy/edje/src/bin/edje_cc_sources.c @@ -184,7 +184,15 @@ source_fetch_file(char *fil, char *filname) void source_fetch(void) { - source_fetch_file(file_in, "main_edje_source.edc"); + char buf[PATH_MAX] = {0}, *ptr; + + ptr = strrchr(file_in, '/'); + if (ptr) + { + snprintf(buf, sizeof (buf), "%s", ptr + 1); + } + + source_fetch_file(file_in, buf[0] ? buf : file_in); } int diff --git a/legacy/edje/src/bin/edje_decc.c b/legacy/edje/src/bin/edje_decc.c index 5b36d39a4c..7dd7021293 100644 --- a/legacy/edje/src/bin/edje_decc.c +++ b/legacy/edje/src/bin/edje_decc.c @@ -24,6 +24,7 @@ int e_file_is_dir(char *file); int e_file_mkdir(char *dir); int e_file_mkpath(char *path); static int compiler_cmd_is_sane(); +static int root_filename_is_sane(); static void main_help(void) @@ -78,12 +79,18 @@ decomp(void) } srcfiles = source_load(ef); - if (!srcfiles) + if (!srcfiles || !srcfiles->list) { printf("ERROR: %s has no decompile information\n", file_in); eet_close(ef); return 0; } + if (!srcfiles->list->data || !root_filename_is_sane()) + { + printf("ERROR: Invalid root filename: '%s'\n", (char *) srcfiles->list->data); + eet_close(ef); + return 0; + } edje_file = eet_data_read(ef, _edje_edd_edje_file, "edje_file"); if (!edje_file) { @@ -264,6 +271,7 @@ output(void) { char out[4096]; FILE *f; + SrcFile *sf = srcfiles->list->data; snprintf(out, sizeof(out), "%s/build.sh", outdir); printf("Output Build Script: %s\n", out); @@ -274,7 +282,7 @@ output(void) } f = fopen(out, "w"); fprintf(f, "#!/bin/sh\n"); - fprintf(f, "%s $@ -id . -fd . main_edje_source.edc -o %s.eet\n", edje_file->compiler, outdir); + fprintf(f, "%s $@ -id . -fd . %s -o %s.eet\n", edje_file->compiler, sf->name, outdir); fclose(f); #ifndef WIN32 @@ -358,3 +366,31 @@ compiler_cmd_is_sane() return 1; } + +static int +root_filename_is_sane() +{ + SrcFile *sf = srcfiles->list->data; + char *f = sf->name, *ptr; + + if (!f || !*f) + { + return 0; + } + + for (ptr = f; ptr && *ptr; ptr++) + { + /* only allow [a-z][A-Z][0-9]_-./ */ + switch (*ptr) + { + case '_': case '-': case '.': case '/': + break; + default: + if (!isalnum(*ptr)) + { + return 0; + } + } + } + return 1; +}