return node;
}
-int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node)
+int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node,
+ bool no_quota_check)
{
TDB_DATA data;
void *p;
+ node->num_perms*sizeof(node->perms[0])
+ node->datalen + node->childlen;
- if (domain_is_unprivileged(conn) &&
+ if (!no_quota_check && domain_is_unprivileged(conn) &&
data.dsize >= quota_max_entry_size) {
errno = ENOSPC;
return errno;
return 0;
}
-static int write_node(struct connection *conn, struct node *node)
+static int write_node(struct connection *conn, struct node *node,
+ bool no_quota_check)
{
TDB_DATA key;
if (access_node(conn, node, NODE_ACCESS_WRITE, &key))
return errno;
- return write_node_raw(conn, &key, node);
+ return write_node_raw(conn, &key, node, no_quota_check);
}
static enum xs_perm_type perm_for_conn(struct connection *conn,
/* We write out the nodes down, setting destructor in case
* something goes wrong. */
for (i = node; i; i = i->parent) {
- if (write_node(conn, i)) {
+ if (write_node(conn, i, false)) {
domain_entry_dec(conn, i);
return NULL;
}
} else {
node->data = in->buffer + offset;
node->datalen = datalen;
- if (write_node(conn, node))
+ if (write_node(conn, node, false))
return errno;
}
size_t childlen = strlen(node->children + offset);
memdel(node->children, offset, childlen + 1, node->childlen);
node->childlen -= childlen + 1;
- return write_node(conn, node);
+ return write_node(conn, node, true);
}
node->num_perms = num;
domain_entry_inc(conn, node);
- if (write_node(conn, node))
+ if (write_node(conn, node, false))
return errno;
fire_watches(conn, in, name, false);
if (child)
node->childlen = strlen(child) + 1;
- if (write_node(NULL, node))
+ if (write_node(NULL, node, false))
barf_perror("Could not create initial node %s", name);
talloc_free(node);
}
char *canonicalize(struct connection *conn, const void *ctx, const char *node);
/* Write a node to the tdb data base. */
-int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node);
+int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node,
+ bool no_quota_check);
/* Get this node, checking we have permissions. */
struct node *get_node(struct connection *conn,