- num_globals_allocated = 100;
- globals = xmalloc (num_globals_allocated * sizeof (struct global));
- }
- else if (num_globals == num_globals_allocated)
- {
- num_globals_allocated *= 2;
- globals = xrealloc (globals,
- num_globals_allocated * sizeof (struct global));
+ ptrdiff_t num_globals_max = (min (PTRDIFF_MAX, SIZE_MAX)
+ / sizeof *globals);
+ if (num_globals_allocated == num_globals_max)
+ memory_exhausted ();
+ if (num_globals_allocated < num_globals_max / 2)
+ num_globals_allocated = 2 * num_globals_allocated + 1;
+ else
+ num_globals_allocated = num_globals_max;
+ globals = xrealloc (globals, num_globals_allocated * sizeof *globals);