From 75df45d709445c8a74ea8b7be5c60ef3fe852a90 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Wed, 12 Jun 2019 16:25:28 +0300 Subject: [PATCH] Kernel: Fix comparing StringViews with strcmp(). StringView character buffer is not guaranteed to be null-terminated; in particular it will not be null-terminated when making a substring. This means that the buffer can not be used with C functions that expect a null-terminated string. Instead, StringView provides a convinient operator == for comparing it with Strings and C stirngs, so use that. This fixes /proc/self/... resolution failures in ProcFS, since the name ("self") passed to ProcFSInode::lookup() would not be null-terminated. --- Kernel/FileSystem/Ext2FileSystem.cpp | 4 ++-- Kernel/FileSystem/ProcFS.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 0f85b40892..3ad2c9b306 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -767,7 +767,7 @@ KResult Ext2FSInode::add_child(InodeIdentifier child_id, const StringView& name, Vector entries; bool name_already_exists = false; traverse_as_directory([&](auto& entry) { - if (!strcmp(entry.name, name.characters())) { + if (name == entry.name) { name_already_exists = true; return false; } @@ -812,7 +812,7 @@ KResult Ext2FSInode::remove_child(const StringView& name) Vector entries; traverse_as_directory([&](auto& entry) { - if (strcmp(entry.name, name.characters()) != 0) + if (name != entry.name) entries.append(entry); return true; }); diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index aef44fcbe5..e197fd1c92 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -966,7 +966,7 @@ InodeIdentifier ProcFSInode::lookup(StringView name) if (entry.name == nullptr) continue; if (entry.proc_file_type > __FI_Root_Start && entry.proc_file_type < __FI_Root_End) { - if (!strcmp(entry.name, name.characters())) { + if (name == entry.name) { return to_identifier(fsid(), PDI_Root, 0, (ProcFileType)entry.proc_file_type); } } @@ -988,7 +988,7 @@ InodeIdentifier ProcFSInode::lookup(StringView name) if (proc_file_type == FI_Root_sys) { for (int i = 0; i < fs().m_sys_entries.size(); ++i) { auto& entry = fs().m_sys_entries[i]; - if (!strcmp(entry.name, name.characters())) + if (name == entry.name) return sys_var_to_identifier(fsid(), i); } return {}; @@ -1005,7 +1005,7 @@ InodeIdentifier ProcFSInode::lookup(StringView name) continue; if (entry.name == nullptr) continue; - if (!strcmp(entry.name, name.characters())) { + if (name == entry.name) { return to_identifier(fsid(), PDI_PID, to_pid(identifier()), (ProcFileType)entry.proc_file_type); } }