diff options
Diffstat (limited to 'security/selinux')
-rw-r--r-- | security/selinux/ss/ebitmap.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/security/selinux/ss/ebitmap.c b/security/selinux/ss/ebitmap.c index 4b915eb60c45..cfed1d30fa6a 100644 --- a/security/selinux/ss/ebitmap.c +++ b/security/selinux/ss/ebitmap.c | |||
@@ -145,29 +145,28 @@ int ebitmap_import(const unsigned char *src, | |||
145 | struct ebitmap *dst) | 145 | struct ebitmap *dst) |
146 | { | 146 | { |
147 | size_t src_off = 0; | 147 | size_t src_off = 0; |
148 | size_t node_limit; | ||
148 | struct ebitmap_node *node_new; | 149 | struct ebitmap_node *node_new; |
149 | struct ebitmap_node *node_last = NULL; | 150 | struct ebitmap_node *node_last = NULL; |
150 | size_t iter; | 151 | u32 i_byte; |
151 | size_t iter_bit; | 152 | u32 i_bit; |
152 | size_t iter_limit; | ||
153 | unsigned char src_byte; | 153 | unsigned char src_byte; |
154 | 154 | ||
155 | do { | 155 | while (src_off < src_len) { |
156 | iter_limit = src_len - src_off; | 156 | if (src_len - src_off >= sizeof(MAPTYPE)) { |
157 | if (iter_limit >= sizeof(MAPTYPE)) { | ||
158 | if (*(MAPTYPE *)&src[src_off] == 0) { | 157 | if (*(MAPTYPE *)&src[src_off] == 0) { |
159 | src_off += sizeof(MAPTYPE); | 158 | src_off += sizeof(MAPTYPE); |
160 | continue; | 159 | continue; |
161 | } | 160 | } |
162 | iter_limit = sizeof(MAPTYPE); | 161 | node_limit = sizeof(MAPTYPE); |
163 | } else { | 162 | } else { |
164 | iter = src_off; | 163 | for (src_byte = 0, i_byte = src_off; |
165 | src_byte = 0; | 164 | i_byte < src_len && src_byte == 0; |
166 | do { | 165 | i_byte++) |
167 | src_byte |= src[iter++]; | 166 | src_byte |= src[i_byte]; |
168 | } while (iter < src_len && src_byte == 0); | ||
169 | if (src_byte == 0) | 167 | if (src_byte == 0) |
170 | break; | 168 | break; |
169 | node_limit = src_len - src_off; | ||
171 | } | 170 | } |
172 | 171 | ||
173 | node_new = kzalloc(sizeof(*node_new), GFP_ATOMIC); | 172 | node_new = kzalloc(sizeof(*node_new), GFP_ATOMIC); |
@@ -176,24 +175,21 @@ int ebitmap_import(const unsigned char *src, | |||
176 | return -ENOMEM; | 175 | return -ENOMEM; |
177 | } | 176 | } |
178 | node_new->startbit = src_off * 8; | 177 | node_new->startbit = src_off * 8; |
179 | iter = 0; | 178 | for (i_byte = 0; i_byte < node_limit; i_byte++) { |
180 | do { | ||
181 | src_byte = src[src_off++]; | 179 | src_byte = src[src_off++]; |
182 | iter_bit = iter++ * 8; | 180 | for (i_bit = i_byte * 8; src_byte != 0; i_bit++) { |
183 | while (src_byte != 0) { | ||
184 | if (src_byte & 0x80) | 181 | if (src_byte & 0x80) |
185 | node_new->map |= MAPBIT << iter_bit; | 182 | node_new->map |= MAPBIT << i_bit; |
186 | iter_bit++; | ||
187 | src_byte <<= 1; | 183 | src_byte <<= 1; |
188 | } | 184 | } |
189 | } while (iter < iter_limit); | 185 | } |
190 | 186 | ||
191 | if (node_last != NULL) | 187 | if (node_last != NULL) |
192 | node_last->next = node_new; | 188 | node_last->next = node_new; |
193 | else | 189 | else |
194 | dst->node = node_new; | 190 | dst->node = node_new; |
195 | node_last = node_new; | 191 | node_last = node_new; |
196 | } while (src_off < src_len); | 192 | } |
197 | 193 | ||
198 | if (likely(node_last != NULL)) | 194 | if (likely(node_last != NULL)) |
199 | dst->highbit = node_last->startbit + MAPSIZE; | 195 | dst->highbit = node_last->startbit + MAPSIZE; |