git-svn: trunk@4768
Török Edvin authored on 2009/02/13 06:14:45... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Thu Feb 12 22:33:30 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * clamd/clamd.c, clamd/server-th.c: Unify error paths. Remove unix |
|
4 |
+ socket we created if startup fails due to invalid config. |
|
5 |
+ |
|
1 | 6 |
Thu Feb 12 21:47:27 EET 2009 (edwin) |
2 | 7 |
------------------------------------ |
3 | 8 |
* shared/getopt.c: fix |
... | ... |
@@ -89,7 +89,7 @@ static void help(void) |
89 | 89 |
static struct optstruct *opts; |
90 | 90 |
/* needs to be global, so that valgrind reports it as reachable, and not |
91 | 91 |
* as definetely/indirectly lost when daemonizing clamd */ |
92 |
-static struct cl_engine *engine; |
|
92 |
+static struct cl_engine *engine = NULL; |
|
93 | 93 |
int main(int argc, char **argv) |
94 | 94 |
{ |
95 | 95 |
const struct optstruct *opt; |
... | ... |
@@ -208,30 +208,29 @@ int main(int argc, char **argv) |
208 | 208 |
logg_size = optget(opts, "LogFileMaxSize")->numarg; |
209 | 209 |
logg_verbose = mprintf_verbose = optget(opts, "LogVerbose")->enabled; |
210 | 210 |
|
211 |
+ do { /* logger initialized */ |
|
212 |
+ |
|
211 | 213 |
if((opt = optget(opts, "LogFile"))->enabled) { |
212 | 214 |
char timestr[32]; |
213 | 215 |
logg_file = opt->strarg; |
214 | 216 |
if(strlen(logg_file) < 2 || (logg_file[0] != '/' && logg_file[0] != '\\' && logg_file[1] != ':')) { |
215 | 217 |
fprintf(stderr, "ERROR: LogFile requires full path.\n"); |
216 |
- logg_close(); |
|
217 |
- optfree(opts); |
|
218 |
- return 1; |
|
218 |
+ ret = 1; |
|
219 |
+ break; |
|
219 | 220 |
} |
220 | 221 |
time(&currtime); |
221 | 222 |
if(logg("#+++ Started at %s", cli_ctime(&currtime, timestr, sizeof(timestr)))) { |
222 | 223 |
fprintf(stderr, "ERROR: Can't initialize the internal logger\n"); |
223 |
- logg_close(); |
|
224 |
- optfree(opts); |
|
225 |
- return 1; |
|
224 |
+ ret = 1; |
|
225 |
+ break; |
|
226 | 226 |
} |
227 | 227 |
} else |
228 | 228 |
logg_file = NULL; |
229 | 229 |
|
230 | 230 |
if((ret = cl_init(CL_INIT_DEFAULT))) { |
231 | 231 |
logg("!Can't initialize libclamav: %s\n", cl_strerror(ret)); |
232 |
- logg_close(); |
|
233 |
- optfree(opts); |
|
234 |
- return 1; |
|
232 |
+ ret = 1; |
|
233 |
+ break; |
|
235 | 234 |
} |
236 | 235 |
|
237 | 236 |
if(optget(opts, "Debug")->enabled) /* enable debug messages in libclamav */ |
... | ... |
@@ -244,9 +243,8 @@ int main(int argc, char **argv) |
244 | 244 |
opt = optget(opts, "LogFacility"); |
245 | 245 |
if((fac = logg_facility(opt->strarg)) == -1) { |
246 | 246 |
logg("!LogFacility: %s: No such facility.\n", opt->strarg); |
247 |
- logg_close(); |
|
248 |
- optfree(opts); |
|
249 |
- return 1; |
|
247 |
+ ret = 1; |
|
248 |
+ break; |
|
250 | 249 |
} |
251 | 250 |
|
252 | 251 |
openlog("clamd", LOG_PID, fac); |
... | ... |
@@ -270,9 +268,8 @@ int main(int argc, char **argv) |
270 | 270 |
|
271 | 271 |
if(!tcpsock && !localsock) { |
272 | 272 |
logg("!Please define server type (local and/or TCP).\n"); |
273 |
- logg_close(); |
|
274 |
- optfree(opts); |
|
275 |
- return 1; |
|
273 |
+ ret = 1; |
|
274 |
+ break; |
|
276 | 275 |
} |
277 | 276 |
|
278 | 277 |
logg("#clamd daemon %s (OS: "TARGET_OS_TYPE", ARCH: "TARGET_ARCH_TYPE", CPU: "TARGET_CPU_TYPE")\n", get_version()); |
... | ... |
@@ -291,16 +288,14 @@ int main(int argc, char **argv) |
291 | 291 |
max_port = optget(opts, "StreamMaxPort")->numarg; |
292 | 292 |
if (min_port < 1024 || min_port > max_port || max_port > 65535) { |
293 | 293 |
logg("!Invalid StreaMinPort/StreamMaxPort: %d, %d\n", min_port, max_port); |
294 |
- logg_close(); |
|
295 |
- optfree(opts); |
|
296 |
- return 1; |
|
294 |
+ ret = 1; |
|
295 |
+ break; |
|
297 | 296 |
} |
298 | 297 |
|
299 | 298 |
if(!(engine = cl_engine_new())) { |
300 | 299 |
logg("!Can't initialize antivirus engine\n"); |
301 |
- logg_close(); |
|
302 |
- optfree(opts); |
|
303 |
- return 1; |
|
300 |
+ ret = 1; |
|
301 |
+ break; |
|
304 | 302 |
} |
305 | 303 |
|
306 | 304 |
/* load the database(s) */ |
... | ... |
@@ -317,10 +312,9 @@ int main(int argc, char **argv) |
317 | 317 |
while(opt) { |
318 | 318 |
if(!(pua_cats = realloc(pua_cats, i + strlen(opt->strarg) + 3))) { |
319 | 319 |
logg("!Can't allocate memory for pua_cats\n"); |
320 |
- logg_close(); |
|
321 |
- optfree(opts); |
|
322 | 320 |
cl_engine_free(engine); |
323 |
- return 1; |
|
321 |
+ ret = 1; |
|
322 |
+ break; |
|
324 | 323 |
} |
325 | 324 |
logg("# %s", opt->strarg); |
326 | 325 |
sprintf(pua_cats + i, ".%s", opt->strarg); |
... | ... |
@@ -328,6 +322,8 @@ int main(int argc, char **argv) |
328 | 328 |
pua_cats[i] = 0; |
329 | 329 |
opt = opt->nextarg; |
330 | 330 |
} |
331 |
+ if (ret) |
|
332 |
+ break; |
|
331 | 333 |
logg("#\n"); |
332 | 334 |
pua_cats[i] = '.'; |
333 | 335 |
pua_cats[i + 1] = 0; |
... | ... |
@@ -336,11 +332,9 @@ int main(int argc, char **argv) |
336 | 336 |
if((opt = optget(opts, "IncludePUA"))->enabled) { |
337 | 337 |
if(pua_cats) { |
338 | 338 |
logg("!ExcludePUA and IncludePUA cannot be used at the same time\n"); |
339 |
- logg_close(); |
|
340 |
- optfree(opts); |
|
341 | 339 |
free(pua_cats); |
342 |
- cl_engine_free(engine); |
|
343 |
- return 1; |
|
340 |
+ ret = 1; |
|
341 |
+ break; |
|
344 | 342 |
} |
345 | 343 |
dboptions |= CL_DB_PUA_INCLUDE; |
346 | 344 |
i = 0; |
... | ... |
@@ -348,10 +342,8 @@ int main(int argc, char **argv) |
348 | 348 |
while(opt) { |
349 | 349 |
if(!(pua_cats = realloc(pua_cats, i + strlen(opt->strarg) + 3))) { |
350 | 350 |
logg("!Can't allocate memory for pua_cats\n"); |
351 |
- logg_close(); |
|
352 |
- optfree(opts); |
|
353 |
- cl_engine_free(engine); |
|
354 |
- return 1; |
|
351 |
+ ret = 1; |
|
352 |
+ break; |
|
355 | 353 |
} |
356 | 354 |
logg("# %s", opt->strarg); |
357 | 355 |
sprintf(pua_cats + i, ".%s", opt->strarg); |
... | ... |
@@ -359,6 +351,8 @@ int main(int argc, char **argv) |
359 | 359 |
pua_cats[i] = 0; |
360 | 360 |
opt = opt->nextarg; |
361 | 361 |
} |
362 |
+ if (ret) |
|
363 |
+ break; |
|
362 | 364 |
logg("#\n"); |
363 | 365 |
pua_cats[i] = '.'; |
364 | 366 |
pua_cats[i + 1] = 0; |
... | ... |
@@ -367,11 +361,9 @@ int main(int argc, char **argv) |
367 | 367 |
if(pua_cats) { |
368 | 368 |
if((ret = cl_engine_set(engine, CL_ENGINE_PUA_CATEGORIES, pua_cats))) { |
369 | 369 |
logg("!cli_engine_set(CL_ENGINE_PUA_CATEGORIES) failed: %s\n", cl_strerror(ret)); |
370 |
- logg_close(); |
|
371 |
- optfree(opts); |
|
372 | 370 |
free(pua_cats); |
373 |
- cl_engine_free(engine); |
|
374 |
- return 1; |
|
371 |
+ ret = 1; |
|
372 |
+ break; |
|
375 | 373 |
} |
376 | 374 |
free(pua_cats); |
377 | 375 |
} |
... | ... |
@@ -383,10 +375,8 @@ int main(int argc, char **argv) |
383 | 383 |
if((opt = optget(opts, "TemporaryDirectory"))->enabled) { |
384 | 384 |
if((ret = cl_engine_set(engine, CL_ENGINE_TMPDIR, opt->strarg))) { |
385 | 385 |
logg("!cli_engine_set(CL_ENGINE_TMPDIR) failed: %s\n", cl_strerror(ret)); |
386 |
- logg_close(); |
|
387 |
- optfree(opts); |
|
388 |
- cl_engine_free(engine); |
|
389 |
- return 1; |
|
386 |
+ ret = 1; |
|
387 |
+ break; |
|
390 | 388 |
} |
391 | 389 |
} |
392 | 390 |
|
... | ... |
@@ -419,19 +409,15 @@ int main(int argc, char **argv) |
419 | 419 |
|
420 | 420 |
if((ret = cl_load(dbdir, engine, &sigs, dboptions))) { |
421 | 421 |
logg("!%s\n", cl_strerror(ret)); |
422 |
- logg_close(); |
|
423 |
- optfree(opts); |
|
424 |
- cl_engine_free(engine); |
|
425 |
- return 1; |
|
422 |
+ ret = 1; |
|
423 |
+ break; |
|
426 | 424 |
} |
427 | 425 |
|
428 | 426 |
logg("#Loaded %u signatures.\n", sigs); |
429 | 427 |
if((ret = cl_engine_compile(engine)) != 0) { |
430 | 428 |
logg("!Database initialization error: %s\n", cl_strerror(ret)); |
431 |
- logg_close(); |
|
432 |
- optfree(opts); |
|
433 |
- cl_engine_free(engine); |
|
434 |
- return 1; |
|
429 |
+ ret = 1; |
|
430 |
+ break; |
|
435 | 431 |
} |
436 | 432 |
|
437 | 433 |
if(tcpsock) { |
... | ... |
@@ -440,31 +426,21 @@ int main(int argc, char **argv) |
440 | 440 |
|
441 | 441 |
if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) { |
442 | 442 |
logg("!Error at WSAStartup(): %d\n", WSAGetLastError()); |
443 |
- logg_close(); |
|
444 |
- optfree(opts); |
|
445 |
- cl_engine_free(engine); |
|
446 |
- return 1; |
|
443 |
+ ret = 1; |
|
444 |
+ break; |
|
447 | 445 |
} |
448 | 446 |
#endif |
449 |
- lsockets[nlsockets] = tcpserver(opts); |
|
450 |
- if(lsockets[nlsockets] == -1) { |
|
451 |
- logg_close(); |
|
452 |
- optfree(opts); |
|
453 |
- cl_engine_free(engine); |
|
454 |
- return 1; |
|
447 |
+ if ((lsockets[nlsockets] = tcpserver(opts)) == -1) { |
|
448 |
+ ret = 1; |
|
449 |
+ break; |
|
455 | 450 |
} |
456 | 451 |
nlsockets++; |
457 | 452 |
} |
458 | 453 |
|
459 | 454 |
if(localsock) { |
460 |
- lsockets[nlsockets] = localserver(opts); |
|
461 |
- if(lsockets[nlsockets] == -1) { |
|
462 |
- logg_close(); |
|
463 |
- optfree(opts); |
|
464 |
- if(tcpsock) |
|
465 |
- closesocket(lsockets[0]); |
|
466 |
- cl_engine_free(engine); |
|
467 |
- return 1; |
|
455 |
+ if ((lsockets[nlsockets] = localserver(opts)) == -1) { |
|
456 |
+ ret = 1; |
|
457 |
+ break; |
|
468 | 458 |
} |
469 | 459 |
nlsockets++; |
470 | 460 |
} |
... | ... |
@@ -479,10 +455,8 @@ int main(int argc, char **argv) |
479 | 479 |
#endif |
480 | 480 |
if(daemonize() == -1) { |
481 | 481 |
logg("!daemonize() failed\n"); |
482 |
- logg_close(); |
|
483 |
- optfree(opts); |
|
484 |
- cl_engine_free(engine); |
|
485 |
- return 1; |
|
482 |
+ ret = 1; |
|
483 |
+ break; |
|
486 | 484 |
} |
487 | 485 |
#ifdef C_BSD |
488 | 486 |
for(ret=0;ret<nlsockets;ret++) { |
... | ... |
@@ -496,9 +470,25 @@ int main(int argc, char **argv) |
496 | 496 |
} else |
497 | 497 |
foreground = 1; |
498 | 498 |
|
499 |
- |
|
500 | 499 |
ret = recvloop_th(lsockets, nlsockets, engine, dboptions, opts); |
501 | 500 |
|
501 |
+ } while (0); |
|
502 |
+ |
|
503 |
+ logg("*Closing the main socket%s.\n", (nlsockets > 1) ? "s" : ""); |
|
504 |
+ |
|
505 |
+ for (i = 0; i < nlsockets; i++) { |
|
506 |
+ closesocket(socketds[i]); |
|
507 |
+ } |
|
508 |
+ |
|
509 |
+#ifndef C_OS2 |
|
510 |
+ if(localsock && nlsockets) { |
|
511 |
+ if(unlink(opt->strarg) == -1) |
|
512 |
+ logg("!Can't unlink the socket file %s\n", opt->strarg); |
|
513 |
+ else |
|
514 |
+ logg("Socket file removed.\n"); |
|
515 |
+ } |
|
516 |
+#endif |
|
517 |
+ |
|
502 | 518 |
#ifdef C_WINDOWS |
503 | 519 |
if(tcpsock) |
504 | 520 |
WSACleanup(); |
... | ... |
@@ -1131,17 +1131,6 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi |
1131 | 1131 |
logg("*Shutting down the main socket%s.\n", (nsockets > 1) ? "s" : ""); |
1132 | 1132 |
for (i = 0; i < nsockets; i++) |
1133 | 1133 |
shutdown(socketds[i], 2); |
1134 |
- logg("*Closing the main socket%s.\n", (nsockets > 1) ? "s" : ""); |
|
1135 |
- for (i = 0; i < nsockets; i++) |
|
1136 |
- closesocket(socketds[i]); |
|
1137 |
-#ifndef C_OS2 |
|
1138 |
- if((opt = optget(opts, "LocalSocket"))->enabled) { |
|
1139 |
- if(unlink(opt->strarg) == -1) |
|
1140 |
- logg("!Can't unlink the socket file %s\n", opt->strarg); |
|
1141 |
- else |
|
1142 |
- logg("Socket file removed.\n"); |
|
1143 |
- } |
|
1144 |
-#endif |
|
1145 | 1134 |
|
1146 | 1135 |
if((opt = optget(opts, "PidFile"))->enabled) { |
1147 | 1136 |
if(unlink(opt->strarg) == -1) |