All of lore.kernel.org
 help / color / mirror / Atom feed
From: Grant Edwards <grant.edwards@comtrol.com>
To: kernel-janitors@vger.kernel.org
Subject: Re: FW: puzzle for puzzle lovers
Date: Tue, 04 Oct 2011 16:16:28 +0000	[thread overview]
Message-ID: <20111004161627.GA10694@comtrol.com> (raw)
In-Reply-To: <20111004072631.GA18470@longonot.mountain>


> Subject: puzzle for puzzle lovers
> Date: Tuesday 04 October 2011
> From: Dan Carpenter <dan.carpenter@oracle.com>
> To: kernel-janitors@vger.kernel.org
> 
> Here is something that might amuse someone.
> 
> Smatch reports a read past the end of the array in rocket.c
> drivers/tty/rocket.c +2168 init_ISA(77)
> 	error: buffer overflow calling init_r_port. param 0. 7 >= 4
> 
> drivers/tty/rocket.c
>    657          init_completion(&info->close_wait);
>    658          info->flags &= ~ROCKET_MODE_MASK;
>    659          switch (pc104[board][line]) {
>    660          case 422:
>    661                  info->flags |= ROCKET_MODE_RS422;
>    662                  break;
> 
> pc104[] is a 4 element array.
> 
> board comes from for loop in rp_init().
> 
>   2315          for (i = 0; i < NUM_BOARDS; i++) {
>   2316                  if (init_ISA(i))
>   2317                          isa_boards_found++;
>   2318          }
> 
> NUM_BOARDS is is 8, so according to Smatch "board" can be 7

At that point in the code, 'board' can only be 0-3.  The init_ISA(i)
function will return immediately if isa_io_addr[i] is 0. isa_io_addr[]
is a static 8-element array and only the first 4 elements are ever
assigned to. Therefore, isa_io_addr[4] is guaranteed to be 0, and the
loop above is never called with 'board' greater than 3.

> and no one knows what line is.

'line' is the serial port index within that board (e.g. 0-7 on a
8-port board, 0-31 on a 32-port board).

> Weird huh?

pc104 is a 4-element array of pointers.  Those pointers point to
8-element arrays.  'board' can be 0-3, and 'line' can be 0-7.

The problem is that there are 32-port ISA boards, so I think pc104_1
through pc104_4 should be 32-element arrays.  I suspect this hasn't
caused any failures because the flags set based on pc104[board][line]
are only used in the case of PC104 boards, and PC104 boards never have
more than 8 ports.

IOW, for boards with more than 8 ports, there is a read-past-end-of-array
but the result isn't used.  Hmm -- there may be one case where the
bogus result _is_ used but it would take some work to figure out if
that happens or not.  It would be better to just change pc104_1
through pc104_4 from 8-element arrays to 32-element arrays.

> But the code is ancient from before the git era so no one knows what
> it's supposed to do.

I can explain "it" to you if you specify to what "it" refers.

> Unless you are clever enough to solve this mystery.

If it would make people happy, feel free to make pc104[] a
MAX_NUMBEROF_BOARDS sized array.  It's not possible to configure more
than 4 ISA boards, but if the objective is to make a static code
analyzer happy, then go ahead.

> This code gets run during init so presumably it got tested often
> ten years ago and it works.

Diclaimer: Comtrol offers no support for the in-tree driver.  The
driver we officially support is at ftp://ftp.comtrol.com/html/default.htm

-- 
Grant Edwards
grant.edwards@comtrol.com

  reply	other threads:[~2011-10-04 16:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-04  7:26 puzzle for puzzle lovers Dan Carpenter
2011-10-04 16:16 ` Grant Edwards [this message]
2011-10-04 16:55 ` FW: " Dan Carpenter
2011-10-04 17:14 ` Grant Edwards

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111004161627.GA10694@comtrol.com \
    --to=grant.edwards@comtrol.com \
    --cc=kernel-janitors@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.