]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authormillert@openbsd.org <millert@openbsd.org>
Thu, 27 Apr 2017 11:53:12 +0000 (11:53 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 28 Apr 2017 03:26:36 +0000 (13:26 +1000)
Avoid potential signed int overflow when parsing the file
size. Use strtoul() instead of parsing manually.  OK djm@

Upstream-ID: 1f82640861c7d905bbb05e7d935d46b0419ced02

scp.c

diff --git a/scp.c b/scp.c
index b4db851980ba68a93d119c0c42d17d31f3b1866c..45541af00d30a7a3a5cd202d10db7d2d9ae8c8a6 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scp.c,v 1.187 2016/09/12 01:22:38 deraadt Exp $ */
+/* $OpenBSD: scp.c,v 1.188 2017/04/27 11:53:12 millert Exp $ */
 /*
  * scp - secure remote copy.  This is basically patched BSD rcp which
  * uses ssh to do the data transfer (instead of using rcmd).
@@ -1043,10 +1043,15 @@ sink(int argc, char **argv)
                if (*cp++ != ' ')
                        SCREWUP("mode not delimited");
 
-               for (size = 0; isdigit((unsigned char)*cp);)
-                       size = size * 10 + (*cp++ - '0');
-               if (*cp++ != ' ')
+               if (!isdigit((unsigned char)*cp))
+                       SCREWUP("size not present");
+               ull = strtoull(cp, &cp, 10);
+               if (!cp || *cp++ != ' ')
                        SCREWUP("size not delimited");
+               if ((off_t)ull < 0 || (unsigned long long)(off_t)ull != ull)
+                       SCREWUP("size out of range");
+               size = (off_t)ull;
+
                if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) {
                        run_err("error: unexpected filename: %s", cp);
                        exit(1);