Hello Michał Mirosław,

This is a semi-automatic email about new static checker warnings.

The patch 8b4c62aef6f6: "usb: gadget: u_serial: process RX in
workqueue instead of tasklet" from Dec 16, 2018, leads to the
following Smatch complaint:

    drivers/usb/gadget/function/u_serial.c:438 gs_rx_push()
    error: we previously assumed 'tty' could be null (see line 373)

drivers/usb/gadget/function/u_serial.c
   372                  /* leave data queued if tty was rx throttled */
   373                  if (tty && tty_throttled(tty))
                            ^^^^^^^^^^^^^^^^^^^^^^^^
Other checks for NULL

   374                          break;
   375  
   376                  switch (req->status) {
   377                  case -ESHUTDOWN:
   378                          disconnect = true;
   379                          pr_vdebug("ttyGS%d: shutdown\n", 
port->port_num);
   380                          break;
   381  
   382                  default:
   383                          /* presumably a transient fault */
   384                          pr_warn("ttyGS%d: unexpected RX status %d\n",
   385                                  port->port_num, req->status);
   386                          /* FALLTHROUGH */
   387                  case 0:
   388                          /* normal completion */
   389                          break;
   390                  }
   391  
   392                  /* push data to (open) tty */
   393                  if (req->actual && tty) {
   394                          char            *packet = req->buf;
   395                          unsigned        size = req->actual;
   396                          unsigned        n;
   397                          int             count;
   398  
   399                          /* we may have pushed part of this packet 
already... */
   400                          n = port->n_read;
   401                          if (n) {
   402                                  packet += n;
   403                                  size -= n;
   404                          }
   405  
   406                          count = tty_insert_flip_string(&port->port, 
packet,
   407                                          size);
   408                          if (count)
   409                                  do_push = true;
   410                          if (count != size) {
   411                                  /* stop pushing; TTY layer can't handle 
more */
   412                                  port->n_read += count;
   413                                  pr_vdebug("ttyGS%d: rx block %d/%d\n",
   414                                            port->port_num, count, 
req->actual);
   415                                  break;
   416                          }
   417                          port->n_read = 0;
   418                  }
   419  
   420                  list_move(&req->list, &port->read_pool);
   421                  port->read_started--;
   422          }
   423  
   424          /* Push from tty to ldisc; this is handled by a workqueue,
   425           * so we won't get callbacks and can hold port_lock
   426           */
   427          if (do_push)
   428                  tty_flip_buffer_push(&port->port);
   429  
   430  
   431          /* We want our data queue to become empty ASAP, keeping data
   432           * in the tty and ldisc (not here).  If we couldn't push any
   433           * this time around, RX may be starved, so wait until next 
jiffy.
   434           *
   435           * We may leave non-empty queue only when there is a tty, and
   436           * either it is throttled or there is no more room in flip 
buffer.
   437           */
   438          if (!list_empty(queue) && !tty_throttled(tty))
                                          ^^^^^^^^^^^^^^^^^^^
in the original code there was check for NULL here but the patch removed
it.

   439                  schedule_delayed_work(&port->push, 1);
   440  

regards,
dan carpenter

Reply via email to