From d419a780aed4a8111ab30531797d0e1afe6f02c4 Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Sun, 23 Aug 2020 19:08:02 +0200 Subject: [PATCH] LibC: Prefer strlcpy over strcpy/strncpy All of these are cosmetic (I believe). Furthermore, they serve as reminders to always check the length of the destination buffers. --- Libraries/LibC/netdb.cpp | 14 +++++++------- Libraries/LibC/pwd.cpp | 10 +++++----- Libraries/LibC/unistd.cpp | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Libraries/LibC/netdb.cpp b/Libraries/LibC/netdb.cpp index ed1799205a..fe5b6df7f1 100644 --- a/Libraries/LibC/netdb.cpp +++ b/Libraries/LibC/netdb.cpp @@ -86,7 +86,7 @@ static int connect_to_lookup_server() sockaddr_un address; address.sun_family = AF_LOCAL; - strcpy(address.sun_path, "/tmp/portal/lookup"); + strlcpy(address.sun_path, "/tmp/portal/lookup", sizeof(address.sun_path)); if (connect(fd, (const sockaddr*)&address, sizeof(address)) < 0) { perror("connect_to_lookup_server"); @@ -102,7 +102,7 @@ hostent* gethostbyname(const char* name) if (ipv4_address.has_value()) { auto ip4_string = ipv4_address.value().to_string(); ASSERT(ip4_string.length() < sizeof(__gethostbyname_name_buffer)); - strncpy(__gethostbyname_name_buffer, ip4_string.characters(), ip4_string.length()); + strlcpy(__gethostbyname_name_buffer, ip4_string.characters(), sizeof(__gethostbyname_name_buffer)); __gethostbyname_buffer.h_name = __gethostbyname_name_buffer; __gethostbyname_buffer.h_aliases = nullptr; __gethostbyname_buffer.h_addrtype = AF_INET; @@ -152,7 +152,7 @@ hostent* gethostbyname(const char* name) if (rc <= 0) return nullptr; - strncpy(__gethostbyname_name_buffer, name, sizeof(__gethostbyaddr_name_buffer) - 1); + strlcpy(__gethostbyname_name_buffer, name, sizeof(__gethostbyaddr_name_buffer)); __gethostbyname_buffer.h_name = __gethostbyname_name_buffer; __gethostbyname_buffer.h_aliases = nullptr; @@ -216,7 +216,7 @@ hostent* gethostbyaddr(const void* addr, socklen_t addr_size, int type) auto& response = responses[0]; - strncpy(__gethostbyaddr_name_buffer, response.characters(), max(sizeof(__gethostbyaddr_name_buffer), response.length())); + strlcpy(__gethostbyaddr_name_buffer, response.characters(), sizeof(__gethostbyaddr_name_buffer)); __gethostbyaddr_buffer.h_name = __gethostbyaddr_name_buffer; __gethostbyaddr_buffer.h_aliases = nullptr; @@ -374,7 +374,7 @@ static bool fill_getserv_buffers(char* line, ssize_t read) return false; } if (sizeof(__getserv_name_buffer) >= split_line[0].length() + 1) { - strncpy(__getserv_name_buffer, split_line[0].characters(), split_line[0].length() + 1); + strlcpy(__getserv_name_buffer, split_line[0].characters(), sizeof(__getserv_name_buffer)); } else { perror("invalid buffer length: service name"); return false; @@ -397,7 +397,7 @@ static bool fill_getserv_buffers(char* line, ssize_t read) port_protocol_split[1].replace("\n", "", true); if (sizeof(__getserv_protocol_buffer) >= port_protocol_split[1].length()) { - strncpy(__getserv_protocol_buffer, port_protocol_split[1].characters(), port_protocol_split[1].length() + 1); + strlcpy(__getserv_protocol_buffer, port_protocol_split[1].characters(), sizeof(__getserv_protocol_buffer)); } else { perror("malformed services file: protocol"); return false; @@ -566,7 +566,7 @@ static bool fill_getproto_buffers(char* line, ssize_t read) return false; } if (sizeof(__getproto_name_buffer) >= split_line[0].length() + 1) { - strncpy(__getproto_name_buffer, split_line[0].characters(), split_line[0].length() + 1); + strlcpy(__getproto_name_buffer, split_line[0].characters(), sizeof(__getproto_name_buffer)); } else { perror("invalid buffer length: protocol name"); return false; diff --git a/Libraries/LibC/pwd.cpp b/Libraries/LibC/pwd.cpp index 969208b4b7..70716709c6 100644 --- a/Libraries/LibC/pwd.cpp +++ b/Libraries/LibC/pwd.cpp @@ -146,11 +146,11 @@ next_entry: __pwdb_entry->pw_dir = __pwdb_entry->dir_buffer; __pwdb_entry->pw_shell = __pwdb_entry->shell_buffer; - strncpy(__pwdb_entry->name_buffer, e_name.characters(), PWDB_STR_MAX_LEN - 1); - strncpy(__pwdb_entry->passwd_buffer, e_passwd.characters(), PWDB_STR_MAX_LEN - 1); - strncpy(__pwdb_entry->gecos_buffer, e_gecos.characters(), PWDB_STR_MAX_LEN - 1); - strncpy(__pwdb_entry->dir_buffer, e_dir.characters(), PWDB_STR_MAX_LEN - 1); - strncpy(__pwdb_entry->shell_buffer, e_shell.characters(), PWDB_STR_MAX_LEN - 1); + strlcpy(__pwdb_entry->name_buffer, e_name.characters(), PWDB_STR_MAX_LEN); + strlcpy(__pwdb_entry->passwd_buffer, e_passwd.characters(), PWDB_STR_MAX_LEN); + strlcpy(__pwdb_entry->gecos_buffer, e_gecos.characters(), PWDB_STR_MAX_LEN); + strlcpy(__pwdb_entry->dir_buffer, e_dir.characters(), PWDB_STR_MAX_LEN); + strlcpy(__pwdb_entry->shell_buffer, e_shell.characters(), PWDB_STR_MAX_LEN); return __pwdb_entry; } diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index 74299af907..796006a572 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -554,7 +554,7 @@ char* getlogin() { static char __getlogin_buffer[256]; if (auto* passwd = getpwuid(getuid())) { - strncpy(__getlogin_buffer, passwd->pw_name, sizeof(__getlogin_buffer) - 1); + strlcpy(__getlogin_buffer, passwd->pw_name, sizeof(__getlogin_buffer)); endpwent(); return __getlogin_buffer; }