Browse code

Unify error paths. Remove unix socket we created if startup fails due to invalid config.

git-svn: trunk@4768

Török Edvin authored on 2009/02/13 06:14:45
Showing 3 changed files
... ...
@@ -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)