aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/memory.c
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2026-11-09 22:51:28 +0100
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2026-11-09 22:51:28 +0100
commit427c9da3281950f3e37011e31b30985332c95345 (patch)
treec5a496b85462e5fdc35c5e5c0598b08333beef1e /src/memory.c
parent5a4537cb67c77daba87d820ddcb4bd7574a8080d (diff)
use __builtin_add_overflow() for checking memory usage overflows
We don't have g_size_checked_add(), but these are just wrappers around the GCC/Clang intrinsics anyway.
Diffstat (limited to 'src/memory.c')
-rw-r--r--src/memory.c11
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.",