1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
#pragma allow_unsafe_libc_calls
#endif
#include "net/base/sockaddr_util_posix.h"
#include <stddef.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "base/compiler_specific.h"
#include "base/debug/crash_logging.h"
#include "base/debug/dump_without_crashing.h"
#include "build/build_config.h"
#include "net/base/sockaddr_storage.h"
namespace net {
bool FillUnixAddress(const std::string& socket_path,
bool use_abstract_namespace,
SockaddrStorage* address) {
// Caller should provide a non-empty path for the socket address.
if (socket_path.empty())
return false;
size_t path_max = address->addr_len - offsetof(struct sockaddr_un, sun_path);
// Non abstract namespace pathname should be null-terminated. Abstract
// namespace pathname must start with '\0'. So, the size is always greater
// than socket_path size by 1.
size_t path_size = socket_path.size() + 1;
if (path_size > path_max)
return false;
struct sockaddr_un* socket_addr =
reinterpret_cast<struct sockaddr_un*>(address->addr());
// We want to change the behavior here to limit path size to the length of
// `sun_path`, rather than the current behavior. This is code is to test the
// viability of doing so.
//
// TODO(crbug.com/416481248): Remove this logic, and, if all goes well, change
// behavior of the code above.
if (path_size > sizeof(socket_addr->sun_path)) {
SCOPED_CRASH_KEY_NUMBER("crbug-416481248", "domain-socket-path-len",
path_size);
base::debug::DumpWithoutCrashing();
}
memset(socket_addr, 0, address->addr_len);
socket_addr->sun_family = AF_UNIX;
address->addr_len = path_size + offsetof(struct sockaddr_un, sun_path);
if (!use_abstract_namespace) {
memcpy(socket_addr->sun_path, socket_path.c_str(), socket_path.size());
return true;
}
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
// Convert the path given into abstract socket name. It must start with
// the '\0' character, so we are adding it. |addr_len| must specify the
// length of the structure exactly, as potentially the socket name may
// have '\0' characters embedded (although we don't support this).
// Note that addr.sun_path is already zero initialized.
UNSAFE_TODO(memcpy(socket_addr->sun_path + 1, socket_path.c_str(),
socket_path.size());)
return true;
#else
return false;
#endif
}
} // namespace net
|