mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
First version that asks aha framework for permission to execute it
This commit is contained in:
parent
509cf94a40
commit
adf5e80cda
1 changed files with 52 additions and 11 deletions
|
@ -18,6 +18,8 @@
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "aha.h"
|
#include "aha.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "linux/delay.h"
|
||||||
|
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
|
@ -87,7 +89,7 @@ int create_filename(char *fn, int size){
|
||||||
asm volatile("rdtsc" : "=a" (a), "=d" (b));
|
asm volatile("rdtsc" : "=a" (a), "=d" (b));
|
||||||
ncycles = ((long long )a|(long long)b<<32);
|
ncycles = ((long long )a|(long long)b<<32);
|
||||||
/* Return the length of the string, negative value on failure */
|
/* Return the length of the string, negative value on failure */
|
||||||
return snprintf(fn,size,"out/AHA_%lx.out",ncycles);
|
return snprintf(fn,size,"AHA_%lx.dat",ncycles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -100,10 +102,10 @@ int create_filename(char *fn, int size){
|
||||||
* TODO clone system calls should be monitored true aiming to avoid disrupted
|
* TODO clone system calls should be monitored true aiming to avoid disrupted
|
||||||
* trees
|
* trees
|
||||||
*/
|
*/
|
||||||
void dump_execve(char __user *file, char __user *__user *argv,
|
char* dump_execve(char __user *file, char __user *__user *argv,
|
||||||
char __user *__user *env)
|
char __user *__user *env)
|
||||||
{
|
{
|
||||||
char *p, *a, *q;
|
char *p, *a, *q, *r;
|
||||||
struct openflags flg;
|
struct openflags flg;
|
||||||
int mode = 0644;
|
int mode = 0644;
|
||||||
int fd,cnt;
|
int fd,cnt;
|
||||||
|
@ -111,15 +113,19 @@ void dump_execve(char __user *file, char __user *__user *argv,
|
||||||
flg.w = 1;
|
flg.w = 1;
|
||||||
flg.c = 1;
|
flg.c = 1;
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
|
r = NULL;
|
||||||
p = kmalloc(MAX_DUMP_BUF,GFP_KERNEL);
|
p = kmalloc(MAX_DUMP_BUF,GFP_KERNEL);
|
||||||
q = kmalloc(MAX_DUMP_BUF, GFP_KERNEL);
|
q = kmalloc(MAX_DUMP_BUF, GFP_KERNEL);
|
||||||
if (p && q) {
|
r = kmalloc(MAX_DUMP_BUF,GFP_KERNEL);
|
||||||
if (create_filename(p,MAX_DUMP_BUF)<0)
|
if (p && q && r) {
|
||||||
return;
|
if (create_filename(r,MAX_DUMP_BUF)<0)
|
||||||
|
return NULL;
|
||||||
|
/* Go into output queue */
|
||||||
|
cnt=snprintf(p,MAX_DUMP_BUF,"out/%s",r);
|
||||||
|
if ((cnt<0) | (cnt>MAX_DUMP_BUF))
|
||||||
|
return NULL;
|
||||||
if ((fd = os_open_file(p,flg,mode))<0)
|
if ((fd = os_open_file(p,flg,mode))<0)
|
||||||
return;
|
return NULL;
|
||||||
|
|
||||||
/* Dump the file from execve */
|
/* Dump the file from execve */
|
||||||
if (strncpy_from_user(p,file,MAX_DUMP_BUF) > 0){
|
if (strncpy_from_user(p,file,MAX_DUMP_BUF) > 0){
|
||||||
|
@ -163,6 +169,37 @@ void dump_execve(char __user *file, char __user *__user *argv,
|
||||||
kfree(p);
|
kfree(p);
|
||||||
kfree(q);
|
kfree(q);
|
||||||
}
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
//TODO clean up files
|
||||||
|
void get_reply_message(char* key, struct ReplyMessage *msg)
|
||||||
|
{
|
||||||
|
int fd,size;
|
||||||
|
char filename[128];
|
||||||
|
filename[0]=0;
|
||||||
|
snprintf((char*)filename,128,"in/%s",key);
|
||||||
|
|
||||||
|
/* Give AHA the time to write the reply */
|
||||||
|
msleep_interruptible(50);
|
||||||
|
fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
|
||||||
|
if (fd <0){
|
||||||
|
printk("Could not open reply file: %s\n",filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = os_read_file(fd,msg,sizeof(struct ReplyMessage));
|
||||||
|
/* Make sure that we got a complete message */
|
||||||
|
if (size == sizeof(struct ReplyMessage)){
|
||||||
|
printk("AHA told me to ...\n");
|
||||||
|
printk("block %d\n",msg->block);
|
||||||
|
printk("exitcode: %d\n",msg->exitcode);
|
||||||
|
printk("substitue: %d\n",msg->substitue);
|
||||||
|
printk("insult:%d\n",msg->insult);
|
||||||
|
}else
|
||||||
|
printk("The message %s is corrupted. Got only %d bytes\n",filename,
|
||||||
|
size);
|
||||||
|
|
||||||
|
os_close_file(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
long sys_execve(char __user *file, char __user *__user *argv,
|
long sys_execve(char __user *file, char __user *__user *argv,
|
||||||
|
@ -170,9 +207,13 @@ long sys_execve(char __user *file, char __user *__user *argv,
|
||||||
{
|
{
|
||||||
long error;
|
long error;
|
||||||
char *filename;
|
char *filename;
|
||||||
|
struct ReplyMessage msg;
|
||||||
dump_execve(file,argv,env);
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
filename = dump_execve(file,argv,env);
|
||||||
|
if (filename){
|
||||||
|
get_reply_message(filename,&msg);
|
||||||
|
kfree(filename);
|
||||||
|
}
|
||||||
filename = getname(file);
|
filename = getname(file);
|
||||||
error = PTR_ERR(filename);
|
error = PTR_ERR(filename);
|
||||||
if (IS_ERR(filename)) goto out;
|
if (IS_ERR(filename)) goto out;
|
||||||
|
|
Loading…
Reference in a new issue