1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-12-04 14:46:30 -05:00

Redo memory-management in config.c so that xmlFree() is called instead of

free(), hopefully fixing win32 segfaults.

svn path=/trunk/icecast/; revision=3780
This commit is contained in:
Michael Smith 2002-08-09 14:36:12 +00:00
parent 6357936028
commit 7f0230e8ea

View File

@ -58,28 +58,38 @@ void config_initialize(void)
void config_shutdown(void) void config_shutdown(void)
{ {
ice_config_dir_t *dirnode, *nextdirnode; ice_config_dir_t *dirnode, *nextdirnode;
ice_config_t *c = &_configuration;
if (_config_filename) free(_config_filename); if (_config_filename) free(_config_filename);
if (_configuration.location) free(_configuration.location);
if (_configuration.admin) free(_configuration.admin); if (c->location && c->location != CONFIG_DEFAULT_LOCATION)
if (_configuration.source_password) free(_configuration.source_password); xmlFree(c->location);
if (_configuration.hostname) free(_configuration.hostname); if (c->admin && c->admin != CONFIG_DEFAULT_ADMIN)
if (_configuration.base_dir) free(_configuration.base_dir); xmlFree(c->admin);
if (_configuration.log_dir) free(_configuration.log_dir); if (c->source_password && c->source_password != CONFIG_DEFAULT_SOURCE_PASSWORD)
if (_configuration.access_log) free(_configuration.access_log); xmlFree(c->source_password);
if (_configuration.error_log) free(_configuration.error_log); if (c->hostname && c->hostname != CONFIG_DEFAULT_HOSTNAME)
if (_configuration.bind_address) free(_configuration.bind_address); xmlFree(c->hostname);
if (_configuration.user) free(_configuration.user); if (c->base_dir && c->base_dir != CONFIG_DEFAULT_BASE_DIR)
if (_configuration.group) free(_configuration.group); xmlFree(c->base_dir);
if (c->log_dir && c->log_dir != CONFIG_DEFAULT_LOG_DIR)
xmlFree(c->log_dir);
if (c->access_log && c->access_log != CONFIG_DEFAULT_ACCESS_LOG)
xmlFree(c->access_log);
if (c->error_log && c->error_log != CONFIG_DEFAULT_ERROR_LOG)
xmlFree(c->error_log);
if (c->bind_address) xmlFree(c->bind_address);
if (c->user) xmlFree(c->user);
if (c->group) xmlFree(c->group);
dirnode = _configuration.dir_list; dirnode = _configuration.dir_list;
while(dirnode) { while(dirnode) {
nextdirnode = dirnode->next; nextdirnode = dirnode->next;
free(dirnode->host); xmlFree(dirnode->host);
free(dirnode); free(dirnode);
dirnode = nextdirnode; dirnode = nextdirnode;
} }
memset(&_configuration, 0, sizeof(ice_config_t)); memset(c, 0, sizeof(ice_config_t));
} }
int config_parse_file(const char *filename) int config_parse_file(const char *filename)
@ -131,27 +141,27 @@ ice_config_t *config_get_config(void)
static void _set_defaults(void) static void _set_defaults(void)
{ {
_configuration.location = (char *)strdup(CONFIG_DEFAULT_LOCATION); _configuration.location = CONFIG_DEFAULT_LOCATION;
_configuration.admin = (char *)strdup(CONFIG_DEFAULT_ADMIN); _configuration.admin = CONFIG_DEFAULT_ADMIN;
_configuration.client_limit = CONFIG_DEFAULT_CLIENT_LIMIT; _configuration.client_limit = CONFIG_DEFAULT_CLIENT_LIMIT;
_configuration.source_limit = CONFIG_DEFAULT_SOURCE_LIMIT; _configuration.source_limit = CONFIG_DEFAULT_SOURCE_LIMIT;
_configuration.threadpool_size = CONFIG_DEFAULT_THREADPOOL_SIZE; _configuration.threadpool_size = CONFIG_DEFAULT_THREADPOOL_SIZE;
_configuration.client_timeout = CONFIG_DEFAULT_CLIENT_TIMEOUT; _configuration.client_timeout = CONFIG_DEFAULT_CLIENT_TIMEOUT;
_configuration.header_timeout = CONFIG_DEFAULT_HEADER_TIMEOUT; _configuration.header_timeout = CONFIG_DEFAULT_HEADER_TIMEOUT;
_configuration.source_timeout = CONFIG_DEFAULT_SOURCE_TIMEOUT; _configuration.source_timeout = CONFIG_DEFAULT_SOURCE_TIMEOUT;
_configuration.source_password = (char *)strdup(CONFIG_DEFAULT_SOURCE_PASSWORD); _configuration.source_password = CONFIG_DEFAULT_SOURCE_PASSWORD;
_configuration.touch_freq = CONFIG_DEFAULT_TOUCH_FREQ; _configuration.touch_freq = CONFIG_DEFAULT_TOUCH_FREQ;
_configuration.dir_list = NULL; _configuration.dir_list = NULL;
_configuration.hostname = (char *)strdup(CONFIG_DEFAULT_HOSTNAME); _configuration.hostname = CONFIG_DEFAULT_HOSTNAME;
_configuration.port = CONFIG_DEFAULT_PORT; _configuration.port = CONFIG_DEFAULT_PORT;
_configuration.bind_address = NULL; _configuration.bind_address = NULL;
_configuration.master_server = NULL; _configuration.master_server = NULL;
_configuration.master_server_port = CONFIG_DEFAULT_PORT; _configuration.master_server_port = CONFIG_DEFAULT_PORT;
_configuration.master_update_interval = CONFIG_MASTER_UPDATE_INTERVAL; _configuration.master_update_interval = CONFIG_MASTER_UPDATE_INTERVAL;
_configuration.base_dir = (char *)strdup(CONFIG_DEFAULT_BASE_DIR); _configuration.base_dir = CONFIG_DEFAULT_BASE_DIR;
_configuration.log_dir = (char *)strdup(CONFIG_DEFAULT_LOG_DIR); _configuration.log_dir = CONFIG_DEFAULT_LOG_DIR;
_configuration.access_log = (char *)strdup(CONFIG_DEFAULT_ACCESS_LOG); _configuration.access_log = CONFIG_DEFAULT_ACCESS_LOG;
_configuration.error_log = (char *)strdup(CONFIG_DEFAULT_ERROR_LOG); _configuration.error_log = CONFIG_DEFAULT_ERROR_LOG;
_configuration.loglevel = CONFIG_DEFAULT_LOG_LEVEL; _configuration.loglevel = CONFIG_DEFAULT_LOG_LEVEL;
_configuration.chroot = CONFIG_DEFAULT_CHROOT; _configuration.chroot = CONFIG_DEFAULT_CHROOT;
_configuration.chuid = CONFIG_DEFAULT_CHUID; _configuration.chuid = CONFIG_DEFAULT_CHUID;
@ -168,10 +178,10 @@ static void _parse_root(xmlDocPtr doc, xmlNodePtr node)
if (xmlIsBlankNode(node)) continue; if (xmlIsBlankNode(node)) continue;
if (strcmp(node->name, "location") == 0) { if (strcmp(node->name, "location") == 0) {
if (_configuration.location) free(_configuration.location); if (_configuration.location && _configuration.location != CONFIG_DEFAULT_LOCATION) xmlFree(_configuration.location);
_configuration.location = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.location = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "admin") == 0) { } else if (strcmp(node->name, "admin") == 0) {
if (_configuration.admin) free(_configuration.admin); if (_configuration.admin && _configuration.admin != CONFIG_DEFAULT_ADMIN) xmlFree(_configuration.admin);
_configuration.admin = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.admin = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "source-password") == 0) { } else if (strcmp(node->name, "source-password") == 0) {
char *mount, *pass; char *mount, *pass;
@ -180,21 +190,21 @@ static void _parse_root(xmlDocPtr doc, xmlNodePtr node)
/* FIXME: This is a placeholder for per-mount passwords */ /* FIXME: This is a placeholder for per-mount passwords */
} }
else { else {
if (_configuration.source_password) free(_configuration.source_password); if (_configuration.source_password && _configuration.source_password != CONFIG_DEFAULT_SOURCE_PASSWORD) xmlFree(_configuration.source_password);
_configuration.source_password = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.source_password = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} }
} else if (strcmp(node->name, "hostname") == 0) { } else if (strcmp(node->name, "hostname") == 0) {
if (_configuration.hostname) free(_configuration.hostname); if (_configuration.hostname && _configuration.hostname != CONFIG_DEFAULT_HOSTNAME) xmlFree(_configuration.hostname);
_configuration.hostname = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.hostname = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "port") == 0) { } else if (strcmp(node->name, "port") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.port = atoi(tmp); _configuration.port = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "bind-address") == 0) { } else if (strcmp(node->name, "bind-address") == 0) {
if (_configuration.bind_address) free(_configuration.bind_address); if (_configuration.bind_address) xmlFree(_configuration.bind_address);
_configuration.bind_address = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.bind_address = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "master-server") == 0) { } else if (strcmp(node->name, "master-server") == 0) {
if (_configuration.master_server) free(_configuration.master_server); if (_configuration.master_server) xmlFree(_configuration.master_server);
_configuration.master_server = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.master_server = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "master-server-port") == 0) { } else if (strcmp(node->name, "master-server-port") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
@ -227,27 +237,27 @@ static void _parse_limits(xmlDocPtr doc, xmlNodePtr node)
if (strcmp(node->name, "clients") == 0) { if (strcmp(node->name, "clients") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.client_limit = atoi(tmp); _configuration.client_limit = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "sources") == 0) { } else if (strcmp(node->name, "sources") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.source_limit = atoi(tmp); _configuration.source_limit = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "threadpool") == 0) { } else if (strcmp(node->name, "threadpool") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.threadpool_size = atoi(tmp); _configuration.threadpool_size = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "client-timeout") == 0) { } else if (strcmp(node->name, "client-timeout") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.client_timeout = atoi(tmp); _configuration.client_timeout = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "header-timeout") == 0) { } else if (strcmp(node->name, "header-timeout") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.header_timeout = atoi(tmp); _configuration.header_timeout = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "source-timeout") == 0) { } else if (strcmp(node->name, "source-timeout") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.source_timeout = atoi(tmp); _configuration.source_timeout = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} }
} while ((node = node->next)); } while ((node = node->next));
} }
@ -265,7 +275,7 @@ static void _parse_directory(xmlDocPtr doc, xmlNodePtr node)
} else if (strcmp(node->name, "touch-freq") == 0) { } else if (strcmp(node->name, "touch-freq") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.touch_freq = atoi(tmp); _configuration.touch_freq = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} }
} while ((node = node->next)); } while ((node = node->next));
} }
@ -277,13 +287,13 @@ static void _parse_paths(xmlDocPtr doc, xmlNodePtr node)
if (xmlIsBlankNode(node)) continue; if (xmlIsBlankNode(node)) continue;
if (strcmp(node->name, "basedir") == 0) { if (strcmp(node->name, "basedir") == 0) {
if (_configuration.base_dir) free(_configuration.base_dir); if (_configuration.base_dir && _configuration.base_dir != CONFIG_DEFAULT_BASE_DIR) xmlFree(_configuration.base_dir);
_configuration.base_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.base_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "logdir") == 0) { } else if (strcmp(node->name, "logdir") == 0) {
if (_configuration.log_dir) free(_configuration.log_dir); if (_configuration.log_dir && _configuration.log_dir != CONFIG_DEFAULT_LOG_DIR) xmlFree(_configuration.log_dir);
_configuration.log_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.log_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "webroot") == 0) { } else if (strcmp(node->name, "webroot") == 0) {
if (_configuration.webroot_dir) free(_configuration.webroot_dir); if (_configuration.webroot_dir && _configuration.webroot_dir != CONFIG_DEFAULT_WEBROOT_DIR) xmlFree(_configuration.webroot_dir);
_configuration.webroot_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.webroot_dir = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} }
} while ((node = node->next)); } while ((node = node->next));
@ -296,15 +306,15 @@ static void _parse_logging(xmlDocPtr doc, xmlNodePtr node)
if (xmlIsBlankNode(node)) continue; if (xmlIsBlankNode(node)) continue;
if (strcmp(node->name, "accesslog") == 0) { if (strcmp(node->name, "accesslog") == 0) {
if (_configuration.access_log) free(_configuration.access_log); if (_configuration.access_log && _configuration.access_log != CONFIG_DEFAULT_ACCESS_LOG) xmlFree(_configuration.access_log);
_configuration.access_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.access_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "errorlog") == 0) { } else if (strcmp(node->name, "errorlog") == 0) {
if (_configuration.error_log) free(_configuration.error_log); if (_configuration.error_log && _configuration.error_log != CONFIG_DEFAULT_ERROR_LOG) xmlFree(_configuration.error_log);
_configuration.error_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.error_log = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if (strcmp(node->name, "loglevel") == 0) { } else if (strcmp(node->name, "loglevel") == 0) {
char *tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); char *tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.loglevel = atoi(tmp); _configuration.loglevel = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} }
} while ((node = node->next)); } while ((node = node->next));
} }
@ -321,7 +331,7 @@ static void _parse_security(xmlDocPtr doc, xmlNodePtr node)
if (strcmp(node->name, "chroot") == 0) { if (strcmp(node->name, "chroot") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
_configuration.chroot = atoi(tmp); _configuration.chroot = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} else if (strcmp(node->name, "changeowner") == 0) { } else if (strcmp(node->name, "changeowner") == 0) {
_configuration.chuid = 1; _configuration.chuid = 1;
oldnode = node; oldnode = node;
@ -330,10 +340,10 @@ static void _parse_security(xmlDocPtr doc, xmlNodePtr node)
if(node == NULL) break; if(node == NULL) break;
if(xmlIsBlankNode(node)) continue; if(xmlIsBlankNode(node)) continue;
if(strcmp(node->name, "user") == 0) { if(strcmp(node->name, "user") == 0) {
if(_configuration.user) free(_configuration.user); if(_configuration.user) xmlFree(_configuration.user);
_configuration.user = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.user = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} else if(strcmp(node->name, "group") == 0) { } else if(strcmp(node->name, "group") == 0) {
if(_configuration.group) free(_configuration.group); if(_configuration.group) xmlFree(_configuration.group);
_configuration.group = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); _configuration.group = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
} }
} while((node = node->next)); } while((node = node->next));
@ -363,7 +373,7 @@ static void _add_server(xmlDocPtr doc, xmlNodePtr node)
} else if (strcmp(node->name, "touch-freq") == 0) { } else if (strcmp(node->name, "touch-freq") == 0) {
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1); tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
server->touch_freq = atoi(tmp); server->touch_freq = atoi(tmp);
if (tmp) free(tmp); if (tmp) xmlFree(tmp);
} }
server->next = NULL; server->next = NULL;
} while ((node = node->next)); } while ((node = node->next));
@ -382,11 +392,6 @@ static void _add_server(xmlDocPtr doc, xmlNodePtr node)
addnode = 0; addnode = 0;
} }
if (server) {
if (server->host) free(server->host);
free(server);
server = NULL;
}
} }