qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Bug 1904331] [NEW] Coding bug in the function serial_ioport_write in serial.c
@ 2020-11-15 15:48 Jonathan D. Belanger
  2020-11-18 15:40 ` [Bug 1904331] " Peter Maydell
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Jonathan D. Belanger @ 2020-11-15 15:48 UTC (permalink / raw)
  To: qemu-devel

Public bug reported:

Branch hash: b50ea0d  (pulled from github).

I was reviewing the code and noticed the following in the function
serial_ioport_write:

    assert(size == 1 && addr < 8);
        .
        .
        .
    switch(addr) {
    default:
    case 0:
        if (s->lcf & UART_LCR_DLAB) {
            if (size == 1) {
                s->divider = (s->divider & 0xff00) | val;
            } else {
                s->divider = val;
            }
        }

The assert will trigger if the size is > 1, so the else of the if (size
== 1) will never be executed and an attempt to specify a size > 1 will
trigger an assert.

The documentation for the UART indicates that the 16-bit divisor is
broken up amongst 2 8-bit registers (DLL and DLM).  There already is
code to handle the DLL and DLM portions of the divider register (as
coded).

This is not exactly going to cause a bug, as there is no code that calls
this function with a value for size other than 1.  It is just
unnecessary code.

** Affects: qemu
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1904331

Title:
  Coding bug in the function serial_ioport_write in serial.c

Status in QEMU:
  New

Bug description:
  Branch hash: b50ea0d  (pulled from github).

  I was reviewing the code and noticed the following in the function
  serial_ioport_write:

      assert(size == 1 && addr < 8);
          .
          .
          .
      switch(addr) {
      default:
      case 0:
          if (s->lcf & UART_LCR_DLAB) {
              if (size == 1) {
                  s->divider = (s->divider & 0xff00) | val;
              } else {
                  s->divider = val;
              }
          }

  The assert will trigger if the size is > 1, so the else of the if
  (size == 1) will never be executed and an attempt to specify a size >
  1 will trigger an assert.

  The documentation for the UART indicates that the 16-bit divisor is
  broken up amongst 2 8-bit registers (DLL and DLM).  There already is
  code to handle the DLL and DLM portions of the divider register (as
  coded).

  This is not exactly going to cause a bug, as there is no code that
  calls this function with a value for size other than 1.  It is just
  unnecessary code.

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1904331/+subscriptions


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-04-30  8:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-15 15:48 [Bug 1904331] [NEW] Coding bug in the function serial_ioport_write in serial.c Jonathan D. Belanger
2020-11-18 15:40 ` [Bug 1904331] " Peter Maydell
2020-11-20 16:19 ` [PATCH-for-5.2?] hw/char/serial: Clean up unnecessary code Philippe Mathieu-Daudé
2020-11-20 16:19   ` [Bug 1904331] " Philippe Mathieu-Daudé
2020-11-20 16:32   ` Paolo Bonzini
2021-04-30  8:26 ` [Bug 1904331] Re: Coding bug in the function serial_ioport_write in serial.c Thomas Huth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).