Update to v1.10 for some features and bugfix

Signed-off-by: liqiang <liqiang64@huawei.com>
This commit is contained in:
liqiang 2024-05-24 15:11:18 +08:00
parent d267c33679
commit e7325a331b
22 changed files with 5 additions and 2082 deletions

View File

@ -1,308 +0,0 @@
From b6663e01b364c878e08206a4ccb3ea02a63d7ed0 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Thu, 7 Dec 2023 16:58:09 +0800
Subject: [PATCH 1/3] fix suspend in fifo, the reason is SIGURG recieved in
client thread when wait for ack
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/include/log.h | 9 ++++---
qtfs/qtfs/fifo.c | 21 +++++++++++++----
qtfs/qtfs/qtfs-mod.c | 12 +++++-----
qtfs/qtfs_common/conn.c | 43 +++++++++++++++++++++++++++-------
qtfs/qtfs_server/server_fifo.c | 21 +++++++++++------
5 files changed, 77 insertions(+), 29 deletions(-)
diff --git a/qtfs/include/log.h b/qtfs/include/log.h
index 4df42b3..284464e 100644
--- a/qtfs/include/log.h
+++ b/qtfs/include/log.h
@@ -27,8 +27,11 @@ enum level {
#ifndef __KERNEL__
#include <time.h>
#define true 1
+#ifndef log_switch
+#define log_switch 1
+#endif
#define log_info(info, ...) \
- if (true) {\
+ if (log_switch) {\
time_t t; \
struct tm p; \
time(&t); \
@@ -39,7 +42,7 @@ enum level {
}
#define log_warn(info, ...) \
- if (true) {\
+ if (log_switch) {\
time_t t; \
struct tm p; \
time(&t); \
@@ -50,7 +53,7 @@ enum level {
}
#define log_err(info, ...) \
- if (true) {\
+ if (log_switch) {\
time_t t; \
struct tm p; \
time(&t); \
diff --git a/qtfs/qtfs/fifo.c b/qtfs/qtfs/fifo.c
index 2b636bb..55292de 100644
--- a/qtfs/qtfs/fifo.c
+++ b/qtfs/qtfs/fifo.c
@@ -117,6 +117,10 @@ ssize_t qtfs_fifo_readiter(struct kiocb *kio, struct iov_iter *iov)
int total = 0;
int ret;
+ if (sigismember(&current->pending.signal, SIGURG)) {
+ qtfs_err("signal SIGURG return eintr");
+ return -EINTR;
+ }
if (pvar == NULL || !virt_addr_valid(pvar)) {
qtfs_err("invalid fifo read req, private data is invalid");
return -EFAULT;
@@ -127,8 +131,9 @@ ssize_t qtfs_fifo_readiter(struct kiocb *kio, struct iov_iter *iov)
qtfs_info("fifo readiter len:%llu", req->len);
rsp = qtfs_remote_run(pvar, QTFS_REQ_READITER, sizeof(struct qtreq_fifo_read));
if (IS_ERR_OR_NULL(rsp) || rsp->err != 0) {
- qtfs_err("remote run failed. or errno:%d", (rsp == NULL) ? -1 : rsp->err);
- return -EFAULT;
+ qtfs_err("remote run failed. or errno:%d", IS_ERR_OR_NULL(rsp) ? -1 : rsp->err);
+ //return -EFAULT;
+ return (rsp == NULL) ? -EFAULT : (ssize_t)rsp;
}
while (total < rsp->len) {
@@ -154,6 +159,10 @@ ssize_t qtfs_fifo_writeiter(struct kiocb *kio, struct iov_iter *iov)
struct qtreq_fifo_write *req;
struct qtrsp_fifo_write *rsp;
+ if (sigismember(&current->pending.signal, SIGURG)) {
+ qtfs_err("signal SIGURG return eintr");
+ return -EINTR;
+ }
if (pvar == NULL || !virt_addr_valid(pvar)) {
qtfs_err("invalid fifo write req, private data is invalid");
return -EFAULT;
@@ -164,9 +173,10 @@ ssize_t qtfs_fifo_writeiter(struct kiocb *kio, struct iov_iter *iov)
pvar->iov_send = iov;
rsp = qtfs_remote_run(pvar, QTFS_REQ_WRITE, sizeof(struct qtreq_fifo_write));
if (IS_ERR_OR_NULL(rsp) || rsp->err != 0) {
- qtfs_err("fifo write remote run failed, or errno:%d", (rsp == NULL) ? -1 : rsp->err);
- return -EFAULT;
+ qtfs_err("fifo write remote run failed, or errno:%d", IS_ERR_OR_NULL(rsp) ? -1 : rsp->err);
+ return (rsp == NULL) ? -EFAULT : (ssize_t)rsp;
}
+ qtfs_info("fifo write over err:%d len:%llu", rsp->err, rsp->len);
return rsp->len;
}
@@ -179,11 +189,12 @@ int qtfs_fifo_release(struct inode *inode, struct file *file)
qtfs_err("invalid fifo write req, private data is invalid");
return -EFAULT;
}
- pvar->vec_recv.iov_len = QTFS_MSG_HEAD_LEN;
+ pvar->vec_recv.iov_len = pvar->recv_max;
rsp = qtfs_remote_run(pvar, QTFS_REQ_CLOSE, 0);
if (IS_ERR_OR_NULL(rsp)) {
qtfs_err("fifo close failed");
}
+ qtfs_info("fifo release req over");
qtfs_fifo_put_file(file);
return 0;
}
diff --git a/qtfs/qtfs/qtfs-mod.c b/qtfs/qtfs/qtfs-mod.c
index ad0bfc5..c4ef72c 100644
--- a/qtfs/qtfs/qtfs-mod.c
+++ b/qtfs/qtfs/qtfs-mod.c
@@ -66,7 +66,7 @@ void *qtfs_remote_run(struct qtfs_conn_var_s *pvar, unsigned int type, unsigned
if (ret <= 0) {
qtfs_err("qtfs remote run send failed, ret:%d pvar sendlen:%lu.", ret, pvar->vec_send.iov_len);
qtinfo_senderrinc(req->type);
- return NULL;
+ return (void *)ret;
}
qtinfo_sendinc(type);
@@ -87,7 +87,7 @@ retry:
}
// miss message retry would result in block
if (retrytimes >= 5) {
- qtfs_err("qtfs conn recv get mismatch seq_num too many times, stop retrying");
+ qtfs_err("qtfs conn recv get mismatch seq_num too many times, stop retrying, signal:0x%lx", (unsigned long)current->pending.signal.sig[0]);
return NULL;
}
retrytimes++;
@@ -98,9 +98,9 @@ retry:
qtinfo_cntinc(QTINF_RESTART_SYS);
qtinfo_recverrinc(req->type);
}
- if (retrytimes >= 5) {
- qtfs_err("qtfs conn recv get retry signal(%d) too many times, stop retrying", ret);
- return NULL;
+ if (retrytimes >= 5 && ret == -EINTR) {
+ qtfs_err("qtfs conn recv get retry signal(%d) too many times, stop retrying, signal:0x%lx", ret, (unsigned long)current->pending.signal.sig[0]);
+ return (void *)ret;
}
retrytimes++;
msleep(1);
@@ -109,7 +109,7 @@ retry:
if (ret < 0) {
qtfs_err("qtfs remote run error, req_type:%u, ret:%d.", req->type, ret);
qtinfo_recverrinc(req->type);
- return NULL;
+ return (void *)ret;
}
if (retrytimes > 0)
qtfs_debug("qtfs remote run retry times:%lu.", retrytimes);
diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c
index 99809d2..4f2f048 100644
--- a/qtfs/qtfs_common/conn.c
+++ b/qtfs/qtfs_common/conn.c
@@ -274,6 +274,29 @@ int qtfs_conn_send(struct qtfs_conn_var_s *pvar)
return ret + iov_ret;
}
+#ifdef QTFS_CLIENT
+static int qtfs_mismatch_fix(struct qtfs_conn_var_s *pvar)
+{
+ struct qtreq *req = (struct qtreq *)pvar->vec_send.iov_base;
+ struct qtreq *rsp = (struct qtreq *)pvar->vec_recv.iov_base;
+ int ret;
+ size_t len;
+ if (req->seq_num == rsp->seq_num)
+ return 0;
+
+ qtfs_err("recv mismatch package, req type:%u rsp type:%u req seq:%lu rsp seq:%lu",
+ req->type, rsp->type, req->seq_num, rsp->seq_num);
+ // 如果收到错包到目前为止只接收了qtreq这个标准头下面把rsp->len长度
+ // 的socket缓冲区丢弃就行了
+ len = rsp->len;
+ ret = pvar->conn_ops->conn_recv(&pvar->conn_var, pvar->vec_recv.iov_base, len, true);
+ if (ret != len) {
+ qtfs_err("mismatch drop failed, recv len:%lu ret:%d", len, ret);
+ }
+ return -1;
+}
+#endif
+
int do_qtfs_conn_recv(struct qtfs_conn_var_s *pvar, bool block)
{
int ret = 0;
@@ -284,8 +307,10 @@ int do_qtfs_conn_recv(struct qtfs_conn_var_s *pvar, bool block)
int msglen = 0;
void *addr = NULL;
int leftlen = 0;
- int totallen = 0;
+#ifdef QTFS_CLIENT
+start:
+#endif
headlen = pvar->conn_ops->conn_recv(&pvar->conn_var, pvar->vec_recv.iov_base, QTFS_MSG_HEAD_LEN, block);
if (headlen <= 0) {
return headlen;
@@ -294,6 +319,12 @@ int do_qtfs_conn_recv(struct qtfs_conn_var_s *pvar, bool block)
qtfs_err("qtfs recv headlen not valid, expect(%ld), get(%d)", QTFS_MSG_HEAD_LEN, headlen);
return headlen;
}
+#ifdef QTFS_CLIENT
+ if (qtfs_mismatch_fix(pvar) != 0) {
+ qtfs_err("mismatch package recved");
+ goto start;
+ }
+#endif
load.iov_base = pvar->vec_recv.iov_base + QTFS_MSG_HEAD_LEN;
load.iov_len = pvar->vec_recv.iov_len - QTFS_MSG_HEAD_LEN;
@@ -318,7 +349,7 @@ retry:
qtinfo_recverrinc(rsp->type);
}
#endif
- if (retrytimes >= 5) {
+ if (retrytimes >= 5 && ret == -EINTR) {
qtfs_err("qtfs recv get retry signal(%d) too many times, stop retrying", ret);
return ret;
}
@@ -331,12 +362,8 @@ retry:
return ret;
}
- totallen += ret;
- if (totallen < msglen) {
- qtfs_err("qtfs conn recv %d msg, expect %d, goto retry", ret, msglen);
- addr += ret;
- leftlen -= ret;
- goto retry;
+ if (ret < msglen) {
+ qtfs_err("qtfs conn recv %d msg, expect %d", ret, msglen);
}
if (ret > rsp->len) {
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index e1d9bd1..fc4c67c 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -21,6 +21,7 @@
#include <sys/epoll.h>
#include <linux/vm_sockets.h>
+int log_switch = 0;
#include "req.h"
#include "log.h"
#include "libsocket.h"
@@ -227,22 +228,26 @@ static void fifo_proc_ack(struct fifo_event_t *evt, int type, int sockfd, char *
{
int ret;
struct qtreq rsp;
+ char *msg = (char *)malloc(sizeof(rsp) + arglen);
+ if (msg == NULL) {
+ log_err("malloc failed:%d.", errno);
+ return;
+ }
rsp.type = type;
rsp.err = 0;
rsp.seq_num = evt->seq_num;
rsp.len = arglen;
- ret = write(sockfd, &rsp, sizeof(struct qtreq));
+ memcpy(msg, &rsp, sizeof(rsp));
+ memcpy(&msg[sizeof(rsp)], arg, arglen);
+
+ ret = write(sockfd, msg, sizeof(struct qtreq) + arglen);
+ free(msg);
if (ret < 0) {
log_err("fifo ack type:%d failed, sockfd:%d err:%d", type, sockfd, errno);
return;
}
- ret = write(sockfd, arg, arglen);
- if (ret < 0) {
- log_err("fifo ack arg type:%d failed, sockfd:%d err:%d", type, sockfd, errno);
- return;
- }
log_info("Type:%d ack successed, sockfd:%d.", type, sockfd);
return;
}
@@ -639,6 +644,8 @@ int fifo_proc_main_sock(struct fifo_event_t *evt)
return FIFO_RET_OK;
}
+
+extern int engine_run;
void *fifo_server_main_thread(void *arg)
{
int indx = 0;
@@ -673,7 +680,7 @@ void *fifo_server_main_thread(void *arg)
fifo_add_event(sockfd, NULL, fifo_proc_main_sock, NULL, EPOLLIN);
- while (1) {
+ while (engine_run) {
int ret;
struct fifo_event_t *event;
int n = epoll_wait(epollfd, evts, EPOLL_MAX_EVENT_NUMS, 1000);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,150 +0,0 @@
From 7f99bba84646a5efe0f25f83e6c45e70537798bd Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Fri, 8 Dec 2023 17:18:42 +0800
Subject: [PATCH 2/3] fix virsh console problem
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/fifo.c | 6 +++---
qtfs/qtfs/qtfs-mod.h | 1 +
qtfs/qtfs/sb.c | 1 +
qtfs/qtfs_server/server_fifo.c | 21 ++++++++++++++++-----
4 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/qtfs/qtfs/fifo.c b/qtfs/qtfs/fifo.c
index 55292de..829ce66 100644
--- a/qtfs/qtfs/fifo.c
+++ b/qtfs/qtfs/fifo.c
@@ -199,8 +199,8 @@ int qtfs_fifo_release(struct inode *inode, struct file *file)
return 0;
}
-static __poll_t
-qtfs_fifo_poll(struct file *filp, poll_table *wait)
+__poll_t
+qtfs_poll(struct file *filp, poll_table *wait)
{
struct qtfs_inode_priv *priv = filp->f_inode->i_private;
__poll_t mask = 0;
@@ -248,5 +248,5 @@ struct file_operations qtfsfifo_ops = {
.open = qtfs_fifo_open,
.release = qtfs_fifo_release,
.llseek = no_llseek,
- .poll = qtfs_fifo_poll,
+ .poll = qtfs_poll,
};
diff --git a/qtfs/qtfs/qtfs-mod.h b/qtfs/qtfs/qtfs-mod.h
index cecce11..21d2f2d 100644
--- a/qtfs/qtfs/qtfs-mod.h
+++ b/qtfs/qtfs/qtfs-mod.h
@@ -192,6 +192,7 @@ int qtfs_utils_register(void);
void qtfs_utils_destroy(void);
void qtfs_whitelist_clearall(void);
void qtfs_whitelist_initset(void);
+__poll_t qtfs_poll(struct file *filp, poll_table *wait);
#endif
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index 79f1f89..a0d0964 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -747,6 +747,7 @@ static struct file_operations qtfs_file_ops = {
.llseek = qtfs_llseek,
.fsync = qtfs_fsync,
.unlocked_ioctl = qtfs_ioctl,
+ .poll = qtfs_poll,
};
static int qtfs_readpage(struct file *file, struct page *page)
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index fc4c67c..0eaadea 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -190,15 +190,20 @@ void fifo_suspend_event(struct fifo_event_t *evt)
static int fifo_peer_index;
static struct fifo_event_t *fifo_peer_evt[EPOLL_MAX_EVENT_NUMS];
-static int fifo_del_peer(int flag, struct fifo_event_t *peer)
+static int fifo_del_peer(int flag, struct fifo_event_t *me)
{
+ // 自己已经先被peer加过了就不必加peer了peer此时已释放
+ for (int i = 0; i < fifo_peer_index; i++) {
+ if (fifo_peer_evt[i] == me)
+ return 0;
+ }
switch (flag) {
case FIFO_PEER_PRE:
fifo_peer_index = 0;
memset(fifo_peer_evt, 0, sizeof(struct fifo_event_t *) * EPOLL_MAX_EVENT_NUMS);
break;
case FIFO_PEER_ADD:
- fifo_peer_evt[fifo_peer_index] = peer;
+ fifo_peer_evt[fifo_peer_index] = me->peerevt;
break;
case FIFO_PEER_POST:
for (int i = 0; i < fifo_peer_index; i++) {
@@ -288,6 +293,7 @@ int fifo_proc_readable(struct fifo_event_t *evt)
char *msg;
struct qtrsp_fifo_read *rsp;
int readlen = evt->len;
+ int error_ret = FIFO_RET_SUSPEND;
if (readlen > QTFS_REQ_MAX_LEN) {
log_err("Read rsp len:%d too large!", readlen);
ret = EINVAL;
@@ -307,6 +313,8 @@ int fifo_proc_readable(struct fifo_event_t *evt)
log_err("read from fifo:%d failed, readlen:%d, errno:%d", evt->fd, readlen, errno);
ret = errno;
free(msg);
+ if (errno == EPIPE)
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp->err = 0;
@@ -327,7 +335,7 @@ err_ack:
fifo_proc_ack(evt, QTFS_REQ_READITER, evt->peerevt->fd, (char *)&errrsp, sizeof(errrsp));
} while (0);
evt->peerevt->peerevt = NULL;
- return FIFO_RET_SUSPEND;
+ return error_ret;
}
int fifo_proc_writeable(struct fifo_event_t *evt)
@@ -337,6 +345,7 @@ int fifo_proc_writeable(struct fifo_event_t *evt)
char *msg;
struct qtrsp_fifo_write rsp;
int writelen = evt->len;
+ int error_ret = FIFO_RET_SUSPEND;
if (writelen > QTFS_REQ_MAX_LEN) {
log_err("Read rsp len:%d too large!", writelen);
ret = EINVAL;
@@ -361,6 +370,8 @@ int fifo_proc_writeable(struct fifo_event_t *evt)
log_err("write to fifo failed, ret:%d errno:%d", ret, errno);
ret = errno;
free(msg);
+ if (errno == EPIPE)
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp.err = 0;
@@ -379,7 +390,7 @@ err_ack:
errrsp.len = 0;
fifo_proc_ack(evt, QTFS_REQ_WRITE, evt->peerevt->fd, (char *)&errrsp, sizeof(errrsp));
} while (0);
- return FIFO_RET_SUSPEND;
+ return error_ret;
}
// 处理读请求,读可能阻塞,因为打开时已经确定是否阻塞型,
@@ -700,7 +711,7 @@ void *fifo_server_main_thread(void *arg)
} else if (ret == FIFO_RET_DEL) {
fifo_del_event(event);
} else if (ret == FIFO_RET_DEL_BOTH) {
- fifo_del_peer(FIFO_PEER_ADD, event->peerevt);
+ fifo_del_peer(FIFO_PEER_ADD, event);
fifo_del_event(event);
}
}
--
2.37.1 (Apple Git-137.1)

View File

@ -1,32 +0,0 @@
From 44efcff94d48fe022d0eb76924ac549a3dc4d9ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <liqiang64@huawei.com>
Date: Sat, 9 Dec 2023 08:26:04 +0000
Subject: [PATCH 3/3] =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=E4=B8=AD=E5=88=A0=E9=99=A4=E6=89=93=E5=8D=B0write=E5=86=85?=
=?UTF-8?q?=E5=AE=B9=EF=BC=8C=E9=98=B2=E6=AD=A2=E4=BF=A1=E6=81=AF=E6=B3=84?=
=?UTF-8?q?=E9=9C=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 李强 <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index a0d0964..fb60261 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -480,7 +480,7 @@ ssize_t qtfs_writeiter(struct kiocb *kio, struct iov_iter *iov)
wake_up_interruptible_sync_poll(&priv->readq, EPOLLIN | EPOLLRDNORM);
if (S_ISCHR(inode->i_mode)) {
wake_up_interruptible_poll(&priv->readq, EPOLLIN);
- qtfs_err("writeiter file:%s char:<%s> wakup poll.", filp->f_path.dentry->d_iname, req->path_buf);
+ qtfs_err("writeiter file:%s len:%lu wakup poll.", filp->f_path.dentry->d_iname, len - leftlen);
}
} while (0);
qtfs_info("qtfs write %s over, leftlen:%lu.", filp->f_path.dentry->d_iname, leftlen);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,115 +0,0 @@
From f624bc7602c459de3cbbcd691309c1c66438d109 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 11 Dec 2023 10:46:07 +0800
Subject: [PATCH 04/12] fix rexec exit code bug, and fix some warning
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/qtfs-mod.c | 6 +++---
qtfs/rexec/rexec.c | 11 ++++++-----
qtfs/rexec/rexec_server.c | 6 ++++--
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/qtfs/qtfs/qtfs-mod.c b/qtfs/qtfs/qtfs-mod.c
index c4ef72c..0b6cd65 100644
--- a/qtfs/qtfs/qtfs-mod.c
+++ b/qtfs/qtfs/qtfs-mod.c
@@ -66,7 +66,7 @@ void *qtfs_remote_run(struct qtfs_conn_var_s *pvar, unsigned int type, unsigned
if (ret <= 0) {
qtfs_err("qtfs remote run send failed, ret:%d pvar sendlen:%lu.", ret, pvar->vec_send.iov_len);
qtinfo_senderrinc(req->type);
- return (void *)ret;
+ return ERR_PTR(ret);
}
qtinfo_sendinc(type);
@@ -100,7 +100,7 @@ retry:
}
if (retrytimes >= 5 && ret == -EINTR) {
qtfs_err("qtfs conn recv get retry signal(%d) too many times, stop retrying, signal:0x%lx", ret, (unsigned long)current->pending.signal.sig[0]);
- return (void *)ret;
+ return ERR_PTR(ret);
}
retrytimes++;
msleep(1);
@@ -109,7 +109,7 @@ retry:
if (ret < 0) {
qtfs_err("qtfs remote run error, req_type:%u, ret:%d.", req->type, ret);
qtinfo_recverrinc(req->type);
- return (void *)ret;
+ return ERR_PTR(ret);
}
if (retrytimes > 0)
qtfs_debug("qtfs remote run retry times:%lu.", retrytimes);
diff --git a/qtfs/rexec/rexec.c b/qtfs/rexec/rexec.c
index 060abc5..e24c0ad 100644
--- a/qtfs/rexec/rexec.c
+++ b/qtfs/rexec/rexec.c
@@ -183,7 +183,7 @@ static int rexec_conn_msg(struct rexec_client_event *evt)
}
} else {
char msg[sizeof(struct rexec_msg) + 1];
- struct rexec_msg *hs = msg;
+ struct rexec_msg *hs = (struct rexec_msg *)msg;
char *ok = hs->msg;
hs->msgtype = REXEC_HANDSHAKE;
hs->msglen = 1;
@@ -558,7 +558,7 @@ err_end:
static int rexec_handshake_proc(struct rexec_client_event *evt)
{
char msg[sizeof(struct rexec_msg) + 1];
- struct rexec_msg *hs = msg;
+ struct rexec_msg *hs = (struct rexec_msg *)msg;
int ret = read(evt->fd, hs->msg, 1);
if (ret <= 0) {
rexec_err("read from handshake pipe failed, ret:%d err:%d", ret, errno);
@@ -686,8 +686,9 @@ static void *rexec_pipe_proxy_thread(void *arg)
static void *rexec_conn_thread(void *arg)
{
struct rexec_thread_arg *parg = (struct rexec_thread_arg *)arg;
+ int exit_status = rexec_run(parg->efd, parg->connfd, parg->argv);
- return (void *)rexec_run(parg->efd, parg->connfd, parg->argv);
+ pthread_exit((void *)&exit_status);
}
static void rexec_global_var_init()
@@ -763,9 +764,9 @@ int main(int argc, char *argv[])
connarg.connfd = connfd;
connarg.argv = argv;
(void)pthread_create(&thrd_conn, NULL, rexec_conn_thread, &connarg);
- pthread_join(thrd_conn, (void *)&exit_status);
+ pthread_join(thrd_conn, (void **)&exit_status);
fclose(rexec_logfile);
- exit((int)exit_status);
+ exit(*(int *)exit_status);
err_end:
fclose(rexec_logfile);
rexec_logfile = NULL;
diff --git a/qtfs/rexec/rexec_server.c b/qtfs/rexec/rexec_server.c
index 7182a9e..5e571fd 100644
--- a/qtfs/rexec/rexec_server.c
+++ b/qtfs/rexec/rexec_server.c
@@ -379,7 +379,7 @@ static int rexec_start_new_process(int newconnfd)
char *ack;
int mypid = getpid();
char msg[sizeof(struct rexec_msg) + 1];
- struct rexec_msg *pm = msg;
+ struct rexec_msg *pm = (struct rexec_msg *)msg;
pm->msgtype = REXEC_PIDMAP;
pm->msglen = 0;
pm->pid = mypid;
@@ -443,7 +443,9 @@ err_free:
err_to_parent:
do {
int errpid = -1;
- write(pipefd[PIPE_WRITE], &errpid, sizeof(int));
+ if (write(pipefd[PIPE_WRITE], &errpid, sizeof(int)) <= 0) {
+ rexec_err("write err ack to parent failed, errno:%d", errno);
+ }
} while (0);
exit(0);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,28 +0,0 @@
From 0c20dd74f9acc47da17ce0e94c6616b0961f3854 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 11 Dec 2023 11:19:19 +0800
Subject: [PATCH 05/12] add cmake to adapt server fifo
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/qtfs/CMakeLists.txt b/qtfs/CMakeLists.txt
index 012c8db..4d0e9e3 100644
--- a/qtfs/CMakeLists.txt
+++ b/qtfs/CMakeLists.txt
@@ -18,8 +18,8 @@ target_include_directories(udsproxyd PRIVATE include/ /usr/include/glib-2.0 /usr
target_link_libraries(udsproxyd PRIVATE pthread glib-2.0)
# Build engine
-add_executable(engine ipc/uds_main.c ipc/uds_event.c qtfs_common/user_engine.c)
-target_include_directories(engine PRIVATE include/ ./ ipc/ /usr/include/glib-2.0 /usr/lib64/glib-2.0/include)
+add_executable(engine ipc/uds_main.c ipc/uds_event.c qtfs_common/user_engine.c qtfs_server/server_fifo.c qtfs_common/libsocket.c)
+target_include_directories(engine PRIVATE include/ ./ ipc/ qtfs_common/ /usr/include/glib-2.0 /usr/lib64/glib-2.0/include)
target_link_libraries(engine PRIVATE glib-2.0 pthread)
target_compile_options(engine PRIVATE "-DQTFS_SERVER")
--
2.37.1 (Apple Git-137.1)

View File

@ -1,534 +0,0 @@
From ba079528b3c1c0fd911ee98353685c4116c8e6f8 Mon Sep 17 00:00:00 2001
From: Deng Guangxing <dengguangxing@huawei.com>
Date: Mon, 11 Dec 2023 14:20:51 +0800
Subject: [PATCH 06/12] code-style problem fix
Signed-off-by: Deng Guangxing <dengguangxing@huawei.com>
---
qtfs/ipc/uds_event.c | 6 +-
qtfs/qtfs/fifo.c | 39 ++++++-------
qtfs/qtfs/proc.c | 10 ++--
qtfs/qtfs/qtfs-mod.c | 6 +-
qtfs/qtfs/sb.c | 7 +--
qtfs/qtfs_common/qtfs_check.c | 103 ++++++++++++----------------------
qtfs/rexec/rexec.c | 11 ++--
7 files changed, 77 insertions(+), 105 deletions(-)
diff --git a/qtfs/ipc/uds_event.c b/qtfs/ipc/uds_event.c
index 4253deb..78a2a97 100644
--- a/qtfs/ipc/uds_event.c
+++ b/qtfs/ipc/uds_event.c
@@ -524,7 +524,7 @@ static int uds_msg_scm_regular_file(int scmfd, int tcpfd, struct uds_event_globa
uds_err("failed to calloc memory");
return EVENT_ERR;
}
- sprintf(fdproc, "/proc/self/fd/%d", scmfd);
+ snprintf(fdproc, UDS_PATH_MAX, "/proc/self/fd/%d", scmfd);
ret = readlink(fdproc, p_scmr->path, UDS_PATH_MAX);
if (ret < 0) {
uds_err("readlink:%s error, ret:%d, errno:%d", fdproc, ret, errno);
@@ -562,7 +562,7 @@ static int uds_msg_scm_fifo_file(int scmfd, int tcpfd, struct uds_event_global_v
p_get->msgtype = MSG_SCM_PIPE;
p_get->msglen = sizeof(struct uds_stru_scm_pipe);
- sprintf(path, "/proc/self/fd/%d", scmfd);
+ snprintf(path, FDPATH_LEN, "/proc/self/fd/%d", scmfd);
lstat(path, &st);
if (st.st_mode & S_IRUSR) {
p_pipe->dir = SCM_PIPE_READ;
@@ -1085,7 +1085,7 @@ int uds_event_debug_level(void *arg, int epfd, struct uds_event_global_var *p_ev
uds_log("debug level accept a new connection, current level:%s change to:%s", UDS_LOG_STR(cur), UDS_LOG_STR(p_uds_var->loglevel));
- len = sprintf(p_event_var->iov_base, "+---------------UDS LOG LEVEL UPDATE--------------+\n"
+ len = snprintf(p_event_var->iov_base, p_event_var->iov_len, "+---------------UDS LOG LEVEL UPDATE--------------+\n"
"+ Log level is:%s before, now change to :%s.\n"
"+-------------------------------------------------+\n", UDS_LOG_STR(cur), UDS_LOG_STR(p_uds_var->loglevel));
diff --git a/qtfs/qtfs/fifo.c b/qtfs/qtfs/fifo.c
index 829ce66..f072706 100644
--- a/qtfs/qtfs/fifo.c
+++ b/qtfs/qtfs/fifo.c
@@ -26,9 +26,9 @@
static void qtfs_fifo_put_file(struct file *file)
{
- struct private_data *priv = file->private_data;
- struct qtfs_conn_var_s *pvar = (struct qtfs_conn_var_s *)priv->priv;
- if (pvar == NULL) {
+ struct private_data *priv;
+ struct qtfs_conn_var_s *pvar;
+ if (file == NULL || (priv = file->private_data) == NULL || (pvar = (struct qtfs_conn_var_s *)priv->priv) == NULL) {
qtfs_err("fifo private data invalid to put");
return;
}
@@ -110,8 +110,8 @@ int qtfs_fifo_open(struct inode *inode, struct file *file)
ssize_t qtfs_fifo_readiter(struct kiocb *kio, struct iov_iter *iov)
{
- struct private_data *priv = kio->ki_filp->private_data;
- struct qtfs_conn_var_s *pvar = (struct qtfs_conn_var_s *)priv->priv;
+ struct private_data *priv;
+ struct qtfs_conn_var_s *pvar;
struct qtreq_fifo_read *req;
struct qtrsp_fifo_read *rsp;
int total = 0;
@@ -121,7 +121,7 @@ ssize_t qtfs_fifo_readiter(struct kiocb *kio, struct iov_iter *iov)
qtfs_err("signal SIGURG return eintr");
return -EINTR;
}
- if (pvar == NULL || !virt_addr_valid(pvar)) {
+ if (!kio || !kio->ki_filp || (priv = kio->ki_filp->private_data) == NULL || (pvar = (struct qtfs_conn_var_s *)priv->priv) == NULL || !virt_addr_valid(pvar)) {
qtfs_err("invalid fifo read req, private data is invalid");
return -EFAULT;
}
@@ -154,8 +154,8 @@ ssize_t qtfs_fifo_readiter(struct kiocb *kio, struct iov_iter *iov)
ssize_t qtfs_fifo_writeiter(struct kiocb *kio, struct iov_iter *iov)
{
- struct private_data *priv = kio->ki_filp->private_data;
- struct qtfs_conn_var_s *pvar = (struct qtfs_conn_var_s *)priv->priv;
+ struct private_data *priv;
+ struct qtfs_conn_var_s *pvar;
struct qtreq_fifo_write *req;
struct qtrsp_fifo_write *rsp;
@@ -163,7 +163,7 @@ ssize_t qtfs_fifo_writeiter(struct kiocb *kio, struct iov_iter *iov)
qtfs_err("signal SIGURG return eintr");
return -EINTR;
}
- if (pvar == NULL || !virt_addr_valid(pvar)) {
+ if (!kio || !kio->ki_filp || (priv = kio->ki_filp->private_data) == NULL || (pvar = (struct qtfs_conn_var_s *)priv->priv) == NULL || !virt_addr_valid(pvar)) {
qtfs_err("invalid fifo write req, private data is invalid");
return -EFAULT;
}
@@ -182,10 +182,11 @@ ssize_t qtfs_fifo_writeiter(struct kiocb *kio, struct iov_iter *iov)
int qtfs_fifo_release(struct inode *inode, struct file *file)
{
- struct private_data *priv = file->private_data;
- struct qtfs_conn_var_s *pvar = (struct qtfs_conn_var_s *)priv->priv;
+ struct private_data *priv;
+ struct qtfs_conn_var_s *pvar;
struct qtrsp_fifo_close *rsp = NULL;
- if (pvar == NULL) {
+
+ if (file == NULL || (priv = file->private_data) == NULL || (pvar = (struct qtfs_conn_var_s *)priv->priv) == NULL) {
qtfs_err("invalid fifo write req, private data is invalid");
return -EFAULT;
}
@@ -202,22 +203,22 @@ int qtfs_fifo_release(struct inode *inode, struct file *file)
__poll_t
qtfs_poll(struct file *filp, poll_table *wait)
{
- struct qtfs_inode_priv *priv = filp->f_inode->i_private;
+ struct qtfs_inode_priv *priv;
__poll_t mask = 0;
struct list_head *p;
struct qtfs_conn_var_s *pvar;
struct qtreq_poll *req;
struct qtrsp_poll *rsp;
- struct private_data *fpriv = (struct private_data *)filp->private_data;
-
- poll_wait(filp, &priv->readq, wait);
-
- p = &priv->readq.head;
+ struct private_data *fpriv;
- if (fpriv->fd < 0) {
+ if (!filp || !filp->f_inode || !(priv = filp->f_inode->i_private) || !(fpriv = (struct private_data *)filp->private_data) || fpriv->fd < 0) {
qtfs_err("fifo poll priv file invalid.");
return 0;
}
+
+ poll_wait(filp, &priv->readq, wait);
+ p = &priv->readq.head;
+
pvar = qtfs_conn_get_param();
if (pvar == NULL) {
qtfs_err("qtfs fifo poll get param failed.");
diff --git a/qtfs/qtfs/proc.c b/qtfs/qtfs/proc.c
index 70238ea..deea1c8 100644
--- a/qtfs/qtfs/proc.c
+++ b/qtfs/qtfs/proc.c
@@ -147,7 +147,7 @@ struct dentry *qtfs_proc_lookup(struct inode *parent_inode, struct dentry *child
if (pid > 0) {
sscanf(cpath, "/proc/%s", tmp);
memset(cpath, 0, MAX_PATH_LEN);
- sprintf(cpath, "/local_proc/%s", tmp);
+ snprintf(cpath, MAX_PATH_LEN, "/local_proc/%s", tmp);
qtfs_debug("[%s]: get path from local: %s\n", __func__, cpath);
ret = kern_path(cpath, 0, &spath);
if(ret) {
@@ -208,13 +208,13 @@ const char *qtfs_proc_getlink(struct dentry *dentry,
}
if (!strncmp(path, "/proc/self", 11)) {
- sprintf(link, "/local_proc/%d", (int)current->pid);
+ snprintf(link, MAX_PATH_LEN, "/local_proc/%d", (int)current->pid);
qtfs_info("[%s] success: %s getlink: %s", __func__, path, link);
goto link_local;
}
if (!strcmp(path, "/proc/mounts")) {
- sprintf(link, "/proc/1/mounts");
+ snprintf(link, MAX_PATH_LEN, "/proc/1/mounts");
qtfs_info("[%s] success: %s getlink /proc/1/mounts", __func__, path);
goto link_local;
}
@@ -222,7 +222,7 @@ const char *qtfs_proc_getlink(struct dentry *dentry,
pid = is_local_process(path);
if (pid > 0) {
sscanf(path, "/proc/%s", tmp);
- sprintf(link, "/local_proc/%s", tmp);
+ snprintf(link, MAX_PATH_LEN, "/local_proc/%s", tmp);
qtfs_info("[%s] success: %s getlink: %s", __func__, path, link);
goto link_local;
}
@@ -274,7 +274,7 @@ int qtfs_proc_getattr(const struct path *path, struct kstat *stat, u32 req_mask,
pid = is_local_process(cpath);
if (pid > 0) {
sscanf(cpath, "/proc/%s", tmp);
- sprintf(local_path, "/local_proc/%s", tmp);
+ snprintf(local_path, MAX_PATH_LEN, "/local_proc/%s", tmp);
ret = kern_path(local_path, 0, &spath);
if (ret) {
qtfs_err("[%s]: kern_path(%s) failed: %d", __func__, local_path, ret);
diff --git a/qtfs/qtfs/qtfs-mod.c b/qtfs/qtfs/qtfs-mod.c
index 0b6cd65..d49e9a2 100644
--- a/qtfs/qtfs/qtfs-mod.c
+++ b/qtfs/qtfs/qtfs-mod.c
@@ -23,6 +23,8 @@
#include "syscall.h"
#include "symbol_wrapper.h"
+#define MAX_RETRY 5
+
static struct file_system_type qtfs_fs_type = {
.owner = THIS_MODULE,
.name = QTFS_FSTYPE_NAME,
@@ -86,7 +88,7 @@ retry:
pvar->miss_proc = 0;
}
// miss message retry would result in block
- if (retrytimes >= 5) {
+ if (retrytimes >= MAX_RETRY) {
qtfs_err("qtfs conn recv get mismatch seq_num too many times, stop retrying, signal:0x%lx", (unsigned long)current->pending.signal.sig[0]);
return NULL;
}
@@ -98,7 +100,7 @@ retry:
qtinfo_cntinc(QTINF_RESTART_SYS);
qtinfo_recverrinc(req->type);
}
- if (retrytimes >= 5 && ret == -EINTR) {
+ if (retrytimes >= MAX_RETRY && ret == -EINTR) {
qtfs_err("qtfs conn recv get retry signal(%d) too many times, stop retrying, signal:0x%lx", ret, (unsigned long)current->pending.signal.sig[0]);
return ERR_PTR(ret);
}
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index fb60261..a5bcc8e 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -155,8 +155,8 @@ int qtfs_readdir(struct file *filp, struct dir_context *ctx)
int count = 0;
struct getdents_callback64 *buf = container_of(ctx, struct getdents_callback64, ctx);
- if (!pvar) {
- qtfs_err("Failed to get qtfs sock var");
+ if (!pvar || !buf) {
+ qtfs_err("Failed to get qtfs sock var(%p) or gentdents(%p)", pvar, buf);
return -EINVAL;
}
@@ -168,7 +168,6 @@ int qtfs_readdir(struct file *filp, struct dir_context *ctx)
req = pvar->conn_ops->get_conn_msg_buf(pvar, QTFS_SEND);
rsp = pvar->conn_ops->get_conn_msg_buf(pvar, QTFS_RECV);
QTFS_FULLNAME(req->path, filp->f_path.dentry, sizeof(req->path));
- // req->count = sizeof(rsp->dirent);
count = sizeof(rsp->dirent);
if (buf && buf->count > 0 && buf->count < sizeof(rsp->dirent)) {
qtfs_info("readdir use input buf size(%d), prev_reclen(%d)", buf->count, buf->prev_reclen);
@@ -198,7 +197,6 @@ int qtfs_readdir(struct file *filp, struct dir_context *ctx)
}
dirent = (struct qtfs_dirent64 *)&rsp->dirent[idx];
namelen = strlen(dirent->d_name);
- // ret = dir_emit(ctx, dirent->d_name, namelen, dirent->d_ino, dirent->d_type);
ret = ctx->actor(ctx, dirent->d_name, namelen, ctx->pos, dirent->d_ino, dirent->d_type);
if (ret == -EINTR) {
err = ret;
@@ -210,7 +208,6 @@ int qtfs_readdir(struct file *filp, struct dir_context *ctx)
(void *)dirent - (void *)rsp->dirent, dirent->d_name, ret, dirent->d_reclen, namelen, dirent->d_ino, dirent->d_type);
}
- // ctx->pos = (rsp->d.over) ? -1 : rsp->d.pos;
ctx->pos = rsp->d.pos;
qtfs_info("qtfs readdir<%s> success ret:%d vldcnt:%d dircnt:%d over:%d pos:%lld.",
req->path, rsp->d.ret, rsp->d.vldcnt, dircnt, rsp->d.over, ctx->pos);
diff --git a/qtfs/qtfs_common/qtfs_check.c b/qtfs/qtfs_common/qtfs_check.c
index 8daad39..e2a7ec1 100644
--- a/qtfs/qtfs_common/qtfs_check.c
+++ b/qtfs/qtfs_common/qtfs_check.c
@@ -15,6 +15,26 @@
#include "req.h"
#include "qtfs_check.h"
+#define do_path_check(ops) \
+( \
+ { \
+ struct qtreq_##ops *req = TOREQ; \
+ if (check_string(req->path, sizeof(req->path))) \
+ return QTFS_CHECK_ERR; \
+ return QTFS_CHECK_OK; \
+ } \
+)
+
+#define do_fd_check(ops) \
+( \
+ { \
+ struct qtreq_##ops *req = TOREQ; \
+ if (check_fd(req->fd)) \
+ return QTFS_CHECK_ERR; \
+ return QTFS_CHECK_OK; \
+ } \
+)
+
/*
检查原则:
1. 基本数据类型,据实严格判断合法范围,有数组、指针操作的注意数组越界或指针飞踩;
@@ -26,7 +46,7 @@
// string类型基本防护在max范围内最后一个字符必须是结束符防止越界访问
static inline bool check_string(char *str, size_t max)
{
- if (max == 0)
+ if (str == NULL || max == 0)
return false;
if (str[max - 1] != '\0')
return true;
@@ -50,37 +70,24 @@ int req_check_none(void *in)
int req_check_mount(void *in)
{
- struct qtreq_mount *req = TOREQ;
-
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(mount);
}
int req_check_open(void *in)
{
- struct qtreq_open *req = TOREQ;
// flags 和 mode如果错误syscall会报错不会有安全风险
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(open);
}
int req_check_close(void *in)
{
- struct qtreq_close *req = TOREQ;
- if (check_fd(req->fd))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_fd_check(close);
}
int req_check_readiter(void *in)
{
- struct qtreq_readiter *req = TOREQ;
- if (check_fd(req->fd))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_fd_check(readiter);
}
int req_check_write(void *in)
@@ -111,26 +118,17 @@ int req_check_readdir(void *in)
int req_check_mkdir(void *in)
{
- struct qtreq_mkdir *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(mkdir);
}
int req_check_rmdir(void *in)
{
- struct qtreq_rmdir *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(rmdir);
}
int req_check_getattr(void *in)
{
- struct qtreq_getattr *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(getattr);
}
int req_check_setattr(void *in)
@@ -143,26 +141,17 @@ int req_check_setattr(void *in)
int req_check_icreate(void *in)
{
- struct qtreq_icreate *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(icreate);
}
int req_check_mknod(void *in)
{
- struct qtreq_mknod *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(mknod);
}
int req_check_unlink(void *in)
{
- struct qtreq_unlink *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(unlink);
}
int req_check_symlink(void *in)
@@ -195,10 +184,7 @@ int req_check_link(void *in)
int req_check_getlink(void *in)
{
- struct qtreq_getlink *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(getlink);
}
int req_check_rename(void *in)
@@ -216,10 +202,7 @@ int req_check_rename(void *in)
}
int req_check_xattrlist(void *in)
{
- struct qtreq_xattrlist *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(xattrlist);
}
int req_check_xattrget(void *in)
@@ -277,18 +260,12 @@ int req_check_sysumount(void *in)
int req_check_fifopoll(void *in)
{
- struct qtreq_poll *req = TOREQ;
- if (check_fd(req->fd))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_fd_check(poll);
}
int req_check_statfs(void *in)
{
- struct qtreq_statfs *req = TOREQ;
- if (check_string(req->path, sizeof(req->path)))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_path_check(statfs);
}
int req_check_ioctl(void *in)
@@ -303,18 +280,12 @@ int req_check_ioctl(void *in)
int req_check_epoll_ctl(void *in)
{
- struct qtreq_epollctl *req = TOREQ;
- if (check_fd(req->fd))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_fd_check(epollctl);
}
int req_check_llseek(void *in)
{
- struct qtreq_llseek *req = TOREQ;
- if (check_fd(req->fd))
- return QTFS_CHECK_ERR;
- return QTFS_CHECK_OK;
+ do_fd_check(llseek);
}
int req_check_sc_kill(void *in)
diff --git a/qtfs/rexec/rexec.c b/qtfs/rexec/rexec.c
index e24c0ad..f905cfa 100644
--- a/qtfs/rexec/rexec.c
+++ b/qtfs/rexec/rexec.c
@@ -150,7 +150,7 @@ static int rexec_conn_msg(struct rexec_client_event *evt)
rexec_err("Rexec pidmap msg > 1 error.");
return REXEC_EVENT_OK;
}
- sprintf(path, "%s/%d", REXEC_PIDMAP_PATH, mypid);
+ snprintf(path, REXEC_PIDMAP_PATH_LEN, "%s/%d", REXEC_PIDMAP_PATH, mypid);
fd = open(path, O_CREAT|O_WRONLY, 0600);
if (fd < 0) {
rexec_err("Rexec create pidmap:%d-%d failed, path:%s open failed:%d",
@@ -170,7 +170,7 @@ static int rexec_conn_msg(struct rexec_client_event *evt)
rexec_err("Rexec pidmap file:%s lseek 0 failed errno:%d rexec exit", path, err);
return REXEC_EVENT_EXIT;
}
- sprintf(buf, "%d", peerpid);
+ snprintf(buf, REXEC_PID_LEN, "%d", peerpid);
if ((err = write(fd, buf, strlen(buf))) <= 0) {
rexec_err("Rexec pidmap file:%s write pid:%d failed errno:%d rexec exit.", path, peerpid, err);
return REXEC_EVENT_EXIT;
@@ -316,7 +316,7 @@ static int rexec_run(int efd, int connfd, char *argv[])
// clear pidmap file
if (pidfd > 0) {
char path[32] = {0};
- sprintf(path, "%s/%d", REXEC_PIDMAP_PATH, getpid());
+ snprintf(path, 32, "%s/%d", REXEC_PIDMAP_PATH, getpid());
close(pidfd);
remove(path);
}
@@ -357,7 +357,7 @@ void rexec_clear_pids()
continue;
memset(path, 0, sizeof(path));
- sprintf(path, "%s/%s", REXEC_PIDMAP_PATH, entry->d_name);
+ snprintf(path, REXEC_PIDMAP_PATH_LEN, "%s/%s", REXEC_PIDMAP_PATH, entry->d_name);
fd = open(path, O_RDONLY);
if (fd <= 0) {
rexec_err("open pid file:%s failed", path);
@@ -401,7 +401,7 @@ static int rexec_get_fdinfo(struct dirent *fdentry, struct rexec_fdinfo *fdinfo)
return -1;
if (!rexec_is_reg_file(fd))
return -1;
- sprintf(path, "/proc/self/fd/%s", fdentry->d_name);
+ snprintf(path, 32, "/proc/self/fd/%s", fdentry->d_name);
ret = readlink(path, fdinfo->path, REXEC_PATH_MAX);
if (ret < 0) {
rexec_err("Get fd:%d link failed.", fd);
@@ -624,6 +624,7 @@ static int rexec_send_binary_msg(int efd, int argc, char *argv[], int arglen, ch
pmsg->argc = argc - 1; // for remote binary's argc is argc-1
// pmsg->msg is like: "binary"\0"argv[1]"\0"argv[2]"\0"..."
pmsg->msglen = rexec_msg_fill_argv(pmsg->argc, &argv[1], bufmsg);
+ // bufmsg len has been calculated to make sure it will not overflow.
strcpy(&bufmsg[pmsg->msglen], fds_json);
pmsg->msglen += strlen(fds_json);
free(fds_json);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,27 +0,0 @@
From 8b34c899b08ee078e988c900b90d9b925f5535aa Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 11 Dec 2023 19:48:50 +0800
Subject: [PATCH 07/12] do not output addr in kernel
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index a5bcc8e..0babad1 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -156,7 +156,8 @@ int qtfs_readdir(struct file *filp, struct dir_context *ctx)
struct getdents_callback64 *buf = container_of(ctx, struct getdents_callback64, ctx);
if (!pvar || !buf) {
- qtfs_err("Failed to get qtfs sock var(%p) or gentdents(%p)", pvar, buf);
+ qtfs_err("Failed to get qtfs sock var(%s) or gentdents(%s)",
+ (!pvar) ? "INVALID" : "VALID", (!buf) ? "INVALID" : "VALID");
return -EINVAL;
}
--
2.37.1 (Apple Git-137.1)

View File

@ -1,37 +0,0 @@
From d5de8eaa514e2a29cd85f0bb4eae7850bfe59c88 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 11 Dec 2023 21:46:43 +0800
Subject: [PATCH 08/12] fix coredump run binary after copy in client
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index fb60261..68ad696 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -482,6 +482,11 @@ ssize_t qtfs_writeiter(struct kiocb *kio, struct iov_iter *iov)
wake_up_interruptible_poll(&priv->readq, EPOLLIN);
qtfs_err("writeiter file:%s len:%lu wakup poll.", filp->f_path.dentry->d_iname, len - leftlen);
}
+ if (inode->i_size < kio->ki_pos) {
+ qtfs_info("file:%s write pos reached:%lld and inode size is:%lld just update.",
+ filp->f_path.dentry->d_iname, kio->ki_pos, inode->i_size);
+ inode->i_size = kio->ki_pos;
+ }
} while (0);
qtfs_info("qtfs write %s over, leftlen:%lu.", filp->f_path.dentry->d_iname, leftlen);
qtfs_conn_put_param(pvar);
@@ -1331,6 +1336,7 @@ int qtfs_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsi
qtfs_conn_put_param(pvar);
return ret;
}
+ inode->i_size = rsp->stat.size;
*stat = rsp->stat;
if (path->dentry && path->dentry->d_inode && S_ISDIR(path->dentry->d_inode->i_mode))
path->dentry->d_time = jiffies;
--
2.37.1 (Apple Git-137.1)

View File

@ -1,27 +0,0 @@
From 4352197e314767a644c46b43a08fc02b67d9dd63 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Tue, 12 Dec 2023 11:53:18 +0800
Subject: [PATCH 09/12] get mount pointer error when remote mount path is same
as local path
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index fb60261..68ed8d8 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -107,7 +107,7 @@ static inline char *qtfs_mountpoint_path_init(struct dentry *dentry, struct path
if (IS_ERR_OR_NULL(ret)) {
qtfs_err("d_absolute_path failed:%ld", QTFS_PTR_ERR(ret));
} else {
- if (strcmp(mnt_file, "/")) {
+ if (strcmp(ret, mnt_file) != 0 && strcmp(mnt_file, "/")) {
mnt_point = strstr(ret, mnt_file);
qtfs_info("mnt point:%s", mnt_point);
if (mnt_point) {
--
2.37.1 (Apple Git-137.1)

View File

@ -1,114 +0,0 @@
From 0626a247f1b30b71f74f0eb7cd0890c4c469e6a6 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Wed, 13 Dec 2023 14:48:11 +0800
Subject: [PATCH 10/12] bugfix: unix socket connection refuse after chmod
modify socket file
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 38 ++++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index fefb6c1..4ecbf50 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -35,6 +35,17 @@ static struct inode_operations qtfs_inode_ops;
static struct inode_operations qtfs_symlink_inode_ops;
struct inode *qtfs_iget(struct super_block *sb, struct inode_info *ii);
extern ssize_t qtfs_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size);
+static void qtfs_copy_kstat_inode(struct inode *inode, struct kstat *stat)
+{
+ inode->i_mode = stat->mode;
+ inode->i_size = stat->size;
+ inode->i_uid = stat->uid;
+ inode->i_gid = stat->gid;
+ inode->i_atime = stat->atime;
+ inode->i_mtime = stat->mtime;
+ inode->i_ctime = stat->ctime;
+}
+
int qtfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct qtfs_conn_var_s *pvar = qtfs_conn_get_param();
@@ -1340,16 +1351,28 @@ int qtfs_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsi
path->dentry->d_time = jiffies;
qtfs_debug("qtfs getattr success:<%s> blksiz:%u size:%lld mode:%o ino:%llu pathino:%lu. %s\n", req->path, rsp->stat.blksize,
rsp->stat.size, rsp->stat.mode, rsp->stat.ino, inode->i_ino, rsp->stat.ino != inode->i_ino ? "delete current inode" : "");
- if (inode->i_ino != rsp->stat.ino || inode->i_mode != rsp->stat.mode) {
+ if (inode->i_ino != rsp->stat.ino) {
if (inode->i_nlink > 0){
drop_nlink(inode);
}
d_invalidate(path->dentry);
}
+ qtfs_copy_kstat_inode(inode, &rsp->stat);
qtfs_conn_put_param(pvar);
return 0;
}
+static void qtfs_copy_iattr_inode(struct inode *inode, struct iattr *attr)
+{
+ inode->i_mode = attr->ia_mode;
+ inode->i_uid = attr->ia_uid;
+ inode->i_gid = attr->ia_gid;
+ inode->i_size = attr->ia_size;
+ inode->i_atime = attr->ia_atime;
+ inode->i_mtime = attr->ia_mtime;
+ inode->i_ctime = attr->ia_ctime;
+}
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0))
int qtfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr)
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0))
@@ -1385,6 +1408,8 @@ int qtfs_setattr(struct dentry *dentry, struct iattr *attr)
qtfs_conn_put_param(pvar);
return ret;
}
+ // 成功后更新local的inode信息
+ qtfs_copy_iattr_inode(dentry->d_inode, &req->attr);
qtfs_info("qtfs setattr <%s> success.\n", req->path);
qtfs_conn_put_param(pvar);
return 0;
@@ -1558,7 +1583,7 @@ int qtfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)
pvar = qtfs_conn_get_param();
if (!pvar) {
qtfs_err("Failed to get qtfs sock var\n");
- return 0;
+ return 1;
}
req = pvar->conn_ops->get_conn_msg_buf(pvar, QTFS_SEND);
@@ -1569,24 +1594,25 @@ int qtfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)
rsp = qtfs_remote_run(pvar, QTFS_REQ_GETATTR, QTFS_SEND_SIZE(struct qtreq_getattr, req->path));
if (IS_ERR_OR_NULL(rsp)) {
qtfs_conn_put_param(pvar);
- return 0;
+ return 1;
}
if (rsp->ret) {
qtfs_conn_put_param(pvar);
- return 0;
+ return 1;
}
inode = dentry->d_inode;
if (inode == NULL) {
qtfs_conn_put_param(pvar);
- return 0;
+ return 1;
}
- if (inode->i_ino != rsp->stat.ino || inode->i_mode != rsp->stat.mode) {
+ if (inode->i_ino != rsp->stat.ino) {
if (inode->i_nlink > 0)
drop_nlink(inode);
qtfs_conn_put_param(pvar);
return 0;
}
+ qtfs_copy_kstat_inode(inode, &rsp->stat);
qtfs_conn_put_param(pvar);
dentry->d_time = jiffies;
}
--
2.37.1 (Apple Git-137.1)

View File

@ -1,36 +0,0 @@
From 039a2c19c0b854cebfc63666b55c9f83f6cd9510 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Wed, 13 Dec 2023 15:23:35 +0800
Subject: [PATCH 11/12] filter af unix before whitelist check
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs_common/conn.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c
index 4f2f048..1974c06 100644
--- a/qtfs/qtfs_common/conn.c
+++ b/qtfs/qtfs_common/conn.c
@@ -165,15 +165,15 @@ int qtfs_uds_remote_connect_user(int fd, struct sockaddr __user *addr, int len)
return sysret;
try_conn_remote:
// len is passed from syscall input args directly. it's trustworthy
- if (copy_from_user(&addr_un, addr, len)) {
+ if (len > sizeof(struct sockaddr_un) || copy_from_user(&addr_un, addr, len)) {
qtfs_err("copy sockaddr failed.");
return sysret;
}
+ if (addr_un.sun_family != AF_UNIX)
+ return sysret;
// don't try remote uds connect if sunpath not in whitelist
if (qtfs_uds_remote_whitelist(addr_un.sun_path) != 0)
return sysret;
- if (addr_un.sun_family != AF_UNIX)
- return sysret;
un_headlen = sizeof(struct sockaddr_un) - sizeof(addr_un.sun_path);
if (len < un_headlen || strlen(addr_un.sun_path) >= (sizeof(addr_un.sun_path) - strlen(QTFS_UDS_PROXY_SUFFIX))) {
qtfs_err("failed to try connect remote uds server, sun path:%s too long to add suffix:%s",
--
2.37.1 (Apple Git-137.1)

View File

@ -1,49 +0,0 @@
From 091ae21631ba7c93ba4673cdd69d199687851864 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Wed, 13 Dec 2023 16:58:22 +0800
Subject: [PATCH 12/12] not updata iattr invalid data to inode
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/CMakeLists.txt | 2 +-
qtfs/qtfs/sb.c | 11 ++++-------
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/qtfs/CMakeLists.txt b/qtfs/CMakeLists.txt
index 4d0e9e3..5f97eef 100644
--- a/qtfs/CMakeLists.txt
+++ b/qtfs/CMakeLists.txt
@@ -24,7 +24,7 @@ target_link_libraries(engine PRIVATE glib-2.0 pthread)
target_compile_options(engine PRIVATE "-DQTFS_SERVER")
if (DEFINED UDS_TEST_MODE OR DEFINED QTFS_TEST_MODE)
- target_compile_options(engine PRIVATE "-DUDS_TEST_MODE")
+ target_compile_options(engine PRIVATE "-DUDS_TEST_MODE" "-DQTFS_TEST_MODE")
target_compile_options(udsproxyd PRIVATE "-DUDS_TEST_MODE")
message(WARNING "Important risk warning: the test mode is turned on, and qtfs will expose the network port, \
which will bring security risks and is only for testing! If you do not understand the risks,\
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index 4ecbf50..71aba49 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -1364,13 +1364,10 @@ int qtfs_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsi
static void qtfs_copy_iattr_inode(struct inode *inode, struct iattr *attr)
{
- inode->i_mode = attr->ia_mode;
- inode->i_uid = attr->ia_uid;
- inode->i_gid = attr->ia_gid;
- inode->i_size = attr->ia_size;
- inode->i_atime = attr->ia_atime;
- inode->i_mtime = attr->ia_mtime;
- inode->i_ctime = attr->ia_ctime;
+ inode->i_mode = (attr->ia_valid & ATTR_MODE) ? attr->ia_mode : inode->i_mode;
+ inode->i_uid = (attr->ia_valid & ATTR_UID) ? attr->ia_uid : inode->i_uid;
+ inode->i_gid = (attr->ia_valid & ATTR_GID) ? attr->ia_gid : inode->i_gid;
+ inode->i_size = (attr->ia_valid & ATTR_SIZE) ? attr->ia_size : inode->i_size;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0))
--
2.37.1 (Apple Git-137.1)

View File

@ -1,326 +0,0 @@
From be76eb42524e97f240e7dfca8d3db63df1ca6ed9 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Thu, 14 Dec 2023 21:02:02 +0800
Subject: [PATCH] bugfix: fifo suspend and fd leak
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/syscall.c | 1 -
qtfs/qtfs_server/server_fifo.c | 148 ++++++++++++++++++++++-----------
2 files changed, 99 insertions(+), 50 deletions(-)
diff --git a/qtfs/qtfs/syscall.c b/qtfs/qtfs/syscall.c
index 61a0de0..e4ee26e 100644
--- a/qtfs/qtfs/syscall.c
+++ b/qtfs/qtfs/syscall.c
@@ -56,7 +56,6 @@ static inline int qtfs_fstype_judgment(char __user *dir)
return 1;
}
path_put(&path);
- qtfs_info("qtfs fstype judge <%s> is not qtfs.\n", path.dentry->d_iname);
return 0;
}
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index 0eaadea..88d3cde 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -21,7 +21,7 @@
#include <sys/epoll.h>
#include <linux/vm_sockets.h>
-int log_switch = 0;
+#define log_switch 0
#include "req.h"
#include "log.h"
#include "libsocket.h"
@@ -73,11 +73,9 @@ struct fifo_event_t {
/* 触发时的操作函数 */
int (*handler)(struct fifo_event_t *event);
// 仅在open阻塞状态有效open完成后应该置空
- union {
- void *priv;
- int len; // valid read or write len
- int peerfd; // priv fd
- };
+ void *priv;
+ int len; // valid read or write len
+ int peerfd; // priv fd
unsigned long seq_num;
int block; // block fifo or nonblock
};
@@ -177,6 +175,18 @@ void fifo_del_event(struct fifo_event_t *evt)
return;
}
+int fifo_resume_event(struct fifo_event_t *evt, unsigned int events)
+{
+ struct epoll_event event;
+ event.data.ptr = (void *)evt;
+ event.events = events;
+ if (-1 == epoll_ctl(epollfd, EPOLL_CTL_ADD, evt->fd, &event)) {
+ log_err("epoll ctl add fd:%d event failed, errno:%d.", evt->fd, errno);
+ return -1;
+ }
+ return 0;
+}
+
void fifo_suspend_event(struct fifo_event_t *evt)
{
struct epoll_event event;
@@ -184,7 +194,6 @@ void fifo_suspend_event(struct fifo_event_t *evt)
if (epoll_ctl(epollfd, EPOLL_CTL_DEL, evt->fd, &event) == -1) {
log_err("suspend event fd:%d failed, errno:%d", evt->fd, errno);
}
- free(evt);
return;
}
@@ -203,7 +212,7 @@ static int fifo_del_peer(int flag, struct fifo_event_t *me)
memset(fifo_peer_evt, 0, sizeof(struct fifo_event_t *) * EPOLL_MAX_EVENT_NUMS);
break;
case FIFO_PEER_ADD:
- fifo_peer_evt[fifo_peer_index] = me->peerevt;
+ fifo_peer_evt[fifo_peer_index++] = me->peerevt;
break;
case FIFO_PEER_POST:
for (int i = 0; i < fifo_peer_index; i++) {
@@ -260,13 +269,15 @@ static void fifo_proc_ack(struct fifo_event_t *evt, int type, int sockfd, char *
int fifo_proc_unknown(struct fifo_event_t *evt)
{
- struct open_arg_t *oarg;
+ struct open_arg_t *oarg = (struct open_arg_t *)evt->priv;
log_info("unknown read/write event fd:%d happend, open event not complete!", evt->fd);
// 这不是预期的事件直接删除此事件且关联删除open线程
pthread_mutex_lock(&fifomutex);
+ // 如果priv为空表示open thread已退出
if (evt->priv) {
- oarg = (struct open_arg_t *)evt->priv;
+ // 如果priv非空则open thread还在阻塞状态先杀死线程然后释放资源置空priv。
pthread_cancel(*oarg->t);
+ oarg = (struct open_arg_t *)evt->priv;
free(oarg->t);
free(oarg->req);
free(oarg);
@@ -323,7 +334,10 @@ int fifo_proc_readable(struct fifo_event_t *evt)
log_info("readable event fd:%d peerfd:%d, errno:%d", evt->fd, evt->peerevt->fd, errno);
free(msg);
- evt->peerevt->peerevt = NULL;
+ // 挂起readable任务恢复监听网络请求
+ if (fifo_resume_event(evt->peerevt, EPOLLIN|EPOLLHUP) == -1) {
+ goto err_ack;
+ }
// 读完立即删除本监听,如果继续读后面再添加进来
return FIFO_RET_SUSPEND;
@@ -334,7 +348,8 @@ err_ack:
errrsp.len = 0;
fifo_proc_ack(evt, QTFS_REQ_READITER, evt->peerevt->fd, (char *)&errrsp, sizeof(errrsp));
} while (0);
- evt->peerevt->peerevt = NULL;
+ if (fifo_resume_event(evt->peerevt, EPOLLIN|EPOLLHUP) == -1)
+ return FIFO_RET_DEL_BOTH;
return error_ret;
}
@@ -380,7 +395,10 @@ int fifo_proc_writeable(struct fifo_event_t *evt)
log_info("writeable event fd:%d peerfd:%d, writelen:%lu, errno:%d", evt->fd, evt->peerevt->fd, rsp.len, errno);
free(msg);
- evt->peerevt->peerevt = NULL;
+ // 挂起写fifo任务重启监听网络请求任务
+ if (fifo_resume_event(evt->peerevt, EPOLLIN) == -1) {
+ goto err_ack;
+ }
return FIFO_RET_SUSPEND;
err_ack:
@@ -390,6 +408,8 @@ err_ack:
errrsp.len = 0;
fifo_proc_ack(evt, QTFS_REQ_WRITE, evt->peerevt->fd, (char *)&errrsp, sizeof(errrsp));
} while (0);
+ if (fifo_resume_event(evt->peerevt, EPOLLIN|EPOLLHUP) == -1)
+ return FIFO_RET_DEL_BOTH;
return error_ret;
}
@@ -402,9 +422,10 @@ int fifo_proc_read_req(struct fifo_event_t *evt)
ret = fifo_recv_with_timeout(evt->fd, (char *)&req, sizeof(req));
if (ret <= 0) {
log_err("recv fifo read head failed, errno:%d.", errno);
- // 主线程是串行的peerevt如果是空则没有readable监听直接close peerfd即可
+ // 链接提前被中断了有可能还没有peerevt就直接关掉fd
if (evt->peerevt == NULL) {
- close(evt->peerfd);
+ if (evt->peerfd != 0)
+ close(evt->peerfd);
return FIFO_RET_DEL;
}
// 如果peerevt非空则要同时删除peer事件
@@ -422,16 +443,31 @@ int fifo_proc_read_req(struct fifo_event_t *evt)
}
// if fifo is block, dont block on main thread
- struct fifo_event_t *newevt = fifo_add_event(evt->peerfd, evt, fifo_proc_readable, NULL, EPOLLIN);
- if (newevt == NULL) {
- log_err("add readable event failed, fd:%d socketfd:%d", evt->peerfd, evt->fd);
- return FIFO_RET_ERR;
+ if (evt->peerevt == NULL) {
+ struct fifo_event_t *newevt = fifo_add_event(evt->peerfd, evt, fifo_proc_readable, NULL, EPOLLIN);
+ if (newevt == NULL) {
+ log_err("add readable event failed, fd:%d socketfd:%d", evt->peerfd, evt->fd);
+ goto early_ack;
+ }
+ evt->peerevt = newevt;
+ newevt->len = req.len;
+ newevt->seq_num = evt->seq_num;
+ } else {
+ evt->peerevt->seq_num = evt->seq_num;
+ evt->peerevt->len = req.len;
+ if (fifo_resume_event(evt->peerevt, EPOLLIN) == -1)
+ goto early_ack;
}
- evt->peerevt = newevt;
- newevt->len = req.len;
- newevt->seq_num = evt->seq_num;
+ return FIFO_RET_SUSPEND;
- return FIFO_RET_OK;
+early_ack:
+ do {
+ struct qtrsp_fifo_read rsp;
+ rsp.err = -EFAULT;
+ rsp.len = 0;
+ fifo_proc_ack(evt, QTFS_REQ_READITER, evt->fd, (char *)&rsp, sizeof(rsp));
+ } while (0);
+ return FIFO_RET_DEL_BOTH;
}
// 写
@@ -442,9 +478,10 @@ int fifo_proc_write_req(struct fifo_event_t *evt)
ret = fifo_recv_with_timeout(evt->fd, (char *)&req, sizeof(req));
if (ret <= 0) {
log_err("recv fifo write head failed, errno:%d.", errno);
- // 主线程是串行的peerevt如果是空则没有readable监听直接close peerfd即可
+ // 链接提前被中断了有可能还没有peerevt就直接关掉fd
if (evt->peerevt == NULL) {
- close(evt->peerfd);
+ if (evt->peerfd != 0)
+ close(evt->peerfd);
return FIFO_RET_DEL;
}
// 如果peerevt非空则要同时删除peer事件
@@ -461,16 +498,34 @@ int fifo_proc_write_req(struct fifo_event_t *evt)
return FIFO_RET_OK;
}
// if fifo is block, dont block on main thread
- struct fifo_event_t *newevt = fifo_add_event(evt->peerfd, evt, fifo_proc_writeable, NULL, EPOLLOUT);
- if (newevt == NULL) {
- log_err("add writeable event failed, fd:%d socketfd:%d", evt->peerfd, evt->fd);
- return FIFO_RET_ERR;
+ if (evt->peerevt == NULL) {
+ struct fifo_event_t *newevt = fifo_add_event(evt->peerfd, evt, fifo_proc_writeable, NULL, EPOLLOUT);
+ if (newevt == NULL) {
+ log_err("add writeable event failed, fd:%d socketfd:%d", evt->peerfd, evt->fd);
+ goto early_ack;
+ }
+ newevt->len = req.len;
+ newevt->seq_num = evt->seq_num;
+ evt->peerevt = newevt;
+ } else {
+ evt->peerevt->seq_num = evt->seq_num;
+ evt->peerevt->len = req.len;
+ if (fifo_resume_event(evt->peerevt, EPOLLOUT) == -1) {
+ goto early_ack;
+ }
}
- evt->peerevt = newevt;
- newevt->len = req.len;
- newevt->seq_num = evt->seq_num;
- return FIFO_RET_OK;
+ // 此时tcp fd需要切换为writeable状态不能同时用将本任务挂起不再监听writeable完事再切回来
+ return FIFO_RET_SUSPEND;
+early_ack:
+ do {
+ struct qtrsp_fifo_write rsp;
+ rsp.err = -EFAULT;
+ rsp.len = 0;
+ fifo_proc_ack(evt, QTFS_REQ_WRITE, evt->fd, (char *)&rsp, sizeof(rsp));
+ } while (0);
+ return FIFO_RET_DEL_BOTH;
+
}
// read/write/close req
@@ -481,11 +536,6 @@ int fifo_proc_new_req(struct fifo_event_t *evt)
ret = fifo_recv_with_timeout(evt->fd, (char *)&head, sizeof(struct qtreq));
if (ret <= 0) {
log_err("recv qtreq head failed, errno:%d.", errno);
- // 主线程是串行的peerevt如果是空则没有readable监听直接close peerfd即可
- if (evt->peerevt == NULL) {
- close(evt->peerfd);
- return FIFO_RET_DEL;
- }
// 如果peerevt非空则要同时删除peer事件
return FIFO_RET_DEL_BOTH;
}
@@ -522,7 +572,8 @@ int fifo_proc_new_req(struct fifo_event_t *evt)
void *fifo_open_thread(void *arg)
{
int fd;
- struct open_arg_t *oarg = (struct open_arg_t *)arg;
+ struct fifo_event_t *evt = (struct fifo_event_t *)arg;
+ struct open_arg_t *oarg = (struct open_arg_t *)evt->priv;
int rw;
int err = 0;
struct fifo_event_t *newevt;
@@ -540,15 +591,13 @@ void *fifo_open_thread(void *arg)
// 代理不应该主动只监听挂断事件在通信对端发来read/write消息才
// 改为监听可读/可写状态并进行实际读写。
pthread_mutex_lock(&fifomutex);
- if (rw == FIFO_READ) {
- oarg->main_evt->peerevt = NULL;
- oarg->main_evt->peerfd = fd;
- oarg->main_evt->handler = fifo_proc_new_req;
- } else {
- oarg->main_evt->peerevt = NULL;
- oarg->main_evt->handler = fifo_proc_new_req;
- oarg->main_evt->peerfd = fd;
+ if (evt->priv == NULL) {
+ log_err("fatal error, oarg is invalid.");
+ goto end;
}
+ oarg->main_evt->peerevt = NULL;
+ oarg->main_evt->handler = fifo_proc_new_req;
+ oarg->main_evt->peerfd = fd;
oarg->main_evt->block = fifo_block_flags(oarg->req->flags);
rsp.fd = fd;
@@ -565,6 +614,7 @@ end:
free(oarg->t);
free(oarg->req);
free(oarg);
+ evt->priv = NULL;
pthread_mutex_unlock(&fifomutex);
return NULL;
}
@@ -624,11 +674,11 @@ int fifo_proc_open_req(struct fifo_event_t *evt)
free(oarg);
return FIFO_RET_ERR;
}
- pthread_create(t, &attr, fifo_open_thread, oarg);
+ evt->priv = oarg;
oarg->t = t;
+ pthread_create(t, &attr, fifo_open_thread, evt);
// 临时状态机,暂时不知道是读是写
- evt->priv = oarg;
evt->handler = fifo_proc_unknown;
log_info("Start new fifo open thread head:%u, len:%d", head.type, head.len);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,29 +0,0 @@
From 6484415ecbd4062c49a2c4b8d421a9fc9dd4250a Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Sat, 16 Dec 2023 11:22:21 +0800
Subject: [PATCH] fix event misalignment caused by multi-thread scheduling
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs_server/server_fifo.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index 88d3cde..1839a88 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -676,10 +676,9 @@ int fifo_proc_open_req(struct fifo_event_t *evt)
}
evt->priv = oarg;
oarg->t = t;
- pthread_create(t, &attr, fifo_open_thread, evt);
-
// 临时状态机,暂时不知道是读是写
evt->handler = fifo_proc_unknown;
+ pthread_create(t, &attr, fifo_open_thread, evt);
log_info("Start new fifo open thread head:%u, len:%d", head.type, head.len);
return FIFO_RET_OK;
--
2.37.1 (Apple Git-137.1)

View File

@ -1,61 +0,0 @@
From 402c5c17885db59b15ed06c1f1bf92f2378b6f90 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Sat, 16 Dec 2023 16:26:28 +0800
Subject: [PATCH] fix read/write fifo failed problem and update rexec whitelist
descriptor in readme
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/README.md | 8 ++++----
qtfs/qtfs_server/server_fifo.c | 6 ++----
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/qtfs/README.md b/qtfs/README.md
index 3721f44..2ffdce6 100644
--- a/qtfs/README.md
+++ b/qtfs/README.md
@@ -134,13 +134,13 @@ Tips若完成测试环境的配置后无法通过客户端访问所挂载
1. rexec工具依赖上述udsproxyd服务使用udsproxyd提供的uds协同进行通信请确认udsproxyd正常启动。
-2. 配置白名单将qtfs/config/rexec/whitelist文件拷贝至/etc/rexec/下,请手动配置需要的白名单选项,在其中增加允许执行的二进制命令。
+2. 为rexec_server配置白名单将qtfs/config/rexec/whitelist文件拷贝至/etc/rexec/下请手动配置需要的白名单选项在其中增加允许执行的二进制命令请注意该白名单应该配置在rexec_server运行的系统上如果双向运行则两侧都需要配置rexec_server服务只接受该白名单列出的二进制拉起执行不在白名单中的请求会被rexec_server拒绝拉起。
-3. 在udsconnect中增加rexec通信socket所在目录白名单增加方式有两种
+3. 为rexec端配置uds白名单这个白名单只在需要调用rexec二进制的系统中配置如果是双向则都配置在udsconnect中增加rexec通信socket所在目录白名单增加方式有两种
- 1. 在/etc/qtfs/whitelist的`[udsconnect]`表项中增加`/var/run/rexec`修改后需要重新部署qtfs使其生效。
+ 1. 在qtfs_server端可以将/etc/qtfs/whitelist的`[udsconnect]`表项中增加`/var/run/rexec`修改后需要重新启动engine进程使其生效。
- 2. 进入源码目录`qtinfo/`,执行`make`编译得到二进制。使用qtcfg进行配置`qtcfg -w udsconnect -x /var/run/rexec`,配置完成后可通过`qtcfg -w udsconnect -z`查询是否生效
+ 2. 使用前述的qtcfg进行配置`qtcfg -w udsconnect -x /var/run/rexec`,配置完成后可通过`qtcfg -w udsconnect -z`查询是否生效。qtcfg可以在qtfs client或者server端动态添加白名单qtfs server端应该在engine拉起后执行。
4. 拉起rexec_server作为服务端无需参数
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index 1839a88..7e4320e 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -324,8 +324,7 @@ int fifo_proc_readable(struct fifo_event_t *evt)
log_err("read from fifo:%d failed, readlen:%d, errno:%d", evt->fd, readlen, errno);
ret = errno;
free(msg);
- if (errno == EPIPE)
- error_ret = FIFO_RET_DEL_BOTH;
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp->err = 0;
@@ -385,8 +384,7 @@ int fifo_proc_writeable(struct fifo_event_t *evt)
log_err("write to fifo failed, ret:%d errno:%d", ret, errno);
ret = errno;
free(msg);
- if (errno == EPIPE)
- error_ret = FIFO_RET_DEL_BOTH;
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp.err = 0;
--
2.37.1 (Apple Git-137.1)

View File

@ -1,37 +0,0 @@
From fafc4caa3fd73e1e375410e1fbd3e3078761931b Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 18 Dec 2023 15:10:04 +0800
Subject: [PATCH 3/6] fix fifo early exit problem
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs_server/server_fifo.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/qtfs/qtfs_server/server_fifo.c b/qtfs/qtfs_server/server_fifo.c
index 7e4320e..1839a88 100644
--- a/qtfs/qtfs_server/server_fifo.c
+++ b/qtfs/qtfs_server/server_fifo.c
@@ -324,7 +324,8 @@ int fifo_proc_readable(struct fifo_event_t *evt)
log_err("read from fifo:%d failed, readlen:%d, errno:%d", evt->fd, readlen, errno);
ret = errno;
free(msg);
- error_ret = FIFO_RET_DEL_BOTH;
+ if (errno == EPIPE)
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp->err = 0;
@@ -384,7 +385,8 @@ int fifo_proc_writeable(struct fifo_event_t *evt)
log_err("write to fifo failed, ret:%d errno:%d", ret, errno);
ret = errno;
free(msg);
- error_ret = FIFO_RET_DEL_BOTH;
+ if (errno == EPIPE)
+ error_ret = FIFO_RET_DEL_BOTH;
goto err_ack;
}
rsp.err = 0;
--
2.37.1 (Apple Git-137.1)

View File

@ -1,46 +0,0 @@
From b3a943ee226470e2f7ba61b1d7ce5c86b56e001a Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Mon, 18 Dec 2023 17:23:54 +0800
Subject: [PATCH 4/6] update some problem in libvirt readme
Signed-off-by: liqiang <liqiang64@huawei.com>
---
...344\273\216\351\233\266\346\220\255\345\273\272v1.1.md" | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git "a/usecases/libvirtd-offload/libvirt\347\233\264\350\277\236\350\201\232\345\220\210\347\216\257\345\242\203\344\273\216\351\233\266\346\220\255\345\273\272v1.1.md" "b/usecases/libvirtd-offload/libvirt\347\233\264\350\277\236\350\201\232\345\220\210\347\216\257\345\242\203\344\273\216\351\233\266\346\220\255\345\273\272v1.1.md"
index bc47c50..07dbcb4 100644
--- "a/usecases/libvirtd-offload/libvirt\347\233\264\350\277\236\350\201\232\345\220\210\347\216\257\345\242\203\344\273\216\351\233\266\346\220\255\345\273\272v1.1.md"
+++ "b/usecases/libvirtd-offload/libvirt\347\233\264\350\277\236\350\201\232\345\220\210\347\216\257\345\242\203\344\273\216\351\233\266\346\220\255\345\273\272v1.1.md"
@@ -99,9 +99,9 @@ make install
make role=server
make install
```
-配置工具将会自动安装然后使用qtcfg命令配置白名单假设需要增加的白名单为"/var/lib/libvirt/",输入:
+配置工具将会自动安装然后使用qtcfg命令配置白名单假设需要增加的白名单为"/var/lib/libvirt",输入:
```
-qtcfg -x /var/lib/libvirt/
+qtcfg -w udsconnect -x /var/lib/libvirt
```
查询白名单为:
```
@@ -133,7 +133,6 @@ rexec是一个用c语言开发的远程执行组件分为rexec client和rexec
```
chmod 400 /etc/rexec/whitelist。
```
-如果想仅用于测试可以不进行白名单配置删除此文件重启rexec_server进程后则没有白名单限制。
下载dpu-utilities代码后进入qtfs/rexec主目录下执行`make && make install`即可安装rexec所需全部二进制到/usr/bin目录下包括了`rexec、rexec_server`两个二进制可执行文件。
@@ -263,7 +262,7 @@ libvirtd -d
qtcfg -z
```
-查看列举出来的白名单是否包含"/var/lib/libvirt/"
+查看列举出来的白名单是否包含"/var/lib/libvirt"和"/var/run/rexec"。
## **3.5** 拉起虚机
--
2.37.1 (Apple Git-137.1)

View File

@ -1,66 +0,0 @@
From a3f2eaf718eebb05d4b2d350833e1416d1c4a2f6 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Tue, 19 Dec 2023 20:06:07 +0800
Subject: [PATCH 5/6] fix return exit status bug in rexec
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/rexec/rexec.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/qtfs/rexec/rexec.c b/qtfs/rexec/rexec.c
index f905cfa..eb8b9bd 100644
--- a/qtfs/rexec/rexec.c
+++ b/qtfs/rexec/rexec.c
@@ -51,6 +51,7 @@ struct rexec_thread_arg {
int efd;
int connfd;
char **argv;
+ int exit_status;
};
struct rexec_global_var g_rexec;
@@ -311,7 +312,7 @@ static int rexec_run(int efd, int connfd, char *argv[])
rexec_log("Rexec process start run, as proxy of remote %s", argv[1]);
rexec_event_run(efd);
- rexec_log("Rexec process %s exit.", argv[1]);
+ rexec_log("Rexec process %s exit status:%d.", argv[1], exit_status);
// clear pidmap file
if (pidfd > 0) {
@@ -687,9 +688,9 @@ static void *rexec_pipe_proxy_thread(void *arg)
static void *rexec_conn_thread(void *arg)
{
struct rexec_thread_arg *parg = (struct rexec_thread_arg *)arg;
- int exit_status = rexec_run(parg->efd, parg->connfd, parg->argv);
+ parg->exit_status = rexec_run(parg->efd, parg->connfd, parg->argv);
- pthread_exit((void *)&exit_status);
+ pthread_exit((void *)NULL);
}
static void rexec_global_var_init()
@@ -757,7 +758,6 @@ int main(int argc, char *argv[])
pthread_t thrd_conn;
struct rexec_thread_arg targ;
struct rexec_thread_arg connarg;
- void *exit_status;
targ.efd = pipeefd;
(void)pthread_create(&thrd, NULL, rexec_pipe_proxy_thread, &targ);
@@ -765,9 +765,9 @@ int main(int argc, char *argv[])
connarg.connfd = connfd;
connarg.argv = argv;
(void)pthread_create(&thrd_conn, NULL, rexec_conn_thread, &connarg);
- pthread_join(thrd_conn, (void **)&exit_status);
+ pthread_join(thrd_conn, NULL);
fclose(rexec_logfile);
- exit(*(int *)exit_status);
+ exit(connarg.exit_status);
err_end:
fclose(rexec_logfile);
rexec_logfile = NULL;
--
2.37.1 (Apple Git-137.1)

View File

@ -1,38 +0,0 @@
From 7346bdff4366b2ea41714341bb7ed0dc0d3f4426 Mon Sep 17 00:00:00 2001
From: liqiang <liqiang64@huawei.com>
Date: Wed, 20 Dec 2023 16:33:17 +0800
Subject: [PATCH 6/6] fix bug in get link
Signed-off-by: liqiang <liqiang64@huawei.com>
---
qtfs/qtfs/sb.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c
index 71aba49..77ff15b 100644
--- a/qtfs/qtfs/sb.c
+++ b/qtfs/qtfs/sb.c
@@ -1453,10 +1453,7 @@ const char *qtfs_getlink(struct dentry *dentry,
qtfs_conn_put_param(pvar);
return ERR_PTR(-ENOENT);
}
- if (fsinfo->mnt_path)
- len = strlen(fsinfo->mnt_path) + strlen(rsp->path) + 1;
- else
- len = strlen(rsp->path) + 1;
+ len = strlen(rsp->path) + 1;
if (len > MAX_PATH_LEN || len == 0) {
qtfs_err("qtfs getlink failed. path name too long:%s - %s\n", fsinfo->mnt_path, rsp->path);
qtfs_conn_put_param(pvar);
@@ -1468,8 +1465,6 @@ const char *qtfs_getlink(struct dentry *dentry,
return ERR_PTR(-ENOMEM);
}
memset(link, 0, len);
- if (rsp->path[0] == '/' && fsinfo->mnt_path)
- strcat(link, fsinfo->mnt_path);
strcat(link, rsp->path);
qtfs_info("get link success <%s>\n", link);
--
2.37.1 (Apple Git-137.1)

View File

@ -1,7 +1,7 @@
Name: dpu-utilities
Summary: openEuler dpu utilities
Version: 1.6
Release: 7
Version: 1.10
Release: 1
License: GPL-2.0
Source: https://gitee.com/openeuler/dpu-utilities/repository/archive/v%{version}.tar.gz
ExclusiveOS: linux
@ -13,26 +13,6 @@ Provides: %{name} = %{version}-%{release}
%define kernel_version %(ver=`rpm -qa|grep kernel-devel`;echo ${ver#*kernel-devel-})
BuildRequires: kernel-devel >= 5.10, gcc, make, json-c-devel, glib2-devel
Patch1: 0001-fix-suspend-in-fifo-the-reason-is-SIGURG-recieved-in.patch
Patch2: 0002-fix-virsh-console-problem.patch
Patch3: 0003-delete-write-path-buf-to-log-info.patch
Patch4: 0004-fix-rexec-exit-code-bug-and-fix-some-warning.patch
Patch5: 0005-add-cmake-to-adapt-server-fifo.patch
Patch6: 0006-code-style-problem-fix.patch
Patch7: 0007-do-not-output-addr-in-kernel.patch
Patch8: 0008-fix-coredump-run-binary-after-copy-in-client.patch
Patch9: 0009-get-mount-pointer-error-when-remote-mount-path-is-sa.patch
Patch10: 0010-bugfix-unix-socket-connection-refuse-after-chmod-mod.patch
Patch11: 0011-filter-af-unix-before-whitelist-check.patch
Patch12: 0012-not-updata-iattr-invalid-data-to-inode.patch
Patch13: 0013-bugfix-fifo-suspend-and-fd-leak.patch
Patch14: 0014-fix-event-misalignment-caused-by-multi-thread-schedu.patch
Patch15: 0015-fix-read-write-fifo-failed-problem-and-update-rexec-.patch
Patch16: 0016-fix-fifo-early-exit-problem.patch
Patch17: 0017-update-some-problem-in-libvirt-readme.patch
Patch18: 0018-fix-return-exit-status-bug-in-rexec.patch
Patch19: 0019-fix-bug-in-get-link.patch
%description
This package contains the software utilities on dpu.
@ -159,6 +139,9 @@ sed -i '/# product cut_conf/a\dpuos kiwi/minios/cfg_dpuos yes' /opt/imageT
sed -i '/<repository_rule>/a\dpuos 1 rpm-dir euler_base' /opt/imageTailor/repos/RepositoryRule.conf
%changelog
* Fri May 24 2024 liqiang <liqiang64@huawei.com> 1.10-1
- Update to v1.10 for some features and bugfix
* Tue Dec 26 2023 liqiang <liqiang64@huawei.com> 1.6-7
- Update recent bugfixes

BIN
v1.10.tar.gz Normal file

Binary file not shown.

Binary file not shown.