From 9609658665fdd38df5ac3cb5914a1bd0e8a21ec8 Mon Sep 17 00:00:00 2001 From: harvey186 Date: Sat, 15 Jul 2023 07:22:47 +0200 Subject: [PATCH] advanced_privacy Change-Id: I9d72f49c548ec731411529f75b148f80680a3ee4 --- getaddrinfo.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/getaddrinfo.cpp b/getaddrinfo.cpp index 4760f7f..8c9dcf8 100644 --- a/getaddrinfo.cpp +++ b/getaddrinfo.cpp @@ -3,6 +3,7 @@ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * Copyright (C) 2021 ECORP * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -322,6 +323,66 @@ int validateHints(const addrinfo* _Nonnull hints) { } // namespace +int shouldBlockRequest(const char* hostname, int uid){ + int sock, len; + struct sockaddr_un server; + char message[1000], server_reply[2000]; + + //Create socket + sock = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + if (sock == -1) { + LOG(DEBUG) << "Socket: Could not create socket"; + } + LOG(DEBUG) << "Socket: created"; + + char const* name = "foundation.e.advancedprivacy"; + int nameLen = strlen(name); + server.sun_path[0] = '\0'; /* abstract namespace */ + strncpy(server.sun_path + 1, name, nameLen); + server.sun_family = AF_UNIX; + len = 1 + nameLen + offsetof(struct sockaddr_un, sun_path); + + //Connect to remote server + if (connect(sock, (struct sockaddr *)&server, len) < 0) { + LOG(DEBUG) << "Socket: connect failed. Error"; + close(sock); + return 0; + } + + LOG(DEBUG) << "Socket: Connected"; + + //keep communicating with server + snprintf(message, sizeof(message), "%s,%d", hostname, uid); + + //Send some data + if(send(sock, message, strlen(message), 0) < 0) { + LOG(DEBUG) << "Socket: Send failed"; + close(sock); + return 0; + } + shutdown(sock, SHUT_WR); + //Receive a reply from the server + if (recv(sock, server_reply, 2000, 0) < 0) { + LOG(DEBUG) << "Socket:recv failed"; + close(sock); + return 0; + } + + LOG(DEBUG) << "Socket: Server reply : " << server_reply; + if (strncmp(server_reply, "pass", 4) == 0) { + LOG(DEBUG) << "Socket: Shouldn't block"; + close(sock); + return 0; + } else { + LOG(DEBUG) << "Socket: should block"; + close(sock); + return 1; + } + close(sock); + return 0; + +} + int android_getaddrinfofornetcontext(const char* hostname, const char* servname, const addrinfo* hints, const android_net_context* netcontext, addrinfo** res, NetworkDnsEventReported* event) { @@ -415,6 +476,12 @@ int resolv_getaddrinfo(const char* _Nonnull hostname, const char* servname, cons if (hostname == nullptr && servname == nullptr) return EAI_NONAME; if (hostname == nullptr) return EAI_NODATA; + if (shouldBlockRequest(hostname, netcontext->uid)) { + char* dest = new char[10]; + strncpy(dest, "localhost", strlen("localhost")); + hostname = dest; + } + // servname is allowed to be nullptr // hints is allowed to be nullptr assert(res != nullptr); -- 2.34.1