From 1d9a98614a894b1d8288f33f7422ea4f77b451c4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 29 May 2024 21:15:49 +0100 Subject: [PATCH] Fix bug in ResponseWriter for variadic MaD `getSummaryInputOrOutputNode` was giving the summary component stack for arguments corresponding to variadic parameters. This will be a problem when the models for variadic functions are converted to models-as-data. --- .../lib/semmle/go/frameworks/stdlib/NetHttp.qll | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll b/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll index ecf277e882a..4da2f6fe0ca 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/NetHttp.qll @@ -123,9 +123,19 @@ module NetHttp { private DataFlow::Node getSummaryInputOrOutputNode( DataFlow::CallNode call, SummaryComponentStack stack ) { - exists(int n | - stack = SummaryComponentStack::argument(n) and - result = call.getArgument(n) + exists(int n | result = call.getSyntacticArgument(n) | + if result = call.getImplicitVarargsArgument(_) + then + exists( + int lastParamIndex, SummaryComponentStack varArgsSliceArgument, + SummaryComponent arrayContentSC, DataFlow::ArrayContent arrayContent + | + lastParamIndex = call.getCall().getCalleeType().getNumParameter() - 1 and + varArgsSliceArgument = SummaryComponentStack::argument(lastParamIndex) and + arrayContentSC = SummaryComponent::content(arrayContent) and + stack = SummaryComponentStack::push(arrayContentSC, varArgsSliceArgument) + ) + else stack = SummaryComponentStack::argument(n) ) or stack = SummaryComponentStack::argument(-1) and