You are right, but the ancient
cdecl function call convention used by C for variable argument lists is really obsolete and it should never be used in any new programming language implementation, even if it has survived until today in various ABI specifications.
Like for the C null-terminated strings, there are many alternative ways to implement variable argument lists and all of them have already been used many years before the first C compilers, e.g. passing a hidden parameter count or implementing transparently for the programmer any printf-like functions as vprintf-like functions.
With the alternative implementations, the stack should always be freed in the invoked function, which also enables various other important features, e.g. tail-call optimization.