• Tom Lane's avatar
    Fix incautious handling of possibly-miscoded strings in client code. · 42f94f56
    Tom Lane authored
    An incorrectly-encoded multibyte character near the end of a string
    could cause various processing loops to run past the string's
    terminating NUL, with results ranging from no detectable issue to
    a program crash, depending on what happens to be in the following
    memory.
    
    This isn't an issue in the server, because we take care to verify
    the encoding of strings before doing any interesting processing
    on them.  However, that lack of care leaked into client-side code
    which shouldn't assume that anyone has validated the encoding of
    its input.
    
    Although this is certainly a bug worth fixing, the PG security team
    elected not to regard it as a security issue, primarily because
    any untrusted text should be sanitized by PQescapeLiteral or
    the like before being incorporated into a SQL or psql command.
    (If an app fails to do so, the same technique can be used to
    cause SQL injection, with probably much more dire consequences
    than a mere client-program crash.)  Those functions were already
    made proof against this class of problem, cf CVE-2006-2313.
    
    To fix, invent PQmblenBounded() which is like PQmblen() except it
    won't return more than the number of bytes remaining in the string.
    In HEAD we can make this a new libpq function, as PQmblen() is.
    It seems imprudent to change libpq's API in stable branches though,
    so in the back branches define PQmblenBounded as a macro in the files
    that need it.  (Note that just changing PQmblen's behavior would not
    be a good idea; notably, it would completely break the escaping
    functions' defense against this exact problem.  So we just want a
    version for those callers that don't have any better way of handling
    this issue.)
    
    Per private report from houjingyi.  Back-patch to all supported branches.
    42f94f56
libpq-fe.h 23.7 KB