... | ... |
@@ -77,6 +77,12 @@ |
77 | 77 |
static pthread_mutex_t virusaction_lock = PTHREAD_MUTEX_INITIALIZER; |
78 | 78 |
static pthread_mutex_t detstats_lock = PTHREAD_MUTEX_INITIALIZER; |
79 | 79 |
|
80 |
+static void xfree(void *p) |
|
81 |
+{ |
|
82 |
+ if (p) |
|
83 |
+ free(p); |
|
84 |
+} |
|
85 |
+ |
|
80 | 86 |
#ifdef _WIN32 |
81 | 87 |
void |
82 | 88 |
virusaction (const char *filename, const char *virname, |
... | ... |
@@ -97,7 +103,7 @@ virusaction (const char *filename, const char *virname, |
97 | 97 |
{ |
98 | 98 |
pid_t pid; |
99 | 99 |
const struct optstruct *opt; |
100 |
- char *buffer_file, *buffer_vir, *buffer_cmd; |
|
100 |
+ char *buffer_file, *buffer_vir, *buffer_cmd, *path; |
|
101 | 101 |
const char *pt; |
102 | 102 |
size_t i, j, v = 0, len; |
103 | 103 |
char *env[4]; |
... | ... |
@@ -105,7 +111,8 @@ virusaction (const char *filename, const char *virname, |
105 | 105 |
if (!(opt = optget (opts, "VirusEvent"))->enabled) |
106 | 106 |
return; |
107 | 107 |
|
108 |
- env[0] = getenv ("PATH"); |
|
108 |
+ path = getenv ("PATH"); |
|
109 |
+ env[0] = path ? strdup(path) : NULL; |
|
109 | 110 |
j = env[0] ? 1 : 0; |
110 | 111 |
/* Allocate env vars.. to be portable env vars should not be freed */ |
111 | 112 |
buffer_file = |
... | ... |
@@ -136,8 +143,10 @@ virusaction (const char *filename, const char *virname, |
136 | 136 |
(char *) calloc (len + v * strlen (virname) + 1, sizeof (char)); |
137 | 137 |
if (!buffer_cmd) |
138 | 138 |
{ |
139 |
- free (buffer_file); |
|
140 |
- free (buffer_vir); |
|
139 |
+ xfree(path); |
|
140 |
+ |
|
141 |
+ xfree (buffer_file); |
|
142 |
+ xfree (buffer_vir); |
|
141 | 143 |
return; |
142 | 144 |
} |
143 | 145 |
for (i = 0, j = 0; i < len; i++) |
... | ... |
@@ -157,7 +166,7 @@ virusaction (const char *filename, const char *virname, |
157 | 157 |
pthread_mutex_lock (&virusaction_lock); |
158 | 158 |
/* We can only call async-signal-safe functions after fork(). */ |
159 | 159 |
pid = fork (); |
160 |
- if (!pid) |
|
160 |
+ if (pid == 0) |
|
161 | 161 |
{ /* child */ |
162 | 162 |
exit (execle ("/bin/sh", "sh", "-c", buffer_cmd, NULL, env)); |
163 | 163 |
} |
... | ... |
@@ -168,11 +177,14 @@ virusaction (const char *filename, const char *virname, |
168 | 168 |
} |
169 | 169 |
else |
170 | 170 |
{ |
171 |
+ pthread_mutex_unlock(&virusaction_lock); |
|
171 | 172 |
logg ("!VirusEvent: fork failed.\n"); |
172 | 173 |
} |
173 |
- free (buffer_cmd); |
|
174 |
- free (buffer_file); |
|
175 |
- free (buffer_vir); |
|
174 |
+ xfree(path); |
|
175 |
+ |
|
176 |
+ xfree (buffer_cmd); |
|
177 |
+ xfree (buffer_file); |
|
178 |
+ xfree (buffer_vir); |
|
176 | 179 |
} |
177 | 180 |
#endif /* _WIN32 */ |
178 | 181 |
|