From 13d297f3d6b899a09eaa93d76f185a5a729ccf45 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 13 Jan 2020 14:56:23 +0100 Subject: [PATCH] MINOR: config: Use dedicated function to parse proxy's errorfiles The parsing of the "errorfile" directive is now handled by the function http_parse_errorfile(). --- src/cfgparse-listen.c | 64 ++++++------------------------------------- 1 file changed, 9 insertions(+), 55 deletions(-) diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c index 0151130cd..418de0f2a 100644 --- a/src/cfgparse-listen.c +++ b/src/cfgparse-listen.c @@ -3857,74 +3857,28 @@ stats_error_parsing: } } else if (!strcmp(args[0], "errorfile")) { /* error message from a file */ - int errnum, errlen, fd; - char *err; - struct stat stat; + struct buffer chk; + int status, rc; if (warnifnotcap(curproxy, PR_CAP_FE | PR_CAP_BE, file, linenum, args[0], NULL)) err_code |= ERR_WARN; - if (*(args[2]) == 0) { + if (*(args[1]) == 0 || *(args[2]) == 0) { ha_alert("parsing [%s:%d] : <%s> expects and as arguments.\n", file, linenum, args[0]); err_code |= ERR_ALERT | ERR_FATAL; goto out; } - fd = open(args[2], O_RDONLY); - if ((fd < 0) || (fstat(fd, &stat) < 0)) { - ha_alert("parsing [%s:%d] : error opening file <%s> for custom error message <%s>.\n", - file, linenum, args[2], args[1]); - if (fd >= 0) - close(fd); + status = atol(args[1]); + rc = http_parse_errorfile(status, args[2], &chk, &errmsg); + if (rc == -1) { + ha_alert("parsing [%s:%d] : %s: %s\n", file, linenum, args[0], errmsg); err_code |= ERR_ALERT | ERR_FATAL; goto out; } - if (stat.st_size <= global.tune.bufsize) { - errlen = stat.st_size; - } else { - ha_warning("parsing [%s:%d] : custom error message file <%s> larger than %d bytes. Truncating.\n", - file, linenum, args[2], global.tune.bufsize); - err_code |= ERR_WARN; - errlen = global.tune.bufsize; - } - - err = malloc(errlen); /* malloc() must succeed during parsing */ - errnum = read(fd, err, errlen); - if (errnum != errlen) { - ha_alert("parsing [%s:%d] : error reading file <%s> for custom error message <%s>.\n", - file, linenum, args[2], args[1]); - close(fd); - free(err); - err_code |= ERR_ALERT | ERR_FATAL; - goto out; - } - close(fd); - - errnum = atol(args[1]); - for (rc = 0; rc < HTTP_ERR_SIZE; rc++) { - if (http_err_codes[rc] == errnum) { - struct buffer chk; - - if (!http_str_to_htx(&chk, ist2(err, errlen))) { - ha_alert("parsing [%s:%d] : unable to convert message in HTX for HTTP return code %d.\n", - file, linenum, http_err_codes[rc]); - err_code |= ERR_ALERT | ERR_FATAL; - free(err); - goto out; - } - chunk_destroy(&curproxy->errmsg[rc]); - curproxy->errmsg[rc] = chk; - break; - } - } - - if (rc >= HTTP_ERR_SIZE) { - ha_warning("parsing [%s:%d] : status code %d not handled by '%s', error customization will be ignored.\n", - file, linenum, errnum, args[0]); - err_code |= ERR_WARN; - free(err); - } + chunk_destroy(&curproxy->errmsg[rc]); + curproxy->errmsg[rc] = chk; } else { struct cfg_kw_list *kwl;