[OE-core] [V4][PATCH] inetutils: Fix the rcp couldn't copy subdirectory issue

Zhixiong Chi zhixiong.chi at windriver.com
Tue Jan 7 01:57:22 UTC 2020


Ping...

I sent this patch to the inetutils upstream mail list several days ago 
but no response so far.

So will it be merged next steps for oe-core?

Thanks.


On 2019年12月24日 14:35, Zhixiong Chi wrote:
> Since snprintf doesn't support the same src and dst address, it will get
> the wrong result.
> In the sink second recursive call env, the argv and the namebuf will point
> the same address, after free operation for namebuf.
> Overall the last change for this is wrong, now we just move the memory free
> to the end of the sink function, so that we can correct the value and fix
> the memory leak issue.
>
> Signed-off-by: Zhixiong Chi <zhixiong.chi at windriver.com>
> ---
>   ...e-rcp-couldn-t-copy-subdirectory-iss.patch | 90 +++++++++++++++++++
>   .../inetutils/inetutils_1.9.4.bb              |  1 +
>   2 files changed, 91 insertions(+)
>   create mode 100644 meta/recipes-connectivity/inetutils/inetutils/0001-inetutils-Fix-the-rcp-couldn-t-copy-subdirectory-iss.patch
>
> diff --git a/meta/recipes-connectivity/inetutils/inetutils/0001-inetutils-Fix-the-rcp-couldn-t-copy-subdirectory-iss.patch b/meta/recipes-connectivity/inetutils/inetutils/0001-inetutils-Fix-the-rcp-couldn-t-copy-subdirectory-iss.patch
> new file mode 100644
> index 0000000000..e90781998a
> --- /dev/null
> +++ b/meta/recipes-connectivity/inetutils/inetutils/0001-inetutils-Fix-the-rcp-couldn-t-copy-subdirectory-iss.patch
> @@ -0,0 +1,90 @@
> +The namebuf will get the same allocation address as the one before
> +free operation, at the same time because of the recursive call for
> +sink function, the targ and namebuf point the same address, then it
> +cause the namebuf will get the wrong value with the snprintf function.
> +Since the snprintf function doesn't like the strcpy function which
> +can overwrite the destination.
> +eg:
> + char tmp[20] = "test";
> + snprintf(tmp,20,"%s%s",tmp,"yes");
> +The result of tmp -> yes. It will cause the wrong value.
> +
> +The sink function flow is as follows:
> + >sink(int argc, char*argv[])
> + >{
> + > ...
> + > targ = *argv;
> + > static char *namebuf = NULL;
> + > free (namebuf);
> + > namebuf = malloc (need);
> + > snprintf (namebuf, cursize, "%s%s%s", targ, *targ ? "/" : "", cp);
> + > np = namebuf;
> + > vect[0] = np;
> + > sink (1, vect);
> + > ...
> + >}
> +
> +At the same time, we couldn't add the condition(need > corsize),
> +the same snprintf issue still exists. for example:
> +#ls rccopy/*/*
> +rccopy/fold1/1  rccopy/fold2/2  rccopy/fold3/3
> +
> +Since the cursize static variable is still the old value after copying the
> +rccopy/fold1/1, when it copys the directory rccopy/fold2 during recursive,
> +the value of need < cursize, the namebuf still use the old vlaue without being
> +allocated the new space, the incorrect namebuf value issue is still here.
> +
> +We move the memory free to the end of this fucntion.
> +
> +Upstream-Status: Submitted [commit-inetutils at gnu.org]
> +Signed-off-by: Zhixiong Chi <zhixiong.chi at windriver.com>
> +Index: inetutils-1.9.4/src/rcp.c
> +===================================================================
> +--- inetutils-1.9.4.orig/src/rcp.c
> ++++ inetutils-1.9.4/src/rcp.c
> +@@ -881,6 +881,7 @@ sink (int argc, char *argv[])
> +   int setimes, targisdir, wrerrno;
> +   char ch, *cp, *np, *targ, *vect[1], buf[BUFSIZ];
> +   const char *why;
> ++  static char *namebuf = NULL;
> +
> + #define atime	tv[0]
> + #define mtime	tv[1]
> +@@ -988,25 +989,14 @@ sink (int argc, char *argv[])
> + 	SCREWUP ("size not delimited");
> +       if (targisdir)
> + 	{
> +-	  static char *namebuf = NULL;
> +-	  static size_t cursize = 0;
> + 	  size_t need;
> +
> + 	  need = strlen (targ) + strlen (cp) + 250;
> +-	  if (need > cursize)
> ++	  if (!(namebuf = malloc (need)));
> + 	    {
> +-	      free (namebuf);
> +-	      namebuf = malloc (need);
> +-	      if (namebuf)
> +-		cursize = need;
> +-	      else
> +-		{
> +-		  run_err ("%s", strerror (errno));
> +-		  cursize = 0;
> +-		  continue;
> +-		}
> ++	      run_err ("%s", strerror (errno));
> + 	    }
> +-	  snprintf (namebuf, cursize, "%s%s%s", targ, *targ ? "/" : "", cp);
> ++	  snprintf (namebuf, need, "%s%s%s", targ, *targ ? "/" : "", cp);
> + 	  np = namebuf;
> + 	}
> +       else
> +@@ -1163,6 +1153,8 @@ sink (int argc, char *argv[])
> + 	  break;
> + 	}
> +     }
> ++    if (namebuf)
> ++      free(namebuf);
> + screwup:
> +   run_err ("protocol error: %s", why);
> +   exit (EXIT_FAILURE);
> diff --git a/meta/recipes-connectivity/inetutils/inetutils_1.9.4.bb b/meta/recipes-connectivity/inetutils/inetutils_1.9.4.bb
> index 684fbe09e1..bc944131fa 100644
> --- a/meta/recipes-connectivity/inetutils/inetutils_1.9.4.bb
> +++ b/meta/recipes-connectivity/inetutils/inetutils_1.9.4.bb
> @@ -23,6 +23,7 @@ SRC_URI = "${GNU_MIRROR}/inetutils/inetutils-${PV}.tar.gz \
>              file://inetutils-only-check-pam_appl.h-when-pam-enabled.patch \
>              file://0001-rcp-fix-to-work-with-large-files.patch \
>              file://fix-buffer-fortify-tfpt.patch \
> +           file://0001-inetutils-Fix-the-rcp-couldn-t-copy-subdirectory-iss.patch \
>   "
>   
>   SRC_URI[md5sum] = "04852c26c47cc8c6b825f2b74f191f52"

-- 
---------------------
Thanks,
Zhixiong Chi
Tel: +86-10-8477-7036



More information about the Openembedded-core mailing list