summaryrefslogtreecommitdiffstats
path: root/worker/output_handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'worker/output_handler.c')
-rw-r--r--worker/output_handler.c80
1 files changed, 46 insertions, 34 deletions
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; i<xmlXPathNodeSetGetLength(xpath_obj->nodesetval); 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;
}