Removed some code duplication

This commit is contained in:
Aleksandr Lebedev 2026-04-21 16:59:35 +02:00
parent 527199c23d
commit ea8284be82

75
main.c
View file

@ -26,6 +26,33 @@ size_t min_size_t(size_t a, size_t b)
return a > b ? b : a; return a > b ? b : a;
} }
/*Works simular to memcpy, but checks the sizes to avoid buffer overflows. If dest or src are NULL, returns 0, otherwise returns number of copied BYTES*/
size_t copy_to_buf(void* dest, size_t dest_len, const void* src, size_t src_len)
{
if(!dest || !src)
{
return 0;
}
size_t len = min_size_t(dest_len, src_len);
memcpy(dest, src, len);
return len;
}
/*Works simular to strcpy, but checks the sizes to avoid buffer overflows. If dest or src are NULL, returns 0, otherwise returns number of copied BYTES*/
size_t copy_str_to_buf(void* dest, size_t dest_len, const char* src)
{
if(!dest || !src)
{
return 0;
}
size_t len = copy_to_buf(dest, dest_len, src, strlen(src) + 1);
if(len != 0)
{
((char*)dest)[len] = '\0';
}
return len;
}
void sigint_handler(int signo) void sigint_handler(int signo)
{ {
if(!jump_active) if(!jump_active)
@ -910,39 +937,33 @@ int execute_pipeline(struct pipeline* pl, int capture, char** out)
char* get_user() char* get_user()
{ {
static char buf[max_env_var_length] = {0}; static char buf[max_env_var_length] = {0};
char* result = getenv("USER"); size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("USER"));
if(!result) if(!len)
{ {
return "UNKNOWN"; return "UNKNOWN";
} }
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
memcpy(buf, result, length);
return buf; return buf;
} }
char* get_home() char* get_home()
{ {
static char buf[max_length] = {0}; static char buf[max_length] = {0};
char* result = getenv("HOME"); size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("HOME"));
if(!result) if(!len)
{ {
return "UNKNOWN_HOME_PATH"; return "UNKNOWN_HOME_PATH";
} }
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
memcpy(buf, result, length);
return buf; return buf;
} }
char* get_pwd() char* get_pwd()
{ {
static char buf[max_length] = {0}; static char buf[max_length] = {0};
char* result = getenv("PWD"); size_t len = copy_str_to_buf(buf, sizeof(buf), getenv("PWD"));
if(!result) if(!len)
{ {
return "UNKNOWN"; return "UNKNOWN";
} }
size_t length = min_size_t(sizeof(buf), strlen(result) + 1);
memcpy(buf, result, length);
return buf; return buf;
} }
@ -976,21 +997,14 @@ char* generate_ps1_prompt()
{ {
static char prompt_buf[max_length] = {0}; static char prompt_buf[max_length] = {0};
char env_buf[max_env_var_length] = {0}; char env_buf[max_env_var_length] = {0};
char* ps1 = getenv("PS1"); size_t ps1_len = copy_str_to_buf(env_buf, sizeof(env_buf), getenv("PS1"));
if(!ps1)
{
return default_prompt;
}
size_t ps1_len = min_size_t(sizeof(env_buf), strlen(ps1) + 1) - 1;
if(ps1_len == 0) if(ps1_len == 0)
{ {
return default_prompt; return default_prompt;
} }
memcpy(env_buf, ps1, ps1_len);
env_buf[ps1_len + 1] = '\0';
if(ps1_len < 2) if(ps1_len < 2)
{ {
memcpy(prompt_buf, env_buf, ps1_len + 1); copy_str_to_buf(prompt_buf, sizeof(prompt_buf), getenv("PS1"));
return prompt_buf; return prompt_buf;
} }
size_t i = 1, j = 0; size_t i = 1, j = 0;
@ -1027,25 +1041,12 @@ char* generate_ps1_prompt()
i++; i++;
continue; continue;
} }
size_t len = strlen(data); size_t start_len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, env_buf + start, i - start - 1);
if(j + i - 1 - start + len >= sizeof(prompt_buf))
{
fprintf(stderr, "\nOut of memory(1) for prompt: %d >= %d\n", j + i - start + len, sizeof(prompt_buf));
break;
}
size_t start_len = min_size_t(sizeof(prompt_buf) - j, i - start - 1);
memcpy(prompt_buf + j, env_buf + start, start_len);
j += start_len; j += start_len;
if(j + len >= sizeof(prompt_buf)) size_t len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, data, strlen(data));
{
fprintf(stderr, "\nOut of memory(2) for prompt: %d >= %d\n", j + len, sizeof(prompt_buf));
break;
}
memcpy(prompt_buf + j, data, len);
i += 1; start = i; j += len; i += 1; start = i; j += len;
} }
size_t start_len = min_size_t(sizeof(prompt_buf) - j, i - start); size_t start_len = copy_to_buf(prompt_buf + j, sizeof(prompt_buf) - j, env_buf + start, i - start);
memcpy(prompt_buf + j, env_buf + start, start_len);
j += start_len; j += start_len;
prompt_buf[j] = '\0'; prompt_buf[j] = '\0';
return prompt_buf; return prompt_buf;