Received: by 2002:a05:6602:18e:0:0:0:0 with SMTP id m14csp330183ioo; Sat, 21 May 2022 00:07:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyLzakoFalnWwxPhtuOC0f+PfW2ERJzKcszMqzsdF5IoimpKNqgi5F3lqt6O/c4KImkobk/ X-Received: by 2002:a65:6045:0:b0:399:3a5e:e25a with SMTP id a5-20020a656045000000b003993a5ee25amr11261557pgp.139.1653116838840; Sat, 21 May 2022 00:07:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1653116838; cv=none; d=google.com; s=arc-20160816; b=GUPU+XaLVUjoBXxl0iitftEsMzs7DfTfQ46QEVk8ErIhzpR89Fwf7AOzUc2+dTWb9b iancvcVrUOXG1rh4iebZ5ssXukuU8owWiQsMoCtK2pdl8OS9alybQE9tNXES+m3TAlof Y2x4jN4uWlut1fxXubCDu2YUeXe8Zi6BzixWI3OqofghdVLkiFwffAzeYk5gLIByRvm6 ByJ7VTOsPzqZNfo55oK+E8obToBZNX0JIJaKQ4h5toeLkJ6l+UF69yfkjOEQjG82CwCC zYfo8aWZUPj+wR8wKRbu5ZsApKB7jP4RgI01gCpomCeCvf+7ERD9jWQ5VpSl1eCJN51L 3o+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dkim-signature; bh=H/or2OZsQeDEkRCrMm6GNFDu44m+XF/7j107kxhZkho=; b=vEXAUi/QLiQpmVQuP8kdvfISpyRLEq6KNRh3cFkuBDp5en2YOay21Wa4pvOVCyjb5B XPnewSvIrItPZaV8zG8ueH3pruRgrdJhXKsUjSXUPXDDiayC9JQg8dQnz/4xY/F7BBVk ulPTTCjhIfKSTLbMR/77Li1q2xeIK7VVyo63Zf4b8ShJQ248k+vSTj2J6Ru9S+sTnpsE 86Fm0WXk3MMVP1LWSZYehHipXOoZVrHoNtUT+eJRG6fzuQb1oXpCb9GeRObe5pJh3d1a MHSbICkgIGcpZakywjAUjzWB7+tYHjq+U5TR86pJRRblrshQQqkm9yRRVk4bRDP2m34U XJcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=U60N1c8r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a63-20020a639042000000b003c6115ef99esi2086702pge.49.2022.05.21.00.07.05; Sat, 21 May 2022 00:07:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=U60N1c8r; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230331AbiESHJg (ORCPT + 99 others); Thu, 19 May 2022 03:09:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231504AbiESHJY (ORCPT ); Thu, 19 May 2022 03:09:24 -0400 Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net [185.136.65.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5308B8BD0 for ; Thu, 19 May 2022 00:09:21 -0700 (PDT) Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 202205190709182510517c384cdfebb4 for ; Thu, 19 May 2022 09:09:19 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc; bh=H/or2OZsQeDEkRCrMm6GNFDu44m+XF/7j107kxhZkho=; b=U60N1c8r560NMW3iOshF1O+ZUF4+ODYQfVrvQ1ouc/le0NpaIuF1yCaJxrjEbwFRUvf+Q+ SZIqeS2+SJdT/RttYLUmCYghzTk07yYLFak43oXrcadr+Eq2q5X1X7C/4RQwJn0BOT1p9/QV Y2XyISlzon4sTC6tYcmdfBtugY3To=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v2 1/9] tty: n_gsm: fix user open not possible at responder until initiator open Date: Thu, 19 May 2022 09:07:49 +0200 Message-Id: <20220519070757.2096-1-daniel.starke@siemens.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Starke After setting up the control channel on both sides the responder side may want to open a virtual tty to listen on until the initiator starts an application on a user channel. The current implementation allows the open() but no other operation, like termios. These fail with EINVAL. The responder sided application has no means to detect an open by the initiator sided application this way. And the initiator sided applications usually expect the responder sided application to listen on the user channel upon open. Set the user channel into half-open state on responder side once a user application opens the virtual tty to allow IO operations on it. Furthermore, keep the user channel constipated until the initiator side opens it to give the responder sided application the chance to detect the new connection and to avoid data loss if the responder sided application starts sending before the user channel is open. Fixes: e1eaea46bb40 ("tty: n_gsm line discipline") Cc: stable@vger.kernel.org Signed-off-by: Daniel Starke --- drivers/tty/n_gsm.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) This commit was not changed as there have been no comments on it in v1. Link: https://lore.kernel.org/all/20220506144725.1946-1-daniel.starke@siemens.com/ diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index fd8b86dde525..08fea3e7674d 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1493,6 +1493,8 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) if (debug & 8) pr_debug("DLCI %d goes closed.\n", dlci->addr); dlci->state = DLCI_CLOSED; + /* Prevent us from sending data before the link is up again */ + dlci->constipated = true; if (dlci->addr != 0) { tty_port_tty_hangup(&dlci->port, false); spin_lock_irqsave(&dlci->lock, flags); @@ -1522,6 +1524,7 @@ static void gsm_dlci_open(struct gsm_dlci *dlci) del_timer(&dlci->t1); /* This will let a tty open continue */ dlci->state = DLCI_OPEN; + dlci->constipated = false; if (debug & 8) pr_debug("DLCI %d goes open.\n", dlci->addr); /* Send current modem state */ @@ -1602,6 +1605,25 @@ static void gsm_dlci_begin_open(struct gsm_dlci *dlci) mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); } +/** + * gsm_dlci_wait_open - wait for channel open procedure + * @dlci: DLCI to open + * + * Wait for a DLCI opening from the other side. Asynchronously wait until + * we get a SABM and set off timers and the responses. + */ +static void gsm_dlci_wait_open(struct gsm_dlci *dlci) +{ + switch (dlci->state) { + case DLCI_CLOSED: + case DLCI_CLOSING: + dlci->state = DLCI_OPENING; + break; + default: + break; + } +} + /** * gsm_dlci_begin_close - start channel open procedure * @dlci: DLCI to open @@ -1745,10 +1767,13 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) dlci->addr = addr; dlci->adaption = gsm->adaption; dlci->state = DLCI_CLOSED; - if (addr) + if (addr) { dlci->data = gsm_dlci_data; - else + /* Prevent us from sending data before the link is up */ + dlci->constipated = true; + } else { dlci->data = gsm_dlci_command; + } gsm->dlci[addr] = dlci; return dlci; } @@ -3163,6 +3188,8 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) /* Start sending off SABM messages */ if (gsm->initiator) gsm_dlci_begin_open(dlci); + else + gsm_dlci_wait_open(dlci); /* And wait for virtual carrier */ return tty_port_block_til_ready(port, tty, filp); } -- 2.34.1