/**
* Loco program runner core
* Copyright (C) 2011 Lodevil(Du Jiong)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "access.h"
#include
#include
#include
#include
#include
int fileAccess(PyObject *files, const char *file, long flags) {
PyObject *perm_obj;
long perm;
if ((perm_obj = PyDict_GetItemString(files, file)) == NULL) {
return 0;
}
//printf("%s:%d\n",file,flags);
perm = PyLong_AsLong(perm_obj);
if (perm == flags)
return 1;
return 0;
}
static long file_temp[100];
int checkAccess(struct Runobj *runobj, int pid, struct user_regs_struct *regs) {
#if __WORDSIZE == 64
if (!runobj->inttable[regs->orig_rax])
#else
if (!runobj->inttable[regs->orig_eax])
#endif
return ACCESS_CALL_ERR;
#if __WORDSIZE == 64
switch (regs->orig_rax)
#else
switch (regs->orig_eax)
#endif
{
case SYS_open: {
int i, j;
for (i = 0; i < 100; i++) {
#if __WORDSIZE == 64
long t = ptrace(PTRACE_PEEKDATA, pid,
regs->rdi + i * sizeof(long), NULL);
#else
long t = ptrace(PTRACE_PEEKDATA, pid, regs->ebx + i*sizeof(long), NULL);
#endif
file_temp[i] = t;
const char* test = (const char*) &file_temp[i];
for (j = 0; j < sizeof(long); j++) {
if (!test[j]) {
goto l_cont;
}
}
}
l_cont: file_temp[99] = 0;
#if __WORDSIZE == 64
if (fileAccess(runobj->files, (const char *) file_temp, regs->rsi))
#else
if(fileAccess(runobj->files, (const char *)file_temp, regs->ecx))
#endif
return ACCESS_OK;
return ACCESS_FILE_ERR;
}
}
return ACCESS_OK;
}
const char* lastFileAccess(void) {
file_temp[99] = 0;
return (const char*) file_temp;
}