Commit 278f840b authored by williangaspar's avatar williangaspar

check input

parent 0108702b
......@@ -5,6 +5,7 @@
#include "printf.h"
#include "arch/arch.h"
#include <sys/stat.h>
#include <regex>
#include "libbpf.h"
......@@ -209,13 +210,24 @@ void SemanticAnalyser::visit(Call &call)
call.type = SizedType(Type::integer, 8);
}
else if (call.func == "kaddr" || call.func == "uaddr") {
else if (call.func == "kaddr") {
if (check_nargs(call, 1)) {
if (check_arg(call, Type::string, 0, true)) {
;
}
}
call.type = SizedType(Type::integer, 8);
}
else if (call.func == "uaddr")
{
if (check_nargs(call, 1)) {
if (check_arg(call, Type::string, 0, true)) {
if (check_alpha_numeric(call, 0)) {
;
}
}
}
call.type = SizedType(Type::integer, 8);
}
else if (call.func == "printf") {
check_assignment(call, false, false);
......@@ -909,5 +921,23 @@ bool SemanticAnalyser::check_arg(const Call &call, Type type, int arg_num, bool
return true;
}
bool SemanticAnalyser::check_alpha_numeric(const Call &call, int arg_num)
{
if (!call.vargs)
return false;
auto &arg = static_cast<String&>(*call.vargs->at(0)).str;
bool is_alpha = std::regex_match(arg, std::regex("^[a-zA-Z0-9_-]+$"));
if (!is_alpha)
{
err_ << call.func << "() expects an alpha numeric string as input";
err_ << " (\"" << arg << "\" provided)" << std::endl;
return false;
}
return true;
}
} // namespace ast
} // namespace bpftrace
......@@ -55,6 +55,7 @@ private:
bool check_nargs(const Call &call, int expected_nargs);
bool check_varargs(const Call &call, int min_nargs, int max_nargs);
bool check_arg(const Call &call, Type type, int arg_num, bool want_literal=false);
bool check_alpha_numeric(const Call &call, int arg_num);
Probe *probe_;
std::map<std::string, SizedType> variable_val_;
......
......@@ -1158,6 +1158,7 @@ uint64_t BPFtrace::resolve_uname(const char *name)
{
uint64_t addr = 0;
// TODO: switch from objdump to library call
std::string call_str = "objdump -tT /bin/bash | grep ";
call_str += name;
const char *call = call_str.c_str();
......
......@@ -1029,6 +1029,11 @@ TEST(codegen, call_kaddr)
// TODO: test kaddr()
}
TEST(codegen, call_uaddr)
{
// TODO: test uaddr()
}
TEST(codegen, call_hist)
{
test("kprobe:f { @x = hist(pid) }",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment