summaryrefslogtreecommitdiff
path: root/src/xgselect.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-07-28 18:56:54 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2011-07-28 18:56:54 -0700
commitc26f25213a70687820290a58189e58e687ef498c (patch)
tree5fe2033b13ccee712dad1e3a37a22935bdc1f649 /src/xgselect.c
parentc678c83546bee743707bd0e259cc2aba192180c3 (diff)
downloademacs-c26f25213a70687820290a58189e58e687ef498c.tar.gz
* xgselect.c (xg_select): Check for size calculation overflow.
Don't update size until alloc done.
Diffstat (limited to 'src/xgselect.c')
-rw-r--r--src/xgselect.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/xgselect.c b/src/xgselect.c
index 9ccdd37489f..d1844610077 100644
--- a/src/xgselect.c
+++ b/src/xgselect.c
@@ -54,10 +54,16 @@ xg_select (int max_fds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
do {
if (n_gfds > gfds_size)
{
- while (n_gfds > gfds_size)
- gfds_size *= 2;
+ int gfds_size_max =
+ min (INT_MAX, min (PTRDIFF_MAX, SIZE_MAX) / sizeof *gfds);
+ int size;
+ if (gfds_size_max / 2 < n_gfds)
+ memory_full (SIZE_MAX);
+ size = 2 * n_gfds;
+ gfds_size = 0;
xfree (gfds);
- gfds = xmalloc (sizeof (*gfds) * gfds_size);
+ gfds = xmalloc (sizeof *gfds * size);
+ gfds_size = size;
}
n_gfds = g_main_context_query (context,