Download raw body.
use size_t for loop indices to avoid signedness warnings
On Thu, Dec 17, 2020 at 03:55:39PM -0700, Todd C. Miller wrote:
> On Thu, 17 Dec 2020 21:48:42 +0100, Stefan Sperling wrote:
>
> > Note that the condition i >= 0 is always true for an unsigned type.
> > The loop no longer stops iterating and eventually attempts to index
> > the array path_list_input with a very large value after i overflows.
> >
> > I guess changing i to ssize_t would be one possibility, but I don't
> > know if that will bring back the warnings you were trying to avoid.
> > So instead I have removed the assumption that i can become negative:
>
> You could also just iterate over the number of items instead of the
> indexes into the array and move the decrement to immediately before
> the call to got_pathlist_insert() to adjust from item number to
> array index. For example:
>
> for (i = nitems(path_list_input); i > 0; ) {
> i--;
> err = got_pathlist_insert(NULL, &paths, path_list_input[i],
> NULL);
> if (err) {
> test_printf("%s\n", __func__, err->msg);
> return 0;
> }
> }
>
> Or alternately without the standalone decrememnt:
>
> err = got_pathlist_insert(NULL, &paths, path_list_input[--i],
> NULL);
>
> - todd
Thank you!
I have commited this just now:
-----------------------------------------------
commit a4153d5b903b1fe20edad776a6d0ec3c3cbcc0aa (main, origin/main)
from: Stefan Sperling <stsp@stsp.name>
date: Thu Dec 17 23:13:10 2020 UTC
more concise fix for path_list_reverse_input() crash; suggested by millert
diff a46ac2cbc24e20b46540307ad7cfa4fca47c566a d9be8199616dc843dfa00d6d376b126a0b26b44f
blob - 231a6477402c69e760b2ab21b75fee238ebbddff
blob + cb17e05405edca193cab8ab4da47e83af9ed79a6
--- regress/path/path_test.c
+++ regress/path/path_test.c
@@ -178,19 +178,14 @@ path_list_reverse_input(void)
size_t i;
TAILQ_INIT(&paths);
- for (i = nitems(path_list_input) - 1; i > 0; i--) {
- err = got_pathlist_insert(NULL, &paths, path_list_input[i],
+ for (i = nitems(path_list_input); i > 0;) {
+ err = got_pathlist_insert(NULL, &paths, path_list_input[--i],
NULL);
if (err) {
test_printf("%s\n", __func__, err->msg);
return 0;
}
}
- err = got_pathlist_insert(NULL, &paths, path_list_input[0], NULL);
- if (err) {
- test_printf("%s\n", __func__, err->msg);
- return 0;
- }
i = 0;
TAILQ_FOREACH(pe, &paths, entry) {
use size_t for loop indices to avoid signedness warnings