You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.7 KiB
100 lines
3.7 KiB
diff --git a/server/util.c b/server/util.c |
|
index e0ba5c2..a6516d4 100644 |
|
--- a/server/util.c |
|
+++ b/server/util.c |
|
@@ -968,20 +968,20 @@ AP_DECLARE(const char *) ap_pcfg_strerror(apr_pool_t *p, ap_configfile_t *cfp, |
|
/* Read one line from open ap_configfile_t, strip LF, increase line number */ |
|
/* If custom handler does not define a getstr() function, read char by char */ |
|
static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize, |
|
- ap_configfile_t *cfp) |
|
+ apr_size_t offset, ap_configfile_t *cfp) |
|
{ |
|
apr_status_t rc; |
|
/* If a "get string" function is defined, use it */ |
|
if (cfp->getstr != NULL) { |
|
char *cp; |
|
- char *cbuf = buf; |
|
- apr_size_t cbufsize = bufsize; |
|
+ char *cbuf = buf + offset; |
|
+ apr_size_t cbufsize = bufsize - offset; |
|
|
|
while (1) { |
|
++cfp->line_number; |
|
rc = cfp->getstr(cbuf, cbufsize, cfp->param); |
|
if (rc == APR_EOF) { |
|
- if (cbuf != buf) { |
|
+ if (cbuf != buf + offset) { |
|
*cbuf = '\0'; |
|
break; |
|
} |
|
@@ -999,11 +999,11 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize, |
|
*/ |
|
cp = cbuf; |
|
cp += strlen(cp); |
|
- if (cp > cbuf && cp[-1] == LF) { |
|
+ if (cp > buf && cp[-1] == LF) { |
|
cp--; |
|
- if (cp > cbuf && cp[-1] == CR) |
|
+ if (cp > buf && cp[-1] == CR) |
|
cp--; |
|
- if (cp > cbuf && cp[-1] == '\\') { |
|
+ if (cp > buf && cp[-1] == '\\') { |
|
cp--; |
|
/* |
|
* line continuation requested - |
|
@@ -1021,19 +1021,19 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize, |
|
} |
|
} else { |
|
/* No "get string" function defined; read character by character */ |
|
- apr_size_t i = 0; |
|
+ apr_size_t i = offset; |
|
|
|
if (bufsize < 2) { |
|
/* too small, assume caller is crazy */ |
|
return APR_EINVAL; |
|
} |
|
- buf[0] = '\0'; |
|
+ buf[offset] = '\0'; |
|
|
|
while (1) { |
|
char c; |
|
rc = cfp->getch(&c, cfp->param); |
|
if (rc == APR_EOF) { |
|
- if (i > 0) |
|
+ if (i > offset) |
|
break; |
|
else |
|
return APR_EOF; |
|
@@ -1051,11 +1051,11 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize, |
|
break; |
|
} |
|
} |
|
- else if (i >= bufsize - 2) { |
|
- return APR_ENOSPC; |
|
- } |
|
buf[i] = c; |
|
++i; |
|
+ if (i >= bufsize - 1) { |
|
+ return APR_ENOSPC; |
|
+ } |
|
} |
|
buf[i] = '\0'; |
|
} |
|
@@ -1089,7 +1089,7 @@ static int cfg_trim_line(char *buf) |
|
AP_DECLARE(apr_status_t) ap_cfg_getline(char *buf, apr_size_t bufsize, |
|
ap_configfile_t *cfp) |
|
{ |
|
- apr_status_t rc = ap_cfg_getline_core(buf, bufsize, cfp); |
|
+ apr_status_t rc = ap_cfg_getline_core(buf, bufsize, 0, cfp); |
|
if (rc == APR_SUCCESS) |
|
cfg_trim_line(buf); |
|
return rc; |
|
@@ -1116,7 +1116,7 @@ AP_DECLARE(apr_status_t) ap_varbuf_cfg_getline(struct ap_varbuf *vb, |
|
} |
|
|
|
for (;;) { |
|
- rc = ap_cfg_getline_core(vb->buf + vb->strlen, vb->avail - vb->strlen, cfp); |
|
+ rc = ap_cfg_getline_core(vb->buf, vb->avail, vb->strlen, cfp); |
|
if (rc == APR_ENOSPC || rc == APR_SUCCESS) |
|
vb->strlen += strlen(vb->buf + vb->strlen); |
|
if (rc != APR_ENOSPC)
|
|
|