summaryrefslogtreecommitdiffhomepage
path: root/dev/boot
diff options
context:
space:
mode:
Diffstat (limited to 'dev/boot')
-rw-r--r--dev/boot/src/BootSupport.cc48
1 files changed, 28 insertions, 20 deletions
diff --git a/dev/boot/src/BootSupport.cc b/dev/boot/src/BootSupport.cc
index ce824e0f..7cf7af95 100644
--- a/dev/boot/src/BootSupport.cc
+++ b/dev/boot/src/BootSupport.cc
@@ -18,11 +18,16 @@
/// @param dst destination pointer.
/// @param byte value to fill in.
/// @param len length of of src.
-EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len) {
+EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len, long long unsigned int dst_size) {
+ if (!dst || len > dst_size) {
+ // For now, we return nullptr or an error status.
+ return nullptr;
+ }
+ unsigned char* p = (unsigned char*)dst;
+ unsigned char val = (unsigned char)byte;
for (size_t i = 0UL; i < len; ++i) {
- ((int*) dst)[i] = byte;
+ p[i] = val;
}
-
return dst;
}
@@ -30,36 +35,39 @@ EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len) {
/// @param dst destination pointer.
/// @param src source pointer.
/// @param len length of of src.
-EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len) {
+EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len, long long unsigned int dst_size) {
+ if (!dst || !src || len > dst_size) {
+ // Similar to memset, this is a critical failure.
+ return nullptr;
+ }
+ unsigned char* d = (unsigned char*)dst;
+ const unsigned char* s = (const unsigned char*)src;
for (size_t i = 0UL; i < len; ++i) {
- ((int*) dst)[i] = ((int*) src)[i];
+ d[i] = s[i];
}
-
return dst;
}
/// @brief strlen definition in C++.
-EXTERN_C size_t strlen(const char* whatToCheck) {
- SizeT len = 0;
-
- while (whatToCheck[len] != 0) {
+EXTERN_C size_t strlen(const char* whatToCheck, size_t max_len) {
+ size_t len = 0;
+ while (len < max_len && whatToCheck[len] != '\0') {
++len;
}
-
return len;
}
/// @brief strcmp definition in C++.
-EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight) {
- SizeT len = 0;
-
- while (whatToCheck[len] == whatToCheckRight[len]) {
- if (whatToCheck[len] == 0) return 0;
-
- ++len;
+EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight, size_t max_len) {
+ size_t i = 0;
+ while (i < max_len && whatToCheck[i] == whatToCheckRight[i]) {
+ if (whatToCheck[i] == '\0') return 0;
+ ++i;
}
-
- return len;
+ if (i == max_len) {
+ return 0;
+ }
+ return (unsigned char)whatToCheck[i] - (unsigned char)whatToCheckRight[i];
}
/// @brief something specific to the Microsoft's ABI, When the stack grows too big.