diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2011-07-28 18:56:54 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2011-07-28 18:56:54 -0700 |
commit | c26f25213a70687820290a58189e58e687ef498c (patch) | |
tree | 5fe2033b13ccee712dad1e3a37a22935bdc1f649 /src/xgselect.c | |
parent | c678c83546bee743707bd0e259cc2aba192180c3 (diff) | |
download | emacs-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.c | 12 |
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, |