diff options
| -rw-r--r-- | src/memory.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/src/memory.c b/src/memory.c index 2a3b51a..b5e5fcc 100644 --- a/src/memory.c +++ b/src/memory.c @@ -722,18 +722,13 @@ gboolean teco_memory_check(gsize request, GError **error) { gsize memory_usage = (guint)g_atomic_int_get(&teco_memory_usage); - gsize requested_memory_usage = memory_usage+request; /* - * Check for overflows. * NOTE: Glib 2.48 has g_size_checked_add(). */ - if (G_UNLIKELY(requested_memory_usage < memory_usage)) - /* guaranteed to fail if memory limiting is enabled */ - requested_memory_usage = G_MAXSIZE; - - if (G_UNLIKELY(teco_memory_limit && requested_memory_usage >= teco_memory_limit)) { - g_autofree gchar *limit_str = g_format_size(requested_memory_usage); + if (G_UNLIKELY(__builtin_add_overflow(memory_usage, request, &memory_usage) || + (teco_memory_limit && memory_usage >= teco_memory_limit))) { + g_autofree gchar *limit_str = g_format_size(memory_usage); g_set_error(error, TECO_ERROR, TECO_ERROR_MEMLIMIT, "Memory limit (%s) exceeded. See <EJ> command.", |
