mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-02 21:46:58 +00:00
misc: life_mngr: fix use-after-free in uart channel
LIST_FOREACH() doesn't allow var to be removed or freed within the loop, but c_dev is freed inside the loop here. gcc 12 also reports error on it. This patch uses list_foreach_safe() macro instead for freeing var within the loop safely. Tracked-On: #8382 Signed-off-by: Jiaqing Zhao <jiaqing.zhao@linux.intel.com> Reviewed-by: Junjie Mao <junjie.mao@intel.com>
This commit is contained in:
parent
fcb8e9bb2d
commit
d4fa35ad5b
misc/services/life_mngr
11
misc/services/life_mngr/list.h
Normal file
11
misc/services/life_mngr/list.h
Normal file
@ -0,0 +1,11 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Intel Corporation.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <sys/queue.h>
|
||||
|
||||
#define list_foreach_safe(var, head, field, tvar) \
|
||||
for ((var) = LIST_FIRST((head)); \
|
||||
(var) && ((tvar) = LIST_NEXT((var), field), 1); \
|
||||
(var) = (tvar))
|
@ -18,12 +18,7 @@
|
||||
#include <arpa/inet.h>
|
||||
#include "socket.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
#define list_foreach_safe(var, head, field, tvar) \
|
||||
for ((var) = LIST_FIRST((head)); \
|
||||
(var) && ((tvar) = LIST_NEXT((var), field), 1);\
|
||||
(var) = (tvar))
|
||||
#include "list.h"
|
||||
|
||||
|
||||
static int setup_and_listen_unix_socket(const char *sock_path, int num)
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <stdint.h>
|
||||
#include "uart_channel.h"
|
||||
#include "log.h"
|
||||
#include "list.h"
|
||||
#include "config.h"
|
||||
#include "command.h"
|
||||
|
||||
@ -308,9 +309,9 @@ struct channel_dev *create_uart_channel_dev(struct uart_channel *c, char *path,
|
||||
}
|
||||
static void destroy_uart_channel_devs(struct uart_channel *c)
|
||||
{
|
||||
struct channel_dev *c_dev;
|
||||
struct channel_dev *c_dev, *tc_dev;
|
||||
|
||||
LIST_FOREACH(c_dev, &c->tty_open_head, open_list) {
|
||||
list_foreach_safe(c_dev, &c->tty_open_head, open_list, tc_dev) {
|
||||
pthread_mutex_lock(&c->tty_conn_list_lock);
|
||||
LIST_REMOVE(c_dev, open_list);
|
||||
pthread_mutex_unlock(&c->tty_conn_list_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user