diff options
| -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; |
