chiark / gitweb /
coredump: also escape spaces in comm fields when formatting file names
[elogind.git] / src / journal / coredump.c
index f48f4e2c897d103673cb24d35f52400256ee0685..287e0ed7fdd065bd30053ae196ea1084858d3f2c 100644 (file)
@@ -24,7 +24,7 @@
 #include <stdio.h>
 #include <sys/prctl.h>
 #include <sys/types.h>
-#include <attr/xattr.h>
+#include <sys/xattr.h>
 
 #include <systemd/sd-journal.h>
 #include <systemd/sd-login.h>
@@ -159,39 +159,34 @@ static int fix_acl(int fd, uid_t uid) {
 }
 
 static int fix_xattr(int fd, char *argv[]) {
+
+        static const char * const xattrs[_ARG_MAX] = {
+                [ARG_PID] = "user.coredump.pid",
+                [ARG_UID] = "user.coredump.uid",
+                [ARG_GID] = "user.coredump.gid",
+                [ARG_SIGNAL] = "user.coredump.signal",
+                [ARG_TIMESTAMP] = "user.coredump.timestamp",
+                [ARG_COMM] = "user.coredump.comm",
+        };
+
         int r = 0;
+        unsigned i;
 
         /* Attach some metadate to coredumps via extended
          * attributes. Just because we can. */
 
-        if (!isempty(argv[ARG_PID]))
-                if (fsetxattr(fd, "user.coredump.pid", argv[ARG_PID], strlen(argv[ARG_PID]), XATTR_CREATE) < 0)
-                        r = -errno;
+        for (i = 0; i < _ARG_MAX; i++) {
+                if (isempty(argv[i]))
+                        continue;
 
-        if (!isempty(argv[ARG_UID]))
-                if (fsetxattr(fd, "user.coredump.uid", argv[ARG_UID], strlen(argv[ARG_UID]), XATTR_CREATE) < 0)
-                        r = -errno;
-
-        if (!isempty(argv[ARG_GID]))
-                if (fsetxattr(fd, "user.coredump.gid", argv[ARG_GID], strlen(argv[ARG_GID]), XATTR_CREATE) < 0)
-                        r = -errno;
-
-        if (!isempty(argv[ARG_SIGNAL]))
-                if (fsetxattr(fd, "user.coredump.signal", argv[ARG_SIGNAL], strlen(argv[ARG_SIGNAL]), XATTR_CREATE) < 0)
-                        r = -errno;
-
-        if (!isempty(argv[ARG_TIMESTAMP]))
-                if (fsetxattr(fd, "user.coredump.timestamp", argv[ARG_TIMESTAMP], strlen(argv[ARG_TIMESTAMP]), XATTR_CREATE) < 0)
-                        r = -errno;
-
-        if (!isempty(argv[ARG_COMM]))
-                if (fsetxattr(fd, "user.coredump.comm", argv[ARG_COMM], strlen(argv[ARG_COMM]), XATTR_CREATE) < 0)
+                if (fsetxattr(fd, xattrs[i], argv[i], strlen(argv[i]), XATTR_CREATE) < 0)
                         r = -errno;
+        }
 
         return r;
 }
 
-#define filename_escape(s) xescape((s), "./")
+#define filename_escape(s) xescape((s), "./ ")
 
 static int save_external_coredump(char **argv, uid_t uid, char **ret_filename, int *ret_fd, off_t *ret_size) {
         _cleanup_free_ char *p = NULL, *t = NULL, *c = NULL, *fn = NULL, *tmp = NULL;