* [gentoo-commits] proj/autodep:master commit in: logger/src/hook_lib/
@ 2011-07-08 17:11 Александр Берсенев
0 siblings, 0 replies; 2+ messages in thread
From: Александр Берсенев @ 2011-07-08 17:11 UTC (permalink / raw
To: gentoo-commits
commit: 8b5a9b27ad976cc5c4a160130512db633490d07a
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Fri Jul 8 23:11:25 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Fri Jul 8 23:11:25 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=8b5a9b27
fixed bugs with multithreading. Log more functions
---
logger/src/hook_lib/file_hook.c | 207 +++++++++++++++++++++++----------------
1 files changed, 121 insertions(+), 86 deletions(-)
diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c
index efe3c9c..93a7702 100644
--- a/logger/src/hook_lib/file_hook.c
+++ b/logger/src/hook_lib/file_hook.c
@@ -26,10 +26,11 @@
#define MAXENVSIZE 65536
#define MAXENVITEMSIZE 256
-#define MAXARGS 256
+#define MAXARGS 1024
//extern int errorno;
pthread_mutex_t socketblock = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t envblock = PTHREAD_MUTEX_INITIALIZER;
int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);
@@ -45,7 +46,6 @@ int (*_execv)(const char *path, char *const argv[]);
int (*_execvp)(const char *file, char *const argv[]);
int (*_execvpe)(const char *file, char *const argv[], char *const envp[]);
-//int (*_execl)(const char *path, const char *arg, ...);
int (*_fexecve)(int fd, char *const argv[], char *const envp[]);
@@ -103,20 +103,20 @@ void __doreconnect() {
// this fucnction executes when library is loaded
void _init() {
- char *log_socket_env=getenv("LOG_SOCKET");
+ char *log_socket_val=getenv("LOG_SOCKET");
- if(log_socket_env==NULL) {
+ if(log_socket_val==NULL) {
fprintf(stderr,"LOG_SOCKET environment variable isn't defined."
"Are this library launched by server?\n");
exit(1);
}
- if(strlen(log_socket_env)>=MAXSOCKETPATHLEN) {
+ if(strlen(log_socket_val)>=MAXSOCKETPATHLEN) {
fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name);
exit(1);
}
- strcpy(log_socket_name,log_socket_env);
+ strcpy(log_socket_name,log_socket_val);
if(getenv("LD_PRELOAD")==NULL) {
fprintf(stderr,"Unable to find LD_PRELOAD environment variable. "
@@ -142,8 +142,6 @@ void _init() {
_execvp = (int (*)(const char *file, char *const argv[])) dlsym(RTLD_NEXT, "execvp");
_execvpe = (int (*)(const char *file, char *const argv[], char *const envp[])) dlsym(RTLD_NEXT, "execvpe");
- //_execl =(int (*)(const char *path, const char *arg, ...)) dlsym(RTLD_NEXT, "execl");
-
_fexecve = (int (*)(int fd, char *const argv[], char *const envp[])) dlsym(RTLD_NEXT, "fexecve");
_system = (int (*)(const char *command)) dlsym(RTLD_NEXT, "system");
@@ -284,37 +282,42 @@ void __fixenvp(char *const envp[], char *envp_new[]) {
int ld_preload_valid=0;
int log_socket_valid=0;
int i;
- for(i=0;envp[i];i++){
- if(strncmp(envp[i],"LD_PRELOAD=",11)==0)
- if(strcmp(envp[i]+11,ld_preload_orig)==0)
- ld_preload_valid=1;
- if(strncmp(envp[i],"LOG_SOCKET=",11)==0)
- if(strcmp(envp[i]+11,log_socket_name)==0)
- log_socket_valid=1;
+// for(i=0;envp[i];i++){
+// if(strncmp(envp[i],"LD_PRELOAD=",11)==0)
+// if(strcmp(envp[i]+11,ld_preload_orig)==0)
+// ld_preload_valid=1;
+// if(strncmp(envp[i],"LOG_SOCKET=",11)==0)
+// if(strcmp(envp[i]+11,log_socket_name)==0)
+// log_socket_valid=1;
+// }
+ for(i=0; envp[i] && i<MAXENVSIZE-3; i++) {
+// if(strncmp(envp[i],"LD_PRELOAD=",11)==0) {
+ // envp_new[i]=malloc(1);//ld_preload_env;
+ //ld_preload_valid=1;
+// } else if(strncmp(envp[i],"LOG_SOCKET=",11)==0) {
+ //envp_new[i]=malloc(1);//log_socket_env;
+ //log_socket_valid=1;
+// } else {
+ envp_new[i]=envp[i];
+// }
+ //envp_new[i]=envp[i];
+// }
}
- if(!ld_preload_valid || !log_socket_valid) {
- for(i=0; envp[i] && i<MAXENVSIZE-3; i++) {
- if(strncmp(envp[i],"LD_PRELOAD=",11)==0) {
- envp_new[i]=ld_preload_env;
- ld_preload_valid=1;
- } else if(strncmp(envp[i],"LOG_SOCKET=",11)==0) {
- envp_new[i]=log_socket_env;
- log_socket_valid=1;
- } else {
- envp_new[i]=envp[i];
- }
- }
- if(!ld_preload_valid) {
- envp_new[i]=ld_preload_env;
- i++;
- }
- if(!log_socket_valid) {
- envp_new[i]=log_socket_env;
- i++;
- }
- envp_new[i]=NULL;
- }
+ //if(!ld_preload_valid) {
+ envp_new[i]=ld_preload_env;
+ i++;
+ //}
+ //if(!log_socket_valid) {
+ envp_new[i]=log_socket_env;
+ i++;
+ //}
+ envp_new[i]=NULL;
+
+ //envp_new[0]=NULL;
+ //envp_new[4]=ld_preload_env;
+ //envp_new[5]=log_socket_env;
+
}
/*
@@ -468,6 +471,7 @@ pid_t fork(void) {
return ret;
}
+
int execve(const char *filename, char *const argv[],
char *const envp[]) {
char *stage=__get_stage();
@@ -498,14 +502,26 @@ int execv(const char *path, char *const argv[]){
return -1;
}
- __fixenv();
if(access(path, F_OK)!=-1)
__log_event("read",path,"OK",0,stage);
else
__log_event("open",path,"ERR",2,stage);
+
+ // we can't just call __fixenv() here, it is not thread-safely
+ char **old_env=__environ;
+ char **new_env;
+
+ new_env=malloc(MAXENVSIZE * sizeof(char *));
+ __fixenvp(__environ,new_env);
+ __environ=new_env;
+
+ _execv(path,argv);
+
+ free(new_env);
+ __environ=old_env;
- return _execv(path,argv);
+ return -1;
}
int execvp(const char *file, char *const argv[]){
@@ -526,10 +542,20 @@ int execvp(const char *file, char *const argv[]){
// TODO: may me repeat bash's PATH parsing logic here
}
- __fixenv();
+ // we can't just call __fixenv() here, it is not thread-safely
+ char **old_env=__environ;
+ char **new_env;
+ new_env=malloc(MAXENVSIZE * sizeof(char *));
+ __fixenvp(__environ,new_env);
+ __environ=new_env;
+
+ _execvp(file,argv);
+
+ free(new_env);
+ __environ=old_env;
- return _execvp(file,argv);
+ return -1;
}
int execvpe(const char *file, char *const argv[],
@@ -566,13 +592,19 @@ int execl(const char *path, const char *arg, ...){
return -1;
}
- __fixenv();
-
if(access(path, F_OK)!=-1)
__log_event("read",path,"OK",0,stage);
else
__log_event("open",path,"ERR",2,stage);
-
+
+ // we can't just call __fixenv() here, it is not thread-safely
+ char **old_env=__environ;
+ char **new_env;
+
+ new_env=malloc(MAXENVSIZE * sizeof(char *));
+ __fixenvp(__environ,new_env);
+ __environ=new_env;
+
va_list ap;
char * argv[MAXARGS+1];
int i=0;
@@ -584,7 +616,13 @@ int execl(const char *path, const char *arg, ...){
}
argv[i]=NULL;
va_end(ap);
- return _execv(path,argv);
+
+ _execv(path,argv);
+
+ free(new_env);
+ __environ=old_env;
+
+ return -1;
}
int execlp(const char *file, const char *arg, ...) {
@@ -603,7 +641,13 @@ int execlp(const char *file, const char *arg, ...) {
// TODO: may me repeat bash's PATH parsing logic here
}
- __fixenv();
+ // we can't just call __fixenv() here, it is not thread-safely
+ char **old_env=__environ;
+ char **new_env;
+
+ new_env=malloc(MAXENVSIZE * sizeof(char *));
+ __fixenvp(__environ,new_env);
+ __environ=new_env;
va_list ap;
char * argv[MAXARGS+1];
@@ -617,7 +661,12 @@ int execlp(const char *file, const char *arg, ...) {
argv[i]=NULL;
va_end(ap);
- return _execvp(file,argv);
+ _execvp(file,argv);
+ free(new_env);
+ __environ=old_env;
+
+ return -1;
+
}
int execle(const char *path, const char *arg, ... ){
@@ -651,52 +700,38 @@ int execle(const char *path, const char *arg, ... ){
return _execve(path,argv,envp_new);
}
-
-
-/*
int fexecve(int fd, char *const argv[], char *const envp[]) {
- fprintf(stderr,"fexecuting pid=%d",getpid());
- fflush(stderr);
-
- int ret=_fexecve(fd, argv, envp);
- return ret;
-}
-
-int execle(const char *path, const char *arg, ...) {
- fprintf(stderr,"fexecluting pid=%d",getpid());
- fflush(stderr);
-//
- return 0;
-}
-
-
-
-
+ char *stage=__get_stage();
+ char *envp_new[MAXENVSIZE];
+ __fixenvp(envp,envp_new);
+
+ char filename[MAXPATHLEN];
+ ssize_t path_size=__get_path_by_fd(fd,filename,MAXPATHLEN);
+ if(path_size==-1)
+ return _fexecve(fd, argv, envp_new);
+
+ if(! __is_event_allowed("open",filename,stage)) {
+ __log_event("open",filename,"DENIED",errno,stage);
+ errno=2; // not found
+ return -1;
+ }
-int execlp(const char *file, const char *arg, ...){
- fprintf(stderr,"execlpeting 1 pid=%d",getpid());
- fflush(stderr);
-//
- return 0;
+ if(access(filename, F_OK)!=-1)
+ __log_event("read",filename,"OK",0,stage);
+ else
+ __log_event("open",filename,"ERR",2,stage);
+
+ return _fexecve(fd, argv, envp_new);
}
-int rexec(char **ahost, int inport, char *user,
- char *passwd, char *cmd, int *fd2p){
- fprintf(stderr,"rexec 1 pid=%d",getpid());
- fflush(stderr);
-//
- return 0;
-}
-
int system(const char *command) {
- fprintf(stderr,"rexec 1 pid=%d cmd=%s",getpid(),command);
- fflush(stderr);
-
- return _system(command);
- return 0;
+ __fixenv();
+
+ int ret=_system(command);
-}*/
+ return ret;
+}
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [gentoo-commits] proj/autodep:master commit in: logger/src/hook_lib/
@ 2011-07-13 12:32 Александр Берсенев
0 siblings, 0 replies; 2+ messages in thread
From: Александр Берсенев @ 2011-07-13 12:32 UTC (permalink / raw
To: gentoo-commits
commit: c934321f619596fb82f300fe44d4f040a3eeae5a
Author: root <root <AT> BAYsGentooNotebook <DOT> usu <DOT> local>
AuthorDate: Wed Jul 13 18:31:40 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Wed Jul 13 18:31:40 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=c934321f
mmap handling
---
logger/src/hook_lib/file_hook.c | 73 +++++++++++++++++----------------------
1 files changed, 32 insertions(+), 41 deletions(-)
diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c
index 93a7702..22e56f5 100644
--- a/logger/src/hook_lib/file_hook.c
+++ b/logger/src/hook_lib/file_hook.c
@@ -15,6 +15,7 @@
#include <bits/fcntl.h>
#include <bits/stat.h>
+#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -41,6 +42,10 @@ ssize_t (*_write)(int fd, const void *buf, size_t count);
size_t (*_fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t (*_fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
+void *(*_mmap)(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset);
+
+
int (*_execve)(const char *filename, char *const argv[],char *const envp[]);
int (*_execv)(const char *path, char *const argv[]);
int (*_execvp)(const char *file, char *const argv[]);
@@ -48,8 +53,6 @@ int (*_execvpe)(const char *file, char *const argv[], char *const envp[]);
int (*_fexecve)(int fd, char *const argv[], char *const envp[]);
-
-
int (*_system)(const char *command);
pid_t (*_fork)();
@@ -134,6 +137,10 @@ void _init() {
_read= (ssize_t (*)(int fd, void *buf, size_t count)) dlsym(RTLD_NEXT, "read");
_write= (ssize_t (*)(int fd, const void *buf, size_t count)) dlsym(RTLD_NEXT, "write");
+
+ _mmap=(void* (*)(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset)) dlsym(RTLD_NEXT, "mmap");
+
_fork = (pid_t (*)()) dlsym(RTLD_NEXT, "fork");
@@ -153,7 +160,7 @@ void _init() {
if(_open==NULL || _open64==NULL ||
_fopen==NULL || _fopen64==NULL ||
- _read==NULL || _write==NULL ||
+ _read==NULL || _write==NULL || _mmap==NULL ||
_fork==NULL ||
_execve==NULL || _execv==NULL || _execvp==NULL || _execvpe==NULL ||
_fexecve==NULL || _system==NULL || _setenv==NULL || _close==NULL) {
@@ -266,8 +273,6 @@ static int __is_event_allowed(const char *event_type,const char *filename, char*
return 0;
}
-
-
void __fixenv() {
_setenv("LOG_SOCKET",log_socket_name,1);
_setenv("LD_PRELOAD",ld_preload_orig,1);
@@ -279,45 +284,19 @@ void __fixenv() {
* Fixes LD_PRELOAD and LOG_SOCKET in envp and puts modified value in envp_new
*/
void __fixenvp(char *const envp[], char *envp_new[]) {
- int ld_preload_valid=0;
- int log_socket_valid=0;
int i;
-// for(i=0;envp[i];i++){
-// if(strncmp(envp[i],"LD_PRELOAD=",11)==0)
-// if(strcmp(envp[i]+11,ld_preload_orig)==0)
-// ld_preload_valid=1;
-// if(strncmp(envp[i],"LOG_SOCKET=",11)==0)
-// if(strcmp(envp[i]+11,log_socket_name)==0)
-// log_socket_valid=1;
-// }
+ int j=0;
for(i=0; envp[i] && i<MAXENVSIZE-3; i++) {
-// if(strncmp(envp[i],"LD_PRELOAD=",11)==0) {
- // envp_new[i]=malloc(1);//ld_preload_env;
- //ld_preload_valid=1;
-// } else if(strncmp(envp[i],"LOG_SOCKET=",11)==0) {
- //envp_new[i]=malloc(1);//log_socket_env;
- //log_socket_valid=1;
-// } else {
- envp_new[i]=envp[i];
-// }
- //envp_new[i]=envp[i];
-// }
+ if(strncmp(envp[i],"LD_PRELOAD=",11)==0)
+ continue;
+ if(strncmp(envp[i],"LOG_SOCKET=",11)==0)
+ continue;
+ envp_new[j++]=envp[i];
}
- //if(!ld_preload_valid) {
- envp_new[i]=ld_preload_env;
- i++;
- //}
- //if(!log_socket_valid) {
- envp_new[i]=log_socket_env;
- i++;
- //}
- envp_new[i]=NULL;
-
- //envp_new[0]=NULL;
- //envp_new[4]=ld_preload_env;
- //envp_new[5]=log_socket_env;
-
+ envp_new[j++]=ld_preload_env;
+ envp_new[j++]=log_socket_env;
+ envp_new[j]=NULL;
}
/*
@@ -733,7 +712,19 @@ int system(const char *command) {
return ret;
}
-
+void *mmap(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset) {
+ void *ret=_mmap(addr,length,prot,flags,fd,offset);
+ char filename[MAXPATHLEN];
+ if(fd!=-1 && __get_path_by_fd(fd,filename,MAXPATHLEN)!=-1) {
+ char *stage=__get_stage();
+ if(prot & PROT_READ || prot & PROT_EXEC)
+ __log_event("read",filename,"OK",0,stage);
+ if(prot & PROT_WRITE)
+ __log_event("write",filename,"OK",0,stage);
+ }
+ return ret;
+}
int setenv(const char *name, const char *value, int overwrite) {
//printf (" CHANGING name: %s, value: %s",name,value);
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-07-13 12:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-13 12:32 [gentoo-commits] proj/autodep:master commit in: logger/src/hook_lib/ Александр Берсенев
-- strict thread matches above, loose matches on Subject: below --
2011-07-08 17:11 Александр Берсенев
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox