Fix dlmalloc horror bug - mman_map overwrites application code
This commit is contained in:
@ -5,25 +5,27 @@
|
||||
#include <errors.h>
|
||||
#include <dlmalloc/malloc.h>
|
||||
#include <uprintf.h>
|
||||
#include <log.h>
|
||||
|
||||
extern void main(void);
|
||||
|
||||
extern uint8_t _bss_start[];
|
||||
extern uint8_t _bss_end[];
|
||||
void clearbss(void) {
|
||||
extern uint8_t _bss_start;
|
||||
extern uint8_t _bss_end;
|
||||
|
||||
void bss_clear(void) {
|
||||
uint8_t *p = _bss_start;
|
||||
while (p != _bss_end) {
|
||||
*p = 0;
|
||||
p++;
|
||||
uint8_t *ps = &_bss_start;
|
||||
uint8_t *pe = &_bss_end;
|
||||
size_t sz = pe - ps;
|
||||
for (size_t i = 0; i < sz; i++) {
|
||||
ps[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static char **_args;
|
||||
static size_t _argslen;
|
||||
char **_args;
|
||||
size_t _argslen;
|
||||
|
||||
char **args(void) {
|
||||
return _args;
|
||||
return (char **)_args;
|
||||
}
|
||||
|
||||
size_t argslen(void) {
|
||||
@ -32,7 +34,7 @@ size_t argslen(void) {
|
||||
|
||||
// ulib initialization goes here
|
||||
void _premain(void) {
|
||||
bss_clear();
|
||||
clearbss();
|
||||
|
||||
_argslen = processctl(-1, PCTL_ARGLEN, 0, 0, 0);
|
||||
_args = dlmalloc(_argslen * sizeof(*_args));
|
||||
@ -45,9 +47,8 @@ void _premain(void) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (processctl(-1, PCTL_ARGV, (uint64_t)_args, _argslen, 0) != E_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
processctl(-1, PCTL_ARGV, (uint64_t)_args, _argslen, 0);
|
||||
|
||||
main();
|
||||
}
|
||||
|
Reference in New Issue
Block a user