public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [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-08 17:11 [gentoo-commits] proj/autodep:master commit in: logger/src/hook_lib/ Александр Берсенев
  -- strict thread matches above, loose matches on Subject: below --
2011-07-13 12:32 Александр Берсенев

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox