Avoid calls to c_str() in cpdf_filespec.cpp. Even better, remove the unsafe pointer arithmetic being performed on these results. Change-Id: I692dd13c43af59c636f0b2b12dd0ac356ea18fd7 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/117492 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Thomas Sepez <tsepez@google.com> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cpdf_filespec.cpp b/core/fpdfdoc/cpdf_filespec.cpp index 7374674..6ebfdd6 100644 --- a/core/fpdfdoc/cpdf_filespec.cpp +++ b/core/fpdfdoc/cpdf_filespec.cpp
@@ -24,32 +24,30 @@ namespace { #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_WIN) -WideString ChangeSlashToPlatform(const wchar_t* str) { +WideString ChangeSlashToPlatform(WideStringView str) { WideString result; - while (*str) { - if (*str == '/') { + for (auto wch : str) { + if (wch == '/') { #if BUILDFLAG(IS_APPLE) result += L':'; #else result += L'\\'; #endif } else { - result += *str; + result += wch; } - str++; } return result; } -WideString ChangeSlashToPDF(const wchar_t* str) { +WideString ChangeSlashToPDF(WideStringView str) { WideString result; - while (*str) { - if (*str == '\\' || *str == ':') + for (auto wch : str) { + if (wch == '\\' || wch == ':') { result += L'/'; - else - result += *str; - - str++; + } else { + result += wch; + } } return result; } @@ -65,32 +63,36 @@ CPDF_FileSpec::~CPDF_FileSpec() = default; WideString CPDF_FileSpec::DecodeFileName(const WideString& filepath) { - if (filepath.GetLength() <= 1) + if (filepath.IsEmpty()) { return WideString(); - + } #if BUILDFLAG(IS_APPLE) - if (filepath.First(sizeof("/Mac") - 1) == WideStringView(L"/Mac")) - return ChangeSlashToPlatform(filepath.c_str() + 1); - return ChangeSlashToPlatform(filepath.c_str()); + WideStringView view = filepath.AsStringView(); + if (view.First(sizeof("/Mac") - 1) == WideStringView(L"/Mac")) { + return ChangeSlashToPlatform(view.Substr(1)); + } + return ChangeSlashToPlatform(view); #elif BUILDFLAG(IS_WIN) - - if (filepath[0] != L'/') - return ChangeSlashToPlatform(filepath.c_str()); - if (filepath[1] == L'/') - return ChangeSlashToPlatform(filepath.c_str() + 1); - if (filepath[2] == L'/') { + WideStringView view = filepath.AsStringView(); + if (view[0] != L'/') { + return ChangeSlashToPlatform(view); + } + if (view[1] == L'/') { + return ChangeSlashToPlatform(view.Substr(1)); + } + if (view[2] == L'/') { WideString result; - result += filepath[1]; + result += view[1]; result += L':'; - result += ChangeSlashToPlatform(filepath.c_str() + 2); + result += ChangeSlashToPlatform(view.Substr(2)); return result; } WideString result; result += L'\\'; - result += ChangeSlashToPlatform(filepath.c_str()); + result += ChangeSlashToPlatform(view); return result; #else - return WideString(filepath); + return filepath; #endif } @@ -163,30 +165,34 @@ } WideString CPDF_FileSpec::EncodeFileName(const WideString& filepath) { - if (filepath.GetLength() <= 1) + if (filepath.IsEmpty()) { return WideString(); - + } #if BUILDFLAG(IS_WIN) - if (filepath[1] == L':') { + WideStringView view = filepath.AsStringView(); + if (view[1] == L':') { WideString result(L'/'); - result += filepath[0]; - if (filepath[2] != L'\\') + result += view[0]; + if (view[2] != L'\\') { result += L'/'; - - result += ChangeSlashToPDF(filepath.c_str() + 2); + } + result += ChangeSlashToPDF(view.Substr(2)); return result; } - if (filepath[0] == L'\\' && filepath[1] == L'\\') - return ChangeSlashToPDF(filepath.c_str() + 1); - - if (filepath[0] == L'\\') - return L'/' + ChangeSlashToPDF(filepath.c_str()); - return ChangeSlashToPDF(filepath.c_str()); + if (view[0] == L'\\' && view[1] == L'\\') { + return ChangeSlashToPDF(view.Substr(1)); + } + if (view[0] == L'\\') { + return L'/' + ChangeSlashToPDF(view); + } + return ChangeSlashToPDF(view); #elif BUILDFLAG(IS_APPLE) - if (filepath.First(sizeof("Mac") - 1).EqualsASCII("Mac")) - return L'/' + ChangeSlashToPDF(filepath.c_str()); - return ChangeSlashToPDF(filepath.c_str()); + WideStringView view = filepath.AsStringView(); + if (view.First(sizeof("Mac") - 1).EqualsASCII("Mac")) { + return L'/' + ChangeSlashToPDF(view); + } + return ChangeSlashToPDF(view); #else - return WideString(filepath); + return filepath; #endif }