/* append /usr/lib/uml to the existing path */
path_len += strlen("PATH=" UML_LIB_PATH) + 1;
new_path = malloc(path_len); if (!new_path) {
perror("couldn't malloc to set a new PATH"); return;
}
snprintf(new_path, path_len, "PATH=%s" UML_LIB_PATH, old_path); if (putenv(new_path)) {
perror("couldn't putenv to set a new PATH");
free(new_path);
}
}
int __init main(int argc, char **argv, char **envp)
{ char **new_argv; int ret, i, err;
/* Disable randomization and re-exec if it was changed successfully */
ret = personality(PER_LINUX | ADDR_NO_RANDOMIZE); if (ret >= 0 && (ret & (PER_LINUX | ADDR_NO_RANDOMIZE)) !=
(PER_LINUX | ADDR_NO_RANDOMIZE)) { char buf[4096] = {};
ssize_t ret;
ret = readlink("/proc/self/exe", buf, sizeof(buf)); if (ret < 0 || ret >= sizeof(buf)) {
perror("readlink failure"); exit(1);
}
execve(buf, argv, envp);
}
set_stklim();
setup_env_path();
setsid();
new_argv = malloc((argc + 1) * sizeof(char *)); if (new_argv == NULL) {
perror("Mallocing argv"); exit(1);
} for (i = 0; i < argc; i++) {
new_argv[i] = strdup(argv[i]); if (new_argv[i] == NULL) {
perror("Mallocing an arg"); exit(1);
}
}
new_argv[argc] = NULL;
/* stop timers and set timer signal to be ignored */
os_timer_disable();
/* disable SIGIO for the fds and set SIGIO to be ignored */
err = deactivate_all_fds(); if (err)
os_warn("deactivate_all_fds failed, errno = %d\n", -err);
/* workaround for -Wmissing-prototypes warnings */ void *__wrap_malloc(int size); void *__wrap_calloc(int n, int size); void __wrap_free(void *ptr);
void *__wrap_malloc(int size)
{ void *ret;
if (!kmalloc_ok) return __real_malloc(size); elseif (size <= UM_KERN_PAGE_SIZE) /* finding contiguous pages can be hard*/
ret = uml_kmalloc(size, UM_GFP_KERNEL); else ret = vmalloc(size);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.