lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Mon, 11 Mar 2024 14:48:50 -0500
From: Chenyuan Yang <chenyuan0y@...il.com>
To: mazziesaccount@...il.com, jic23@...nel.org, lars@...afoo.de, 
	linux-iio@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, Zijie Zhao <zzjas98@...il.com>
Subject: [drivers/iio] Question about `iio_gts_build_avail_time_table`

Dear Linux Developers for IIO Driver,

We are curious about the functionality of
`iio_gts_build_avail_time_table`
(https://elixir.bootlin.com/linux/latest/source/drivers/iio/industrialio-gts-helper.c#L363)

```
static int iio_gts_build_avail_time_table(struct iio_gts *gts)
{
  int *times, i, j, idx = 0, *int_micro_times;

  if (!gts->num_itime)
    return 0;

  times = kcalloc(gts->num_itime, sizeof(int), GFP_KERNEL);
  if (!times)
    return -ENOMEM;

  /* Sort times from all tables to one and remove duplicates */
  for (i = gts->num_itime - 1; i >= 0; i--) {
    int new = gts->itime_table[i].time_us;

    if (times[idx] < new) {
      times[idx++] = new;
      continue;
    }

    for (j = 0; j <= idx; j++) {
      if (times[j] > new) {
        memmove(&times[j + 1], &times[j],
                                (idx - j) * sizeof(int));
        times[j] = new;
        idx++;
      }
    }
  ...
}
```

For this function, we are trying to understand how it works but not
sure how this sorting is done.

1. When the gts->itime_table[i].time_us is zero, e.g., the time
sequence is `3, 0, 1`, the inner for-loop will not terminate and do
out-of-bound writes. This is because once `times[j] > new`, the value
`new` will be added in the current position and the `times[j]` will be
moved to `j+1` position, which makes the if-condition always hold.
Meanwhile, idx will be added one, making the loop keep running without
termination and out-of-bound write.
2. If none of the gts->itime_table[i].time_us is zero, the elements
will just be copied without being sorted as described in the comment
"Sort times from all tables to one and remove duplicates".

Please correct us if we miss some key prerequisites for this function
or the data structure.
Thanks in advance!

A possible patch based on our understanding is attached.

Best,
Chenyuan

Download attachment "iio.patch" of type "application/octet-stream" (763 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ