[oe] [meta-oe][PATCH v2] systemd: Replace use of %m in printf formats

Khem Raj raj.khem at gmail.com
Sun Jul 3 15:37:27 UTC 2011


On 07/03/2011 01:49 AM, Paul Menzel wrote:
> 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.


I would think otherwise since the patches uclibc specific are being 
moved to this variable its better to do it all at once and it maintains
bisectability

Other concerns I have addressed in v3

>
>> 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
>
>
>
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel





More information about the Openembedded-devel mailing list