diff --git a/src/backend/columnar/cstore_fdw.c b/src/backend/columnar/cstore_fdw.c index e7b1a76b8..97e6f5a3c 100644 --- a/src/backend/columnar/cstore_fdw.c +++ b/src/backend/columnar/cstore_fdw.c @@ -78,6 +78,7 @@ #include "columnar/cstore.h" #include "columnar/cstore_fdw.h" #include "columnar/cstore_version_compat.h" +#include "distributed/citus_safe_lib.h" /* table containing information about how to partition distributed tables */ #define CITUS_EXTENSION_NAME "citus" @@ -474,8 +475,8 @@ CStoreProcessCopyCommand(CopyStmt *copyStatement, const char *queryString, if (completionTag != NULL) { - snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "COPY " UINT64_FORMAT, - processedCount); + SafeSnprintf(completionTag, COMPLETION_TAG_BUFSIZE, "COPY " UINT64_FORMAT, + processedCount); } } diff --git a/src/backend/columnar/cstore_metadata_tables.c b/src/backend/columnar/cstore_metadata_tables.c index f23aaba2d..301dd0c91 100644 --- a/src/backend/columnar/cstore_metadata_tables.c +++ b/src/backend/columnar/cstore_metadata_tables.c @@ -10,6 +10,8 @@ #include "postgres.h" +#include "safe_lib.h" + #include "columnar/cstore.h" #include "columnar/cstore_version_compat.h" @@ -885,12 +887,14 @@ DatumToBytea(Datum value, Form_pg_attribute attrForm) } else { - memcpy(VARDATA(result), DatumGetPointer(value), attrForm->attlen); + memcpy_s(VARDATA(result), datumLength + VARHDRSZ, + DatumGetPointer(value), attrForm->attlen); } } else { - memcpy(VARDATA(result), DatumGetPointer(value), datumLength); + memcpy_s(VARDATA(result), datumLength + VARHDRSZ, + DatumGetPointer(value), datumLength); } return result; @@ -909,7 +913,8 @@ ByteaToDatum(bytea *bytes, Form_pg_attribute attrForm) * after the byteaDatum is freed. */ char *binaryDataCopy = palloc0(VARSIZE_ANY_EXHDR(bytes)); - memcpy(binaryDataCopy, VARDATA_ANY(bytes), VARSIZE_ANY_EXHDR(bytes)); + memcpy_s(binaryDataCopy, VARSIZE_ANY_EXHDR(bytes), + VARDATA_ANY(bytes), VARSIZE_ANY_EXHDR(bytes)); return fetch_att(binaryDataCopy, attrForm->attbyval, attrForm->attlen); } diff --git a/src/backend/columnar/cstore_reader.c b/src/backend/columnar/cstore_reader.c index 8818baf78..4faf2562c 100644 --- a/src/backend/columnar/cstore_reader.c +++ b/src/backend/columnar/cstore_reader.c @@ -16,6 +16,8 @@ #include "postgres.h" +#include "safe_lib.h" + #include "access/nbtree.h" #include "catalog/pg_am.h" #include "commands/defrem.h" @@ -1025,7 +1027,7 @@ ReadFromSmgr(Relation rel, uint64 offset, uint32 size) PageHeader phdr = (PageHeader) page; uint32 to_read = Min(size - read, phdr->pd_upper - addr.offset); - memcpy(resultBuffer->data + read, page + addr.offset, to_read); + memcpy_s(resultBuffer->data + read, size - read, page + addr.offset, to_read); ReleaseBuffer(buffer); read += to_read; } diff --git a/src/backend/columnar/cstore_writer.c b/src/backend/columnar/cstore_writer.c index dcaf5d122..735024fbf 100644 --- a/src/backend/columnar/cstore_writer.c +++ b/src/backend/columnar/cstore_writer.c @@ -16,6 +16,8 @@ #include "postgres.h" +#include "safe_lib.h" + #include "access/nbtree.h" #include "catalog/pg_am.h" #include "miscadmin.h" @@ -354,7 +356,7 @@ WriteToSmgr(Relation rel, uint64 logicalOffset, char *data, uint32 dataLength) START_CRIT_SECTION(); uint64 to_write = Min(phdr->pd_upper - phdr->pd_lower, remaining); - memcpy(page + phdr->pd_lower, data, to_write); + memcpy_s(page + phdr->pd_lower, phdr->pd_upper - phdr->pd_lower, data, to_write); phdr->pd_lower += to_write; MarkBufferDirty(buffer); @@ -561,13 +563,15 @@ SerializeSingleDatum(StringInfo datumBuffer, Datum datum, bool datumTypeByValue, } else { - memcpy(currentDatumDataPointer, DatumGetPointer(datum), datumTypeLength); + memcpy_s(currentDatumDataPointer, datumBuffer->maxlen - datumBuffer->len, + DatumGetPointer(datum), datumTypeLength); } } else { Assert(!datumTypeByValue); - memcpy(currentDatumDataPointer, DatumGetPointer(datum), datumLength); + memcpy_s(currentDatumDataPointer, datumBuffer->maxlen - datumBuffer->len, + DatumGetPointer(datum), datumLength); } datumBuffer->len += datumLengthAligned; @@ -714,7 +718,7 @@ DatumCopy(Datum datum, bool datumTypeByValue, int datumTypeLength) { uint32 datumLength = att_addlength_datum(0, datumTypeLength, datum); char *datumData = palloc0(datumLength); - memcpy(datumData, DatumGetPointer(datum), datumLength); + memcpy_s(datumData, datumLength, DatumGetPointer(datum), datumLength); datumCopy = PointerGetDatum(datumData); } @@ -737,7 +741,8 @@ CopyStringInfo(StringInfo sourceString) targetString->data = palloc0(sourceString->len); targetString->len = sourceString->len; targetString->maxlen = sourceString->len; - memcpy(targetString->data, sourceString->data, sourceString->len); + memcpy_s(targetString->data, sourceString->len, + sourceString->data, sourceString->len); } return targetString;