Commit f5248e50 authored by Tollef Fog Heen's avatar Tollef Fog Heen

Use vsb for varnishncsa to prevent partial lines on error in format strings

parent 7dabcb5d
...@@ -13,6 +13,7 @@ varnishncsa_SOURCES = \ ...@@ -13,6 +13,7 @@ varnishncsa_SOURCES = \
$(top_builddir)/lib/libvarnish/assert.c \ $(top_builddir)/lib/libvarnish/assert.c \
$(top_builddir)/lib/libvarnish/flopen.c \ $(top_builddir)/lib/libvarnish/flopen.c \
$(top_builddir)/lib/libvarnish/version.c \ $(top_builddir)/lib/libvarnish/version.c \
$(top_builddir)/lib/libvarnish/vsb.c \
$(top_builddir)/lib/libvarnish/vpf.c $(top_builddir)/lib/libvarnish/vpf.c
varnishncsa_LDADD = \ varnishncsa_LDADD = \
......
...@@ -485,6 +485,7 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -485,6 +485,7 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
FILE *fo = priv; FILE *fo = priv;
char *q, tbuf[64]; char *q, tbuf[64];
const char *p; const char *p;
struct vsb *os;
if (fd >= nll) { if (fd >= nll) {
struct logline **newll = ll; struct logline **newll = ll;
...@@ -533,12 +534,12 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -533,12 +534,12 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
/* We have a complete data set - log a line */ /* We have a complete data set - log a line */
fo = priv; fo = priv;
os = VSB_new_auto();
for (p = format; *p != '\0'; p++) { for (p = format; *p != '\0'; p++) {
if (*p != '%') { if (*p != '%') {
fprintf(fo, "%c", *p); VSB_putc(os, *p);
continue; continue;
} }
p++; p++;
...@@ -546,29 +547,29 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -546,29 +547,29 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
case 'b': case 'b':
/* %b */ /* %b */
fprintf(fo, "%s", lp->df_b ? lp->df_b : "-"); VSB_cat(os, lp->df_b ? lp->df_b : "-");
break; break;
case 'H': case 'H':
fprintf(fo, "%s", lp->df_H); VSB_cat(os, lp->df_H);
break; break;
case 'h': case 'h':
if (!lp->df_h && spec & VSL_S_BACKEND) if (!lp->df_h && spec & VSL_S_BACKEND)
fprintf(fo, "127.0.0.1"); VSB_cat(os, "127.0.0.1");
else else
fprintf(fo, "%s", lp->df_h ? lp->df_h : "-"); VSB_cat(os, lp->df_h ? lp->df_h : "-");
break; break;
case 'l': case 'l':
fprintf(fo, "-"); VSB_putc(os, '-');
break; break;
case 'm': case 'm':
fprintf(fo, "%s", lp->df_m); VSB_cat(os, lp->df_m);
break; break;
case 'q': case 'q':
fprintf(fo, "%s", lp->df_q ? lp->df_q : ""); VSB_cat(os, lp->df_q ? lp->df_q : "");
break; break;
case 'r': case 'r':
...@@ -576,30 +577,32 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -576,30 +577,32 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
* Fake "%r". This would be a lot easier if Varnish * Fake "%r". This would be a lot easier if Varnish
* normalized the request URL. * normalized the request URL.
*/ */
fprintf(fo, "%s ", lp->df_m); VSB_cat(os, lp->df_m);
VSB_putc(os, ' ');
if (lp->df_Host) { if (lp->df_Host) {
if (strncmp(lp->df_Host, "http://", 7) != 0) if (strncmp(lp->df_Host, "http://", 7) != 0)
fprintf(fo, "http://"); VSB_cat(os, "http://");
fprintf(fo, "%s", lp->df_Host); VSB_cat(os, lp->df_Host);
} }
fprintf(fo, "%s", lp->df_U); VSB_cat(os, lp->df_U);
fprintf(fo, "%s ", lp->df_q ? lp->df_q : ""); VSB_cat(os, lp->df_q ? lp->df_q : "");
fprintf(fo, "%s", lp->df_H); VSB_putc(os, ' ');
VSB_cat(os, lp->df_H);
break; break;
case 's': case 's':
/* %s */ /* %s */
fprintf(fo, "%s", lp->df_s ? lp->df_s : ""); VSB_cat(os, lp->df_s ? lp->df_s : "");
break; break;
case 't': case 't':
/* %t */ /* %t */
strftime(tbuf, sizeof tbuf, "[%d/%b/%Y:%T %z]", &lp->df_t); strftime(tbuf, sizeof tbuf, "[%d/%b/%Y:%T %z]", &lp->df_t);
fprintf(fo, "%s", tbuf); VSB_cat(os, tbuf);
break; break;
case 'U': case 'U':
fprintf(fo, "%s", lp->df_U); VSB_cat(os, lp->df_U);
break; break;
case 'u': case 'u':
...@@ -616,49 +619,45 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -616,49 +619,45 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
q = strchr(rubuf, ':'); q = strchr(rubuf, ':');
if (q != NULL) if (q != NULL)
*q = '\0'; *q = '\0';
fprintf(fo, "%s", rubuf); VSB_cat(os, rubuf);
free(rubuf); free(rubuf);
} else { } else {
fprintf(fo, "-"); VSB_putc(os, '-');
} }
break; break;
case '{': case '{':
if (strncmp(p, "{Referer}i", 10) == 0) { if (strncmp(p, "{Referer}i", 10) == 0) {
fprintf(fo, "%s", VSB_cat(os, lp->df_Referer ? lp->df_Referer : "-");
lp->df_Referer ? lp->df_Referer : "-");
p += 9; p += 9;
break; break;
} else if (strncmp(p, "{Host}i", 7) == 0) { } else if (strncmp(p, "{Host}i", 7) == 0) {
fprintf(fo, "%s", VSB_cat(os, lp->df_Host ? lp->df_Host : "-");
lp->df_Host ? lp->df_Host : "-");
p += 6; p += 6;
break; break;
} else if (strncmp(p, "{X-Forwarded-For}i", 18) == 0) { } else if (strncmp(p, "{X-Forwarded-For}i", 18) == 0) {
/* %{Referer}i */ /* %{Referer}i */
fprintf(fo, "%s", VSB_cat(os, lp->df_X_Forwarded_For ? lp->df_X_Forwarded_For : "-");
lp->df_X_Forwarded_For ? lp->df_X_Forwarded_For : "-");
p += 17; p += 17;
break; break;
} else if (strncmp(p, "{User-agent}i", 13) == 0) { } else if (strncmp(p, "{User-agent}i", 13) == 0) {
/* %{User-agent}i */ /* %{User-agent}i */
fprintf(fo, "%s", VSB_cat(os, lp->df_User_agent ? lp->df_User_agent : "-");
lp->df_User_agent ? lp->df_User_agent : "-");
p += 12; p += 12;
break; break;
} else if (strncmp(p, "{Varnish:", 9) == 0) { } else if (strncmp(p, "{Varnish:", 9) == 0) {
/* Scan for what we're looking for */ /* Scan for what we're looking for */
const char *what = p+9; const char *what = p+9;
if (strncmp(what, "time_firstbyte}x", 16) == 0) { if (strncmp(what, "time_firstbyte}x", 16) == 0) {
fprintf(fo, "%s", lp->df_ttfb); VSB_cat(os, lp->df_ttfb);
p += 9+15; p += 9+15;
break; break;
} else if (strncmp(what, "hitmiss}x", 9) == 0) { } else if (strncmp(what, "hitmiss}x", 9) == 0) {
fprintf(fo, "%s", (lp->df_hitmiss ? lp->df_hitmiss : "-")); VSB_cat(os, (lp->df_hitmiss ? lp->df_hitmiss : "-"));
p += 9+8; p += 9+8;
break; break;
} else if (strncmp(what, "handling}x", 10) == 0) { } else if (strncmp(what, "handling}x", 10) == 0) {
fprintf(fo, "%s", (lp->df_handling ? lp->df_handling : "-")); VSB_cat(os, (lp->df_handling ? lp->df_handling : "-"));
p += 9+9; p += 9+9;
break; break;
} }
...@@ -670,14 +669,16 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd, ...@@ -670,14 +669,16 @@ h_ncsa(void *priv, enum VSL_tag_e tag, unsigned fd,
exit(1); exit(1);
} }
} }
fprintf(fo, "\n"); VSB_putc(os, '\n');
/* flush the stream */ /* flush the stream */
VSB_finish(os);
fprintf(fo, "%s", VSB_data(os));
fflush(fo); fflush(fo);
/* clean up */ /* clean up */
clean_logline(lp); clean_logline(lp);
VSB_delete(os);
return (reopen); return (reopen);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment