分享一個 變數沒有初始化 可能帶來的問題
阿新 • • 發佈:2019-02-02
先看 code:
static void do_ctors_aux(void) { /* SGX RTS does not support .ctors currently */ fp_t *p = NULL; uintptr_t init_array_addr; size_t init_array_size; const void *enclave_start = (const void*)&__ImageBase; elf_get_init_array(enclave_start, &init_array_addr, &init_array_size); if (init_array_addr == 0 || init_array_size == 0) return; fp_t *fp_start = (fp_t*)(init_array_addr + (uintptr_t)(enclave_start)); fp_t *fp_end = fp_start + (init_array_size / sizeof(fp_t)); /* traverse .init_array in forward order */ for (p = fp_start; p < fp_end; p++) { (*p)(); //使用 init_array_addr } }
init_array_array 本來應該在 elf_get_init_array() 裡面被賦值的。
但是在 elf_get_init_array() 裡面:
有可能 init_array_addr 還沒有被賦值,函式就return -1 了。 這樣就會產生 還使用沒有賦值的變數的情況。int elf_get_init_array(const void* enclave_base, uintptr_t *init_array_addr, size_t *init_array_size) { ElfW(Half) phnum = 0; const ElfW(Ehdr) *ehdr = (const ElfW(Ehdr)*)enclave_base; ElfW(Phdr) *phdr = get_phdr(ehdr); if (!init_array_addr || !init_array_size) return -1; if (phdr == NULL) return -1; /* Invalid image. */ *init_array_addr = 0; *init_array_size = 0; /* Search for Dynamic segment */ for (; phnum < ehdr->e_phnum; phnum++, phdr++) { if (phdr->p_type == PT_DYNAMIC) { size_t count; size_t n_dyn = phdr->p_filesz/sizeof(ElfW(Dyn)); ElfW(Dyn) *dyn = GET_PTR(ElfW(Dyn), ehdr, phdr->p_paddr); for (count = 0; count < n_dyn; count++, dyn++) { switch (dyn->d_tag) { case DT_INIT_ARRAY: *init_array_addr = dyn->d_un.d_ptr; break; case DT_INIT_ARRAYSZ: *init_array_size = dyn->d_un.d_val; break; } } } } return 0; }
整改辦法:
在 do_ctors_aux()中增加 對 elf_get_init_array() 的返回值的判斷。