diff options
Diffstat (limited to 'src/backend/libpq')
-rw-r--r-- | src/backend/libpq/pqformat.c | 30 | ||||
-rw-r--r-- | src/backend/libpq/pqmq.c | 2 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/backend/libpq/pqformat.c b/src/backend/libpq/pqformat.c index 4ddea8285fc..b5d9d64e547 100644 --- a/src/backend/libpq/pqformat.c +++ b/src/backend/libpq/pqformat.c @@ -65,6 +65,7 @@ * pq_copymsgbytes - copy raw data from a message buffer * pq_getmsgtext - get a counted text string (with conversion) * pq_getmsgstring - get a null-terminated text string (with conversion) + * pq_getmsgrawstring - get a null-terminated text string - NO conversion * pq_getmsgend - verify message fully consumed */ @@ -640,6 +641,35 @@ pq_getmsgstring(StringInfo msg) } /* -------------------------------- + * pq_getmsgrawstring - get a null-terminated text string - NO conversion + * + * Returns a pointer directly into the message buffer. + * -------------------------------- + */ +const char * +pq_getmsgrawstring(StringInfo msg) +{ + char *str; + int slen; + + str = &msg->data[msg->cursor]; + + /* + * It's safe to use strlen() here because a StringInfo is guaranteed to + * have a trailing null byte. But check we found a null inside the + * message. + */ + slen = strlen(str); + if (msg->cursor + slen >= msg->len) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid string in message"))); + msg->cursor += slen + 1; + + return str; +} + +/* -------------------------------- * pq_getmsgend - verify message fully consumed * -------------------------------- */ diff --git a/src/backend/libpq/pqmq.c b/src/backend/libpq/pqmq.c index 3225c1fa0e7..0dcdee03db5 100644 --- a/src/backend/libpq/pqmq.c +++ b/src/backend/libpq/pqmq.c @@ -232,7 +232,7 @@ pq_parse_errornotice(StringInfo msg, ErrorData *edata) pq_getmsgend(msg); break; } - value = pq_getmsgstring(msg); + value = pq_getmsgrawstring(msg); switch (code) { |