Download | Plain Text | No Line Numbers


  1. diff --git a/server/util.c b/server/util.c
  2. index c960248..c8932a2 100644
  3. --- a/server/util.c
  4. +++ b/server/util.c
  5. @@ -971,20 +971,20 @@ AP_DECLARE(const char *) ap_pcfg_strerror(apr_pool_t *p, ap_configfile_t *cfp,
  6. /* Read one line from open ap_configfile_t, strip LF, increase line number */
  7. /* If custom handler does not define a getstr() function, read char by char */
  8. static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize,
  9. - ap_configfile_t *cfp)
  10. + apr_size_t offset, ap_configfile_t *cfp)
  11. {
  12. apr_status_t rc;
  13. /* If a "get string" function is defined, use it */
  14. if (cfp->getstr != NULL) {
  15. char *cp;
  16. - char *cbuf = buf;
  17. - apr_size_t cbufsize = bufsize;
  18. + char *cbuf = buf + offset;
  19. + apr_size_t cbufsize = bufsize - offset;
  20.  
  21. while (1) {
  22. ++cfp->line_number;
  23. rc = cfp->getstr(cbuf, cbufsize, cfp->param);
  24. if (rc == APR_EOF) {
  25. - if (cbuf != buf) {
  26. + if (cbuf != buf + offset) {
  27. *cbuf = '\0';
  28. break;
  29. }
  30. @@ -1002,11 +1002,11 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize,
  31. */
  32. cp = cbuf;
  33. cp += strlen(cp);
  34. - if (cp > cbuf && cp[-1] == LF) {
  35. + if (cp > buf && cp[-1] == LF) {
  36. cp--;
  37. - if (cp > cbuf && cp[-1] == CR)
  38. + if (cp > buf && cp[-1] == CR)
  39. cp--;
  40. - if (cp > cbuf && cp[-1] == '\\') {
  41. + if (cp > buf && cp[-1] == '\\') {
  42. cp--;
  43. /*
  44. * line continuation requested -
  45. @@ -1024,19 +1024,19 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize,
  46. }
  47. } else {
  48. /* No "get string" function defined; read character by character */
  49. - apr_size_t i = 0;
  50. + apr_size_t i = offset;
  51.  
  52. if (bufsize < 2) {
  53. /* too small, assume caller is crazy */
  54. return APR_EINVAL;
  55. }
  56. - buf[0] = '\0';
  57. + buf[offset] = '\0';
  58.  
  59. while (1) {
  60. char c;
  61. rc = cfp->getch(&c, cfp->param);
  62. if (rc == APR_EOF) {
  63. - if (i > 0)
  64. + if (i > offset)
  65. break;
  66. else
  67. return APR_EOF;
  68. @@ -1054,11 +1054,11 @@ static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize,
  69. break;
  70. }
  71. }
  72. - else if (i >= bufsize - 2) {
  73. - return APR_ENOSPC;
  74. - }
  75. buf[i] = c;
  76. ++i;
  77. + if (i >= bufsize - 1) {
  78. + return APR_ENOSPC;
  79. + }
  80. }
  81. buf[i] = '\0';
  82. }
  83. @@ -1092,7 +1092,7 @@ static int cfg_trim_line(char *buf)
  84. AP_DECLARE(apr_status_t) ap_cfg_getline(char *buf, apr_size_t bufsize,
  85. ap_configfile_t *cfp)
  86. {
  87. - apr_status_t rc = ap_cfg_getline_core(buf, bufsize, cfp);
  88. + apr_status_t rc = ap_cfg_getline_core(buf, bufsize, 0, cfp);
  89. if (rc == APR_SUCCESS)
  90. cfg_trim_line(buf);
  91. return rc;
  92. @@ -1119,7 +1119,7 @@ AP_DECLARE(apr_status_t) ap_varbuf_cfg_getline(struct ap_varbuf *vb,
  93. }
  94.  
  95. for (;;) {
  96. - rc = ap_cfg_getline_core(vb->buf + vb->strlen, vb->avail - vb->strlen, cfp);
  97. + rc = ap_cfg_getline_core(vb->buf, vb->avail, vb->strlen, cfp);
  98. if (rc == APR_ENOSPC || rc == APR_SUCCESS)
  99. vb->strlen += strlen(vb->buf + vb->strlen);
  100. if (rc != APR_ENOSPC)
  101.