Kernel: Switch to strlcpy() as well
Surprisingly, most uses of strncpy() are in places where strncpy() is actually a better choice. For example, copying to a fixed-length char array in a structure.
This commit is contained in:
parent
42b6b927c9
commit
aca1367158
@ -8,6 +8,7 @@ __attribute__((deprecated)) int strcmp(const char* a, const char* b);
|
|||||||
__attribute__((deprecated)) char* strcat(char* dest, const char* src);
|
__attribute__((deprecated)) char* strcat(char* dest, const char* src);
|
||||||
|
|
||||||
char* strncpy(char* dest, const char* src, size_t n);
|
char* strncpy(char* dest, const char* src, size_t n);
|
||||||
|
size_t strlcpy(char* dest, const char* src, size_t size);
|
||||||
int strncmp(const char* a, const char* b, size_t n);
|
int strncmp(const char* a, const char* b, size_t n);
|
||||||
char* strncat(char* dest, const char* src, size_t n);
|
char* strncat(char* dest, const char* src, size_t n);
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void get_symbol_name(uintptr_t address, char* buffer);
|
void get_symbol_name(uintptr_t address, char* buffer, size_t size);
|
@ -17,11 +17,29 @@ char* strcpy(char* dest, const char* src)
|
|||||||
|
|
||||||
char* strncpy(char* dest, const char* src, size_t n)
|
char* strncpy(char* dest, const char* src, size_t n)
|
||||||
{
|
{
|
||||||
size_t src_len = strlen(src) + 1; // NULL byte
|
size_t i;
|
||||||
memcpy(dest, src, src_len > n ? n : src_len);
|
for (i = 0; i < n && src[i] != 0; i++) dest[i] = src[i];
|
||||||
|
for (; i < n; i++) dest[i] = 0;
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t strlcpy(char* dest, const char* src, size_t size)
|
||||||
|
{
|
||||||
|
size_t len = strlen(src);
|
||||||
|
if (size == 0) return len;
|
||||||
|
if (len < (size - 1))
|
||||||
|
{
|
||||||
|
memcpy(dest, src, len);
|
||||||
|
dest[len] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(dest, src, size - 1);
|
||||||
|
dest[size - 1] = 0;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
int strcmp(const char* a, const char* b)
|
int strcmp(const char* a, const char* b)
|
||||||
{
|
{
|
||||||
while (*a && (*a == *b))
|
while (*a && (*a == *b))
|
||||||
|
@ -17,10 +17,10 @@ static size_t symbol_strlen(const char* symbol)
|
|||||||
return (i - symbol);
|
return (i - symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_symbol_name(uintptr_t address, char* buffer)
|
void get_symbol_name(uintptr_t address, char* buffer, size_t max)
|
||||||
{
|
{
|
||||||
if (symbol_map.addr == (void*)-1) { symbol_map = InitRD::open("sys/moon.sym"); }
|
if (symbol_map.addr == (void*)-1) { symbol_map = InitRD::open("sys/moon.sym"); }
|
||||||
if (!symbol_map.addr) { strncpy(buffer, "(no symbols loaded)", 20); }
|
if (!symbol_map.addr) { strlcpy(buffer, "(no symbols loaded)", max); }
|
||||||
while (address >= (uintptr_t)&kernel_start && address <= (uintptr_t)&kernel_end)
|
while (address >= (uintptr_t)&kernel_start && address <= (uintptr_t)&kernel_end)
|
||||||
{
|
{
|
||||||
char addr_as_str[60];
|
char addr_as_str[60];
|
||||||
@ -30,11 +30,12 @@ void get_symbol_name(uintptr_t address, char* buffer)
|
|||||||
{
|
{
|
||||||
symbol += 19;
|
symbol += 19;
|
||||||
size_t symlen = symbol_strlen(symbol);
|
size_t symlen = symbol_strlen(symbol);
|
||||||
memcpy(buffer, symbol, symlen);
|
size_t copylen = (max - 1) < symlen ? (max - 1) : symlen;
|
||||||
buffer[symlen] = 0;
|
memcpy(buffer, symbol, copylen);
|
||||||
|
buffer[copylen] = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
address--;
|
address--;
|
||||||
}
|
}
|
||||||
strncpy(buffer, "(no symbol)", 12);
|
strlcpy(buffer, "(no symbol)", max);
|
||||||
}
|
}
|
@ -24,7 +24,7 @@ void StackTracer::trace()
|
|||||||
while (frame)
|
while (frame)
|
||||||
{
|
{
|
||||||
char symbol_name[512];
|
char symbol_name[512];
|
||||||
get_symbol_name(frame->instruction, symbol_name);
|
get_symbol_name(frame->instruction, symbol_name, sizeof(symbol_name));
|
||||||
printf("%lx: %s\n", frame->instruction, symbol_name);
|
printf("%lx: %s\n", frame->instruction, symbol_name);
|
||||||
frame = frame->next;
|
frame = frame->next;
|
||||||
}
|
}
|
||||||
@ -33,7 +33,7 @@ void StackTracer::trace()
|
|||||||
void StackTracer::trace_with_ip(uintptr_t ip)
|
void StackTracer::trace_with_ip(uintptr_t ip)
|
||||||
{
|
{
|
||||||
char symbol_name[512];
|
char symbol_name[512];
|
||||||
get_symbol_name(ip, symbol_name);
|
get_symbol_name(ip, symbol_name, sizeof(symbol_name));
|
||||||
printf("%lx: %s\n", ip, symbol_name);
|
printf("%lx: %s\n", ip, symbol_name);
|
||||||
trace();
|
trace();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user