From 05dee7a425fa295c6b1ab5f4c8ec39314e4e1d8c Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sun, 17 Feb 2013 20:40:38 +0100 Subject: [PATCH] NETCFG: cleanup & memleaks fixed. --- citadel/modules/network/netspool.h | 1 + citadel/modules/network/serv_netspool.c | 19 +++++++++++++++++-- citadel/modules/network/serv_network.c | 22 +++++----------------- citadel/netconfig.c | 5 ++++- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/citadel/modules/network/netspool.h b/citadel/modules/network/netspool.h index e3f225b3e..d04a49f1f 100644 --- a/citadel/modules/network/netspool.h +++ b/citadel/modules/network/netspool.h @@ -59,6 +59,7 @@ int HaveSpoolConfig(OneRoomNetCfg* RNCfg); void network_do_spoolin(HashList *working_ignetcfg, HashList *the_netmap, int *netmap_changed); void network_consolidate_spoolout(HashList *working_ignetcfg, HashList *the_netmap); void free_spoolcontrol_struct(SpoolControl **scc); +void free_spoolcontrol_struct_members(SpoolControl *scc); int writenfree_spoolcontrol_file(SpoolControl **scc, char *filename); int read_spoolcontrol_file(SpoolControl **scc, char *filename); diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index ed79adb8b..b0928454c 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -237,8 +237,8 @@ void CalcListID(SpoolControl *sc) if (fd != 0) { struct stat stbuf; - fstat(fd, &stbuf); - if (stbuf.st_size > 0) + if ((fstat(fd, &stbuf) == 0) && + (stbuf.st_size > 0)) { sc->RoomInfo = NewStrBufPlain(NULL, stbuf.st_size + 1); StrBufReadBLOB(sc->RoomInfo, &fd, 0, stbuf.st_size, &err); @@ -1017,6 +1017,21 @@ void network_consolidate_spoolout(HashList *working_ignetcfg, HashList *the_netm closedir(dp); } +void free_spoolcontrol_struct(SpoolControl **sc) +{ + free_spoolcontrol_struct_members(*sc); + free(*sc); + *sc = NULL; +} + +void free_spoolcontrol_struct_members(SpoolControl *sc) +{ + int i; + FreeStrBuf(&sc->RoomInfo); + FreeStrBuf(&sc->ListID); + for (i = 0; i < maxRoomNetCfg; i++) + FreeStrBuf(&sc->Users[i]); +} diff --git a/citadel/modules/network/serv_network.c b/citadel/modules/network/serv_network.c index 5ba84707b..56492925e 100644 --- a/citadel/modules/network/serv_network.c +++ b/citadel/modules/network/serv_network.c @@ -176,7 +176,7 @@ int network_sync_to(char *target_node, long len) pCfgLine = pRNCFG->NetConfigs[ignet_push_share]; while (pCfgLine != NULL) { - if (strcmp(ChrPtr(pCfgLine->Value[0]), target_node)) + if (!strcmp(ChrPtr(pCfgLine->Value[0]), target_node)) break; pCfgLine = pCfgLine->next; } @@ -189,13 +189,13 @@ int network_sync_to(char *target_node, long len) sc.RNCfg = &OneRNCFG; sc.RNCfg->NetConfigs[ignet_push_share] = DuplicateOneGenericCfgLine(pCfgLine); + CalcListID(&sc); + end_critical_section(S_NETCONFIGS); sc.working_ignetcfg = CtdlLoadIgNetCfg(); sc.the_netmap = CtdlReadNetworkMap(); - CalcListID(&sc); - /* Send ALL messages */ num_spooled = CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, network_spool_msg, &sc); @@ -205,6 +205,7 @@ int network_sync_to(char *target_node, long len) DeleteHash(&sc.working_ignetcfg); DeleteHash(&sc.the_netmap); + free_spoolcontrol_struct_members(&sc); QN_syslog(LOG_NOTICE, "Synchronized %d messages to <%s>\n", num_spooled, target_node); @@ -441,19 +442,6 @@ void network_bounce(struct CtdlMessage *msg, char *reason) } -void free_network_spoolout_room(SpoolControl *sc) -{ - if (sc != NULL) - { - int i; - for (i = subpending; i < maxRoomNetCfg; i++) - FreeStrBuf(&sc->Users[i]); - free(sc); - } -} - - - /* * network_do_queue() @@ -553,7 +541,7 @@ void network_do_queue(void) while (pSC != NULL) { sc = pSC->next; - free_network_spoolout_room(pSC); + free_spoolcontrol_struct(&pSC); pSC = sc; } /* If there is anything in the inbound queue, process it */ diff --git a/citadel/netconfig.c b/citadel/netconfig.c index 7fc53c594..d4652e244 100644 --- a/citadel/netconfig.c +++ b/citadel/netconfig.c @@ -146,16 +146,19 @@ void DeleteGenericCfgLine(const CfgLineType *ThisOne, RoomNetCfgLine **data) } RoomNetCfgLine *DuplicateOneGenericCfgLine(const RoomNetCfgLine *data) { + int i; RoomNetCfgLine *NewData; NewData = (RoomNetCfgLine*)malloc(sizeof(RoomNetCfgLine)); - int i; + memset(NewData, 0, sizeof(RoomNetCfgLine)); NewData->Value = (StrBuf **)malloc(sizeof(StrBuf*) * data->nValues); + memset(NewData->Value, 0, sizeof(StrBuf*) * data->nValues); for (i = 0; i < data->nValues; i++) { NewData->Value[i] = NewStrBufDup(data->Value[i]); } + NewData->nValues = data->nValues; return NewData; } int ReadRoomNetConfigFile(OneRoomNetCfg **pOneRNCfg, char *filename) -- 2.30.2