[oe] [meta-oe][PATCH v2] systemd: Replace use of %m in printf formats
Paul Menzel
paulepanter at users.sourceforge.net
Sun Jul 3 08:49:48 UTC 2011
Am Samstag, den 02.07.2011, 17:47 -0700 schrieb Khem Raj:
> The patch is applied optionally only to uclibc builds
> Also move the mkostemp replacement patch to uclibc only list
A separate patch for that is better in my opinion.
> Signed-off-by: Khem Raj <raj.khem at gmail.com>
> ---
> .../systemd/systemd/format-replace-m-uclibc.patch | 428 ++++++++++++++++++++
> meta-oe/recipes-core/systemd/systemd_git.bb | 8 +-
> 2 files changed, 434 insertions(+), 2 deletions(-)
> create mode 100644 meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch
>
> diff --git a/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch
> new file mode 100644
> index 0000000..05e9d1a
> --- /dev/null
> +++ b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch
> @@ -0,0 +1,428 @@
> +Patch from Henning. %m is a glibc only thing. For uclibc we need to do it
> +differently. So we use static strings instead of mallocing them and free'ing
> +
> +I dont know if upstream systemd have plans to make systemd work on non
> +glibc system libraries if not then this patch would not make sense for
> +upstream
> +
> +Signed-off-by: Khem Raj <raj.khem at gmail.com>
> +
> +Index: git/src/mount-setup.c
> +===================================================================
> +--- git.orig/src/mount-setup.c 2011-06-03 23:30:05.985617093 +0200
> ++++ git/src/mount-setup.c 2011-06-03 23:51:15.446677362 +0200
> +@@ -146,10 +146,11 @@
> +
> + for (;;) {
> + MountPoint p;
> +- char *controller, *where;
> ++ char controller[30];
> ++ char *where;
White space looks different.
> + int enabled = false;
> +
> +- if (fscanf(f, "%ms %*i %*i %i", &controller, &enabled) != 2) {
> ++ if (fscanf(f, "%29s %*i %*i %i", controller, &enabled) != 2) {
> +
> + if (feof(f))
> + break;
> +@@ -160,12 +161,10 @@
> + }
> +
> + if (!enabled) {
> +- free(controller);
> + continue;
> + }
> +
> + if (asprintf(&where, "/sys/fs/cgroup/%s", controller) < 0) {
> +- free(controller);
> + r = -ENOMEM;
> + goto finish;
> + }
> +@@ -179,7 +178,6 @@
> + p.fatal = false;
> +
> + r = mount_one(&p);
> +- free(controller);
> + free(where);
> +
> + if (r < 0)
> +Index: git/src/socket-util.c
> +===================================================================
> +--- git.orig/src/socket-util.c 2011-06-03 23:30:05.988952093 +0200
> ++++ git/src/socket-util.c 2011-06-03 23:31:55.056790399 +0200
> +@@ -192,7 +192,7 @@
> + int socket_address_parse_netlink(SocketAddress *a, const char *s) {
> + int family;
> + unsigned group = 0;
> +- char* sfamily = NULL;
> ++ char sfamily[50];
> + assert(a);
> + assert(s);
> +
> +@@ -200,17 +200,14 @@
> + a->type = SOCK_RAW;
> +
> + errno = 0;
> +- if (sscanf(s, "%ms %u", &sfamily, &group) < 1)
> ++ if (sscanf(s, "%49s %u", &sfamily, &group) < 1)
> + return errno ? -errno : -EINVAL;
> +
> + if ((family = netlink_family_from_string(sfamily)) < 0)
> + if (safe_atoi(sfamily, &family) < 0) {
> +- free(sfamily);
> + return -EINVAL;
> + }
> +
> +- free(sfamily);
> +-
> + a->sockaddr.nl.nl_family = AF_NETLINK;
> + a->sockaddr.nl.nl_groups = group;
> +
> +Index: git/src/cryptsetup-generator.c
> +===================================================================
> +--- git.orig/src/cryptsetup-generator.c 2011-06-03 23:30:05.995622093 +0200
> ++++ git/src/cryptsetup-generator.c 2011-06-03 23:31:55.056790399 +0200
> +@@ -260,7 +260,7 @@
> +
> + for (;;) {
> + char line[LINE_MAX], *l;
> +- char *name = NULL, *device = NULL, *password = NULL, *options = NULL;
> ++ char name[50], device[50], password[50], options[50] = NULL;
> + int k;
> +
> + if (!(fgets(line, sizeof(line), f)))
> +@@ -272,7 +272,7 @@
> + if (*l == '#' || *l == 0)
> + continue;
> +
> +- if ((k = sscanf(l, "%ms %ms %ms %ms", &name, &device, &password, &options)) < 2 || k > 4) {
> ++ if ((k = sscanf(l, "%s %s %s %s", &name, &device, &password, &options)) < 2 || k > 4) {
> + log_error("Failed to parse /etc/crypttab:%u, ignoring.", n);
> + r = EXIT_FAILURE;
> + goto next;
> +@@ -281,11 +281,7 @@
> + if (create_disk(name, device, password, options) < 0)
> + r = EXIT_FAILURE;
> +
> +- next:
> +- free(name);
> +- free(device);
> +- free(password);
> +- free(options);
> ++ next:;
> + }
> +
> + finish:
> +Index: git/src/ask-password-api.c
> +===================================================================
> +--- git.orig/src/ask-password-api.c 2011-06-03 23:30:06.002292093 +0200
> ++++ git/src/ask-password-api.c 2011-06-03 23:31:55.056790399 +0200
> +@@ -319,7 +319,7 @@
> +
> + mkdir_p("/run/systemd/ask-password", 0755);
> +
> +- if ((fd = mkostemp(temp, O_CLOEXEC|O_CREAT|O_WRONLY)) < 0) {
> ++ if ((fd = mkstemp(temp)) < 0) {
Some of these changes seem to have slipped in too. Could you put those
into the other patch or is there another reason for that?
> + log_error("Failed to create password file: %m");
> + r = -errno;
> + goto finish;
> +Index: git/src/manager.c
> +===================================================================
> +--- git.orig/src/manager.c 2011-06-03 23:30:06.008962093 +0200
> ++++ git/src/manager.c 2011-06-03 23:31:55.060125399 +0200
> +@@ -2623,7 +2623,7 @@
> + return -ENOMEM;
> +
> + saved_umask = umask(0077);
> +- fd = mkostemp(path, O_RDWR|O_CLOEXEC);
> ++ fd = mkstemp(path);
Dito.
> + umask(saved_umask);
> +
> + if (fd < 0) {
> +Index: git/src/swap.c
> +===================================================================
> +--- git.orig/src/swap.c 2011-06-03 23:30:06.015632093 +0200
> ++++ git/src/swap.c 2011-06-03 23:31:55.060125399 +0200
> +@@ -1043,11 +1043,12 @@
> + (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n");
> +
> + for (i = 1;; i++) {
> +- char *dev = NULL, *d;
> ++ char *d;
> ++ char dev[20];
White space.
> + int prio = 0, k;
> +
> + if ((k = fscanf(m->proc_swaps,
> +- "%ms " /* device/file */
> ++ "%19s " /* device/file */
> + "%*s " /* type of swap */
> + "%*s " /* swap size */
> + "%*s " /* used */
> +@@ -1058,12 +1059,10 @@
> + break;
> +
> + log_warning("Failed to parse /proc/swaps:%u.", i);
> +- free(dev);
> + continue;
> + }
> +
> + d = cunescape(dev);
> +- free(dev);
> +
> + if (!d)
> + return -ENOMEM;
> +Index: git/src/tmpfiles.c
> +===================================================================
> +--- git.orig/src/tmpfiles.c 2011-06-03 23:30:06.022302093 +0200
> ++++ git/src/tmpfiles.c 2011-06-03 23:50:17.207573272 +0200
> +@@ -66,7 +66,7 @@
> + typedef struct Item {
> + char type;
> +
> +- char *path;
> ++ char path[50];
> + uid_t uid;
> + gid_t gid;
> + mode_t mode;
> +@@ -619,7 +619,6 @@
> + static void item_free(Item *i) {
> + assert(i);
> +
> +- free(i->path);
> + free(i);
> + }
> +
> +@@ -654,7 +653,7 @@
> +
> + static int parse_line(const char *fname, unsigned line, const char *buffer) {
> + Item *i, *existing;
> +- char *mode = NULL, *user = NULL, *group = NULL, *age = NULL;
> ++ char mode[50], user[50], group[50], age[50];
> + Hashmap *h;
> + int r;
> +
> +@@ -669,17 +668,17 @@
> +
> + if (sscanf(buffer,
> + "%c "
> +- "%ms "
> +- "%ms "
> +- "%ms "
> +- "%ms "
> +- "%ms",
> ++ "%s "
> ++ "%s "
> ++ "%s "
> ++ "%s "
> ++ "%s",
> + &i->type,
> + &i->path,
> +- &mode,
> +- &user,
> +- &group,
> +- &age) < 2) {
> ++ mode,
> ++ user,
> ++ group,
> ++ age) < 2) {
> + log_error("[%s:%u] Syntax error.", fname, line);
> + r = -EIO;
> + goto finish;
> +@@ -793,11 +792,6 @@
> + r = 0;
> +
> + finish:
> +- free(user);
> +- free(group);
> +- free(mode);
> +- free(age);
> +-
> + if (i)
> + item_free(i);
> +
> +Index: git/src/mount.c
> +===================================================================
> +--- git.orig/src/mount.c 2011-06-03 23:30:06.028972093 +0200
> ++++ git/src/mount.c 2011-06-03 23:42:54.769805160 +0200
> +@@ -24,6 +24,7 @@
> + #include <mntent.h>
> + #include <sys/epoll.h>
> + #include <signal.h>
> ++#include <string.h>
> +
> + #include "unit.h"
> + #include "mount.h"
> +@@ -1555,7 +1556,13 @@
> + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
> + int r = 0;
> + unsigned i;
> +- char *device, *path, *options, *options2, *fstype, *d, *p, *o;
> ++ char *d, *p, *o;
> ++ char device[50];
White space.
> ++ char path[50];
> ++ char options[50];
> ++ char options2[50];
> ++ char fstype[50];
> ++
> +
> + assert(m);
> +
> +@@ -1564,26 +1571,26 @@
> + for (i = 1;; i++) {
> + int k;
> +
> +- device = path = options = options2 = fstype = d = p = o = NULL;
> ++ d = p = o = NULL;
> +
> + if ((k = fscanf(m->proc_self_mountinfo,
> + "%*s " /* (1) mount id */
> + "%*s " /* (2) parent id */
> + "%*s " /* (3) major:minor */
> + "%*s " /* (4) root */
> +- "%ms " /* (5) mount point */
> +- "%ms" /* (6) mount options */
> ++ "%49s " /* (5) mount point */
> ++ "%49s" /* (6) mount options */
> + "%*[^-]" /* (7) optional fields */
> + "- " /* (8) separator */
> +- "%ms " /* (9) file system type */
> +- "%ms" /* (10) mount source */
> +- "%ms" /* (11) mount options 2 */
> ++ "%49s " /* (9) file system type */
> ++ "%49s" /* (10) mount source */
> ++ "%49s" /* (11) mount options 2 */
> + "%*[^\n]", /* some rubbish at the end */
> +- &path,
> +- &options,
> +- &fstype,
> +- &device,
> +- &options2)) != 5) {
> ++ path,
> ++ options,
> ++ fstype,
> ++ device,
> ++ options2)) != 5) {
> +
> + if (k == EOF)
> + break;
> +@@ -1607,22 +1614,12 @@
> + r = k;
> +
> + clean_up:
> +- free(device);
> +- free(path);
> +- free(options);
> +- free(options2);
> +- free(fstype);
> + free(d);
> + free(p);
> + free(o);
> + }
> +
> + finish:
> +- free(device);
> +- free(path);
> +- free(options);
> +- free(options2);
> +- free(fstype);
> + free(d);
> + free(p);
> + free(o);
> +Index: git/src/umount.c
> +===================================================================
> +--- git.orig/src/umount.c 2011-06-03 23:30:06.035642093 +0200
> ++++ git/src/umount.c 2011-06-03 23:51:56.784001724 +0200
> +@@ -60,7 +60,9 @@
> +
> + static int mount_points_list_get(MountPoint **head) {
> + FILE *proc_self_mountinfo;
> +- char *path, *p;
> ++ char *p;
> ++ char path[50];
White space.
> ++
> + unsigned int i;
> + int r;
> +
> +@@ -72,17 +74,17 @@
> + for (i = 1;; i++) {
> + int k;
> + MountPoint *m;
> +- char *root;
> ++ char root[50];
> + bool skip_ro;
> +
> +- path = p = NULL;
> ++ p = NULL;
> +
> + if ((k = fscanf(proc_self_mountinfo,
> + "%*s " /* (1) mount id */
> + "%*s " /* (2) parent id */
> + "%*s " /* (3) major:minor */
> +- "%ms " /* (4) root */
> +- "%ms " /* (5) mount point */
> ++ "%49s " /* (4) root */
> ++ "%49s " /* (5) mount point */
> + "%*s" /* (6) mount options */
> + "%*[^-]" /* (7) optional fields */
> + "- " /* (8) separator */
> +@@ -90,24 +92,21 @@
> + "%*s" /* (10) mount source */
> + "%*s" /* (11) mount options 2 */
> + "%*[^\n]", /* some rubbish at the end */
> +- &root,
> +- &path)) != 2) {
> ++ root,
> ++ path)) != 2) {
> + if (k == EOF)
> + break;
> +
> + log_warning("Failed to parse /proc/self/mountinfo:%u.", i);
> +
> +- free(path);
> + continue;
> + }
> +
> + /* If we encounter a bind mount, don't try to remount
> + * the source dir too early */
> + skip_ro = !streq(root, "/");
> +- free(root);
> +
> + p = cunescape(path);
> +- free(path);
> +
> + if (!p) {
> + r = -ENOMEM;
> +@@ -152,28 +151,28 @@
> +
> + for (i = 2;; i++) {
> + MountPoint *swap;
> +- char *dev = NULL, *d;
> ++ char *d;
> ++ char dev[50];
White space.
> ++
> + int k;
> +
> + if ((k = fscanf(proc_swaps,
> +- "%ms " /* device/file */
> ++ "%50s " /* device/file */
> + "%*s " /* type of swap */
> + "%*s " /* swap size */
> + "%*s " /* used */
> + "%*s\n", /* priority */
> +- &dev)) != 1) {
> ++ dev)) != 1) {
> +
> + if (k == EOF)
> + break;
> +
> + log_warning("Failed to parse /proc/swaps:%u.", i);
> +
> +- free(dev);
> + continue;
> + }
> +
> + if (endswith(dev, "(deleted)")) {
> +- free(dev);
> + continue;
> + }
> +
> diff --git a/meta-oe/recipes-core/systemd/systemd_git.bb b/meta-oe/recipes-core/systemd/systemd_git.bb
> index 40b93b8..e5115f7 100644
> --- a/meta-oe/recipes-core/systemd/systemd_git.bb
> +++ b/meta-oe/recipes-core/systemd/systemd_git.bb
> @@ -15,7 +15,7 @@ inherit gitpkgv
> PKGV = "v${GITPKGVTAG}"
>
> PV = "git"
> -PR = "r5"
> +PR = "r6"
>
> inherit autotools vala
>
> @@ -23,9 +23,13 @@ SRCREV = "8585357a0e5e9f4d56e999d7cd1a73e77ae0eb80"
>
> SRC_URI = "git://anongit.freedesktop.org/systemd;protocol=git \
> file://0001-systemd-disable-xml-file-stuff-and-introspection.patch \
> - file://paper-over-mkostemp.patch \
> file://use-nonet-for-docbook.patch \
> + ${UCLIBCPATCHES} \
> "
> +UCLIBCPATCHES = ""
> +UCLIBCPATCHES_libc-uclibc = "file://paper-over-mkostemp.patch \
> + file://format-replace-m-uclibc.patch \
> + "
>
> S = "${WORKDIR}/git"
Thanks,
Paul
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20110703/26284636/attachment-0002.sig>
More information about the Openembedded-devel
mailing list