| 233 | */ |
| 234 | |
| 235 | static int esp_elf_load_segment(esp_elf_t *elf, const uint8_t *pbuf) |
| 236 | { |
| 237 | uint32_t size; |
| 238 | bool first_segment = false; |
| 239 | Elf32_Addr vaddr_s = 0; |
| 240 | Elf32_Addr vaddr_e = 0; |
| 241 | |
| 242 | const elf32_hdr_t *ehdr = (const elf32_hdr_t *)pbuf; |
| 243 | const elf32_phdr_t *phdr = (const elf32_phdr_t *)(pbuf + ehdr->phoff); |
| 244 | |
| 245 | for (int i = 0; i < ehdr->phnum; i++) { |
| 246 | if (phdr[i].type != PT_LOAD) { |
| 247 | continue; |
| 248 | } |
| 249 | |
| 250 | if (phdr[i].memsz < phdr[i].filesz) { |
| 251 | ESP_LOGE(TAG, "Invalid segment[%d], memsz: %d, filesz: %d", |
| 252 | i, phdr[i].memsz, phdr[i].filesz); |
| 253 | return -EINVAL; |
| 254 | } |
| 255 | |
| 256 | if (first_segment == true) { |
| 257 | vaddr_s = phdr[i].vaddr; |
| 258 | vaddr_e = phdr[i].vaddr + phdr[i].memsz; |
| 259 | first_segment = true; |
| 260 | if (vaddr_e < vaddr_s) { |
| 261 | ESP_LOGE(TAG, "Invalid segment[%d], vaddr: 0x%x, memsz: %d", |
| 262 | i, phdr[i].vaddr, phdr[i].memsz); |
| 263 | return -EINVAL; |
| 264 | } |
| 265 | } else { |
| 266 | if (phdr[i].vaddr < vaddr_e) { |
| 267 | ESP_LOGE(TAG, "Invalid segment[%d], should not overlap, vaddr: 0x%x, vaddr_e: 0x%x\n", |
| 268 | i, phdr[i].vaddr, vaddr_e); |
| 269 | return -EINVAL; |
| 270 | } |
| 271 | |
| 272 | if (phdr[i].vaddr > vaddr_e + ADDR_OFFSET) { |
| 273 | ESP_LOGI(TAG, "Too much padding before segment[%d], padding: %d", |
| 274 | i, phdr[i].vaddr - vaddr_e); |
| 275 | } |
| 276 | |
| 277 | vaddr_e = phdr[i].vaddr + phdr[i].memsz; |
| 278 | if (vaddr_e < phdr[i].vaddr) { |
| 279 | ESP_LOGE(TAG, "Invalid segment[%d], address overflow, vaddr: 0x%x, vaddr_e: 0x%x\n", |
| 280 | i, phdr[i].vaddr, vaddr_e); |
| 281 | return -EINVAL; |
| 282 | } |
| 283 | } |
| 284 | |
| 285 | ESP_LOGD(TAG, "LOAD segment[%d], vaddr: 0x%x, memsize: 0x%08x", |
| 286 | i, phdr[i].vaddr, phdr[i].memsz); |
| 287 | } |
| 288 | |
| 289 | size = vaddr_e - vaddr_s; |
| 290 | if (size == 0) { |
| 291 | return -EINVAL; |
| 292 | } |
no test coverage detected