mirror of
https://github.com/pi-hole/FTL.git
synced 2025-12-24 14:58:26 +00:00
Declare return value of getstr() as const char* because the returned strings should not be modifiable. Similarly, neither pack_fixstr() nor pack_str32() should be able to modify strings they are given. Furthermore, getDomainString(), getClientIPString(), getClientNameString(), getSetupVarsArray(), insetupVarsArray(), and getSetupVarsBool() should never modify the strings they receive as arguments.
Signed-off-by: DL6ER <dl6er@dl6er.de>
This commit is contained in:
28
api.c
28
api.c
@@ -418,8 +418,8 @@ void getTopClients(char *client_message, int *sock)
|
|||||||
if(strcmp(getstr(clients[j].ippos), HIDDEN_CLIENT) == 0)
|
if(strcmp(getstr(clients[j].ippos), HIDDEN_CLIENT) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char *client_ip = getstr(clients[j].ippos);
|
const char *client_ip = getstr(clients[j].ippos);
|
||||||
char *client_name = getstr(clients[j].namepos);
|
const char *client_name = getstr(clients[j].namepos);
|
||||||
|
|
||||||
// Return this client if either
|
// Return this client if either
|
||||||
// - "withzero" option is set, and/or
|
// - "withzero" option is set, and/or
|
||||||
@@ -450,12 +450,12 @@ void getTopClients(char *client_message, int *sock)
|
|||||||
void getForwardDestinations(char *client_message, int *sock)
|
void getForwardDestinations(char *client_message, int *sock)
|
||||||
{
|
{
|
||||||
bool sort = true;
|
bool sort = true;
|
||||||
int i, temparray[counters->forwarded][2], totalqueries = 0;
|
int temparray[counters->forwarded][2], totalqueries = 0;
|
||||||
|
|
||||||
if(command(client_message, "unsorted"))
|
if(command(client_message, "unsorted"))
|
||||||
sort = false;
|
sort = false;
|
||||||
|
|
||||||
for(i=0; i < counters->forwarded; i++) {
|
for(int i = 0; i < counters->forwarded; i++) {
|
||||||
validate_access("forwarded", i, true, __LINE__, __FUNCTION__, __FILE__);
|
validate_access("forwarded", i, true, __LINE__, __FUNCTION__, __FILE__);
|
||||||
// If we want to print a sorted output, we fill the temporary array with
|
// If we want to print a sorted output, we fill the temporary array with
|
||||||
// the values we will use for sorting afterwards
|
// the values we will use for sorting afterwards
|
||||||
@@ -474,10 +474,10 @@ void getForwardDestinations(char *client_message, int *sock)
|
|||||||
totalqueries = counters->forwardedqueries + counters->cached + counters->blocked;
|
totalqueries = counters->forwardedqueries + counters->cached + counters->blocked;
|
||||||
|
|
||||||
// Loop over available forward destinations
|
// Loop over available forward destinations
|
||||||
for(i=-2; i < min(counters->forwarded, 8); i++)
|
for(int i = -2; i < min(counters->forwarded, 8); i++)
|
||||||
{
|
{
|
||||||
char *ip, *name;
|
|
||||||
float percentage = 0.0f;
|
float percentage = 0.0f;
|
||||||
|
const char* ip, *name;
|
||||||
|
|
||||||
if(i == -2)
|
if(i == -2)
|
||||||
{
|
{
|
||||||
@@ -797,9 +797,9 @@ void getAllQueries(char *client_message, int *sock)
|
|||||||
|
|
||||||
// Ask subroutine for domain. It may return "hidden" depending on
|
// Ask subroutine for domain. It may return "hidden" depending on
|
||||||
// the privacy settings at the time the query was made
|
// the privacy settings at the time the query was made
|
||||||
char *domain = getDomainString(i);
|
const char *domain = getDomainString(i);
|
||||||
// Similarly for the client
|
// Similarly for the client
|
||||||
char *client;
|
const char *client;
|
||||||
if(strlen(getstr(clients[queries[i].clientID].namepos)) > 0)
|
if(strlen(getstr(clients[queries[i].clientID].namepos)) > 0)
|
||||||
client = getClientNameString(i);
|
client = getClientNameString(i);
|
||||||
else
|
else
|
||||||
@@ -844,7 +844,7 @@ void getAllQueries(char *client_message, int *sock)
|
|||||||
|
|
||||||
void getRecentBlocked(char *client_message, int *sock)
|
void getRecentBlocked(char *client_message, int *sock)
|
||||||
{
|
{
|
||||||
int i, num=1;
|
int num=1;
|
||||||
|
|
||||||
// Test for integer that specifies number of entries to be shown
|
// Test for integer that specifies number of entries to be shown
|
||||||
if(sscanf(client_message, "%*[^(](%i)", &num) > 0) {
|
if(sscanf(client_message, "%*[^(](%i)", &num) > 0) {
|
||||||
@@ -855,7 +855,7 @@ void getRecentBlocked(char *client_message, int *sock)
|
|||||||
|
|
||||||
// Find most recently blocked query
|
// Find most recently blocked query
|
||||||
int found = 0;
|
int found = 0;
|
||||||
for(i = counters->queries - 1; i > 0 ; i--)
|
for(int i = counters->queries - 1; i > 0 ; i--)
|
||||||
{
|
{
|
||||||
validate_access("queries", i, true, __LINE__, __FUNCTION__, __FILE__);
|
validate_access("queries", i, true, __LINE__, __FUNCTION__, __FILE__);
|
||||||
|
|
||||||
@@ -867,7 +867,7 @@ void getRecentBlocked(char *client_message, int *sock)
|
|||||||
|
|
||||||
// Ask subroutine for domain. It may return "hidden" depending on
|
// Ask subroutine for domain. It may return "hidden" depending on
|
||||||
// the privacy settings at the time the query was made
|
// the privacy settings at the time the query was made
|
||||||
char *domain = getDomainString(i);
|
const char *domain = getDomainString(i);
|
||||||
|
|
||||||
if(istelnet[*sock])
|
if(istelnet[*sock])
|
||||||
ssend(*sock,"%s\n", domain);
|
ssend(*sock,"%s\n", domain);
|
||||||
@@ -1135,8 +1135,8 @@ void getClientNames(int *sock)
|
|||||||
if(skipclient[i])
|
if(skipclient[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char *client_ip = getstr(clients[i].ippos);
|
const char *client_ip = getstr(clients[i].ippos);
|
||||||
char *client_name = getstr(clients[i].namepos);
|
const char *client_name = getstr(clients[i].namepos);
|
||||||
|
|
||||||
if(istelnet[*sock])
|
if(istelnet[*sock])
|
||||||
ssend(*sock, "%s %s\n", client_name, client_ip);
|
ssend(*sock, "%s %s\n", client_name, client_ip);
|
||||||
@@ -1177,7 +1177,7 @@ void getUnknownQueries(int *sock)
|
|||||||
validate_access("clients", queries[i].clientID, true, __LINE__, __FUNCTION__, __FILE__);
|
validate_access("clients", queries[i].clientID, true, __LINE__, __FUNCTION__, __FILE__);
|
||||||
|
|
||||||
|
|
||||||
char *client = getstr(clients[queries[i].clientID].ippos);
|
const char *client = getstr(clients[queries[i].clientID].ippos);
|
||||||
|
|
||||||
if(istelnet[*sock])
|
if(istelnet[*sock])
|
||||||
ssend(*sock, "%li %i %i %s %s %s %i %s\n", queries[i].timestamp, i, queries[i].id, type, getstr(domains[queries[i].domainID].domainpos), client, queries[i].status, queries[i].complete ? "true" : "false");
|
ssend(*sock, "%li %i %i %s %s %s %i %s\n", queries[i].timestamp, i, queries[i].id, type, getstr(domains[queries[i].domainID].domainpos), client, queries[i].status, queries[i].complete ? "true" : "false");
|
||||||
|
|||||||
4
api.h
4
api.h
@@ -39,6 +39,6 @@ void pack_uint64(int sock, uint64_t value);
|
|||||||
void pack_int32(int sock, int32_t value);
|
void pack_int32(int sock, int32_t value);
|
||||||
void pack_int64(int sock, int64_t value);
|
void pack_int64(int sock, int64_t value);
|
||||||
void pack_float(int sock, float value);
|
void pack_float(int sock, float value);
|
||||||
bool pack_fixstr(int sock, char *string);
|
bool pack_fixstr(int sock, const char *string);
|
||||||
bool pack_str32(int sock, char *string);
|
bool pack_str32(int sock, const char *string);
|
||||||
void pack_map16_start(int sock, uint16_t length);
|
void pack_map16_start(int sock, uint16_t length);
|
||||||
|
|||||||
@@ -490,11 +490,11 @@ void save_to_DB(void)
|
|||||||
sqlite3_bind_int(stmt, 3, queries[i].status);
|
sqlite3_bind_int(stmt, 3, queries[i].status);
|
||||||
|
|
||||||
// DOMAIN
|
// DOMAIN
|
||||||
char *domain = getDomainString(i);
|
const char *domain = getDomainString(i);
|
||||||
sqlite3_bind_text(stmt, 4, domain, -1, SQLITE_TRANSIENT);
|
sqlite3_bind_text(stmt, 4, domain, -1, SQLITE_TRANSIENT);
|
||||||
|
|
||||||
// CLIENT
|
// CLIENT
|
||||||
char *client = getClientIPString(i);
|
const char *client = getClientIPString(i);
|
||||||
sqlite3_bind_text(stmt, 5, client, -1, SQLITE_TRANSIENT);
|
sqlite3_bind_text(stmt, 5, client, -1, SQLITE_TRANSIENT);
|
||||||
|
|
||||||
// FORWARD
|
// FORWARD
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ bool isValidIPv6(const char *addr)
|
|||||||
|
|
||||||
// Privacy-level sensitive subroutine that returns the domain name
|
// Privacy-level sensitive subroutine that returns the domain name
|
||||||
// only when appropriate for the requested query
|
// only when appropriate for the requested query
|
||||||
char *getDomainString(int queryID)
|
const char *getDomainString(int queryID)
|
||||||
{
|
{
|
||||||
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS)
|
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS)
|
||||||
{
|
{
|
||||||
@@ -194,7 +194,7 @@ char *getDomainString(int queryID)
|
|||||||
|
|
||||||
// Privacy-level sensitive subroutine that returns the client IP
|
// Privacy-level sensitive subroutine that returns the client IP
|
||||||
// only when appropriate for the requested query
|
// only when appropriate for the requested query
|
||||||
char *getClientIPString(int queryID)
|
const char *getClientIPString(int queryID)
|
||||||
{
|
{
|
||||||
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS_CLIENTS)
|
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS_CLIENTS)
|
||||||
{
|
{
|
||||||
@@ -207,7 +207,7 @@ char *getClientIPString(int queryID)
|
|||||||
|
|
||||||
// Privacy-level sensitive subroutine that returns the client host name
|
// Privacy-level sensitive subroutine that returns the client host name
|
||||||
// only when appropriate for the requested query
|
// only when appropriate for the requested query
|
||||||
char *getClientNameString(int queryID)
|
const char *getClientNameString(int queryID)
|
||||||
{
|
{
|
||||||
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS_CLIENTS)
|
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS_CLIENTS)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ void pack_float(int sock, float value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Return true if successful
|
// Return true if successful
|
||||||
bool pack_fixstr(int sock, char *string) {
|
bool pack_fixstr(int sock, const char *string) {
|
||||||
// Make sure that the length is less than 32
|
// Make sure that the length is less than 32
|
||||||
size_t length = strlen(string);
|
size_t length = strlen(string);
|
||||||
|
|
||||||
@@ -86,13 +86,13 @@ bool pack_fixstr(int sock, char *string) {
|
|||||||
|
|
||||||
uint8_t format = (uint8_t) (0xA0 | length);
|
uint8_t format = (uint8_t) (0xA0 | length);
|
||||||
swrite(sock, &format, sizeof(format));
|
swrite(sock, &format, sizeof(format));
|
||||||
swrite(sock, string, length);
|
swrite(sock, (char*)string, length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true if successful
|
// Return true if successful
|
||||||
bool pack_str32(int sock, char *string) {
|
bool pack_str32(int sock, const char *string) {
|
||||||
// Make sure that the length is less than 4294967296
|
// Make sure that the length is less than 4294967296
|
||||||
size_t length = strlen(string);
|
size_t length = strlen(string);
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ bool pack_str32(int sock, char *string) {
|
|||||||
swrite(sock, &format, sizeof(format));
|
swrite(sock, &format, sizeof(format));
|
||||||
uint32_t bigELength = htonl((uint32_t) length);
|
uint32_t bigELength = htonl((uint32_t) length);
|
||||||
swrite(sock, &bigELength, sizeof(bigELength));
|
swrite(sock, &bigELength, sizeof(bigELength));
|
||||||
swrite(sock, string, length);
|
swrite(sock, (char*)string, length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ void parse_arp_cache(void)
|
|||||||
bool clientKnown = clientID >= 0;
|
bool clientKnown = clientID >= 0;
|
||||||
|
|
||||||
// Get hostname of this client if the client is known
|
// Get hostname of this client if the client is known
|
||||||
char *hostname = "";
|
const char *hostname = "";
|
||||||
if(clientKnown)
|
if(clientKnown)
|
||||||
{
|
{
|
||||||
validate_access("clients", clientID, true, __LINE__, __FUNCTION__, __FILE__);
|
validate_access("clients", clientID, true, __LINE__, __FUNCTION__, __FILE__);
|
||||||
|
|||||||
14
routines.h
14
routines.h
@@ -30,9 +30,9 @@ int findDomainID(const char *domain);
|
|||||||
int findClientID(const char *client, bool addNew);
|
int findClientID(const char *client, bool addNew);
|
||||||
bool isValidIPv4(const char *addr);
|
bool isValidIPv4(const char *addr);
|
||||||
bool isValidIPv6(const char *addr);
|
bool isValidIPv6(const char *addr);
|
||||||
char *getDomainString(int queryID);
|
const char *getDomainString(int queryID);
|
||||||
char *getClientIPString(int queryID);
|
const char *getClientIPString(int queryID);
|
||||||
char *getClientNameString(int queryID);
|
const char *getClientNameString(int queryID);
|
||||||
|
|
||||||
void close_telnet_socket(void);
|
void close_telnet_socket(void);
|
||||||
void close_unix_socket(void);
|
void close_unix_socket(void);
|
||||||
@@ -57,10 +57,10 @@ void check_blocking_status(void);
|
|||||||
|
|
||||||
void check_setupVarsconf(void);
|
void check_setupVarsconf(void);
|
||||||
char * read_setupVarsconf(const char * key);
|
char * read_setupVarsconf(const char * key);
|
||||||
void getSetupVarsArray(char * input);
|
void getSetupVarsArray(const char * input);
|
||||||
void clearSetupVarsArray(void);
|
void clearSetupVarsArray(void);
|
||||||
bool insetupVarsArray(char * str);
|
bool insetupVarsArray(const char * str);
|
||||||
bool getSetupVarsBool(char * input) __attribute__((pure));
|
bool getSetupVarsBool(const char * input) __attribute__((pure));
|
||||||
|
|
||||||
void parse_args(int argc, char* argv[]);
|
void parse_args(int argc, char* argv[]);
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ bool in_whitelist(char *domain) __attribute__((pure));
|
|||||||
bool init_shmem(void);
|
bool init_shmem(void);
|
||||||
void destroy_shmem(void);
|
void destroy_shmem(void);
|
||||||
unsigned long long addstr(const char *str);
|
unsigned long long addstr(const char *str);
|
||||||
char *getstr(unsigned long long pos);
|
const char *getstr(unsigned long long pos);
|
||||||
void *enlarge_shmem_struct(char type);
|
void *enlarge_shmem_struct(char type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
11
setupVars.c
11
setupVars.c
@@ -133,9 +133,9 @@ char * read_setupVarsconf(const char * key)
|
|||||||
// setupVarsArray[1] = def
|
// setupVarsArray[1] = def
|
||||||
// setupVarsArray[2] = ghi
|
// setupVarsArray[2] = ghi
|
||||||
// setupVarsArray[3] = NULL
|
// setupVarsArray[3] = NULL
|
||||||
void getSetupVarsArray(char * input)
|
void getSetupVarsArray(const char * input)
|
||||||
{
|
{
|
||||||
char * p = strtok(input, ",");
|
char * p = strtok((char*)input, ",");
|
||||||
|
|
||||||
/* split string and append tokens to 'res' */
|
/* split string and append tokens to 'res' */
|
||||||
|
|
||||||
@@ -182,16 +182,15 @@ void clearSetupVarsArray(void)
|
|||||||
clearSetupVarsArray();
|
clearSetupVarsArray();
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool insetupVarsArray(char * str)
|
bool insetupVarsArray(const char * str)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
// Check for possible NULL pointer
|
// Check for possible NULL pointer
|
||||||
// (this is valid input, e.g. if clients[i].name is unspecified)
|
// (this is valid input, e.g. if clients[i].name is unspecified)
|
||||||
if(str == NULL)
|
if(str == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Loop over all entries in setupVarsArray
|
// Loop over all entries in setupVarsArray
|
||||||
for (i = 0; i < setupVarsElements; ++i)
|
for (int i = 0; i < setupVarsElements; ++i)
|
||||||
if(setupVarsArray[i][0] == '*')
|
if(setupVarsArray[i][0] == '*')
|
||||||
{
|
{
|
||||||
// Copying strlen-1 chars into buffer of size strlen: OK
|
// Copying strlen-1 chars into buffer of size strlen: OK
|
||||||
@@ -221,7 +220,7 @@ bool insetupVarsArray(char * str)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool __attribute__((pure)) getSetupVarsBool(char * input)
|
bool __attribute__((pure)) getSetupVarsBool(const char * input)
|
||||||
{
|
{
|
||||||
if((strcmp(input, "true")) == 0)
|
if((strcmp(input, "true")) == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
4
shmem.c
4
shmem.c
@@ -90,11 +90,11 @@ unsigned long long addstr(const char *str)
|
|||||||
return (shmSettings->next_str_pos - (len + 1));
|
return (shmSettings->next_str_pos - (len + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
char *getstr(unsigned long long pos)
|
const char *getstr(unsigned long long pos)
|
||||||
{
|
{
|
||||||
// Only access the string memory if this memory region has already been set
|
// Only access the string memory if this memory region has already been set
|
||||||
if(pos < shmSettings->next_str_pos)
|
if(pos < shmSettings->next_str_pos)
|
||||||
return &((char*)shm_strings.ptr)[pos];
|
return &((const char*)shm_strings.ptr)[pos];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logg("WARN: Tried to access %llu but next_str_pos is %u", pos, shmSettings->next_str_pos);
|
logg("WARN: Tried to access %llu but next_str_pos is %u", pos, shmSettings->next_str_pos);
|
||||||
|
|||||||
Reference in New Issue
Block a user