Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(551)

Side by Side Diff: src/trusted/validator_ragel/unreviewed/validator-test.c

Issue 9968039: Add ragel machine generators to SCONS (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 #include <assert.h> 7 #include <assert.h>
8 #include <elf.h>
9 #include <inttypes.h>
10 #include <stdio.h> 8 #include <stdio.h>
11 #include <stdlib.h> 9 #include <stdlib.h>
12 #include <string.h> 10 #include <string.h>
13 #include "validator.h"
14 11
15 #undef TRUE 12 #include "native_client/src/include/elf32.h"
16 #define TRUE 1 13 #include "native_client/src/include/elf64.h"
14 #include "native_client/src/shared/platform/nacl_check.h"
15 #include "native_client/src/shared/utils/types.h"
16 #include "native_client/src/trusted/validator_ragel/unreviewed/validator.h"
17 17
18 #undef FALSE 18 /* This is a copy of NaClLog_Function from shared/platform/nacl_log.c to avoid
19 #define FALSE 0 19 * linking in code in NaCl shared code in the unreviewed/Makefile and be able to
20 * use CHECK().
20 21
21 /* This may help with portability but makes code less readable. */ 22 * TODO(khim): remove the copy of NaClLog_Function implementation as soon as
22 #pragma GCC diagnostic ignored "-Wdeclaration-after-statement" 23 *unreviewed/Makefile is eliminated.
24 */
25 void NaClLog_Function(int detail_level, char const *fmt, ...) {
26 va_list ap;
27
28 va_start(ap, fmt);
29 vfprintf(stderr, fmt, ap);
30 exit(1);
31 NaClLogV_mu(detail_level, fmt, ap);
32 va_end(ap);
33 NaClLogUnlock();
34 }
23 35
24 static void CheckBounds(unsigned char *data, size_t data_size, 36 static void CheckBounds(unsigned char *data, size_t data_size,
25 void *ptr, size_t inside_size) { 37 void *ptr, size_t inside_size) {
26 assert(data <= (unsigned char *) ptr); 38 CHECK(data <= (unsigned char *) ptr);
27 assert((unsigned char *) ptr + inside_size <= data + data_size); 39 CHECK((unsigned char *) ptr + inside_size <= data + data_size);
28 } 40 }
29 41
30 void ReadFile(const char *filename, uint8_t **result, size_t *result_size) { 42 void ReadImage(const char *filename, uint8_t **result, size_t *result_size) {
31 FILE *fp; 43 FILE *fp;
32 uint8_t *data; 44 uint8_t *data;
33 size_t file_size; 45 size_t file_size;
34 size_t got; 46 size_t got;
35 47
36 fp = fopen(filename, "rb"); 48 fp = fopen(filename, "rb");
37 if (fp == NULL) { 49 if (fp == NULL) {
38 fprintf(stderr, "Failed to open input file: %s\n", filename); 50 fprintf(stderr, "Failed to open input file: %s\n", filename);
39 exit(1); 51 exit(1);
40 } 52 }
(...skipping 18 matching lines...) Expand all
59 *result = data; 71 *result = data;
60 *result_size = file_size; 72 *result_size = file_size;
61 } 73 }
62 74
63 struct ValidateState { 75 struct ValidateState {
64 uint8_t width; 76 uint8_t width;
65 const uint8_t *offset; 77 const uint8_t *offset;
66 }; 78 };
67 79
68 void ProcessError (const uint8_t *ptr, void *userdata) { 80 void ProcessError (const uint8_t *ptr, void *userdata) {
69 printf("offset 0x%zx: DFA error in validator\n", 81 printf("offset 0x%"NACL_PRIxS": DFA error in validator\n",
70 ptr - (((struct ValidateState *)userdata)->offset)); 82 ptr - (((struct ValidateState *)userdata)->offset));
71 } 83 }
72 84
73 int ValidateFile(const char *filename, int repeat_count) { 85 int ValidateFile(const char *filename, int repeat_count) {
74 size_t data_size; 86 size_t data_size;
75 uint8_t *data; 87 uint8_t *data;
76 ReadFile(filename, &data, &data_size); 88 int count;
77 89
78 int count; 90 ReadImage(filename, &data, &data_size);
91
79 if (data[4] == 1) { 92 if (data[4] == 1) {
80 for (count = 0; count < repeat_count; ++count) { 93 for (count = 0; count < repeat_count; ++count) {
81 Elf32_Ehdr *header; 94 Elf32_Ehdr *header;
82 int index; 95 int index;
83 96
84 header = (Elf32_Ehdr *) data; 97 header = (Elf32_Ehdr *) data;
85 CheckBounds(data, data_size, header, sizeof(*header)); 98 CheckBounds(data, data_size, header, sizeof(*header));
86 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0); 99 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
87 100
88 for (index = 0; index < header->e_shnum; ++index) { 101 for (index = 0; index < header->e_shnum; ++index) {
89 Elf32_Shdr *section = (Elf32_Shdr *) (data + header->e_shoff + 102 Elf32_Shdr *section = (Elf32_Shdr *) (data + header->e_shoff +
90 header->e_shentsize * index); 103 header->e_shentsize * index);
91 CheckBounds(data, data_size, section, sizeof(*section)); 104 CheckBounds(data, data_size, section, sizeof(*section));
92 105
93 if ((section->sh_flags & SHF_EXECINSTR) != 0) { 106 if ((section->sh_flags & SHF_EXECINSTR) != 0) {
94 struct ValidateState state; 107 struct ValidateState state;
108 int res;
109
95 state.offset = data + section->sh_offset - section->sh_addr; 110 state.offset = data + section->sh_offset - section->sh_addr;
96 if (section->sh_size <= 0xfff) { 111 if (section->sh_size <= 0xfff) {
97 state.width = 4; 112 state.width = 4;
98 } else if (section->sh_size <= 0xfffffff) { 113 } else if (section->sh_size <= 0xfffffff) {
99 state.width = 8; 114 state.width = 8;
100 } else { 115 } else {
101 state.width = 12; 116 state.width = 12;
102 } 117 }
103 CheckBounds(data, data_size, 118 CheckBounds(data, data_size,
104 data + section->sh_offset, section->sh_size); 119 data + section->sh_offset, section->sh_size);
105 int res = ValidateChunkIA32(data + section->sh_offset, 120 res = ValidateChunkIA32(data + section->sh_offset,
106 section->sh_size, ProcessError, &state); 121 section->sh_size, ProcessError, &state);
107 if (res != 0) { 122 if (res != 0) {
108 return res; 123 return res;
109 } 124 }
110 } 125 }
111 } 126 }
112 } 127 }
113 } else if (data[4] == 2) { 128 } else if (data[4] == 2) {
114 for (count = 0; count < repeat_count; ++count) { 129 for (count = 0; count < repeat_count; ++count) {
115 Elf64_Ehdr *header; 130 Elf64_Ehdr *header;
116 int index; 131 int index;
117 132
118 header = (Elf64_Ehdr *) data; 133 header = (Elf64_Ehdr *) data;
119 CheckBounds(data, data_size, header, sizeof(*header)); 134 CheckBounds(data, data_size, header, sizeof(*header));
120 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0); 135 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
121 136
122 for (index = 0; index < header->e_shnum; ++index) { 137 for (index = 0; index < header->e_shnum; ++index) {
123 Elf64_Shdr *section = (Elf64_Shdr *) (data + header->e_shoff + 138 Elf64_Shdr *section = (Elf64_Shdr *) (data + header->e_shoff +
124 header->e_shentsize * index); 139 header->e_shentsize * index);
125 CheckBounds(data, data_size, section, sizeof(*section)); 140 CheckBounds(data, data_size, section, sizeof(*section));
126 141
127 if ((section->sh_flags & SHF_EXECINSTR) != 0) { 142 if ((section->sh_flags & SHF_EXECINSTR) != 0) {
128 struct ValidateState state; 143 struct ValidateState state;
144 int res;
145
129 state.offset = data + section->sh_offset - section->sh_addr; 146 state.offset = data + section->sh_offset - section->sh_addr;
130 if (section->sh_size <= 0xfff) { 147 if (section->sh_size <= 0xfff) {
131 state.width = 4; 148 state.width = 4;
132 } else if (section->sh_size <= 0xfffffff) { 149 } else if (section->sh_size <= 0xfffffff) {
133 state.width = 8; 150 state.width = 8;
134 } else if (section->sh_size <= 0xfffffffffffLL) { 151 } else if (section->sh_size <= 0xfffffffffffLL) {
135 state.width = 12; 152 state.width = 12;
136 } else { 153 } else {
137 state.width = 16; 154 state.width = 16;
138 } 155 }
139 CheckBounds(data, data_size, 156 CheckBounds(data, data_size,
140 data + section->sh_offset, section->sh_size); 157 data + section->sh_offset, section->sh_size);
141 int res = ValidateChunkAMD64(data + section->sh_offset, 158 res = ValidateChunkAMD64(data + section->sh_offset,
142 section->sh_size, ProcessError, &state); 159 section->sh_size, ProcessError, &state);
143 if (res != 0) { 160 if (res != 0) {
144 return res; 161 return res;
145 } 162 }
146 } 163 }
147 } 164 }
148 } 165 }
149 } else { 166 } else {
150 printf("Unknown ELF class: %s\n", filename); 167 printf("Unknown ELF class: %s\n", filename);
151 exit(1); 168 exit(1);
(...skipping 12 matching lines...) Expand all
164 for (index = initial_index; index < argc; ++index) { 181 for (index = initial_index; index < argc; ++index) {
165 const char *filename = argv[index]; 182 const char *filename = argv[index];
166 int rc = ValidateFile(filename, repeat_count); 183 int rc = ValidateFile(filename, repeat_count);
167 if (rc != 0) { 184 if (rc != 0) {
168 printf("file '%s' can not be fully validated\n", filename); 185 printf("file '%s' can not be fully validated\n", filename);
169 return 1; 186 return 1;
170 } 187 }
171 } 188 }
172 return 0; 189 return 0;
173 } 190 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698