]> andersk Git - openssh.git/commitdiff
- djm@cvs.openbsd.org 2006/02/12 10:44:18
authordjm <djm>
Wed, 15 Mar 2006 00:30:38 +0000 (00:30 +0000)
committerdjm <djm>
Wed, 15 Mar 2006 00:30:38 +0000 (00:30 +0000)
     [readconf.c]
     raise error when the user specifies a RekeyLimit that is smaller than 16
     (the smallest of our cipher's blocksize) or big enough to cause integer
     wraparound; ok & feedback dtucker@

ChangeLog
readconf.c

index 816876bfa25b6f4b84a4f0f5b0f407c67726dfab..3a19e6d8e12e45b0518c7012894933179f3a691a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
      add a %l expansion code to the ControlPath, which is filled in with the
      local hostname at runtime. Requested by henning@ to avoid some problems
      with /home on NFS; ok dtucker@
+   - djm@cvs.openbsd.org 2006/02/12 10:44:18
+     [readconf.c]
+     raise error when the user specifies a RekeyLimit that is smaller than 16
+     (the smallest of our cipher's blocksize) or big enough to cause integer
+     wraparound; ok & feedback dtucker@
 
 20060313
  - (dtucker) [configure.ac] Bug #1171: Don't use printf("%lld", longlong)
index 1fbf597936d84e8b795889aeec733c92ba50eb90..bc5cf61883c75ec39ebebcbb1bbda032621d5ed2 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: readconf.c,v 1.145 2005/12/08 18:34:11 reyk Exp $");
+RCSID("$OpenBSD: readconf.c,v 1.146 2006/02/12 10:44:18 djm Exp $");
 
 #include "ssh.h"
 #include "xmalloc.h"
@@ -306,7 +306,8 @@ process_config_line(Options *options, const char *host,
                    int *activep)
 {
        char *s, **charptr, *endofnumber, *keyword, *arg, *arg2, fwdarg[256];
-       int opcode, *intptr, value, value2;
+       int opcode, *intptr, value, value2, scale;
+       long long orig, val64;
        size_t len;
        Forward fwd;
 
@@ -479,22 +480,36 @@ parse_yesnoask:
                        fatal("%.200s line %d: Missing argument.", filename, linenum);
                if (arg[0] < '0' || arg[0] > '9')
                        fatal("%.200s line %d: Bad number.", filename, linenum);
-               value = strtol(arg, &endofnumber, 10);
+               orig = val64 = strtoll(arg, &endofnumber, 10);
                if (arg == endofnumber)
                        fatal("%.200s line %d: Bad number.", filename, linenum);
                switch (toupper(*endofnumber)) {
+               case '\0':
+                       scale = 1;
+                       break;
                case 'K':
-                       value *= 1<<10;
+                       scale = 1<<10;
                        break;
                case 'M':
-                       value *= 1<<20;
+                       scale = 1<<20;
                        break;
                case 'G':
-                       value *= 1<<30;
+                       scale = 1<<30;
                        break;
+               default:
+                       fatal("%.200s line %d: Invalid RekeyLimit suffix",
+                           filename, linenum);
                }
+               val64 *= scale;
+               /* detect integer wrap and too-large limits */
+               if ((val64 / scale) != orig || val64 > INT_MAX)
+                       fatal("%.200s line %d: RekeyLimit too large",
+                           filename, linenum);
+               if (val64 < 16)
+                       fatal("%.200s line %d: RekeyLimit too small",
+                           filename, linenum);
                if (*activep && *intptr == -1)
-                       *intptr = value;
+                       *intptr = (int)val64;
                break;
 
        case oIdentityFile:
This page took 0.24348 seconds and 5 git commands to generate.