Blame SOURCES/0416-load-fragment-fix-parsing-values-in-bytes-and-preven.patch

17b0f1
From 38d00b8a0453d38aecb725342ddd89a7c3dcb134 Mon Sep 17 00:00:00 2001
17b0f1
From: Michal Sekletar <msekleta@redhat.com>
17b0f1
Date: Fri, 18 Nov 2016 14:00:57 +0100
17b0f1
Subject: [PATCH] load-fragment: fix parsing values in bytes and prevent
17b0f1
 returning -ERANGE incorrectly
17b0f1
17b0f1
We didn't port our code base to use uint64_t instead of off_t as
17b0f1
upstream did. RLIMIT_INIFINITY is -1ULL and if we cast to off_t (64 bit
17b0f1
signed int on arches we support) then we get -1 and that is always
17b0f1
smaller than correct value returned by parse_size().
17b0f1
17b0f1
To make code changes as minimal as possible (i.e. not port everything
17b0f1
to uint64_t) let's cast off_t to uint64_t and not the other way
17b0f1
around.
17b0f1
17b0f1
RHEL-only
17b0f1
17b0f1
Resolves: #1396277
17b0f1
---
17b0f1
 src/core/load-fragment.c  | 2 +-
17b0f1
 src/test/test-unit-file.c | 4 ++++
17b0f1
 2 files changed, 5 insertions(+), 1 deletion(-)
17b0f1
17b0f1
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
17b0f1
index 2f6209e053..83b6e7efca 100644
17b0f1
--- a/src/core/load-fragment.c
17b0f1
+++ b/src/core/load-fragment.c
17b0f1
@@ -1105,7 +1105,7 @@ static int rlim_parse_size(const char *val, rlim_t *res) {
17b0f1
                 off_t u;
17b0f1
 
17b0f1
                 r = parse_size(val, 1024, &u);
17b0f1
-                if (r >= 0 && u >= (off_t) RLIM_INFINITY)
17b0f1
+                if (r >= 0 && (uint64_t) u >= RLIM_INFINITY)
17b0f1
                         r = -ERANGE;
17b0f1
                 if (r == 0)
17b0f1
                         *res = (rlim_t) u;
17b0f1
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
17b0f1
index 8acf071ff3..0384305051 100644
17b0f1
--- a/src/test/test-unit-file.c
17b0f1
+++ b/src/test/test-unit-file.c
17b0f1
@@ -554,6 +554,10 @@ static void test_config_parse_rlimit(void) {
17b0f1
         assert_se(rl[RLIMIT_NOFILE]->rlim_cur == 55);
17b0f1
         assert_se(rl[RLIMIT_NOFILE]->rlim_cur == rl[RLIMIT_NOFILE]->rlim_max);
17b0f1
 
17b0f1
+        assert_se(config_parse_bytes_limit(NULL, "fake", 1, "section", 1, "LimitSTACK", RLIMIT_STACK, "55", rl, NULL) >= 0);
17b0f1
+        assert_se(rl[RLIMIT_STACK]);
17b0f1
+        assert_se(rl[RLIMIT_STACK]->rlim_cur == 55);
17b0f1
+        assert_se(rl[RLIMIT_STACK]->rlim_cur == rl[RLIMIT_STACK]->rlim_max);
17b0f1
 
17b0f1
         assert_se(config_parse_limit(NULL, "fake", 1, "section", 1, "LimitNOFILE", RLIMIT_NOFILE, "55:66", rl, NULL) >= 0);
17b0f1
         assert_se(rl[RLIMIT_NOFILE]);