Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
xen.12882
xs-03-read_node-context.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xs-03-read_node-context.patch of Package xen.12882
commit ba81f6636f76511cae83425b1a2e4ade202810fb Author: Juergen Gross <jgross@suse.com> Date: Tue Jul 19 13:30:44 2016 +0200 xenstore: add explicit memory context parameter to read_node() Add a parameter to xenstored read_node() function to explicitly specify the memory context to be used for allocations. This will make it easier to avoid memory leaks by using a context which is freed soon. When calling read_node() select a sensible memory context for the new parameter by preferring a temporary one. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Index: xen-4.7.2-testing/tools/xenstore/xenstored_core.c =================================================================== --- xen-4.7.2-testing.orig/tools/xenstore/xenstored_core.c +++ xen-4.7.2-testing/tools/xenstore/xenstored_core.c @@ -412,8 +412,12 @@ bool is_child(const char *child, const c return child[len] == '/' || child[len] == '\0'; } -/* If it fails, returns NULL and sets errno. */ -static struct node *read_node(struct connection *conn, const char *name) +/* + * If it fails, returns NULL and sets errno. + * Temporary memory allocations will be done with ctx. + */ +static struct node *read_node(struct connection *conn, const void *ctx, + const char *name) { TDB_DATA key, data; uint32_t *p; @@ -434,7 +438,7 @@ static struct node *read_node(struct con return NULL; } - node = talloc(name, struct node); + node = talloc(ctx, struct node); node->name = talloc_strdup(node, name); node->parent = NULL; node->tdb = tdb_context(conn); @@ -541,7 +545,7 @@ static enum xs_perm_type ask_parents(str do { name = get_parent(name, name); - node = read_node(conn, name); + node = read_node(conn, name, name); if (node) break; } while (!streq(name, "/")); @@ -582,7 +586,7 @@ struct node *get_node(struct connection errno = EINVAL; return NULL; } - node = read_node(conn, name); + node = read_node(conn, name, name); /* If we don't have permission, we don't have node. */ if (node) { if ((perm_for_conn(conn, node->perms, node->num_perms) & perm) @@ -839,7 +843,7 @@ static struct node *construct_node(struc char *children, *parentname = get_parent(name, name); /* If parent doesn't exist, create it. */ - parent = read_node(conn, parentname); + parent = read_node(conn, parentname, parentname); if (!parent) parent = construct_node(conn, parentname); if (!parent) @@ -1018,7 +1022,7 @@ static void delete_node(struct connectio for (i = 0; i < node->childlen; i += strlen(node->children+i) + 1) { struct node *child; - child = read_node(conn, + child = read_node(conn, node, talloc_asprintf(node, "%s/%s", node->name, node->children + i)); if (child) { @@ -1070,7 +1074,7 @@ static int _rm(struct connection *conn, /* Delete from parent first, then if we crash, the worst that can happen is the child will continue to take up space, but will otherwise be unreachable. */ - struct node *parent = read_node(conn, get_parent(name, name)); + struct node *parent = read_node(conn, name, get_parent(name, name)); if (!parent) { send_error(conn, EINVAL); return 0; @@ -1089,7 +1093,7 @@ static int _rm(struct connection *conn, static void internal_rm(const char *name) { char *tname = talloc_strdup(NULL, name); - struct node *node = read_node(NULL, tname); + struct node *node = read_node(NULL, tname, tname); if (node) _rm(NULL, node, tname); talloc_free(node); @@ -1107,7 +1111,7 @@ static void do_rm(struct connection *con if (!node) { /* Didn't exist already? Fine, if parent exists. */ if (errno == ENOENT) { - node = read_node(conn, get_parent(in, name)); + node = read_node(conn, in, get_parent(in, name)); if (node) { send_ack(conn, XS_RM); return; @@ -1640,7 +1644,7 @@ static void remember_string(struct hasht */ static void check_store_(const char *name, struct hashtable *reachable) { - struct node *node = read_node(NULL, name); + struct node *node = read_node(NULL, name, name); if (node) { size_t i = 0; @@ -1654,7 +1658,8 @@ static void check_store_(const char *nam size_t childlen = strlen(node->children + i); char * childname = child_name(node->name, node->children + i); - struct node *childnode = read_node(NULL, childname); + struct node *childnode = read_node(NULL, childname, + childname); if (childnode) { if (hashtable_search(children, childname)) {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor