|
|
@ -90,61 +90,67 @@ void virusaction(const char *filename, const char *virname, const struct cfgstru |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
|
|
|
|
|
|
|
|
void virusaction(const char *filename, const char *virname, const struct cfgstruct *copt) |
|
|
|
void virusaction(const char *filename, const char *virname, const struct cfgstruct *copt) |
|
|
|
{ |
|
|
|
{ |
|
|
|
pid_t pid; |
|
|
|
pid_t pid; |
|
|
|
const struct cfgstruct *cpt; |
|
|
|
const struct cfgstruct *cpt; |
|
|
|
|
|
|
|
char *buffer, *pt, *cmd, *buffer_file, *buffer_vir; |
|
|
|
|
|
|
|
size_t j; |
|
|
|
|
|
|
|
char *env[4]; |
|
|
|
|
|
|
|
|
|
|
|
if(!(cpt = cfgopt(copt, "VirusEvent"))->enabled) |
|
|
|
if(!(cpt = cfgopt(copt, "VirusEvent"))->enabled) |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
/* NB: we need to fork here since this function modifies the environment.
|
|
|
|
env[0] = getenv("PATH"); |
|
|
|
(Modifications to the env. are not reentrant, but we need to be.) */ |
|
|
|
j = env[0] ? 1 : 0; |
|
|
|
pid = fork(); |
|
|
|
/* Allocate env vars.. to be portable env vars should not be freed */ |
|
|
|
|
|
|
|
buffer_file = (char *) malloc(strlen(ENV_FILE) + strlen(filename) + 2); |
|
|
|
|
|
|
|
if(buffer_file) { |
|
|
|
|
|
|
|
sprintf(buffer_file, "%s=%s", ENV_FILE, filename); |
|
|
|
|
|
|
|
env[j++] = buffer_file; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ( pid == 0 ) { |
|
|
|
buffer_vir = (char *) malloc(strlen(ENV_VIRUS) + strlen(virname) + 2); |
|
|
|
/* child... */ |
|
|
|
if(buffer_vir) { |
|
|
|
char *buffer, *pt, *cmd; |
|
|
|
sprintf(buffer_vir, "%s=%s", ENV_VIRUS, virname); |
|
|
|
|
|
|
|
env[j++] = buffer_vir; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
env[j++] = NULL; |
|
|
|
|
|
|
|
|
|
|
|
cmd = strdup(cpt->strarg); |
|
|
|
cmd = strdup(cpt->strarg); |
|
|
|
|
|
|
|
|
|
|
|
if(cmd && (pt = strstr(cmd, "%v"))) { |
|
|
|
if(cmd && (pt = strstr(cmd, "%v"))) { |
|
|
|
buffer = (char *) malloc(strlen(cmd) + strlen(virname) + 10); |
|
|
|
buffer = (char *) malloc(strlen(cmd) + strlen(virname) + 10); |
|
|
|
if(buffer) { |
|
|
|
if(buffer) { |
|
|
|
*pt = 0; pt += 2; |
|
|
|
*pt = 0; pt += 2; |
|
|
|
strcpy(buffer, cmd); |
|
|
|
strcpy(buffer, cmd); |
|
|
|
strcat(buffer, virname); |
|
|
|
strcat(buffer, virname); |
|
|
|
strcat(buffer, pt); |
|
|
|
strcat(buffer, pt); |
|
|
|
free(cmd); |
|
|
|
free(cmd); |
|
|
|
cmd = strdup(buffer); |
|
|
|
cmd = strdup(buffer); |
|
|
|
free(buffer); |
|
|
|
free(buffer); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Allocate env vars.. to be portable env vars should not be freed */ |
|
|
|
|
|
|
|
buffer = (char *) malloc(strlen(ENV_FILE) + strlen(filename) + 2); |
|
|
|
|
|
|
|
if(buffer) { |
|
|
|
|
|
|
|
sprintf(buffer, "%s=%s", ENV_FILE, filename); |
|
|
|
|
|
|
|
putenv(buffer); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
buffer = (char *) malloc(strlen(ENV_VIRUS) + strlen(virname) + 2); |
|
|
|
if(!cmd) |
|
|
|
if(buffer) { |
|
|
|
return; |
|
|
|
sprintf(buffer, "%s=%s", ENV_VIRUS, virname); |
|
|
|
/* We can only call async-signal-safe functions after fork(). */ |
|
|
|
putenv(buffer); |
|
|
|
pid = fork(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( pid == 0 ) { |
|
|
|
|
|
|
|
/* child... */ |
|
|
|
|
|
|
|
/* WARNING: this is uninterruptable ! */ |
|
|
|
|
|
|
|
exit(execle("/bin/sh", "sh", "-c", cmd, NULL, env)); |
|
|
|
|
|
|
|
} else if (pid > 0) { |
|
|
|
|
|
|
|
/* parent */ |
|
|
|
|
|
|
|
waitpid(pid, NULL, 0); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
/* error.. */ |
|
|
|
|
|
|
|
logg("!VirusAction: fork failed.\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
/* WARNING: this is uninterruptable ! */ |
|
|
|
free(cmd); |
|
|
|
if(cmd) |
|
|
|
free(buffer_file); |
|
|
|
exit(system(cmd)); |
|
|
|
free(buffer_vir); |
|
|
|
|
|
|
|
|
|
|
|
} else if (pid > 0) { |
|
|
|
|
|
|
|
/* parent */
|
|
|
|
|
|
|
|
waitpid(pid, NULL, 0); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
/* error.. */ |
|
|
|
|
|
|
|
logg("!VirusAction: fork failed.\n"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
#endif /* C_WINDOWS */ |
|
|
|
#endif /* C_WINDOWS */ |
|
|
|
|
|
|
|
|
|
|
|