Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/nacl/loader/nonsfi/elf_loader.h" | 5 #include "components/nacl/loader/nonsfi/elf_loader.h" |
| 6 | 6 |
| 7 #include <elf.h> | 7 #include <elf.h> |
| 8 #include <link.h> | 8 #include <link.h> |
| 9 | 9 |
| 10 #include <cstring> | 10 #include <cstring> |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 } | 263 } |
| 264 return data_->ehdr.e_entry + data_->load_bias; | 264 return data_->ehdr.e_entry + data_->load_bias; |
| 265 } | 265 } |
| 266 | 266 |
| 267 NaClErrorCode ElfImage::Read(struct NaClDesc* descriptor) { | 267 NaClErrorCode ElfImage::Read(struct NaClDesc* descriptor) { |
| 268 DCHECK(!data_); | 268 DCHECK(!data_); |
| 269 | 269 |
| 270 ::scoped_ptr<Data> data(new Data); | 270 ::scoped_ptr<Data> data(new Data); |
| 271 | 271 |
| 272 // Read elf header. | 272 // Read elf header. |
| 273 ssize_t read_ret = (*NACL_VTBL(NaClDesc, descriptor)->PRead)( | 273 ssize_t read_ret = (*NACL_VTBL(NaClDesc, descriptor)->Read)( |
|
Mark Seaborn
2014/03/28 01:38:25
Julien and I are both OK with allowing the pread()
hamaji
2014/03/28 12:06:10
OK, I'd remove this change.
| |
| 274 descriptor, &data->ehdr, sizeof(data->ehdr), 0); | 274 descriptor, &data->ehdr, sizeof(data->ehdr)); |
| 275 if (NaClSSizeIsNegErrno(&read_ret) || | 275 if (NaClSSizeIsNegErrno(&read_ret) || |
| 276 static_cast<size_t>(read_ret) != sizeof(data->ehdr)) { | 276 static_cast<size_t>(read_ret) != sizeof(data->ehdr)) { |
| 277 LOG(ERROR) << "Could not load elf headers."; | 277 LOG(ERROR) << "Could not load elf headers."; |
| 278 return LOAD_READ_ERROR; | 278 return LOAD_READ_ERROR; |
| 279 } | 279 } |
| 280 | 280 |
| 281 NaClErrorCode error_code = ValidateElfHeader(data->ehdr); | 281 NaClErrorCode error_code = ValidateElfHeader(data->ehdr); |
| 282 if (error_code != LOAD_OK) | 282 if (error_code != LOAD_OK) |
| 283 return error_code; | 283 return error_code; |
| 284 | 284 |
| 285 // Read program headers. | 285 // Read program headers. |
| 286 if (data->ehdr.e_phnum > Data::MAX_PROGRAM_HEADERS) { | 286 if (data->ehdr.e_phnum > Data::MAX_PROGRAM_HEADERS) { |
| 287 LOG(ERROR) << "Too many program headers"; | 287 LOG(ERROR) << "Too many program headers"; |
| 288 return LOAD_TOO_MANY_PROG_HDRS; | 288 return LOAD_TOO_MANY_PROG_HDRS; |
| 289 } | 289 } |
| 290 | 290 |
| 291 if (data->ehdr.e_phentsize != sizeof(data->phdrs[0])) { | 291 if (data->ehdr.e_phentsize != sizeof(data->phdrs[0])) { |
| 292 LOG(ERROR) << "Bad program headers size\n" | 292 LOG(ERROR) << "Bad program headers size\n" |
| 293 << " ehdr_.e_phentsize = " << data->ehdr.e_phentsize << "\n" | 293 << " ehdr_.e_phentsize = " << data->ehdr.e_phentsize << "\n" |
| 294 << " sizeof phdrs[0] = " << sizeof(data->phdrs[0]); | 294 << " sizeof phdrs[0] = " << sizeof(data->phdrs[0]); |
| 295 return LOAD_BAD_PHENTSIZE; | 295 return LOAD_BAD_PHENTSIZE; |
| 296 } | 296 } |
| 297 | 297 |
| 298 // We avoid the use of pread here to reduce the number of required | |
| 299 // syscalls for non-SFI mode. | |
| 300 off_t ret = (*NACL_VTBL(NaClDesc, descriptor)->Seek)( | |
| 301 descriptor, data->ehdr.e_phoff, SEEK_SET); | |
| 302 if (ret != static_cast<off_t>(data->ehdr.e_phoff)) { | |
| 303 LOG(ERROR) << "Cannot load prog headers"; | |
| 304 return LOAD_READ_ERROR; | |
| 305 } | |
| 306 | |
| 298 size_t read_size = data->ehdr.e_phnum * data->ehdr.e_phentsize; | 307 size_t read_size = data->ehdr.e_phnum * data->ehdr.e_phentsize; |
| 299 read_ret = (*NACL_VTBL(NaClDesc, descriptor)->PRead)( | 308 read_ret = (*NACL_VTBL(NaClDesc, descriptor)->Read)( |
| 300 descriptor, data->phdrs, read_size, data->ehdr.e_phoff); | 309 descriptor, data->phdrs, read_size); |
| 301 | 310 |
| 302 if (NaClSSizeIsNegErrno(&read_ret) || | 311 if (NaClSSizeIsNegErrno(&read_ret) || |
| 303 static_cast<size_t>(read_ret) != read_size) { | 312 static_cast<size_t>(read_ret) != read_size) { |
| 304 LOG(ERROR) << "Cannot load prog headers"; | 313 LOG(ERROR) << "Cannot load prog headers"; |
| 305 return LOAD_READ_ERROR; | 314 return LOAD_READ_ERROR; |
| 306 } | 315 } |
| 307 | 316 |
| 308 data_.swap(data); | 317 data_.swap(data); |
| 309 return LOAD_OK; | 318 return LOAD_OK; |
| 310 } | 319 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 327 if (error != LOAD_OK) { | 336 if (error != LOAD_OK) { |
| 328 LOG(ERROR) << "ElfImage::Load: Failed to load segments"; | 337 LOG(ERROR) << "ElfImage::Load: Failed to load segments"; |
| 329 return error; | 338 return error; |
| 330 } | 339 } |
| 331 | 340 |
| 332 return LOAD_OK; | 341 return LOAD_OK; |
| 333 } | 342 } |
| 334 | 343 |
| 335 } // namespace nonsfi | 344 } // namespace nonsfi |
| 336 } // namespace nacl | 345 } // namespace nacl |
| OLD | NEW |