]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: log: Don't call sample_fetch_as_type if we don't have a stream.
authorOlivier Houchard <cognet@ci0.org>
Sat, 15 Dec 2018 13:00:06 +0000 (14:00 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 15 Dec 2018 13:34:31 +0000 (14:34 +0100)
In sess_build_logline(), don't attempt to call sample_fetch_as_type()
if we don't have a stream.

It used never to happen in the past before commit 09bb27c ("MEDIUM: log:
make sess_build_logline() support being called with no stream"). But now
it can happen when sess_log() is called from the lower layers (i.e. the
H2 mux got garbage when it was expecting a preface frame), and it reveals
that some sample fetch functions and some converter fnuctions which rely
on the stream don't test for its existence. For the sample fetch functions,
a durable solution is easy and would consist in adapting sample_process()
to verify the SMP_USE_* bits when the stream is not set. But for the
converters we don't have this option as they don't declare whether or not
they use a stream (which possibly is the real issue).

Thus for now let's disable sample_fetch_as_type() if a stream does not
exist, until it can be more accurately refined later.

src/log.c

index 6c6efedae1250254d3e18ca3bff3741a3393bf46..37c2dbd072c42ed95720c58d071031a0ac8e6329 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -1801,9 +1801,9 @@ int sess_build_logline(struct session *sess, struct stream *s, char *dst, size_t
 
                        case LOG_FMT_EXPR: // sample expression, may be request or response
                                key = NULL;
-                               if (tmp->options & LOG_OPT_REQ_CAP)
+                               if (tmp->options & LOG_OPT_REQ_CAP && s)
                                        key = sample_fetch_as_type(be, sess, s, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, tmp->expr, SMP_T_STR);
-                               if (!key && (tmp->options & LOG_OPT_RES_CAP))
+                               if (!key && (tmp->options & LOG_OPT_RES_CAP) && s)
                                        key = sample_fetch_as_type(be, sess, s, SMP_OPT_DIR_RES|SMP_OPT_FINAL, tmp->expr, SMP_T_STR);
                                if (tmp->options & LOG_OPT_HTTP)
                                        ret = lf_encode_chunk(tmplog, dst + maxsize,