mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-27 17:46:01 +00:00
Cleanup lang.vala plugin -20LOC, reduce file path limits, fix uaf
This commit is contained in:
parent
d5f9bdf1c2
commit
2a4b000c37
@ -23,9 +23,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "format.h"
|
||||
#include "r_util.h"
|
||||
#include "avr_disasm.h"
|
||||
|
@ -27,6 +27,9 @@ typedef struct r_lang_plugin_t {
|
||||
const char *name;
|
||||
const char *alias;
|
||||
const char *desc;
|
||||
#if R2_580
|
||||
const char *author;
|
||||
#endif
|
||||
const char *example;
|
||||
const char *license;
|
||||
const char **help;
|
||||
|
@ -1,36 +1,21 @@
|
||||
/* radare - LGPL - Copyright 2011-2017 pancake */
|
||||
/* vala extension for libr (radare2) */
|
||||
// TODO: add cache directory (~/.r2/cache)
|
||||
/* radare - LGPL - Copyright 2011-2022 pancake */
|
||||
|
||||
#include "r_lib.h"
|
||||
#include "r_core.h"
|
||||
#include "r_lang.h"
|
||||
#include <r_lang.h>
|
||||
|
||||
static bool lang_vala_file(RLang *lang, const char *file, bool silent) {
|
||||
void *lib;
|
||||
char *p, name[512], buf[512];
|
||||
char *vapidir, *srcdir, *libname;
|
||||
int len;
|
||||
|
||||
if (strlen (file) > 500) {
|
||||
char *name = (!strstr (file, ".vala")) ? r_str_newf ("%s.vala", file) : strdup (file);
|
||||
if (!name || !r_file_exists (name)) {
|
||||
R_LOG_ERROR ("file not found (%s)", name);
|
||||
free (name);
|
||||
return false;
|
||||
}
|
||||
if (!strstr (file, ".vala")) {
|
||||
sprintf (name, "%s.vala", file);
|
||||
} else {
|
||||
strcpy (name, file);
|
||||
}
|
||||
if (!r_file_exists (name)) {
|
||||
eprintf ("file not found (%s)\n", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
srcdir = strdup (file);
|
||||
p = (char*)r_str_lchr (srcdir, '/');
|
||||
char *srcdir = strdup (file);
|
||||
char *p = (char*)r_str_lchr (srcdir, '/');
|
||||
char *libname;
|
||||
if (p) {
|
||||
*p = 0;
|
||||
libname = strdup (p+1);
|
||||
if (*file!='/') {
|
||||
libname = strdup (p + 1);
|
||||
if (*file != '/') {
|
||||
strcpy (srcdir, ".");
|
||||
}
|
||||
} else {
|
||||
@ -38,7 +23,6 @@ static bool lang_vala_file(RLang *lang, const char *file, bool silent) {
|
||||
strcpy (srcdir, ".");
|
||||
}
|
||||
r_sys_setenv ("PKG_CONFIG_PATH", R2_LIBDIR"/pkgconfig");
|
||||
vapidir = r_sys_getenv ("VAPIDIR");
|
||||
char *tail = silent? " > /dev/null 2>&1": "";
|
||||
char *src = r_file_slurp (name, NULL);
|
||||
const char *pkgs = "";
|
||||
@ -50,32 +34,23 @@ static bool lang_vala_file(RLang *lang, const char *file, bool silent) {
|
||||
}
|
||||
free (src);
|
||||
}
|
||||
// const char *pkgs = "";
|
||||
if (vapidir) {
|
||||
if (*vapidir) {
|
||||
len = snprintf (buf, sizeof (buf), "valac --disable-warnings -d %s --vapidir=%s --pkg r_core %s -C %s %s",
|
||||
srcdir, vapidir, pkgs, name, tail);
|
||||
if (len >= sizeof (buf)) {
|
||||
free (vapidir);
|
||||
free (srcdir);
|
||||
free (libname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
free (vapidir);
|
||||
char *cmdbuf = NULL;
|
||||
char *vapidir = r_sys_getenv ("VAPIDIR");
|
||||
if (R_STR_ISNOTEMPTY (vapidir)) {
|
||||
cmdbuf = r_str_newf ("valac --disable-warnings -d %s --vapidir=%s --pkg r_core %s -C %s %s",
|
||||
srcdir, vapidir, pkgs, name, tail);
|
||||
} else {
|
||||
len = snprintf (buf, sizeof (buf) - 1, "valac --disable-warnings -d %s %s --pkg r_core -C %s %s", srcdir, pkgs, name, tail);
|
||||
if (len >= sizeof (buf)) {
|
||||
free (srcdir);
|
||||
free (libname);
|
||||
return false;
|
||||
}
|
||||
cmdbuf = r_str_newf ("valac --disable-warnings -d %s %s --pkg r_core -C %s %s", srcdir, pkgs, name, tail);
|
||||
}
|
||||
R_FREE (vapidir);
|
||||
free (srcdir);
|
||||
if (r_sandbox_system (buf, 1) != 0) {
|
||||
if (!cmdbuf || r_sandbox_system (cmdbuf, 1) != 0) {
|
||||
free (name);
|
||||
free (libname);
|
||||
free (cmdbuf);
|
||||
return false;
|
||||
}
|
||||
free (cmdbuf);
|
||||
p = strstr (name, ".vala");
|
||||
if (p) {
|
||||
*p = 0;
|
||||
@ -84,40 +59,41 @@ static bool lang_vala_file(RLang *lang, const char *file, bool silent) {
|
||||
if (p) {
|
||||
*p = 0;
|
||||
}
|
||||
// TODO: use CC environ if possible
|
||||
len = snprintf (buf, sizeof (buf), "gcc -fPIC -shared %s.c -o lib%s." R_LIB_EXT
|
||||
" $(pkg-config --cflags --libs r_core gobject-2.0 %s)", name, libname, libs);
|
||||
if (len >= sizeof (buf) || r_sandbox_system (buf, 1) != 0) {
|
||||
char *cc = r_sys_getenv ("CC");
|
||||
if (R_STR_ISEMPTY (cc)) {
|
||||
free (cc);
|
||||
cc = strdup ("gcc");
|
||||
}
|
||||
cmdbuf = r_str_newf ("%s -fPIC -shared %s.c -o lib%s." R_LIB_EXT
|
||||
" $(pkg-config --cflags --libs r_core gobject-2.0 %s)", cc, name, libname, libs);
|
||||
R_FREE (cc);
|
||||
if (r_sandbox_system (cmdbuf, 1) != 0) {
|
||||
free (libname);
|
||||
free (name);
|
||||
return false;
|
||||
}
|
||||
|
||||
len = snprintf (buf, sizeof (buf), "./lib%s." R_LIB_EXT, libname);
|
||||
cmdbuf = r_str_newf ("./lib%s." R_LIB_EXT, libname);
|
||||
free (libname);
|
||||
if (len >= sizeof (buf)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
lib = r_lib_dl_open (buf);
|
||||
void *lib = r_lib_dl_open (cmdbuf);
|
||||
if (lib) {
|
||||
void (*fcn) (RCore *);
|
||||
fcn = r_lib_dl_sym (lib, "entry");
|
||||
void (*fcn) (RCore *) = r_lib_dl_sym (lib, "entry");
|
||||
if (fcn) {
|
||||
fcn (lang->user);
|
||||
} else {
|
||||
eprintf ("Cannot find 'entry' symbol in library\n");
|
||||
R_LOG_ERROR ("Cannot find 'entry' symbol in library");
|
||||
}
|
||||
r_lib_dl_close (lib);
|
||||
} else {
|
||||
eprintf ("Cannot open library\n");
|
||||
R_LOG_ERROR ("Cannot open library");
|
||||
}
|
||||
r_file_rm (buf); // remove lib
|
||||
len = snprintf (buf, sizeof (buf), "%s.c", name); // remove .c
|
||||
if (len >= sizeof (buf)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
r_file_rm (buf);
|
||||
r_file_rm (cmdbuf); // remove lib
|
||||
free (cmdbuf);
|
||||
cmdbuf = r_str_newf ("%s.c", name);
|
||||
free (name);
|
||||
r_file_rm (cmdbuf);
|
||||
free (cmdbuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -145,13 +121,16 @@ static bool lang_vala_run(RLang *lang, const char *code, int len) {
|
||||
r_file_rm (".tmp.vala");
|
||||
return true;
|
||||
}
|
||||
eprintf ("Cannot open .tmp.vala\n");
|
||||
R_LOG_ERROR ("Cannot open .tmp.vala");
|
||||
return false;
|
||||
}
|
||||
|
||||
static RLangPlugin r_lang_plugin_vala = {
|
||||
.name = "vala",
|
||||
.ext = "vala",
|
||||
#if R2_580
|
||||
.author = "pancake",
|
||||
#endif
|
||||
.license = "LGPL",
|
||||
.desc = "Vala language extension",
|
||||
.run = lang_vala_run,
|
||||
|
Loading…
x
Reference in New Issue
Block a user