diff options
author | Greg Clayton <gclayton@apple.com> | 2012-08-30 18:15:10 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-08-30 18:15:10 +0000 |
commit | 0b0b512fd6eaa15626d0b1caad24ae66a79e8408 (patch) | |
tree | ec79472f787c96799b79d9d0556c20bf7e477278 | |
parent | 738ea2590ffde414777efe26bffd27d97f5cc351 (diff) | |
download | bcm5719-llvm-0b0b512fd6eaa15626d0b1caad24ae66a79e8408.tar.gz bcm5719-llvm-0b0b512fd6eaa15626d0b1caad24ae66a79e8408.zip |
OptionValueFileSpec had an accessor to read the contents of the file and return the data. This can end up being used to get the string contents of a text file and could end up not being NULL terminated. I added accessors to get the file contents raw, or with a null terminator. Added the needed calls to make this happen in the FileSpec and File classes.
llvm-svn: 162921
-rw-r--r-- | lldb/include/lldb/Host/File.h | 9 | ||||
-rw-r--r-- | lldb/include/lldb/Host/FileSpec.h | 15 | ||||
-rw-r--r-- | lldb/include/lldb/Interpreter/OptionValueFileSpec.h | 2 | ||||
-rw-r--r-- | lldb/source/Host/common/File.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Host/common/FileSpec.cpp | 32 | ||||
-rw-r--r-- | lldb/source/Interpreter/OptionValueFileSpec.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Target/Target.cpp | 3 |
7 files changed, 66 insertions, 8 deletions
diff --git a/lldb/include/lldb/Host/File.h b/lldb/include/lldb/Host/File.h index 69e8cc6f131..662a0eae89b 100644 --- a/lldb/include/lldb/Host/File.h +++ b/lldb/include/lldb/Host/File.h @@ -378,6 +378,10 @@ public: /// bytes. This offset gets incremented by the number of bytes /// that were read. /// + /// @param[in] null_terminate + /// Ensure that the data that is read is terminated with a NULL + /// character so that the data can be used as a C string. + /// /// @param[out] data_buffer_sp /// A data buffer to create and fill in that will contain any /// data that is read from the file. This buffer will be reset @@ -388,7 +392,10 @@ public: /// failure. //------------------------------------------------------------------ Error - Read (size_t &num_bytes, off_t &offset, lldb::DataBufferSP &data_buffer_sp); + Read (size_t &num_bytes, + off_t &offset, + bool null_terminate, + lldb::DataBufferSP &data_buffer_sp); //------------------------------------------------------------------ /// Write bytes to a file at the specified file offset. diff --git a/lldb/include/lldb/Host/FileSpec.h b/lldb/include/lldb/Host/FileSpec.h index 0419651b004..77bbab54a58 100644 --- a/lldb/include/lldb/Host/FileSpec.h +++ b/lldb/include/lldb/Host/FileSpec.h @@ -479,6 +479,21 @@ public: size_t ReadFileContents (off_t file_offset, void *dst, size_t dst_len, Error *error_ptr) const; + + //------------------------------------------------------------------ + /// Read the entire contents of a file as data that can be used + /// as a C string. + /// + /// Read the entire contents of a file and ensure that the data + /// is NULL terminated so it can be used as a C string. + /// + /// @return + /// A shared pointer to the data. This shared pointer can + /// contain a NULL DataBuffer pointer, so the contained pointer + /// must be checked prior to using it. + //------------------------------------------------------------------ + lldb::DataBufferSP + ReadFileContentsAsCString(Error *error_ptr = NULL); //------------------------------------------------------------------ /// Change the file specificed with a new path. /// diff --git a/lldb/include/lldb/Interpreter/OptionValueFileSpec.h b/lldb/include/lldb/Interpreter/OptionValueFileSpec.h index 95051c265c5..67adaf9cc33 100644 --- a/lldb/include/lldb/Interpreter/OptionValueFileSpec.h +++ b/lldb/include/lldb/Interpreter/OptionValueFileSpec.h @@ -127,7 +127,7 @@ public: } const lldb::DataBufferSP & - GetFileContents(); + GetFileContents(bool null_terminate); protected: FileSpec m_current_value; diff --git a/lldb/source/Host/common/File.cpp b/lldb/source/Host/common/File.cpp index a84266f7110..ca0c223e629 100644 --- a/lldb/source/Host/common/File.cpp +++ b/lldb/source/Host/common/File.cpp @@ -538,7 +538,7 @@ File::Read (void *buf, size_t &num_bytes, off_t &offset) } Error -File::Read (size_t &num_bytes, off_t &offset, DataBufferSP &data_buffer_sp) +File::Read (size_t &num_bytes, off_t &offset, bool null_terminate, DataBufferSP &data_buffer_sp) { Error error; @@ -557,7 +557,7 @@ File::Read (size_t &num_bytes, off_t &offset, DataBufferSP &data_buffer_sp) num_bytes = bytes_left; std::auto_ptr<DataBufferHeap> data_heap_ap; - data_heap_ap.reset(new DataBufferHeap(num_bytes, '\0')); + data_heap_ap.reset(new DataBufferHeap(num_bytes + (null_terminate ? 1 : 0), '\0')); if (data_heap_ap.get()) { diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index 0faa274a47f..d104bd21c47 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/source/Host/common/FileSpec.cpp @@ -812,7 +812,37 @@ FileSpec::ReadFileContents (off_t file_offset, size_t file_size, Error *error_pt File file; error = file.Open(resolved_path, File::eOpenOptionRead); if (error.Success()) - error = file.Read (file_size, file_offset, data_sp); + { + const bool null_terminate = false; + error = file.Read (file_size, file_offset, null_terminate, data_sp); + } + } + else + { + error.SetErrorString("invalid file specification"); + } + if (error_ptr) + *error_ptr = error; + return data_sp; +} + +DataBufferSP +FileSpec::ReadFileContentsAsCString(Error *error_ptr) +{ + Error error; + DataBufferSP data_sp; + char resolved_path[PATH_MAX]; + if (GetPath(resolved_path, sizeof(resolved_path))) + { + File file; + error = file.Open(resolved_path, File::eOpenOptionRead); + if (error.Success()) + { + off_t offset = 0; + size_t length = SIZE_MAX; + const bool null_terminate = true; + error = file.Read (length, offset, null_terminate, data_sp); + } } else { diff --git a/lldb/source/Interpreter/OptionValueFileSpec.cpp b/lldb/source/Interpreter/OptionValueFileSpec.cpp index 3a1f26dd5f6..03608753658 100644 --- a/lldb/source/Interpreter/OptionValueFileSpec.cpp +++ b/lldb/source/Interpreter/OptionValueFileSpec.cpp @@ -114,10 +114,15 @@ OptionValueFileSpec::AutoComplete (CommandInterpreter &interpreter, const lldb::DataBufferSP & -OptionValueFileSpec::GetFileContents() +OptionValueFileSpec::GetFileContents(bool null_terminate) { if (!m_data_sp && m_current_value) - m_data_sp = m_current_value.ReadFileContents(); + { + if (null_terminate) + m_data_sp = m_current_value.ReadFileContentsAsCString(); + else + m_data_sp = m_current_value.ReadFileContents(); + } return m_data_sp; } diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 2298a1fa3a0..23c8678c47e 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2474,7 +2474,8 @@ TargetProperties::GetExpressionPrefixContentsAsCString () OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx); if (file) { - DataBufferSP data_sp(file->GetFileContents()); + const bool null_terminate = true; + DataBufferSP data_sp(file->GetFileContents(null_terminate)); if (data_sp) return (const char *) data_sp->GetBytes(); } |