X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=folly%2FDemangle.cpp;h=d1f53cfc89c33e6bf565f0b3f0b0c2c16bdf4aab;hb=bda67fde120837b77ddab74f23abcb22ae5b3029;hp=54b46d277218529936f6d5a5c71e829cb0ab73f0;hpb=9722033f9009b184b4c669cdc53e85e7567c482a;p=folly.git diff --git a/folly/Demangle.cpp b/folly/Demangle.cpp index 54b46d27..d1f53cfc 100644 --- a/folly/Demangle.cpp +++ b/folly/Demangle.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2015 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,13 @@ #include #include -#include +#include -#include +#include +#include #if FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK -# include +#include // From libiberty // @@ -60,6 +61,18 @@ namespace folly { #if FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK fbstring demangle(const char* name) { +#ifdef FOLLY_DEMANGLE_MAX_SYMBOL_SIZE + // GCC's __cxa_demangle() uses on-stack data structures for the + // parser state which are linear in the number of components of the + // symbol. For extremely long symbols, this can cause a stack + // overflow. We set an arbitrary symbol length limit above which we + // just return the mangled name. + size_t mangledLen = strlen(name); + if (mangledLen > FOLLY_DEMANGLE_MAX_SYMBOL_SIZE) { + return fbstring(name, mangledLen); + } +#endif + int status; size_t len = 0; // malloc() memory for the demangled type name @@ -89,19 +102,21 @@ void demangleCallback(const char* str, size_t size, void* p) { buf->total += size; } -} // namespace +} // namespace -size_t strlcpy(char* dest, const char* const src, size_t size) { - size_t len = strlen(src); - if (size != 0) { - size_t n = std::min(len, size - 1); // always null terminate! - memcpy(dest, src, n); - dest[n] = '\0'; +size_t demangle(const char* name, char* out, size_t outSize) { +#ifdef FOLLY_DEMANGLE_MAX_SYMBOL_SIZE + size_t mangledLen = strlen(name); + if (mangledLen > FOLLY_DEMANGLE_MAX_SYMBOL_SIZE) { + if (outSize) { + size_t n = std::min(mangledLen, outSize - 1); + memcpy(out, name, n); + out[n] = '\0'; + } + return mangledLen; } - return len; -} +#endif -size_t demangle(const char* name, char* out, size_t outSize) { DemangleBuf dbuf; dbuf.dest = out; dbuf.remaining = outSize ? outSize - 1 : 0; // leave room for null term @@ -134,4 +149,14 @@ size_t demangle(const char* name, char* out, size_t outSize) { #endif -} // folly +size_t strlcpy(char* dest, const char* const src, size_t size) { + size_t len = strlen(src); + if (size != 0) { + size_t n = std::min(len, size - 1); // always null terminate! + memcpy(dest, src, n); + dest[n] = '\0'; + } + return len; +} + +} // namespace folly