static bool client_connection(int fd) { LOGD("Accepted connection from %d", fd); struct ucred cred; socklen_t cred_len = sizeof(struct ucred); if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) < 0) { LOGE("Failed to get socket credentials: %s", strerror(errno)); return false; } util::set_process_title_v( nullptr, "mbtool connection from pid: %u", cred.pid); LOGD("Client PID: %u", cred.pid); LOGD("Client UID: %u", cred.uid); LOGD("Client GID: %u", cred.gid); auto disconnect_msg = util::finally([&]{ LOGD("Disconnecting connection from PID: %u", cred.pid); }); if (allow_root_client && cred.uid == 0 && cred.gid == 0) { LOGV("Received connection from client with root UID and GID"); LOGW("WARNING: Cannot verify signature of root client process"); if (!util::socket_write_string(fd, RESPONSE_ALLOW)) { LOGE("Failed to send credentials allowed message"); return false; } } else if (verify_credentials(cred.uid)) { if (!util::socket_write_string(fd, RESPONSE_ALLOW)) { LOGE("Failed to send credentials allowed message"); return false; } } else { if (!util::socket_write_string(fd, RESPONSE_DENY)) { LOGE("Failed to send credentials denied message"); } return false; } int32_t version; if (!util::socket_read_int32(fd, &version)) { LOGE("Failed to get interface version"); return false; } if (version == 2) { LOGE("Protocol version 2 is no longer supported"); util::socket_write_string(fd, RESPONSE_UNSUPPORTED); return false; } else if (version == 3) { if (!util::socket_write_string(fd, RESPONSE_OK)) { return false; } connection_version_3(fd); return true; } else { LOGE("Unsupported interface version: %d", version); util::socket_write_string(fd, RESPONSE_UNSUPPORTED); return false; } return true; }
static bool client_connection(int fd) { bool ret = true; auto fail = util::finally([&] { if (!ret) { LOGE("Killing connection"); } }); LOGD("Accepted connection from %d", fd); struct ucred cred; socklen_t cred_len = sizeof(struct ucred); if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) < 0) { LOGE("Failed to get socket credentials: %s", strerror(errno)); return ret = false; } LOGD("Client PID: %u", cred.pid); LOGD("Client UID: %u", cred.uid); LOGD("Client GID: %u", cred.gid); if (verify_credentials(cred.uid)) { if (!util::socket_write_string(fd, RESPONSE_ALLOW)) { LOGE("Failed to send credentials allowed message"); return ret = false; } } else { if (!util::socket_write_string(fd, RESPONSE_DENY)) { LOGE("Failed to send credentials denied message"); } return ret = false; } int32_t version; if (!util::socket_read_int32(fd, &version)) { LOGE("Failed to get interface version"); return ret = false; } if (version == 2) { LOGE("Protocol version 2 is no longer supported"); util::socket_write_string(fd, RESPONSE_UNSUPPORTED); return ret = false; } else if (version == 3) { if (!util::socket_write_string(fd, RESPONSE_OK)) { return false; } if (!connection_version_3(fd)) { LOGE("[Version 3] Communication error"); } return true; } else { LOGE("Unsupported interface version: %d", version); util::socket_write_string(fd, RESPONSE_UNSUPPORTED); return ret = false; } return true; }