Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(ua2f.c): possible deadlock in the queue, causing network disconnec… #127

Merged
merged 3 commits into from
Jun 30, 2024

Conversation

miny1233
Copy link
Contributor

…tion

在不支持内核上运行会造成队列死锁。当返回Operation not supported错误的时候,如果继续执行,就会死锁。

…tion

在不支持内核上运行会造成队列死锁。当返回Operation not supported错误的时候,如果继续执行,就会死锁。

Signed-off-by: miny1233 <[email protected]>
@miny1233
Copy link
Contributor Author

还有就是我觉得,像这种错误之类的,最好能直接在控制台上输出,最开始运行搞的我都没搞懂哪弄错了,还以为是iptables的问题

@miny1233
Copy link
Contributor Author

补充一点就是,这个死锁问题,就算加--by-pass也是没用的。

src/ua2f.c Outdated Show resolved Hide resolved
@Zxilly Zxilly changed the title fix ua2f.c: possible deadlock in the queue, causing network disconnec… fix(ua2f.c): possible deadlock in the queue, causing network disconnec… Jun 30, 2024
@Zxilly
Copy link
Owner

Zxilly commented Jun 30, 2024

我仔细看了一下,感觉碰到 IO_ERROR 直接退出好了。设置一下 should_exit。已经收到没法解析的东西了,再往下执行也不合适。

@miny1233
Copy link
Contributor Author

我仔细看了一下,感觉碰到 IO_ERROR 直接退出好了。设置一下 should_exit。已经收到没法解析的东西了,再往下执行也不合适。

我最早是这样想的,但是就是错误类型很多,我也没仔细看,就怕存在那种可以忽略的错误。起码目前能确定这个错误是必须要程序退出的。

@Zxilly
Copy link
Owner

Zxilly commented Jun 30, 2024

你现在这样写的话,IO_NOTREADY 的时候也直接退出了,我直接改吧。

@miny1233
Copy link
Contributor Author

你现在这样写的话,IO_NOTREADY 的时候也直接退出了,我直接改吧。

没有的,只会在ERROR的时候退出

@Zxilly
Copy link
Owner

Zxilly commented Jun 30, 2024

while (status = nfqueue_next(buf, packet)) {

返回一个 IO_NOTREADY 为 0,这 while 直接退出去了

@Zxilly Zxilly merged commit 6133d71 into Zxilly:master Jun 30, 2024
17 of 18 checks passed
@miny1233
Copy link
Contributor Author

while (status = nfqueue_next(buf, packet)) {

返回一个 IO_NOTREADY 为 0,这 while 直接退出去了

while (status = nfqueue_next(buf, packet)) {

返回一个 IO_NOTREADY 为 0,这 while 直接退出去了

原本就是收到IO_NOTREADY的时候,跳出这个循环去做nfqueue_receive(queue, buf, 0) ,不过你这用switch确实比原来好看很多。

@miny1233 miny1233 deleted the patch-1 branch June 30, 2024 11:47
@Zxilly
Copy link
Owner

Zxilly commented Jun 30, 2024

nfqueue_receive 只需要成功一次的,拿到 queue 的 handler 就行了。是 packet 因为加了 async 的 flag,所以读的时候可能 NOTREADY

@miny1233
Copy link
Contributor Author

你确定吗?你的这个修改和之前的行为都不一样了
https://github.com/Zxilly/UA2F/blob/448c047601bb150d3ffced6e63efd5fb8ca1ca46/src/ua2f.c

 while (!should_exit) {
        if (nfqueue_receive(queue, buf, 0) == IO_READY) {
            struct nf_packet packet[1];
            while (nfqueue_next(buf, packet) == IO_READY) {
                handle_packet(queue, packet);
            }
        }
    }

原来在nfqueue_next收到非IO_READY的情况下会执行一遍nfqueue_receive,但你修改的最新版本只会执行一次nfqueue_receive后就一直循环执行nfqueue_next

@Zxilly
Copy link
Owner

Zxilly commented Jun 30, 2024

确实,太久没写我把queue和packet弄混了,我再改改。
应该写个集成测试的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants