git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@1569 77e5149b-7576-45b1-b177-96237e5ba77b
Tomasz Kojm authored on 2005/05/23 07:53:07... | ... |
@@ -42,7 +42,7 @@ |
42 | 42 |
|
43 | 43 |
#ifdef CL_THREAD_SAFE |
44 | 44 |
# include <pthread.h> |
45 |
-pthread_mutex_t cli_gentemp_mutex = PTHREAD_MUTEX_INITIALIZER; |
|
45 |
+pthread_mutex_t cli_gentempname_mutex = PTHREAD_MUTEX_INITIALIZER; |
|
46 | 46 |
#endif |
47 | 47 |
|
48 | 48 |
#if defined(HAVE_READDIR_R_3) || defined(HAVE_READDIR_R_2) |
... | ... |
@@ -78,7 +78,7 @@ pthread_mutex_t cli_gentemp_mutex = PTHREAD_MUTEX_INITIALIZER; |
78 | 78 |
|
79 | 79 |
short cli_debug_flag = 0, cli_leavetemps_flag = 0; |
80 | 80 |
|
81 |
-static unsigned char oldmd5buff[16] = { 16, 38, 97, 12, 8, 4, 72, 196, 217, 144, 33, 124, 18, 11, 17, 253 }; |
|
81 |
+static unsigned char name_salt[16] = { 16, 38, 97, 12, 8, 4, 72, 196, 217, 144, 33, 124, 18, 11, 17, 253 }; |
|
82 | 82 |
|
83 | 83 |
void cli_warnmsg(const char *str, ...) |
84 | 84 |
{ |
... | ... |
@@ -263,7 +263,7 @@ char *cli_md5file(const char *filename) |
263 | 263 |
return md5str; |
264 | 264 |
} |
265 | 265 |
|
266 |
-static char *cli_md5buff(const char *buffer, unsigned int len) |
|
266 |
+static char *cli_md5buff(const char *buffer, unsigned int len, unsigned char *dig) |
|
267 | 267 |
{ |
268 | 268 |
unsigned char digest[16]; |
269 | 269 |
char *md5str, *pt; |
... | ... |
@@ -274,7 +274,9 @@ static char *cli_md5buff(const char *buffer, unsigned int len) |
274 | 274 |
MD5_Init(&ctx); |
275 | 275 |
MD5_Update(&ctx, (unsigned char *) buffer, len); |
276 | 276 |
MD5_Final(digest, &ctx); |
277 |
- memcpy(oldmd5buff, digest, 16); |
|
277 |
+ |
|
278 |
+ if(dig) |
|
279 |
+ memcpy(dig, digest, 16); |
|
278 | 280 |
|
279 | 281 |
if(!(md5str = (char *) cli_calloc(32 + 1, sizeof(char)))) |
280 | 282 |
return NULL; |
... | ... |
@@ -378,7 +380,6 @@ static char *cli_gentempname(const char *dir) |
378 | 378 |
int i; |
379 | 379 |
struct stat foo; |
380 | 380 |
|
381 |
- |
|
382 | 381 |
if(!dir) { |
383 | 382 |
if((mdir = getenv("TMPDIR")) == NULL) |
384 | 383 |
#ifdef P_tmpdir |
... | ... |
@@ -389,23 +390,36 @@ static char *cli_gentempname(const char *dir) |
389 | 389 |
} else |
390 | 390 |
mdir = dir; |
391 | 391 |
|
392 |
- name = (char*) cli_calloc(strlen(mdir) + 1 + 16 + 1 + 7, sizeof(char)); |
|
393 |
- if(name == NULL) { |
|
392 |
+ name = (char *) cli_calloc(strlen(mdir) + 1 + 32 + 1 + 7, sizeof(char)); |
|
393 |
+ if(!name) { |
|
394 | 394 |
cli_dbgmsg("cli_gentempname('%s'): out of memory\n", mdir); |
395 | 395 |
return NULL; |
396 | 396 |
} |
397 | 397 |
|
398 |
- memcpy(salt, oldmd5buff, 16); |
|
398 |
+#ifdef CL_THREAD_SAFE |
|
399 |
+ pthread_mutex_lock(&cli_gentempname_mutex); |
|
400 |
+#endif |
|
401 |
+ |
|
402 |
+ memcpy(salt, name_salt, 16); |
|
399 | 403 |
|
400 |
- do { |
|
401 |
- for(i = 16; i < 48; i++) |
|
402 |
- salt[i] = cli_rndnum(256); |
|
404 |
+ for(i = 16; i < 48; i++) |
|
405 |
+ salt[i] = cli_rndnum(256); |
|
403 | 406 |
|
404 |
- tmp = cli_md5buff(( char* ) salt, 48); |
|
405 |
- sprintf(name, "%s/clamav-", mdir); |
|
406 |
- strncat(name, tmp, 16); |
|
407 |
- free(tmp); |
|
408 |
- } while(stat(name, &foo) != -1); |
|
407 |
+ tmp = cli_md5buff((char *) salt, 48, name_salt); |
|
408 |
+ |
|
409 |
+#ifdef CL_THREAD_SAFE |
|
410 |
+ pthread_mutex_unlock(&cli_gentempname_mutex); |
|
411 |
+#endif |
|
412 |
+ |
|
413 |
+ if(!tmp) { |
|
414 |
+ free(name); |
|
415 |
+ cli_dbgmsg("cli_gentempname('%s'): out of memory\n", mdir); |
|
416 |
+ return NULL; |
|
417 |
+ } |
|
418 |
+ |
|
419 |
+ sprintf(name, "%s/clamav-", mdir); |
|
420 |
+ strncat(name, tmp, 32); |
|
421 |
+ free(tmp); |
|
409 | 422 |
|
410 | 423 |
return(name); |
411 | 424 |
} |
... | ... |
@@ -414,16 +428,8 @@ char *cli_gentemp(const char *dir) |
414 | 414 |
{ |
415 | 415 |
char *name; |
416 | 416 |
|
417 |
-#ifdef CL_THREAD_SAFE |
|
418 |
- pthread_mutex_lock(&cli_gentemp_mutex); |
|
419 |
-#endif |
|
420 |
- |
|
421 | 417 |
name = cli_gentempname(dir); |
422 | 418 |
|
423 |
-#ifdef CL_THREAD_SAFE |
|
424 |
- pthread_mutex_unlock(&cli_gentemp_mutex); |
|
425 |
-#endif |
|
426 |
- |
|
427 | 419 |
return(name); |
428 | 420 |
} |
429 | 421 |
|
... | ... |
@@ -432,16 +438,8 @@ char *cli_gentempdir(const char *dir) |
432 | 432 |
{ |
433 | 433 |
char *name; |
434 | 434 |
|
435 |
-#ifdef CL_THREAD_SAFE |
|
436 |
- pthread_mutex_lock(&cli_gentemp_mutex); |
|
437 |
-#endif |
|
438 |
- |
|
439 | 435 |
name = cli_gentempname(dir); |
440 | 436 |
|
441 |
-#ifdef CL_THREAD_SAFE |
|
442 |
- pthread_mutex_unlock(&cli_gentemp_mutex); |
|
443 |
-#endif |
|
444 |
- |
|
445 | 437 |
if(name && mkdir(name, 0700)) { |
446 | 438 |
cli_dbgmsg("cli_gentempdir(): can't create temp directory: %s\n", name); |
447 | 439 |
free(name); |
... | ... |
@@ -455,16 +453,8 @@ char *cli_gentempdesc(const char *dir, int *fd) |
455 | 455 |
{ |
456 | 456 |
char *name; |
457 | 457 |
|
458 |
-#ifdef CL_THREAD_SAFE |
|
459 |
- pthread_mutex_lock(&cli_gentemp_mutex); |
|
460 |
-#endif |
|
461 |
- |
|
462 | 458 |
name = cli_gentempname(dir); |
463 | 459 |
|
464 |
-#ifdef CL_THREAD_SAFE |
|
465 |
- pthread_mutex_unlock(&cli_gentemp_mutex); |
|
466 |
-#endif |
|
467 |
- |
|
468 | 460 |
if(name && ((*fd = open(name, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRWXU)) < 0)) { |
469 | 461 |
cli_dbgmsg("cli_gentempdesc(): can't create temp file: %s\n", name); |
470 | 462 |
free(name); |
... | ... |
@@ -478,16 +468,8 @@ char *cli_gentempstream(const char *dir, FILE **fs) |
478 | 478 |
{ |
479 | 479 |
char *name; |
480 | 480 |
|
481 |
-#ifdef CL_THREAD_SAFE |
|
482 |
- pthread_mutex_lock(&cli_gentemp_mutex); |
|
483 |
-#endif |
|
484 |
- |
|
485 | 481 |
name = cli_gentempname(dir); |
486 | 482 |
|
487 |
-#ifdef CL_THREAD_SAFE |
|
488 |
- pthread_mutex_unlock(&cli_gentemp_mutex); |
|
489 |
-#endif |
|
490 |
- |
|
491 | 483 |
if(name && ((*fs = fopen(name, "wb+")) == NULL)) { |
492 | 484 |
cli_dbgmsg("cli_gentempstream(): can't create temp file: %s\n", name); |
493 | 485 |
free(name); |