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:
DL6ER
2019-03-10 11:22:49 +01:00
parent 77ba771b17
commit a3924c06cf
9 changed files with 40 additions and 41 deletions

28
api.c
View File

@@ -418,8 +418,8 @@ void getTopClients(char *client_message, int *sock)
if(strcmp(getstr(clients[j].ippos), HIDDEN_CLIENT) == 0)
continue;
char *client_ip = getstr(clients[j].ippos);
char *client_name = getstr(clients[j].namepos);
const char *client_ip = getstr(clients[j].ippos);
const char *client_name = getstr(clients[j].namepos);
// Return this client if either
// - "withzero" option is set, and/or
@@ -450,12 +450,12 @@ void getTopClients(char *client_message, int *sock)
void getForwardDestinations(char *client_message, int *sock)
{
bool sort = true;
int i, temparray[counters->forwarded][2], totalqueries = 0;
int temparray[counters->forwarded][2], totalqueries = 0;
if(command(client_message, "unsorted"))
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__);
// If we want to print a sorted output, we fill the temporary array with
// 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;
// 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;
const char* ip, *name;
if(i == -2)
{
@@ -797,9 +797,9 @@ void getAllQueries(char *client_message, int *sock)
// Ask subroutine for domain. It may return "hidden" depending on
// the privacy settings at the time the query was made
char *domain = getDomainString(i);
const char *domain = getDomainString(i);
// Similarly for the client
char *client;
const char *client;
if(strlen(getstr(clients[queries[i].clientID].namepos)) > 0)
client = getClientNameString(i);
else
@@ -844,7 +844,7 @@ void getAllQueries(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
if(sscanf(client_message, "%*[^(](%i)", &num) > 0) {
@@ -855,7 +855,7 @@ void getRecentBlocked(char *client_message, int *sock)
// Find most recently blocked query
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__);
@@ -867,7 +867,7 @@ void getRecentBlocked(char *client_message, int *sock)
// Ask subroutine for domain. It may return "hidden" depending on
// the privacy settings at the time the query was made
char *domain = getDomainString(i);
const char *domain = getDomainString(i);
if(istelnet[*sock])
ssend(*sock,"%s\n", domain);
@@ -1135,8 +1135,8 @@ void getClientNames(int *sock)
if(skipclient[i])
continue;
char *client_ip = getstr(clients[i].ippos);
char *client_name = getstr(clients[i].namepos);
const char *client_ip = getstr(clients[i].ippos);
const char *client_name = getstr(clients[i].namepos);
if(istelnet[*sock])
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__);
char *client = getstr(clients[queries[i].clientID].ippos);
const char *client = getstr(clients[queries[i].clientID].ippos);
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");

4
api.h
View File

@@ -39,6 +39,6 @@ void pack_uint64(int sock, uint64_t value);
void pack_int32(int sock, int32_t value);
void pack_int64(int sock, int64_t value);
void pack_float(int sock, float value);
bool pack_fixstr(int sock, char *string);
bool pack_str32(int sock, char *string);
bool pack_fixstr(int sock, const char *string);
bool pack_str32(int sock, const char *string);
void pack_map16_start(int sock, uint16_t length);

View File

@@ -490,11 +490,11 @@ void save_to_DB(void)
sqlite3_bind_int(stmt, 3, queries[i].status);
// DOMAIN
char *domain = getDomainString(i);
const char *domain = getDomainString(i);
sqlite3_bind_text(stmt, 4, domain, -1, SQLITE_TRANSIENT);
// CLIENT
char *client = getClientIPString(i);
const char *client = getClientIPString(i);
sqlite3_bind_text(stmt, 5, client, -1, SQLITE_TRANSIENT);
// FORWARD

View File

@@ -181,7 +181,7 @@ bool isValidIPv6(const char *addr)
// Privacy-level sensitive subroutine that returns the domain name
// only when appropriate for the requested query
char *getDomainString(int queryID)
const char *getDomainString(int queryID)
{
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS)
{
@@ -194,7 +194,7 @@ char *getDomainString(int queryID)
// Privacy-level sensitive subroutine that returns the client IP
// only when appropriate for the requested query
char *getClientIPString(int queryID)
const char *getClientIPString(int queryID)
{
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
// only when appropriate for the requested query
char *getClientNameString(int queryID)
const char *getClientNameString(int queryID)
{
if(queries[queryID].privacylevel < PRIVACY_HIDE_DOMAINS_CLIENTS)
{

View File

@@ -75,7 +75,7 @@ void pack_float(int sock, float value) {
}
// 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
size_t length = strlen(string);
@@ -86,13 +86,13 @@ bool pack_fixstr(int sock, char *string) {
uint8_t format = (uint8_t) (0xA0 | length);
swrite(sock, &format, sizeof(format));
swrite(sock, string, length);
swrite(sock, (char*)string, length);
return true;
}
// 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
size_t length = strlen(string);
@@ -105,7 +105,7 @@ bool pack_str32(int sock, char *string) {
swrite(sock, &format, sizeof(format));
uint32_t bigELength = htonl((uint32_t) length);
swrite(sock, &bigELength, sizeof(bigELength));
swrite(sock, string, length);
swrite(sock, (char*)string, length);
return true;
}

View File

@@ -123,7 +123,7 @@ void parse_arp_cache(void)
bool clientKnown = clientID >= 0;
// Get hostname of this client if the client is known
char *hostname = "";
const char *hostname = "";
if(clientKnown)
{
validate_access("clients", clientID, true, __LINE__, __FUNCTION__, __FILE__);

View File

@@ -30,9 +30,9 @@ int findDomainID(const char *domain);
int findClientID(const char *client, bool addNew);
bool isValidIPv4(const char *addr);
bool isValidIPv6(const char *addr);
char *getDomainString(int queryID);
char *getClientIPString(int queryID);
char *getClientNameString(int queryID);
const char *getDomainString(int queryID);
const char *getClientIPString(int queryID);
const char *getClientNameString(int queryID);
void close_telnet_socket(void);
void close_unix_socket(void);
@@ -57,10 +57,10 @@ void check_blocking_status(void);
void check_setupVarsconf(void);
char * read_setupVarsconf(const char * key);
void getSetupVarsArray(char * input);
void getSetupVarsArray(const char * input);
void clearSetupVarsArray(void);
bool insetupVarsArray(char * str);
bool getSetupVarsBool(char * input) __attribute__((pure));
bool insetupVarsArray(const char * str);
bool getSetupVarsBool(const char * input) __attribute__((pure));
void parse_args(int argc, char* argv[]);
@@ -118,7 +118,7 @@ bool in_whitelist(char *domain) __attribute__((pure));
bool init_shmem(void);
void destroy_shmem(void);
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);
/**

View File

@@ -133,9 +133,9 @@ char * read_setupVarsconf(const char * key)
// setupVarsArray[1] = def
// setupVarsArray[2] = ghi
// 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' */
@@ -182,16 +182,15 @@ void clearSetupVarsArray(void)
clearSetupVarsArray();
*/
bool insetupVarsArray(char * str)
bool insetupVarsArray(const char * str)
{
int i;
// Check for possible NULL pointer
// (this is valid input, e.g. if clients[i].name is unspecified)
if(str == NULL)
return false;
// Loop over all entries in setupVarsArray
for (i = 0; i < setupVarsElements; ++i)
for (int i = 0; i < setupVarsElements; ++i)
if(setupVarsArray[i][0] == '*')
{
// Copying strlen-1 chars into buffer of size strlen: OK
@@ -221,7 +220,7 @@ bool insetupVarsArray(char * str)
return false;
}
bool __attribute__((pure)) getSetupVarsBool(char * input)
bool __attribute__((pure)) getSetupVarsBool(const char * input)
{
if((strcmp(input, "true")) == 0)
return true;

View File

@@ -90,11 +90,11 @@ unsigned long long addstr(const char *str)
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
if(pos < shmSettings->next_str_pos)
return &((char*)shm_strings.ptr)[pos];
return &((const char*)shm_strings.ptr)[pos];
else
{
logg("WARN: Tried to access %llu but next_str_pos is %u", pos, shmSettings->next_str_pos);