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

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" 11
12 #include "native_client/src/include/elf32.h"
13 #include "native_client/src/include/elf64.h"
14 #include "native_client/src/trusted/validator_ragel/unreviewed/validator.h"
14 15
15 #undef TRUE 16 #undef TRUE
16 #define TRUE 1 17 #define TRUE 1
17 18
18 #undef FALSE 19 #undef FALSE
19 #define FALSE 0 20 #define FALSE 0
20 21
21 /* This may help with portability but makes code less readable. */ 22 #ifdef __GNUC__
22 #pragma GCC diagnostic ignored "-Wdeclaration-after-statement" 23 /* We only use argyuments in assert(3) and that generates warnings in release
24 mode. */
25 #pragma GCC diagnostic ignored "-Wunused-parameter"
26 #endif
23 27
24 static void CheckBounds(unsigned char *data, size_t data_size, 28 static void CheckBounds(unsigned char *data, size_t data_size,
25 void *ptr, size_t inside_size) { 29 void *ptr, size_t inside_size) {
26 assert(data <= (unsigned char *) ptr); 30 assert(data <= (unsigned char *) ptr);
27 assert((unsigned char *) ptr + inside_size <= data + data_size); 31 assert((unsigned char *) ptr + inside_size <= data + data_size);
28 } 32 }
29 33
30 void ReadFile(const char *filename, uint8_t **result, size_t *result_size) { 34 void ReadImage(const char *filename, uint8_t **result, size_t *result_size) {
31 FILE *fp; 35 FILE *fp;
32 uint8_t *data; 36 uint8_t *data;
33 size_t file_size; 37 size_t file_size;
34 size_t got; 38 size_t got;
35 39
36 fp = fopen(filename, "rb"); 40 fp = fopen(filename, "rb");
37 if (fp == NULL) { 41 if (fp == NULL) {
38 fprintf(stderr, "Failed to open input file: %s\n", filename); 42 fprintf(stderr, "Failed to open input file: %s\n", filename);
39 exit(1); 43 exit(1);
40 } 44 }
(...skipping 18 matching lines...) Expand all
59 *result = data; 63 *result = data;
60 *result_size = file_size; 64 *result_size = file_size;
61 } 65 }
62 66
63 struct ValidateState { 67 struct ValidateState {
64 uint8_t width; 68 uint8_t width;
65 const uint8_t *offset; 69 const uint8_t *offset;
66 }; 70 };
67 71
68 void ProcessError (const uint8_t *ptr, void *userdata) { 72 void ProcessError (const uint8_t *ptr, void *userdata) {
69 printf("offset 0x%zx: DFA error in validator\n", 73 printf("offset 0x%"NACL_PRIxS": DFA error in validator\n",
70 ptr - (((struct ValidateState *)userdata)->offset)); 74 ptr - (((struct ValidateState *)userdata)->offset));
71 } 75 }
72 76
73 int ValidateFile(const char *filename, int repeat_count) { 77 int ValidateFile(const char *filename, int repeat_count) {
74 size_t data_size; 78 size_t data_size;
75 uint8_t *data; 79 uint8_t *data;
76 ReadFile(filename, &data, &data_size); 80 int count;
77 81
78 int count; 82 ReadImage(filename, &data, &data_size);
83
79 if (data[4] == 1) { 84 if (data[4] == 1) {
80 for (count = 0; count < repeat_count; ++count) { 85 for (count = 0; count < repeat_count; ++count) {
81 Elf32_Ehdr *header; 86 Elf32_Ehdr *header;
82 int index; 87 int index;
83 88
84 header = (Elf32_Ehdr *) data; 89 header = (Elf32_Ehdr *) data;
85 CheckBounds(data, data_size, header, sizeof(*header)); 90 CheckBounds(data, data_size, header, sizeof(*header));
86 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0); 91 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
87 92
88 for (index = 0; index < header->e_shnum; ++index) { 93 for (index = 0; index < header->e_shnum; ++index) {
89 Elf32_Shdr *section = (Elf32_Shdr *) (data + header->e_shoff + 94 Elf32_Shdr *section = (Elf32_Shdr *) (data + header->e_shoff +
90 header->e_shentsize * index); 95 header->e_shentsize * index);
91 CheckBounds(data, data_size, section, sizeof(*section)); 96 CheckBounds(data, data_size, section, sizeof(*section));
92 97
93 if ((section->sh_flags & SHF_EXECINSTR) != 0) { 98 if ((section->sh_flags & SHF_EXECINSTR) != 0) {
94 struct ValidateState state; 99 struct ValidateState state;
100 int res;
101
95 state.offset = data + section->sh_offset - section->sh_addr; 102 state.offset = data + section->sh_offset - section->sh_addr;
96 if (section->sh_size <= 0xfff) { 103 if (section->sh_size <= 0xfff) {
97 state.width = 4; 104 state.width = 4;
98 } else if (section->sh_size <= 0xfffffff) { 105 } else if (section->sh_size <= 0xfffffff) {
99 state.width = 8; 106 state.width = 8;
100 } else { 107 } else {
101 state.width = 12; 108 state.width = 12;
102 } 109 }
103 CheckBounds(data, data_size, 110 CheckBounds(data, data_size,
104 data + section->sh_offset, section->sh_size); 111 data + section->sh_offset, section->sh_size);
105 int res = ValidateChunkIA32(data + section->sh_offset, 112 res = ValidateChunkIA32(data + section->sh_offset,
106 section->sh_size, ProcessError, &state); 113 section->sh_size, ProcessError, &state);
107 if (res != 0) { 114 if (res != 0) {
108 return res; 115 return res;
109 } 116 }
110 } 117 }
111 } 118 }
112 } 119 }
113 } else if (data[4] == 2) { 120 } else if (data[4] == 2) {
114 for (count = 0; count < repeat_count; ++count) { 121 for (count = 0; count < repeat_count; ++count) {
115 Elf64_Ehdr *header; 122 Elf64_Ehdr *header;
116 int index; 123 int index;
117 124
118 header = (Elf64_Ehdr *) data; 125 header = (Elf64_Ehdr *) data;
119 CheckBounds(data, data_size, header, sizeof(*header)); 126 CheckBounds(data, data_size, header, sizeof(*header));
120 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0); 127 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
121 128
122 for (index = 0; index < header->e_shnum; ++index) { 129 for (index = 0; index < header->e_shnum; ++index) {
123 Elf64_Shdr *section = (Elf64_Shdr *) (data + header->e_shoff + 130 Elf64_Shdr *section = (Elf64_Shdr *) (data + header->e_shoff +
124 header->e_shentsize * index); 131 header->e_shentsize * index);
125 CheckBounds(data, data_size, section, sizeof(*section)); 132 CheckBounds(data, data_size, section, sizeof(*section));
126 133
127 if ((section->sh_flags & SHF_EXECINSTR) != 0) { 134 if ((section->sh_flags & SHF_EXECINSTR) != 0) {
128 struct ValidateState state; 135 struct ValidateState state;
136 int res;
137
129 state.offset = data + section->sh_offset - section->sh_addr; 138 state.offset = data + section->sh_offset - section->sh_addr;
130 if (section->sh_size <= 0xfff) { 139 if (section->sh_size <= 0xfff) {
131 state.width = 4; 140 state.width = 4;
132 } else if (section->sh_size <= 0xfffffff) { 141 } else if (section->sh_size <= 0xfffffff) {
133 state.width = 8; 142 state.width = 8;
134 } else if (section->sh_size <= 0xfffffffffffLL) { 143 } else if (section->sh_size <= 0xfffffffffffLL) {
135 state.width = 12; 144 state.width = 12;
136 } else { 145 } else {
137 state.width = 16; 146 state.width = 16;
138 } 147 }
139 CheckBounds(data, data_size, 148 CheckBounds(data, data_size,
140 data + section->sh_offset, section->sh_size); 149 data + section->sh_offset, section->sh_size);
141 int res = ValidateChunkAMD64(data + section->sh_offset, 150 res = ValidateChunkAMD64(data + section->sh_offset,
142 section->sh_size, ProcessError, &state); 151 section->sh_size, ProcessError, &state);
143 if (res != 0) { 152 if (res != 0) {
144 return res; 153 return res;
145 } 154 }
146 } 155 }
147 } 156 }
148 } 157 }
149 } else { 158 } else {
150 printf("Unknown ELF class: %s\n", filename); 159 printf("Unknown ELF class: %s\n", filename);
151 exit(1); 160 exit(1);
(...skipping 12 matching lines...) Expand all
164 for (index = initial_index; index < argc; ++index) { 173 for (index = initial_index; index < argc; ++index) {
165 const char *filename = argv[index]; 174 const char *filename = argv[index];
166 int rc = ValidateFile(filename, repeat_count); 175 int rc = ValidateFile(filename, repeat_count);
167 if (rc != 0) { 176 if (rc != 0) {
168 printf("file '%s' can not be fully validated\n", filename); 177 printf("file '%s' can not be fully validated\n", filename);
169 return 1; 178 return 1;
170 } 179 }
171 } 180 }
172 return 0; 181 return 0;
173 } 182 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698