From f10e5bbfd57d491bf3a5f6521cb8c1c55b713772 Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Sun, 5 Feb 2012 23:26:15 -0800 Subject: [PATCH] fix for https://bugzilla.redhat.com/show_bug.cgi?id=782619 --- common/os_calls.c | 78 +++++++++++++++++++++++++++++----------- common/os_calls.h | 4 +-- sesman/chansrv/chansrv.c | 3 +- sesman/sesman.c | 2 ++ sesman/sessvc/sessvc.c | 2 ++ xrdp/xrdp.c | 3 +- 6 files changed, 67 insertions(+), 25 deletions(-) diff --git a/common/os_calls.c b/common/os_calls.c index 0993b650..c964a9ff 100644 --- a/common/os_calls.c +++ b/common/os_calls.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2004-2010 Jay Sorg + Copyright (c) 2004-2012 Jay Sorg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -79,9 +79,11 @@ extern char** environ; #define INADDR_NONE ((unsigned long)-1) #endif +static char g_temp_base[64] = ""; + /*****************************************************************************/ void APP_CC -g_init(void) +g_init(const char* app_name) { #if defined(_WIN32) WSADATA wsadata; @@ -89,6 +91,17 @@ g_init(void) WSAStartup(2, &wsadata); #endif setlocale(LC_CTYPE, ""); + if (app_name != 0) + { + if (app_name[0] == 0) + { + snprintf(g_temp_base, sizeof(g_temp_base), "/tmp/%s-XXXXXX", app_name); + if (mkdtemp(g_temp_base) == 0) + { + printf("g_init: mkdtemp failed [%s]\n", g_temp_base); + } + } + } } /*****************************************************************************/ @@ -98,6 +111,7 @@ g_deinit(void) #if defined(_WIN32) WSACleanup(); #endif + g_remove_dir(g_temp_base); } /*****************************************************************************/ @@ -700,39 +714,61 @@ g_create_wait_obj(char* name) #else tbus obj; struct sockaddr_un sa; - size_t len = 0; - tbus sck = -1; - int i = 0; - - g_memset(&sa,0,sizeof(struct sockaddr_un)); + size_t len; + tbus sck; + int i; + int safety; + int unnamed; + if (g_temp_base[0] == 0) + { + return 0; + } sck = socket(PF_UNIX, SOCK_DGRAM, 0); if (sck < 0) { return 0; } - memset(&sa, 0, sizeof(sa)); + safety = 0; + g_memset(&sa, 0, sizeof(sa)); sa.sun_family = AF_UNIX; - if ((name == 0) || (strlen(name) == 0)) + unnamed = 1; + if (name != 0) { - g_random((char*)&i, sizeof(i)); - sprintf(sa.sun_path, "/tmp/auto%8.8x", i); - while (g_file_exist(sa.sun_path)) + if (name[0] != 0) { - g_random((char*)&i, sizeof(i)); - sprintf(sa.sun_path, "/tmp/auto%8.8x", i); + unnamed = 0; } } - else + if (unnamed) { - sprintf(sa.sun_path, "/tmp/%s", name); + do + { + if (safety > 100) + { + break; + } + safety++; + g_random((char*)&i, sizeof(i)); + len = sizeof(sa.sun_path); + g_snprintf(sa.sun_path, len, "%s/auto_%8.8x", g_temp_base, i); + len = sizeof(sa); + } while (bind(sck, (struct sockaddr*)&sa, len) < 0); } - unlink(sa.sun_path); - len = sizeof(sa); - if (bind(sck, (struct sockaddr*)&sa, len) < 0) + else { - close(sck); - return 0; + do + { + if (safety > 100) + { + break; + } + safety++; + g_random((char*)&i, sizeof(i)); + len = sizeof(sa.sun_path); + g_snprintf(sa.sun_path, len, "%s/%s_%8.8x", g_temp_base, name, i); + len = sizeof(sa); + } while (bind(sck, (struct sockaddr*)&sa, len) < 0); } obj = (tbus)sck; return obj; diff --git a/common/os_calls.h b/common/os_calls.h index 62f8b58f..e5625d16 100644 --- a/common/os_calls.h +++ b/common/os_calls.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2004-2010 Jay Sorg + Copyright (c) 2004-2012 Jay Sorg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -32,7 +32,7 @@ #include "arch.h" void APP_CC -g_init(void); +g_init(const char* app_name); void APP_CC g_deinit(void); void* APP_CC diff --git a/sesman/chansrv/chansrv.c b/sesman/chansrv/chansrv.c index 6e80f383..77fbcd50 100644 --- a/sesman/chansrv/chansrv.c +++ b/sesman/chansrv/chansrv.c @@ -637,7 +637,7 @@ main(int argc, char** argv) char text[256] = ""; char* display_text = (char *)NULL; - g_init(); /* os_calls */ + g_init("xrdp-chansrv"); /* os_calls */ read_ini(); pid = g_getpid(); LOG(1, ("main: app started pid %d(0x%8.8x)", pid, pid)); @@ -681,5 +681,6 @@ main(int argc, char** argv) /* cleanup */ main_cleanup(); LOG(1, ("main: app exiting pid %d(0x%8.8x)", pid, pid)); + g_deinit(); return 0; } diff --git a/sesman/sesman.c b/sesman/sesman.c index c97784a8..7bf794e1 100644 --- a/sesman/sesman.c +++ b/sesman/sesman.c @@ -138,6 +138,7 @@ main(int argc, char** argv) char text[256]; char pid_file[256]; + g_init("xrdp-sesman"); g_snprintf(pid_file, 255, "%s/xrdp-sesman.pid", XRDP_PID_PATH); if (1 == argc) { @@ -350,6 +351,7 @@ main(int argc, char** argv) log_end(&(g_cfg->log)); } + g_deinit(); return 0; } diff --git a/sesman/sessvc/sessvc.c b/sesman/sessvc/sessvc.c index e814042a..fe268abc 100644 --- a/sesman/sessvc/sessvc.c +++ b/sesman/sessvc/sessvc.c @@ -80,6 +80,7 @@ main(int argc, char** argv) int lerror = 0; char exe_path[262]; + g_init("xrdp-sessvc"); g_memset(exe_path,0,sizeof(exe_path)); if (argc < 3) @@ -145,5 +146,6 @@ main(int argc, char** argv) g_sleep(1); } g_writeln("xrdp-sessvc: clean exit"); + g_deinit(); return 0; } diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c index 951a2f12..bbe6c6a8 100644 --- a/xrdp/xrdp.c +++ b/xrdp/xrdp.c @@ -235,7 +235,7 @@ main(int argc, char** argv) char text[256]; char pid_file[256]; - g_init(); + g_init("xrdp"); ssl_init(); /* check compiled endian with actual endian */ test = 1; @@ -432,5 +432,6 @@ main(int argc, char** argv) /* delete the xrdp.pid file */ g_file_delete(pid_file); g_free(startup_params); + g_deinit(); return 0; }