[meta-virtualization] [PATCH] hyperstart: Fix compiler errors from gcc 8.1.0 uprev

Bruce Ashfield bruce.ashfield at gmail.com
Tue Jun 19 09:29:47 PDT 2018


merged.

Bruce

On Fri, Jun 15, 2018 at 11:19 AM, Jason Wessel <jason.wessel at windriver.com>
wrote:

> The patch to hypterstart was also submitted to the upstream project.
> It fixes these errors/warnings:
>
> container.c: In function 'hyper_setup_container_rootfs':
> container.c:630:24: error: '/' directive writing 1 byte into a region of
> size between 0 and 511 [-Werror=format-overflow=]
>   sprintf(rootfs, "%s/%s/", root, container->rootfs);
>                         ^
> container.c:630:2: note: 'sprintf' output 3 or more bytes (assuming 514)
> into a destination of size 512
>   sprintf(rootfs, "%s/%s/", root, container->rootfs);
>   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> container.c:262:18: error: '%s' directive writing up to 511 bytes into a
> region of size 510 [-Werror=format-overflow=]
>   sprintf(dst, "./%s", src);
>                   ^~   ~~~
> container.c:262:2: note: 'sprintf' output between 3 and 514 bytes into a
> destination of size 512
>   sprintf(dst, "./%s", src);
>   ^~~~~~~~~~~~~~~~~~~~~~~~~
> container.c:218:24: error: '/_data' directive writing 6 bytes into a
> region of size between 1 and 512 [-Werror=format-overflow=]
>      sprintf(volume, "%s/_data", path);
>                         ^~~~~~
> container.c:218:5: note: 'sprintf' output between 7 and 518 bytes into a
> destination of size 512
>      sprintf(volume, "%s/_data", path);
>      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> container.c:149:24: error: '/_data' directive writing 6 bytes into a
> region of size between 0 and 511 [-Werror=format-overflow=]
>     sprintf(volume, "/%s/_data", path);
>                         ^~~~~~
> container.c:149:4: note: 'sprintf' output between 8 and 519 bytes into a
> destination of size 512
>     sprintf(volume, "/%s/_data", path);
>     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> container.c:131:24: error: '/' directive writing 1 byte into a region of
> size between 0 and 511 [-Werror=format-overflow=]
>     sprintf(volume, "/%s/", path);
>                         ^
> container.c:131:4: note: 'sprintf' output between 3 and 514 bytes into a
> destination of size 512
>     sprintf(volume, "/%s/", path);
>     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> container.c:176:24: error: '/_data/' directive writing 7 bytes into a
> region of size between 0 and 511 [-Werror=format-overflow=]
>     sprintf(volume, "/%s/_data/%s", path, filevolume);
>                         ^~~~~~~
> container.c:176:4: note: 'sprintf' output 9 or more bytes (assuming 520)
> into a destination of size 512
>     sprintf(volume, "/%s/_data/%s", path, filevolume);
>     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Signed-off-by: Jason Wessel <jason.wessel at windriver.com>
> ---
>  ...compiler-errors-that-gcc-8.1.0-repor.patch | 230 ++++++++++++++++++
>  recipes-extended/hyperstart/hyperstart_git.bb |   1 +
>  2 files changed, 231 insertions(+)
>  create mode 100644 recipes-extended/hyperstart/
> hyperstart/0001-container.c-Fix-compiler-errors-that-gcc-8.1.0-repor.patch
>
> diff --git a/recipes-extended/hyperstart/hyperstart/0001-container.c-
> Fix-compiler-errors-that-gcc-8.1.0-repor.patch
> b/recipes-extended/hyperstart/hyperstart/0001-container.c-
> Fix-compiler-errors-that-gcc-8.1.0-repor.patch
> new file mode 100644
> index 0000000..4a01de5
> --- /dev/null
> +++ b/recipes-extended/hyperstart/hyperstart/0001-container.c-
> Fix-compiler-errors-that-gcc-8.1.0-repor.patch
> @@ -0,0 +1,230 @@
> +From 11f5089300c1c368d896c95890827dc85a67f132 Mon Sep 17 00:00:00 2001
> +From: Jason Wessel <jason.wessel at windriver.com>
> +Date: Fri, 15 Jun 2018 08:04:35 -0700
> +Subject: [PATCH] container.c: Fix compiler errors that gcc 8.1.0 reports
> +
> +gcc 8.1.0 reports the following compiler errors/warnings.  They can be
> +fixed by using snprintf and checking the result for truncation.  This
> +patch also uses a named constant instead of inserting the value 512 in
> +many locations.
> +
> +container.c: In function 'hyper_setup_container_rootfs':
> +container.c:630:24: error: '/' directive writing 1 byte into a region of
> size between 0 and 511 [-Werror=format-overflow=]
> +  sprintf(rootfs, "%s/%s/", root, container->rootfs);
> +                        ^
> +container.c:630:2: note: 'sprintf' output 3 or more bytes (assuming 514)
> into a destination of size 512
> +  sprintf(rootfs, "%s/%s/", root, container->rootfs);
> +  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +container.c:262:18: error: '%s' directive writing up to 511 bytes into a
> region of size 510 [-Werror=format-overflow=]
> +  sprintf(dst, "./%s", src);
> +                  ^~   ~~~
> +container.c:262:2: note: 'sprintf' output between 3 and 514 bytes into a
> destination of size 512
> +  sprintf(dst, "./%s", src);
> +  ^~~~~~~~~~~~~~~~~~~~~~~~~
> +container.c:218:24: error: '/_data' directive writing 6 bytes into a
> region of size between 1 and 512 [-Werror=format-overflow=]
> +     sprintf(volume, "%s/_data", path);
> +                        ^~~~~~
> +container.c:218:5: note: 'sprintf' output between 7 and 518 bytes into a
> destination of size 512
> +     sprintf(volume, "%s/_data", path);
> +     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +container.c:149:24: error: '/_data' directive writing 6 bytes into a
> region of size between 0 and 511 [-Werror=format-overflow=]
> +    sprintf(volume, "/%s/_data", path);
> +                        ^~~~~~
> +container.c:149:4: note: 'sprintf' output between 8 and 519 bytes into a
> destination of size 512
> +    sprintf(volume, "/%s/_data", path);
> +    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +container.c:131:24: error: '/' directive writing 1 byte into a region of
> size between 0 and 511 [-Werror=format-overflow=]
> +    sprintf(volume, "/%s/", path);
> +                        ^
> +container.c:131:4: note: 'sprintf' output between 3 and 514 bytes into a
> destination of size 512
> +    sprintf(volume, "/%s/", path);
> +    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +container.c:176:24: error: '/_data/' directive writing 7 bytes into a
> region of size between 0 and 511 [-Werror=format-overflow=]
> +    sprintf(volume, "/%s/_data/%s", path, filevolume);
> +                        ^~~~~~~
> +container.c:176:4: note: 'sprintf' output 9 or more bytes (assuming 520)
> into a destination of size 512
> +    sprintf(volume, "/%s/_data/%s", path, filevolume);
> +    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +Signed-off-by: Jason Wessel <jason.wessel at windriver.com>
> +---
> + src/container.c | 47 ++++++++++++++++++++++++++++-------------------
> + 1 file changed, 28 insertions(+), 19 deletions(-)
> +
> +diff --git a/src/container.c b/src/container.c
> +index 0938d82..b1c52d4 100644
> +--- a/src/container.c
> ++++ b/src/container.c
> +@@ -22,6 +22,8 @@
> + #include "syscall.h"
> + #include "netlink.h"
> +
> ++#define MAX_PBUF 512
> ++
> + static int container_populate_volume(char *src, char *dest)
> + {
> +       struct stat st;
> +@@ -99,12 +101,12 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                                 struct hyper_container *container)
> + {
> +       int i;
> +-      char dev[512], path[512];
> ++      char dev[MAX_PBUF], path[MAX_PBUF];
> +       struct volume *vol;
> +
> +       for (i = 0; i < container->vols_num; i++) {
> +-              char volume[512];
> +-              char mountpoint[512];
> ++              char volume[MAX_PBUF];
> ++              char mountpoint[MAX_PBUF];
> +               char *options = NULL;
> +               const char *filevolume = NULL;
> +               vol = &container->vols[i];
> +@@ -128,7 +130,8 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                       if (hyper_mount_nfs(vol->device, path) < 0)
> +                               return -1;
> +                       /* nfs export has implicitly included _data part
> of the volume */
> +-                      sprintf(volume, "/%s/", path);
> ++                      if (snprintf(volume, MAX_PBUF, "/%s/", path) >=
> MAX_PBUF)
> ++                                return -1;
> +               } else {
> +                       fprintf(stdout, "mount %s to %s, tmp path %s\n",
> +                               dev, vol->mountpoint, path);
> +@@ -137,7 +140,7 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                               options = "nouuid";
> +
> +                       if (access(dev, R_OK) < 0) {
> +-                              char device[512];
> ++                              char device[MAX_PBUF];
> +                               sprintf(device, "/block/%s", vol->device);
> +                               hyper_netlink_wait_dev(pod->ueventfd,
> device);
> +                       }
> +@@ -146,7 +149,8 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                               perror("mount volume device failed");
> +                               return -1;
> +                       }
> +-                      sprintf(volume, "/%s/_data", path);
> ++                      if (snprintf(volume, MAX_PBUF, "/%s/_data", path)
> >= MAX_PBUF)
> ++                                return -1;
> +               }
> +
> +               if (container_check_file_volume(volume, &filevolume) < 0)
> +@@ -173,7 +177,8 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                               perror("create volume file failed");
> +                               return -1;
> +                       }
> +-                      sprintf(volume, "/%s/_data/%s", path, filevolume);
> ++                      if (snprintf(volume, MAX_PBUF, "/%s/_data/%s",
> path, filevolume) >= MAX_PBUF)
> ++                                return -1;
> +                       /* 0777 so that any user can read/write the new
> file volume */
> +                       if (chmod(volume, 0777) < 0) {
> +                               fprintf(stderr, "fail to chmod directory
> %s\n", volume);
> +@@ -197,9 +202,9 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +
> +       for (i = 0; i < container->maps_num; i++) {
> +               struct stat st;
> +-              char *src, path[512], volume[512];
> ++              char *src, path[MAX_PBUF], volume[MAX_PBUF];
> +               struct fsmap *map = &container->maps[i];
> +-              char mountpoint[512];
> ++              char mountpoint[MAX_PBUF];
> +
> +               sprintf(path, "%s/%s", SHARED_DIR, map->source);
> +               sprintf(mountpoint, "./%s", map->path);
> +@@ -215,7 +220,8 @@ static int container_setup_volume(struct hyper_pod
> *pod,
> +                       }
> +                       if (map->docker) {
> +                               /* converted from volume */
> +-                              sprintf(volume, "%s/_data", path);
> ++                              if (snprintf(volume, MAX_PBUF, "%s/_data",
> path) >= MAX_PBUF)
> ++                                        return -1;
> +                               src = volume;
> +                               if (container->initialize &&
> +                                   (container_populate_volume(mountpoint,
> volume) < 0)) {
> +@@ -251,7 +257,7 @@ static int container_setup_modules(struct
> hyper_container *container)
> + {
> +       struct stat st;
> +       struct utsname uts;
> +-      char src[512], dst[512];
> ++      char src[MAX_PBUF], dst[MAX_PBUF];
> +
> +       if (uname(&uts) < 0) {
> +               perror("fail to call uname");
> +@@ -259,7 +265,8 @@ static int container_setup_modules(struct
> hyper_container *container)
> +       }
> +
> +       sprintf(src, "/lib/modules/%s", uts.release);
> +-      sprintf(dst, "./%s", src);
> ++      if (snprintf(dst, MAX_PBUF, "./%s", src) >= MAX_PBUF)
> ++        return -1;
> +
> +       if (stat(dst, &st) == 0) {
> +               struct dirent **list;
> +@@ -291,7 +298,7 @@ static int container_setup_modules(struct
> hyper_container *container)
> +
> + static int container_setup_mount(struct hyper_container *container)
> + {
> +-      char src[512];
> ++      char src[MAX_PBUF];
> +
> +       // current dir is container rootfs, the operations on "./PATH" are
> the operations on container's "/PATH"
> +       if (!container->readonly) {
> +@@ -546,7 +553,7 @@ static int hyper_setup_container_rootfs(void *data)
> + {
> +       struct hyper_container_arg *arg = data;
> +       struct hyper_container *container = arg->c;
> +-      char root[512], rootfs[512];
> ++      char root[MAX_PBUF], rootfs[MAX_PBUF];
> +       int setup_dns;
> +
> +       /* wait for ns-opened ready message */
> +@@ -609,7 +616,7 @@ static int hyper_setup_container_rootfs(void *data)
> +                       goto fail;
> +               }
> +       } else {
> +-              char path[512];
> ++              char path[MAX_PBUF];
> +
> +               sprintf(path, "%s/%s/", SHARED_DIR, container->image);
> +               fprintf(stdout, "src directory %s\n", path);
> +@@ -627,7 +634,9 @@ static int hyper_setup_container_rootfs(void *data)
> +       fprintf(stdout, "root directory for container is %s/%s, init task
> %s\n",
> +               root, container->rootfs, container->exec.argv[0]);
> +
> +-      sprintf(rootfs, "%s/%s/", root, container->rootfs);
> ++      if (snprintf(rootfs, MAX_PBUF, "%s/%s/", root, container->rootfs)
> >= MAX_PBUF)
> ++        goto fail;
> ++
> +       if (mount(rootfs, rootfs, NULL, MS_BIND|MS_REC, NULL) < 0) {
> +               perror("failed to bind rootfs");
> +               goto fail;
> +@@ -710,7 +719,7 @@ fail:
> +
> + static int hyper_setup_pty(struct hyper_container *c)
> + {
> +-      char root[512];
> ++      char root[MAX_PBUF];
> +
> +       sprintf(root, "/tmp/hyper/%s/devpts/", c->id);
> +
> +@@ -730,7 +739,7 @@ static int hyper_setup_pty(struct hyper_container *c)
> +
> + static void hyper_cleanup_pty(struct hyper_container *c)
> + {
> +-      char path[512];
> ++      char path[MAX_PBUF];
> +
> +       sprintf(path, "/tmp/hyper/%s/devpts/", c->id);
> +       if (umount(path) < 0)
> +@@ -739,7 +748,7 @@ static void hyper_cleanup_pty(struct hyper_container
> *c)
> +
> + int container_prepare_rootfs_dev(struct hyper_container *container,
> struct hyper_pod *pod)
> + {
> +-      char dev[512];
> ++      char dev[MAX_PBUF];
> +
> +       if (container->fstype == NULL)
> +               return 0;
> +--
> +2.17.1
> +
> diff --git a/recipes-extended/hyperstart/hyperstart_git.bb
> b/recipes-extended/hyperstart/hyperstart_git.bb
> index 0297477..99c2195 100644
> --- a/recipes-extended/hyperstart/hyperstart_git.bb
> +++ b/recipes-extended/hyperstart/hyperstart_git.bb
> @@ -7,6 +7,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=
> fa818a259cbed7ce8bc2a22d35a464fc"
>  inherit autotools-brokensep
>
>  SRC_URI = "git://github.com/hyperhq/hyperstart.git"
> +SRC_URI += "file://0001-container.c-Fix-compiler-errors-that-gcc-8.1.
> 0-repor.patch"
>
>  SRCREV = "ad48a3230836f59ada163659cde151a37522068b"
>  PV = "v0.2+git${SRCREV}"
> --
> 2.17.1
>
> --
> _______________________________________________
> meta-virtualization mailing list
> meta-virtualization at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-virtualization
>



-- 
"Thou shalt not follow the NULL pointer, for chaos and madness await thee
at its end"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/meta-virtualization/attachments/20180619/37f78944/attachment-0001.html>


More information about the meta-virtualization mailing list