From: Paul Eggert <eggert@cs.ucla.edu>
To: bug-gnulib@gnu.org
Cc: Paul Eggert <eggert@cs.ucla.edu>
Subject: [PATCH 2/2] savedir: avoid unlikely undefined behavior
Date: Sat, 3 Apr 2021 20:17:10 -0700 [thread overview]
Message-ID: <20210404031710.106343-2-eggert@cs.ucla.edu> (raw)
In-Reply-To: <20210404031710.106343-1-eggert@cs.ucla.edu>
* lib/savedir.c (streamsavedir): Prefer idx_to size_t where
either will do. Simplify reallocation of entries.
Use xpalloc to reallocate name_space, to avoid some unlikely
integer overflows.
---
ChangeLog | 6 ++++++
lib/savedir.c | 25 +++++++++----------------
2 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d511911fd..4a665c275 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2021-04-03 Paul Eggert <eggert@cs.ucla.edu>
+ savedir: avoid unlikely undefined behavior
+ * lib/savedir.c (streamsavedir): Prefer idx_to size_t where
+ either will do. Simplify reallocation of entries.
+ Use xpalloc to reallocate name_space, to avoid some unlikely
+ integer overflows.
+
quotearg: avoid undefined and/or O(N**2)
Avoid undefined and O(N**2) behavior in some very unlikely cases.
* lib/quotearg.c (quotearg_n_options): Document that N must
diff --git a/lib/savedir.c b/lib/savedir.c
index bcf41700d..1c23d75b6 100644
--- a/lib/savedir.c
+++ b/lib/savedir.c
@@ -91,11 +91,11 @@ char *
streamsavedir (DIR *dirp, enum savedir_option option)
{
char *name_space = NULL;
- size_t allocated = 0;
+ idx_t allocated = 0;
direntry_t *entries = NULL;
size_t entries_allocated = 0;
- size_t entries_used = 0;
- size_t used = 0;
+ idx_t entries_used = 0;
+ idx_t used = 0;
comparison_function cmp = comparison_function_table[option];
if (dirp == NULL)
@@ -116,15 +116,12 @@ streamsavedir (DIR *dirp, enum savedir_option option)
entry = dp->d_name;
if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0')
{
- size_t entry_size = _D_EXACT_NAMLEN (dp) + 1;
+ idx_t entry_size = _D_EXACT_NAMLEN (dp) + 1;
if (cmp)
{
if (entries_allocated == entries_used)
- {
- size_t n = entries_allocated;
- entries = x2nrealloc (entries, &n, sizeof *entries);
- entries_allocated = n;
- }
+ entries = x2nrealloc (entries, &entries_allocated,
+ sizeof *entries);
entries[entries_used].name = xstrdup (entry);
#if D_INO_IN_DIRENT
entries[entries_used].ino = dp->d_ino;
@@ -134,13 +131,9 @@ streamsavedir (DIR *dirp, enum savedir_option option)
else
{
if (allocated - used <= entry_size)
- {
- size_t n = used + entry_size;
- if (n < used)
- xalloc_die ();
- name_space = x2nrealloc (name_space, &n, 1);
- allocated = n;
- }
+ name_space = xpalloc (name_space, &allocated,
+ entry_size - (allocated - used),
+ IDX_MAX - 1, sizeof *name_space);
memcpy (name_space + used, entry, entry_size);
}
used += entry_size;
--
2.30.2
prev parent reply other threads:[~2021-04-04 3:17 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-04 3:17 [PATCH 1/2] quotearg: avoid undefined and/or O(N**2) Paul Eggert
2021-04-04 3:17 ` Paul Eggert [this message]
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
List information: https://lists.gnu.org/mailman/listinfo/bug-gnulib
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210404031710.106343-2-eggert@cs.ucla.edu \
--to=eggert@cs.ucla.edu \
--cc=bug-gnulib@gnu.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 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 read-only IMAP folder(s) and NNTP newsgroup(s).