From: Felix Morgner Date: Thu, 5 Feb 2015 09:58:35 +0000 (+0100) Subject: Merge pull request #53 from fmorgner/master X-Git-Url: http://git.code-monkey.de/?a=commitdiff_plain;h=80d7d562a25e04a194bfb9260e2d3af3af850968;hp=1a13742a5854076705c656011d23e3ce31d3ef6a;p=umurmur.git Merge pull request #53 from fmorgner/master Fixed a memory leak in the shared memory part --- diff --git a/src/sharedmemory.c b/src/sharedmemory.c index c2b703a..c08e4e8 100644 --- a/src/sharedmemory.c +++ b/src/sharedmemory.c @@ -4,117 +4,121 @@ int shm_fd; shm_t *shmptr = NULL; char shm_file_name[128]; -void Sharedmemory_init( int bindport, int bindport6 ) +void Sharedmemory_init( int bindport, int bindport6 ) { - - int server_max_clients = getIntConf(MAX_CLIENTS); - int shmtotal_size = sizeof( shm_t ) + (sizeof( shmclient_t ) * server_max_clients); - - if( !bindport ) - { - bindport = getIntConf(BINDPORT); - } - - sprintf( shm_file_name, "/umurmurd:%i", bindport ); - Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name ); - - shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0660 ); - if(shm_fd == -1) - { - Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - - if( ftruncate( shm_fd, shmtotal_size ) == -1 ) - { - Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - - shmptr = mmap( 0, shmtotal_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0 ); - if (shmptr == MAP_FAILED) - { - Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - - memset( shmptr, 0, shmtotal_size ); - - shmptr->umurmurd_pid = getpid(); - shmptr->server_max_clients = server_max_clients; - shmptr->shmtotal_size = shmtotal_size; - shmptr->shmclient_size = sizeof( shmclient_t ) * shmptr->server_max_clients; - + + int server_max_clients = getIntConf(MAX_CLIENTS); + int shmtotal_size = sizeof( shm_t ) + (sizeof( shmclient_t ) * server_max_clients); + + if( !bindport ) + { + bindport = getIntConf(BINDPORT); + } + + sprintf( shm_file_name, "/umurmurd:%i", bindport ); + Log_info("SHM_API: shm_fd=\"%s\"", shm_file_name ); + + shm_fd = shm_open( shm_file_name, O_CREAT | O_RDWR, 0660 ); + if(shm_fd == -1) + { + Log_fatal( "SHM_API: Open failed:%s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + if( ftruncate( shm_fd, shmtotal_size ) == -1 ) + { + Sharedmemory_deinit(); + Log_fatal( "SHM_API: ftruncate : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + shmptr = mmap( 0, shmtotal_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0 ); + if (shmptr == MAP_FAILED) + { + Log_fatal( "SHM_API: mmap failed : %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + memset( shmptr, 0, shmtotal_size ); + + shmptr->umurmurd_pid = getpid(); + shmptr->server_max_clients = server_max_clients; + shmptr->shmtotal_size = shmtotal_size; + shmptr->shmclient_size = sizeof( shmclient_t ) * shmptr->server_max_clients; + } -void Sharedmemory_update(void) +void Sharedmemory_update(void) { - uint64_t now; - unsigned int cc = 0; - client_t *client_itr = NULL; - - memset( &shmptr->client[0], 0, shmptr->shmclient_size ); - shmptr->clientcount = Client_count(); - - if( shmptr->clientcount ) - { - Timer_init( &now ); - while( Client_iterate(&client_itr) != NULL ) - { - if( client_itr->authenticated ) - { - channel_t *channel = client_itr->channel; - - strncpy( shmptr->client[cc].username, client_itr->username, 120 ); - strncpy( shmptr->client[cc].ipaddress, Util_clientAddressToString( client_itr ), INET6_ADDRSTRLEN - 1 ); - strncpy( shmptr->client[cc].channel, channel->name, 120 ); - - strncpy( shmptr->client[cc].os, client_itr->os, 120 ); - strncpy( shmptr->client[cc].release, client_itr->release, 120 ); - strncpy( shmptr->client[cc].os_version, client_itr->os_version, 120 ); - - shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr ); - shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr ); - - shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL; - shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL; - - shmptr->client[cc].bUDP = client_itr->bUDP; - shmptr->client[cc].deaf = client_itr->deaf; - shmptr->client[cc].mute = client_itr->mute; - shmptr->client[cc].bOpus = client_itr->bOpus; - shmptr->client[cc].self_deaf = client_itr->self_deaf; - shmptr->client[cc].self_mute = client_itr->self_mute; - shmptr->client[cc].recording = client_itr->recording; - shmptr->client[cc].authenticated = client_itr->authenticated; - - shmptr->client[cc].availableBandwidth = client_itr->availableBandwidth; - - shmptr->client[cc].UDPPingAvg = client_itr->UDPPingAvg; - shmptr->client[cc].UDPPingVar = client_itr->UDPPingVar; - shmptr->client[cc].TCPPingAvg = client_itr->TCPPingAvg; - shmptr->client[cc].TCPPingVar = client_itr->TCPPingVar; - - shmptr->client[cc].isAdmin = client_itr->isAdmin; - shmptr->client[cc].isSuppressed = client_itr->isSuppressed; - - shmptr->client[cc].UDPPackets = client_itr->UDPPackets; - shmptr->client[cc].TCPPackets = client_itr->TCPPackets; - - } - cc++; - } - } + uint64_t now; + unsigned int cc = 0; + client_t *client_itr = NULL; + + memset( &shmptr->client[0], 0, shmptr->shmclient_size ); + shmptr->clientcount = Client_count(); + + if( shmptr->clientcount ) + { + Timer_init( &now ); + while( Client_iterate(&client_itr) != NULL ) + { + if( client_itr->authenticated ) + { + channel_t *channel = client_itr->channel; + + char* clientAddressString = Util_clientAddressToString( client_itr ); + + strncpy( shmptr->client[cc].username, client_itr->username, 120 ); + strncpy( shmptr->client[cc].ipaddress, clientAddressString, INET6_ADDRSTRLEN - 1 ); + strncpy( shmptr->client[cc].channel, channel->name, 120 ); + + strncpy( shmptr->client[cc].os, client_itr->os, 120 ); + strncpy( shmptr->client[cc].release, client_itr->release, 120 ); + strncpy( shmptr->client[cc].os_version, client_itr->os_version, 120 ); + + shmptr->client[cc].tcp_port = Util_clientAddressToPortTCP( client_itr ); + shmptr->client[cc].udp_port = Util_clientAddressToPortUDP( client_itr ); + + shmptr->client[cc].online_secs = ( now - client_itr->connectTime ) / 1000000LL; + shmptr->client[cc].idle_secs = ( now - client_itr->idleTime ) / 1000000LL; + + shmptr->client[cc].bUDP = client_itr->bUDP; + shmptr->client[cc].deaf = client_itr->deaf; + shmptr->client[cc].mute = client_itr->mute; + shmptr->client[cc].bOpus = client_itr->bOpus; + shmptr->client[cc].self_deaf = client_itr->self_deaf; + shmptr->client[cc].self_mute = client_itr->self_mute; + shmptr->client[cc].recording = client_itr->recording; + shmptr->client[cc].authenticated = client_itr->authenticated; + + shmptr->client[cc].availableBandwidth = client_itr->availableBandwidth; + + shmptr->client[cc].UDPPingAvg = client_itr->UDPPingAvg; + shmptr->client[cc].UDPPingVar = client_itr->UDPPingVar; + shmptr->client[cc].TCPPingAvg = client_itr->TCPPingAvg; + shmptr->client[cc].TCPPingVar = client_itr->TCPPingVar; + + shmptr->client[cc].isAdmin = client_itr->isAdmin; + shmptr->client[cc].isSuppressed = client_itr->isSuppressed; + + shmptr->client[cc].UDPPackets = client_itr->UDPPackets; + shmptr->client[cc].TCPPackets = client_itr->TCPPackets; + + free(clientAddressString); + } + cc++; + } + } } void Sharedmemory_alivetick(void) { - shmptr->alive++; + shmptr->alive++; } -void Sharedmemory_deinit(void) +void Sharedmemory_deinit(void) { - close( shm_fd ); - shm_unlink( shm_file_name ); - shmptr->umurmurd_pid = 0; + close( shm_fd ); + shm_unlink( shm_file_name ); + shmptr->umurmurd_pid = 0; }