]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: server: Be more strict when reading the version of a server-state file
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 15 Feb 2021 15:24:10 +0000 (16:24 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 25 Feb 2021 09:02:39 +0000 (10:02 +0100)
Now, we read a full line and expects to found an integer only on it. And if
the line is empty or truncated, an error is returned. If the version is not
valid, an error is also returned. This way, the first line is no longer
partially read.

src/server.c

index bcfdbb277d7def60aa1e1afe90fb4abb1d532351..b9fa115b9ddf042497dd03188e5df65a24c5cfe0 100644 (file)
@@ -3049,20 +3049,26 @@ static void srv_update_state(struct server *srv, int version, char **params)
  * Note that this should be the first read on <f>
  */
 static int srv_state_get_version(FILE *f) {
-       char buf[2];
-       int ret;
+       char mybuf[SRV_STATE_LINE_MAXLEN];
+       char *endptr;
+       long int vsn;
 
        /* first character of first line of the file must contain the version of the export */
-       if (fgets(buf, 2, f) == NULL) {
+       if (fgets(mybuf, SRV_STATE_LINE_MAXLEN, f) == NULL)
+               return 0;
+
+       vsn = strtol(mybuf, &endptr, 10);
+       if (endptr == mybuf || *endptr != '\n') {
+               /* Empty or truncated line */
                return 0;
        }
 
-       ret = atoi(buf);
-       if ((ret < SRV_STATE_FILE_VERSION_MIN) ||
-           (ret > SRV_STATE_FILE_VERSION_MAX))
+       if (vsn < SRV_STATE_FILE_VERSION_MIN || vsn > SRV_STATE_FILE_VERSION_MAX) {
+               /* Wrong version number */
                return 0;
+       }
 
-       return ret;
+       return vsn;
 }