Cleanup lang.vala plugin -20LOC, reduce file path limits, fix uaf

This commit is contained in:
pancake 2022-06-28 14:07:07 +02:00
parent d5f9bdf1c2
commit 2a4b000c37
3 changed files with 50 additions and 71 deletions

View File

@ -23,9 +23,6 @@
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "format.h"
#include "r_util.h"
#include "avr_disasm.h"

View File

@ -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;

View File

@ -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,