【问题标题】:Linux crashes after calling inet_csk_reqsk_queue_drop_and_put()调用 inet_csk_reqsk_queue_drop_and_put() 后 Linux 崩溃
【发布时间】:2020-10-28 17:40:11
【问题描述】:

我修改了 Linux 内核代码,如果 SYN backlog 包含超过 9 个连接请求,它会丢弃第一个 TCP 连接请求,如下所示,但是当 8 个连接到达时系统会挂起。
最后的输出是

Test : 3- SYN Queue Length = 8

原代码为here
修改代码:

tcp_rsk(req)->tfo_listener = false;
    if (!want_cookie) {
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct request_sock_queue *queue = &icsk->icsk_accept_queue;
        printk("Test : 1- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
        inet_csk_reqsk_queue_hash_add(sk, req,
            tcp_timeout_init((struct sock *)req));
        printk("Test : 2- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
        // This is where i drop connection request
        if (net->ipv4.sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < 124) {
            struct request_sock *first_request_sock = queue->rskq_accept_head;
            printk("Test : First condition\n");
            if (net->ipv4.sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < 120) {
                inet_csk_reqsk_queue_drop_and_put(sk, first_request_sock);
                printk("Test : Second condition\n");
            }               
        }
        printk("Test : 3- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
    }
        
    af_ops->send_synack(sk, dst, &fl, req, &foc,
                !want_cookie ? TCP_SYNACK_NORMAL :
                       TCP_SYNACK_COOKIE);

【问题讨论】:

  • “崩溃”到底是什么意思?你有一些堆栈跟踪和BUG 崩溃描述吗?
  • 它冻结了,我什么都做不了。
  • printk 通常是同步的,但会延迟以避免死锁或无限递归。我不认为 fflush 会起作用。您是否在代码中持有锁定或期待长时间中断?
  • @stark 全部在 BH-disabled-section 内:tcp_rcv_state_process()

标签: c linux networking tcp linux-kernel


【解决方案1】:

发生错误是因为变量 first_request_sock 由于我的逻辑错误而包含 NULL,这就是系统冻结的方式,正如 @stark 和 @red0ct 解释的那样,printk 推迟以避免死锁或无限递归,这就是它不能执行的原因打印 cmets 中提到的三行。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 2018-03-13
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多