[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