struct NaClPhdrChecks nacl_phdr_check_data[] = {
/* phdr */
{ PT_PHDR, PF_R, PCA_IGNORE, 0, 0, },
- /* rodata */
- { PT_LOAD, PF_R, PCA_NONE, 0, 0, },
/* text */
- { PT_LOAD, PF_R|PF_X, PCA_TEXT_CHECK, 1, 0, },
+ { PT_LOAD, PF_R|PF_X, PCA_TEXT_CHECK, 1, NACL_TRAMPOLINE_END, },
/* rodata */
{ PT_LOAD, PF_R, PCA_NONE, 0, 0, },
/* data/bss */
@@ -111,9 +109,12 @@ NaClErrorCode NaClProcessPhdrs(struct NaClApp *nap)
j < sizeof nacl_phdr_check_data/sizeof nacl_phdr_check_data[0];
++j) {
if (php->p_type == nacl_phdr_check_data[j].p_type
- && php->p_flags == nacl_phdr_check_data[j].p_flags
- && !seen_seg[j]) {
+ && php->p_flags == nacl_phdr_check_data[j].p_flags) {
NaClLog(2, "Matched nacl_phdr_check_data[%"PRIdS"]\n", j);
+ if (seen_seg[j]) {
+ NaClLog(2, "Segment %d is a type that has been seen\n", segnum);
+ return LOAD_DUP_SEGMENT;
+ }
++seen_seg[j];
if (PCA_IGNORE == nacl_phdr_check_data[j].action) {