]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: allow to specify errno number in SystemCallErrorNumber=
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 11 Nov 2017 12:40:20 +0000 (21:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 11 Nov 2017 12:54:24 +0000 (21:54 +0900)
man/systemd.exec.xml
src/core/dbus-execute.c
src/core/execute.c
src/core/load-fragment.c
src/shared/bus-unit-util.c

index 0aaccb9298bec665ea2a8c070200b6f8e4ed420a..7545c75d77055d345a08f189d122d73dbcb6b7f3 100644 (file)
@@ -1622,15 +1622,11 @@ CapabilityBoundingSet=~CAP_B CAP_C</programlisting>
       <varlistentry>
         <term><varname>SystemCallErrorNumber=</varname></term>
 
-        <listitem><para>Takes an <literal>errno</literal> error number
-        name to return when the system call filter configured with
-        <varname>SystemCallFilter=</varname> is triggered, instead of
-        terminating the process immediately. Takes an error name such
-        as <constant>EPERM</constant>, <constant>EACCES</constant> or
-        <constant>EUCLEAN</constant>. When this setting is not used,
-        or when the empty string is assigned, the process will be
-        terminated immediately when the filter is
-        triggered.</para></listitem>
+        <listitem><para>Takes an <literal>errno</literal> error number (between 1 and 4095) or errno name such as
+        <constant>EPERM</constant>, <constant>EACCES</constant> or <constant>EUCLEAN</constant>, to return when the
+        system call filter configured with <varname>SystemCallFilter=</varname> is triggered, instead of terminating
+        the process immediately. When this setting is not used, or when the empty string is assigned, the process
+        will be terminated immediately when the filter is triggered.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index e480bacdcb2ca1b57c16a411e812bd0c5daa48db..30861617bd4284e525346673fcd5ecc29b41319a 100644 (file)
@@ -1334,20 +1334,18 @@ int bus_exec_context_set_transient_property(
 
         } else if (streq(name, "SystemCallErrorNumber")) {
                 int32_t n;
-                const char *str;
 
                 r = sd_bus_message_read(message, "i", &n);
                 if (r < 0)
                         return r;
 
-                str = errno_to_name(n);
-                if (!str)
+                if (n <= 0 || n > ERRNO_MAX)
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid SystemCallErrorNumber");
 
                 if (mode != UNIT_CHECK) {
                         c->syscall_errno = n;
 
-                        unit_write_drop_in_private_format(u, mode, name, "SystemCallErrorNumber=%s", str);
+                        unit_write_drop_in_private_format(u, mode, name, "SystemCallErrorNumber=%d", n);
                 }
 
                 return 1;
index fdd57cd005186205b6dcbafa3f94a9a68d56bc4e..9f7181549e7fae0f77a6a69544de5c3f838c170e 100644 (file)
@@ -4129,10 +4129,17 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
                                 prefix, s);
         }
 
-        if (c->syscall_errno > 0)
-                fprintf(f,
-                        "%sSystemCallErrorNumber: %s\n",
-                        prefix, strna(errno_to_name(c->syscall_errno)));
+        if (c->syscall_errno > 0) {
+                const char *errno_name;
+
+                fprintf(f, "%sSystemCallErrorNumber: ", prefix);
+
+                errno_name = errno_to_name(c->syscall_errno);
+                if (errno_name)
+                        fprintf(f, "%s\n", errno_name);
+                else
+                        fprintf(f, "%d\n", c->syscall_errno);
+        }
 
         if (c->apparmor_profile)
                 fprintf(f,
index 33f8ca98b4094fd31aa2047cc223d6362571595f..ede62e7b3d04996cc3205ee9a82d096ce8eec9c0 100644 (file)
@@ -2839,8 +2839,8 @@ int config_parse_syscall_errno(
                 return 0;
         }
 
-        e = errno_from_name(rvalue);
-        if (e < 0) {
+        e = parse_errno(rvalue);
+        if (e <= 0) {
                 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse error number, ignoring: %s", rvalue);
                 return 0;
         }
index b891d2465329b92ecb5564ab6cfbea5ac180e18f..57de9975c79117d56cafdf414fa6d7e59ac0cfd6 100644 (file)
@@ -690,8 +690,8 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
         } else if (streq(field, "SystemCallErrorNumber")) {
                 int n;
 
-                n = errno_from_name(eq);
-                if (n < 0)
+                n = parse_errno(eq);
+                if (n <= 0)
                         return log_error_errno(r, "Failed to parse %s value: %s", field, eq);
 
                 r = sd_bus_message_append(m, "v", "i", (int32_t) n);