fix use after free

This commit is contained in:
Akos Horvath 2023-12-30 14:19:13 +01:00
parent 3f5a3604ac
commit 46d0bc1670

View File

@ -431,7 +431,6 @@ void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node)
DEBUG_PRINT("%s: other_client was NULL!\n", __func__); DEBUG_PRINT("%s: other_client was NULL!\n", __func__);
TreeNode *sibling_node = wm_treenode_split_get_sibling(node); TreeNode *sibling_node = wm_treenode_split_get_sibling(node);
wm_treenode_free(node);
// wm_nodearray_free(&node->children); // wm_nodearray_free(&node->children);
@ -441,9 +440,15 @@ void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node)
if (parent->parent == NULL) { if (parent->parent == NULL) {
// parent is root node // parent is root node
DEBUG_PRINT("parent is root node!\n"); DEBUG_PRINT("parent is root node!\n");
sibling_node->parent = NULL;
assert(node->type == NODE_CLIENT); assert(node->type == NODE_CLIENT);
node->client->ws->tree = sibling_node;
TreeNode old_root = *node->client->ws->tree;
sibling_node->parent = NULL;
*node->client->ws->tree = *sibling_node;
wm_nodearray_free(old_root.children);
free(sibling_node);
node->client->ws->tree->pos = (Rect) { node->client->ws->tree->pos = (Rect) {
.x = wm->config.border_width, .y = wm->config.border_width + dock_y , .x = wm->config.border_width, .y = wm->config.border_width + dock_y ,
@ -467,6 +472,8 @@ void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node)
} }
assert(node->client->ws->tree->children->size >= 1); assert(node->client->ws->tree->children->size >= 1);
wm_treenode_free(node);
} }
TreeNode* wm_treenode_split_get_sibling(TreeNode *node) TreeNode* wm_treenode_split_get_sibling(TreeNode *node)
@ -555,7 +562,7 @@ TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client)
} }
assert(client->ws->tree->children->size >= 1); assert(client->ws->tree->children->size >= 1);
return node->children->nodes[0]; return client->ws->tree->children->nodes[0];
} }
NodeArray* wm_nodearray_new() NodeArray* wm_nodearray_new()
@ -578,7 +585,7 @@ void wm_nodearray_push(NodeArray *arr, TreeNode *node)
arr->size++; arr->size++;
if (arr->size >= arr->capacity) { if (arr->size >= arr->capacity) {
TreeNode* temp = calloc(arr->capacity, sizeof(TreeNode*)); TreeNode** temp = calloc(arr->capacity, sizeof(TreeNode*));
assert(temp); assert(temp);
memcpy(temp, arr->nodes, arr->capacity * sizeof(TreeNode*)); memcpy(temp, arr->nodes, arr->capacity * sizeof(TreeNode*));
free(arr->nodes); free(arr->nodes);