From 73635bb1b32450a86c78866ed8c485cc1ce3a1de Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Mon, 8 Dec 2008 09:19:13 +0100 Subject: some memory handling fixes --- worker/output_handler.c | 80 ++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 34 deletions(-) (limited to 'worker/output_handler.c') diff --git a/worker/output_handler.c b/worker/output_handler.c index ca55f07..7300f1d 100644 --- a/worker/output_handler.c +++ b/worker/output_handler.c @@ -45,16 +45,16 @@ char *get_output_handler_parameter(xmlNode *node, const char *name, const char * } int output_handler_file(xmlNode *node, const xmlDocPtr doc, const char *xslt_file_name) { - char *name; - char *owner; - char *group; - char *permission; - char *param_name; - char *param_value; + char *name=NULL; + char *owner=NULL; + char *group=NULL; + char *permission=NULL; + char *param_name=NULL; + char *param_value=NULL; struct stat stat_buffer; - char *dir_name; - char *tmp_file_name; - char *buffer; + char *dir_name=NULL; + char *tmp_file_name=NULL; + char *buffer=NULL; int ret; int fd; xsltStylesheetPtr parsed_stylesheet = NULL; @@ -67,25 +67,20 @@ int output_handler_file(xmlNode *node, const xmlDocPtr doc, const char *xslt_fil dir_name=dirname(buffer); if( (ret=stat(dir_name, &stat_buffer)) == -1) { DEBUG(0,("stat on %s failed: %s\n",dir_name, strerror(errno))); - free(name); - return -1; + goto failed; } if(!S_ISDIR(stat_buffer.st_mode)) { DEBUG(0,("%s is not a directory!\n",dir_name)); - free(name); - return -1; + goto failed; } - free(buffer); if( (ret=lstat(name, &stat_buffer)) == -1) { DEBUG(0,("stat on %s failed: %s\n",name, strerror(errno))); - free(name); - return -1; + goto failed; } if(!S_ISREG(stat_buffer.st_mode)) { DEBUG(0,("%s is not a regular file!\n",name)); - free(name); - return -1; + goto failed; } owner=get_output_handler_parameter(node, "owner", "root", 0); @@ -102,7 +97,7 @@ int output_handler_file(xmlNode *node, const xmlDocPtr doc, const char *xslt_fil strcpy(tmp_file_name, name); strcat(tmp_file_name, ".XXXXXX"); fd=open_temporary_file(tmp_file_name, permission, owner, group, NULL); - CHECK(fd, -1, ("Failed to open temporary file.\n"), return -1); + CHECK(fd, -1, ("Failed to open temporary file.\n"), goto failed); parsed_stylesheet = xsltParseStylesheetFile((xmlChar *) xslt_file_name); CHECK_NULL_FATAL(parsed_stylesheet, ("Cannot parse stylesheet!\n")); @@ -121,6 +116,7 @@ int output_handler_file(xmlNode *node, const xmlDocPtr doc, const char *xslt_fil ret=rename(tmp_file_name, name); CHECK_MINUS_ONE_RETURN(ret, ("Cannot rename %s to %s: %s\n", tmp_file_name, name, strerror(errno) )); + free(buffer); free(tmp_file_name); free(name); @@ -130,6 +126,18 @@ int output_handler_file(xmlNode *node, const xmlDocPtr doc, const char *xslt_fil free(param_name); free(param_value); return 0; + +failed: + free(buffer); + free(tmp_file_name); + + free(name); + free(owner); + free(group); + free(permission); + free(param_name); + free(param_value); + return -1; } int output_handler_exec_with_args(xmlNode *node, const xmlDocPtr doc, const char *xslt_file_name) { @@ -177,6 +185,7 @@ int output_handler_exec_with_args(xmlNode *node, const xmlDocPtr doc, const char } xmlFreeDoc(res); xsltFreeStylesheet(parsed_stylesheet); + xsltCleanupGlobals(); cur=(char *)result_string; while ( (end_of_line = strchr(cur, '\n'))!=NULL ) { @@ -200,10 +209,10 @@ int output_handler_exec_with_args(xmlNode *node, const xmlDocPtr doc, const char int find_output_handler(const char *policy_file_name, const char *xslt_file_name) { int i; - xmlXPathContextPtr xpath_context; - xmlXPathObjectPtr xpath_obj; - xmlDocPtr xslt_doc; - xmlDocPtr doc; + xmlXPathContextPtr xpath_context=NULL; + xmlXPathObjectPtr xpath_obj=NULL; + xmlDocPtr xslt_doc=NULL; + xmlDocPtr doc=NULL; doc = xmlParseFile(policy_file_name); CHECK(doc, NULL, ("Cannot parse file %s!\n", policy_file_name), exit(1)); @@ -218,8 +227,7 @@ int find_output_handler(const char *policy_file_name, const char *xslt_file_name DEBUG(0, ("Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", XSLT_METADATA_NAMESPACE_PREFIX, XSLT_METADATA_NAMESPACE)); - xmlXPathFreeContext(xpath_context); - return 0; + goto failed; } xpath_obj = xmlXPathEvalExpression(XPATH_OUTPUT_HANDLER, xpath_context); @@ -227,29 +235,24 @@ int find_output_handler(const char *policy_file_name, const char *xslt_file_name DEBUG(0, ("Error: unable to evaluate xpath expression \"%s\"\n", XPATH_OUTPUT_HANDLER)); - xmlXPathFreeContext(xpath_context); - return 0; + goto failed; } if (xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)) { DEBUG(0, ("Nothing found for %s\n", XPATH_OUTPUT_HANDLER)); - xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_context); - return 0; + goto failed; } for (i=0; inodesetval); i++) { DEBUG(3, ("found output_handler: %s\n",(char *) xpath_obj->nodesetval->nodeTab[i]->name)); - print_all_attributes(xpath_obj->nodesetval->nodeTab[i]); + /*print_all_attributes(xpath_obj->nodesetval->nodeTab[i]);*/ if ( xmlStrEqual(xpath_obj->nodesetval->nodeTab[i]->name, (xmlChar *) "file" )) { output_handler_file(xpath_obj->nodesetval->nodeTab[i], doc, xslt_file_name); } else if ( xmlStrEqual(xpath_obj->nodesetval->nodeTab[i]->name, (xmlChar *) "exec_with_args" )) { output_handler_exec_with_args(xpath_obj->nodesetval->nodeTab[i], doc, xslt_file_name); } else { DEBUG(0, ("Unknow outout handler '%s'.\n", xpath_obj->nodesetval->nodeTab[i]->name)); - xmlXPathFreeObject(xpath_obj); - xmlXPathFreeContext(xpath_context); - return -1; + goto failed; } } @@ -258,5 +261,14 @@ int find_output_handler(const char *policy_file_name, const char *xslt_file_name xmlXPathFreeContext(xpath_context); xmlFreeDoc(xslt_doc); xmlFreeDoc(doc); + xmlCleanupParser(); return 0; + +failed: + xmlXPathFreeObject(xpath_obj); + xmlXPathFreeContext(xpath_context); + xmlFreeDoc(xslt_doc); + xmlFreeDoc(doc); + xmlCleanupParser(); + return -1; } -- cgit