Browse code

BB#5412: Resource cleanup under error conditions

Shawn webb authored on 2012/07/04 05:15:28
Showing 1 changed files
... ...
@@ -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