diff --git a/arangod/Utils/Transaction.cpp b/arangod/Utils/Transaction.cpp index f3121e262d..7f8c317d7c 100644 --- a/arangod/Utils/Transaction.cpp +++ b/arangod/Utils/Transaction.cpp @@ -938,7 +938,11 @@ void Transaction::extractKeyAndRevFromDocument(VPackSlice slice, } else if (*p == basics::VelocyPackHelper::RevAttribute) { VPackSlice revSlice(p + 1); if (revSlice.isString()) { - revisionId = basics::StringUtils::uint64(revSlice.copyString()); + // use specialized conversion method for trusted input, that also + // does not create a temporary std::string + VPackValueLength revLength; + char const* rev = revSlice.getString(revLength); + revisionId = basics::StringUtils::uint64_trusted(rev, revLength); } else if (revSlice.isNumber()) { revisionId = revSlice.getNumericValue(); } diff --git a/arangod/VocBase/compactor.cpp b/arangod/VocBase/compactor.cpp index ca451d9507..2f84357ea6 100644 --- a/arangod/VocBase/compactor.cpp +++ b/arangod/VocBase/compactor.cpp @@ -475,10 +475,14 @@ static bool CalculateSize(TRI_df_marker_t const* marker, void* data, // new or updated document if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { - VPackSlice const slice(reinterpret_cast(marker) + DatafileHelper::VPackOffset(type)); + VPackSlice slice(reinterpret_cast(marker) + DatafileHelper::VPackOffset(type)); TRI_ASSERT(slice.isObject()); - VPackSlice const keySlice(Transaction::extractKeyFromDocument(slice)); - TRI_voc_rid_t const rid = std::stoull(slice.get(StaticStrings::RevString).copyString()); + + // use specialized conversion method for trusted input that does not + // create a temporary std::string + VPackSlice keySlice; + TRI_voc_rid_t rid; + Transaction::extractKeyAndRevFromDocument(slice, keySlice, rid); // check if the document is still active auto primaryIndex = document->primaryIndex(); diff --git a/arangod/Wal/CollectorThread.cpp b/arangod/Wal/CollectorThread.cpp index 7ca2089fbe..24a1bfe091 100644 --- a/arangod/Wal/CollectorThread.cpp +++ b/arangod/Wal/CollectorThread.cpp @@ -49,19 +49,6 @@ using namespace arangodb; using namespace arangodb::wal; -/// @brief convert a slice value into its numeric equivalent -template -static inline T NumericValue(VPackSlice const& slice, char const* attribute) { - VPackSlice v = slice.get(attribute); - if (v.isString()) { - return static_cast(std::stoull(v.copyString())); - } - if (v.isNumber()) { - return v.getNumber(); - } - return 0; -} - /// @brief return a reference to an existing datafile statistics struct static inline DatafileStatisticsContainer& getDfi(CollectorCache* cache, TRI_voc_fid_t fid) {