]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: support loading big sshd_config files w/o realloc; ok
authormarkus@openbsd.org <markus@openbsd.org>
Wed, 24 Jun 2020 15:09:53 +0000 (15:09 +0000)
committerDamien Miller <djm@mindrot.org>
Fri, 26 Jun 2020 05:18:44 +0000 (15:18 +1000)
djm

OpenBSD-Commit-ID: ba9238e810074ac907f0cf8cee1737ac04983171

servconf.c

index bd8df7fce78e2dcca1be95a561d33f02acaeb277..22cb9583f4fa71645843a8e0747a50e7ae69625d 100644 (file)
@@ -1,5 +1,5 @@
 
-/* $OpenBSD: servconf.c,v 1.365 2020/05/27 22:37:53 djm Exp $ */
+/* $OpenBSD: servconf.c,v 1.366 2020/06/24 15:09:53 markus Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -15,6 +15,7 @@
 
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #ifdef __OpenBSD__
 #include <sys/sysctl.h>
 #endif
@@ -2395,6 +2396,7 @@ process_server_config_line(ServerOptions *options, char *line,
 void
 load_server_config(const char *filename, struct sshbuf *conf)
 {
+       struct stat st;
        char *line = NULL, *cp;
        size_t linesize = 0;
        FILE *f;
@@ -2406,6 +2408,10 @@ load_server_config(const char *filename, struct sshbuf *conf)
                exit(1);
        }
        sshbuf_reset(conf);
+       /* grow buffer, so realloc is avoided for large config files */
+       if (fstat(fileno(f), &st) == 0 && st.st_size > 0 &&
+            (r = sshbuf_allocate(conf, st.st_size)) != 0)
+               fatal("%s: allocate failed: %s", __func__, ssh_err(r));
        while (getline(&line, &linesize, f) != -1) {
                lineno++;
                /*