summary refs log tree commit diff stats
path: root/results/scraper/launchpad-without-comments/1904331
blob: ee820e47bafbdcf5e27a1719d727ab230b740cb1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Coding bug in the function serial_ioport_write in serial.c

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.