fix memory out of bounds in to_cstring
This commit is contained in:
		
							
								
								
									
										14
									
								
								deps/oblib/src/lib/trace/ob_trace.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								deps/oblib/src/lib/trace/ob_trace.cpp
									
									
									
									
										vendored
									
									
								
							| @ -255,12 +255,12 @@ int UUID::deserialize(const char* buf, const int64_t buf_len, int64_t& pos) | ||||
| int to_string_and_strip(const char* str, const int64_t length, char* buf, const int64_t buf_len, int64_t& pos) | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|   char from[] = "\"\n\r\\"; | ||||
|   const char* to[] = { "\\\"", "\\n", "\\r", "\\\\"}; | ||||
|   char from[] = "\"\n\r\\\t"; | ||||
|   const char* to[] = { "\\\"", "\\n", "\\r", "\\\\", " "}; | ||||
|   buf[pos++] = '\"'; | ||||
|   for (auto j = 0; j < length && str[j]; ++j) { | ||||
|     bool conv = false; | ||||
|     for (auto i = 0; i < 4; ++i) { | ||||
|     for (auto i = 0; i < sizeof(from) - 1; ++i) { | ||||
|       if (from[i] == str[j]) { | ||||
|         for (const char* toc = to[i]; *toc; ++toc) { | ||||
|           if (pos < buf_len) { | ||||
| @ -341,15 +341,15 @@ ObSpanCtx::ObSpanCtx() | ||||
| ObTrace* ObTrace::get_instance() | ||||
| { | ||||
|   if (OB_ISNULL(save_buffer)) { | ||||
|     thread_local char* default_tsi_buffer = (char*)GET_TSI(ByteBuf<8 * DEFAULT_BUFFER_SIZE>); | ||||
|     thread_local char default_tls_buffer[DEFAULT_BUFFER_SIZE]; | ||||
|     thread_local char* default_tsi_buffer = (char*)GET_TSI(ByteBuf<DEFAULT_BUFFER_SIZE>); | ||||
|     thread_local char default_tls_buffer[MIN_BUFFER_SIZE]; | ||||
|     struct Guard { | ||||
|       Guard(char* buffer, int64_t size) { | ||||
|         IGNORE_RETURN new(buffer) ObTrace(size); | ||||
|       } | ||||
|     }; | ||||
|     thread_local Guard guard1(default_tsi_buffer, 8 * DEFAULT_BUFFER_SIZE); | ||||
|     thread_local Guard guard2(default_tls_buffer, 1 * DEFAULT_BUFFER_SIZE); | ||||
|     thread_local Guard guard1(default_tsi_buffer, DEFAULT_BUFFER_SIZE); | ||||
|     thread_local Guard guard2(default_tls_buffer, MIN_BUFFER_SIZE); | ||||
|     if (OB_ISNULL(default_tsi_buffer)) { | ||||
|       save_buffer = (ObTrace*)default_tls_buffer; | ||||
|       LIB_LOG(WARN, "tsi was nullptr"); | ||||
|  | ||||
							
								
								
									
										29
									
								
								deps/oblib/src/lib/trace/ob_trace.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								deps/oblib/src/lib/trace/ob_trace.h
									
									
									
									
										vendored
									
									
								
							| @ -209,7 +209,7 @@ struct ObSpanCtx final : public common::ObDLinkBase<ObSpanCtx> | ||||
| struct ObTrace | ||||
| { | ||||
|   static constexpr uint64_t MAGIC_CODE = 0x1234567887654321ul; | ||||
|   static constexpr int64_t DEFAULT_BUFFER_SIZE = (1L << 13); | ||||
|   static constexpr int64_t DEFAULT_BUFFER_SIZE = (1L << 16); | ||||
|   static constexpr int64_t MIN_BUFFER_SIZE = (1L << 13); | ||||
|   static ObTrace* get_instance(); | ||||
|   static void set_trace_buffer(void* buffer, int64_t buffer_size); | ||||
| @ -273,10 +273,13 @@ struct ObTrace | ||||
|   bool append_tag(ObTagType tag_type, const T& value) | ||||
|   { | ||||
|     int ret = false; | ||||
|     ObString v(""); | ||||
|     if (OB_ISNULL(value.ptr())) { | ||||
|       // do nothing | ||||
|     } else { | ||||
|       auto l = value.length(); | ||||
|       v = value; | ||||
|     } | ||||
|     auto l = v.length(); | ||||
|     if (offset_ + sizeof(ObTagCtx<void*>) + l + 1 - sizeof(void*) >= buffer_size_) { | ||||
|       // do nothing | ||||
|     } else { | ||||
| @ -284,35 +287,17 @@ struct ObTrace | ||||
|       tag->next_ = last_active_span_->tags_; | ||||
|       last_active_span_->tags_ = tag; | ||||
|       tag->tag_type_ = tag_type; | ||||
|         memcpy(&(tag->data_), value.ptr(), l); | ||||
|       memcpy(&(tag->data_), v.ptr(), l); | ||||
|       offset_ += (sizeof(ObTagCtx<void*>) + l + 1 - sizeof(void*)); | ||||
|       data_[offset_ - 1] = '\0'; | ||||
|       ret = true; | ||||
|     } | ||||
|     } | ||||
|     return ret; | ||||
|   } | ||||
|   template<class T, typename std::enable_if<std::is_convertible<T, const char*>::value, bool>::type = true> | ||||
|   bool append_tag(ObTagType tag_type, const T& value) | ||||
|   { | ||||
|     int ret = false; | ||||
|     if (OB_ISNULL(value)) { | ||||
|       // do nothing | ||||
|     } else { | ||||
|       auto l = strlen(value); | ||||
|       if (offset_ + sizeof(ObTagCtx<void*>) + l + 1 - sizeof(void*) >= buffer_size_) { | ||||
|         // do nothing | ||||
|       } else { | ||||
|         ObTagCtx<void*>* tag = new (data_ + offset_) ObTagCtx<void*>; | ||||
|         tag->next_ = last_active_span_->tags_; | ||||
|         last_active_span_->tags_ = tag; | ||||
|         tag->tag_type_ = tag_type; | ||||
|         memcpy(&(tag->data_), value, l + 1); | ||||
|         offset_ += (sizeof(ObTagCtx<void*>) + l + 1 - sizeof(void*)); | ||||
|         ret = true; | ||||
|       } | ||||
|     } | ||||
|     return ret; | ||||
|     return append_tag(tag_type, OB_ISNULL(value) ? ObString("") : ObString(value)); | ||||
|   } | ||||
| private: | ||||
|   bool check_magic() { return MAGIC_CODE == magic_code_; } | ||||
|  | ||||
							
								
								
									
										2
									
								
								deps/oblib/src/lib/utility/ob_print_utils.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/oblib/src/lib/utility/ob_print_utils.h
									
									
									
									
										vendored
									
									
								
							| @ -202,7 +202,7 @@ public: | ||||
| private: | ||||
|   BufList list_; | ||||
|   int64_t level_; | ||||
|   int idx_; | ||||
|   uint64_t idx_; | ||||
| }; | ||||
|  | ||||
| template <typename T> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 obdev
					obdev