Changes in / [b6061f8c:c7c6afd] in mainline
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
common/stdc/uchar.c
rb6061f8c rc7c6afd 84 84 } 85 85 86 static bool _is_non_shortest(unsigned short cont, uint8_t b)87 {88 return (cont == 0b1111110000000000 && !(b & 0b00100000)) ||89 (cont == 0b1111111111110000 && !(b & 0b00110000));90 }91 92 86 size_t mbrtoc32(char32_t *c, const char *s, size_t n, mbstate_t *mb) 93 87 { … … 145 139 146 140 if (_is_2_byte(b)) { 147 /* Reject non-shortest form. */148 if (!(b & 0b00011110)) {149 _set_ilseq();150 return UCHAR_ILSEQ;151 }152 153 141 /* 2 byte encoding 110xxxxx */ 154 142 mb->continuation = b ^ 0b0000000011000000; … … 164 152 } 165 153 166 for (; i < n; i++) {154 while (i < n) { 167 155 /* Read continuation bytes. */ 168 uint8_t b = s[i]; 169 170 if (!_is_continuation(b) || _is_non_shortest(mb->continuation, b)) { 156 157 if (!_is_continuation(s[i])) { 171 158 _set_ilseq(); 172 159 return UCHAR_ILSEQ; … … 175 162 /* Top bit becomes zero just before the last byte is shifted in. */ 176 163 if (!(mb->continuation & 0x8000)) { 177 *c = ((char32_t) mb->continuation) << 6 | ( b& 0x3f);164 *c = ((char32_t) mb->continuation) << 6 | (s[i++] & 0x3f); 178 165 mb->continuation = 0; 179 return ++i;180 } 181 182 mb->continuation = mb->continuation << 6 | ( b& 0x3f);166 return i; 167 } 168 169 mb->continuation = mb->continuation << 6 | (s[i++] & 0x3f); 183 170 } 184 171 -
common/str.c
rb6061f8c rc7c6afd 156 156 static inline int _char_continuation_bytes(char32_t c) 157 157 { 158 if ((c & ~LO_MASK_32(7)) == 0)159 return 0;160 161 158 if ((c & ~LO_MASK_32(11)) == 0) 162 159 return 1; … … 210 207 char32_t str_decode(const char *str, size_t *offset, size_t size) 211 208 { 212 if (*offset >=size)209 if (*offset + 1 > size) 213 210 return 0; 214 211 … … 226 223 /* Determine code length */ 227 224 228 int cbytes = _continuation_bytes(b0);229 int b0_bits = 6 - cbytes; /* Data bits in first byte */230 231 if ( cbytes < 0 ||*offset + cbytes > size)225 unsigned int cbytes = _continuation_bytes(b0); 226 unsigned int b0_bits = 6 - cbytes; /* Data bits in first byte */ 227 228 if (*offset + cbytes > size) 232 229 return U_SPECIAL; 233 230 … … 235 232 236 233 /* Decode continuation bytes */ 237 for (int i = 0; i < cbytes; i++) {238 uint8_t b = (uint8_t) str[ *offset];234 while (cbytes > 0) { 235 uint8_t b = (uint8_t) str[(*offset)++]; 239 236 240 237 if (!_is_continuation_byte(b)) 241 238 return U_SPECIAL; 242 239 243 (*offset)++;244 245 240 /* Shift data bits to ch */ 246 241 ch = (ch << CONT_BITS) | (char32_t) (b & LO_MASK_8(CONT_BITS)); 247 } 248 249 /* 250 * Reject non-shortest form encodings. 251 * See https://www.unicode.org/versions/corrigendum1.html 252 */ 253 if (cbytes != _char_continuation_bytes(ch)) 254 return U_SPECIAL; 242 cbytes--; 243 } 255 244 256 245 return ch; … … 356 345 357 346 /* Convert in place any bytes that don't form a valid character into U_SPECIAL. */ 358 static void _sanitize_string(char *str, size_t n) 359 { 360 uint8_t *b = (uint8_t *) str; 361 362 for (; *b && n > 0; b++, n--) { 363 int cont = _continuation_bytes(b[0]); 364 if (__builtin_expect(cont, 0) == 0) 347 static void _repair_string(char *str, size_t n) 348 { 349 for (; *str && n > 0; str++, n--) { 350 int cont = _continuation_bytes(*str); 351 if (cont == 0) 365 352 continue; 366 353 367 354 if (cont < 0 || n <= (size_t) cont) { 368 b[0]= U_SPECIAL;355 *str = U_SPECIAL; 369 356 continue; 370 357 } 371 358 372 /* Check continuation bytes. */373 359 for (int i = 1; i <= cont; i++) { 374 if (!_is_continuation_byte( b[i])) {375 b[0]= U_SPECIAL;360 if (!_is_continuation_byte(str[i])) { 361 *str = U_SPECIAL; 376 362 continue; 377 363 } 378 }379 380 /*381 * Check for non-shortest form encoding.382 * See https://www.unicode.org/versions/corrigendum1.html383 */384 385 switch (cont) {386 case 1:387 /* 0b110!!!!x 0b10xxxxxx */388 if (!(b[0] & 0b00011110))389 b[0] = U_SPECIAL;390 391 continue;392 case 2:393 /* 0b1110!!!! 0b10!xxxxx 0b10xxxxxx */394 if (!(b[0] & 0b00001111) && !(b[1] & 0b00100000))395 b[0] = U_SPECIAL;396 397 continue;398 case 3:399 /* 0b11110!!! 0b10!!xxxx 0b10xxxxxx 0b10xxxxxx */400 if (!(b[0] & 0b00000111) && !(b[1] & 0b00110000))401 b[0] = U_SPECIAL;402 403 continue;404 364 } 405 365 } … … 921 881 static void _str_cpyn(char *dest, size_t size, const char *src) 922 882 { 923 assert(dest && src && size);924 925 if (!dest || !src || !size)926 return;927 928 if (size == STR_NO_LIMIT)929 return _str_cpy(dest, src);930 931 883 char *dest_top = dest + size - 1; 932 assert(size == 1 || dest < dest_top);933 884 934 885 while (*src && dest < dest_top) … … 956 907 assert(src != NULL); 957 908 assert(dest != NULL); 958 assert(size == STR_NO_LIMIT || dest + size > dest);959 909 960 910 /* Copy data. */ … … 962 912 963 913 /* In-place translate invalid bytes to U_SPECIAL. */ 964 _ sanitize_string(dest, size);914 _repair_string(dest, size); 965 915 } 966 916 … … 991 941 992 942 /* In-place translate invalid bytes to U_SPECIAL. */ 993 _ sanitize_string(dest, size);943 _repair_string(dest, size); 994 944 } 995 945 … … 1010 960 assert(dest != NULL); 1011 961 assert(size > 0); 1012 assert(size == STR_NO_LIMIT || dest + size > dest);1013 962 1014 963 size_t dstr_size = _str_nsize(dest, size); 1015 if (dstr_size < size) { 1016 _str_cpyn(dest + dstr_size, size - dstr_size, src); 1017 _sanitize_string(dest + dstr_size, size - dstr_size); 1018 } 964 _str_cpyn(dest + dstr_size, size - dstr_size, src); 965 _repair_string(dest + dstr_size, size - dstr_size); 1019 966 } 1020 967 … … 1593 1540 return NULL; 1594 1541 1595 memcpy(dest, src, size);1596 _ sanitize_string(dest, size);1542 _str_cpy(dest, src); 1543 _repair_string(dest, size); 1597 1544 return dest; 1598 1545 } … … 1620 1567 char *str_ndup(const char *src, size_t n) 1621 1568 { 1622 size_t size = _str_nsize(src, n) ;1623 1624 char *dest = malloc(size + 1);1569 size_t size = _str_nsize(src, n) + 1; 1570 1571 char *dest = malloc(size); 1625 1572 if (!dest) 1626 1573 return NULL; 1627 1574 1628 memcpy(dest, src, size); 1629 _sanitize_string(dest, size); 1630 dest[size] = 0; 1575 _str_cpyn(dest, size, src); 1576 _repair_string(dest, size); 1631 1577 return dest; 1632 1578 } -
uspace/app/sysinst/sysinst.c
rb6061f8c rc7c6afd 72 72 */ 73 73 #define DEFAULT_DEV_0 "devices/\\hw\\sys\\00:01.1\\c0d0" 74 #define DEFAULT_DEV_1 "devices/\\hw\\sys\\ ide1\\c0d0"74 #define DEFAULT_DEV_1 "devices/\\hw\\sys\\00:01.0\\ide1\\c0d0" 75 75 //#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0" 76 76 /** Volume label for the new file system */ -
uspace/drv/block/isa-ide/main.c
rb6061f8c rc7c6afd 169 169 isa_ide_ctrl_t *ctrl; 170 170 isa_ide_hwres_t res; 171 unsigned chans;172 171 errno_t rc; 173 172 … … 188 187 ctrl->dev = dev; 189 188 190 chans = 0;191 192 189 rc = isa_ide_channel_init(ctrl, &ctrl->channel[0], 0, &res); 193 if (rc == EOK) 194 ++chans; 195 else if (rc != ENOENT) 190 if (rc == ENOENT) 196 191 goto error; 197 192 198 193 rc = isa_ide_channel_init(ctrl, &ctrl->channel[1], 1, &res); 199 if (rc == EOK) 200 ++chans; 201 else if (rc != ENOENT) 202 goto error; 203 204 if (chans == 0) { 205 ddf_msg(LVL_ERROR, "No ISA IDE devices found."); 194 if (rc == ENOENT) 195 goto error; 196 197 if (rc != EOK) { 198 ddf_msg(LVL_ERROR, "Failed initializing ATA controller."); 206 199 rc = EIO; 207 200 goto error; -
uspace/drv/block/pci-ide/main.c
rb6061f8c rc7c6afd 136 136 pci_ide_hwres_t res; 137 137 async_sess_t *parent_sess; 138 unsigned chans;139 138 errno_t rc; 140 139 … … 158 157 goto error; 159 158 160 chans = 0;161 162 159 rc = pci_ide_channel_init(ctrl, &ctrl->channel[0], 0, &res); 163 if (rc == EOK) 164 ++chans; 165 else if (rc != ENOENT) 160 if (rc == ENOENT) 166 161 goto error; 167 162 168 163 rc = pci_ide_channel_init(ctrl, &ctrl->channel[1], 1, &res); 169 if (rc == EOK) 170 ++chans; 171 else if (rc != ENOENT) 172 goto error; 173 174 if (chans == 0) { 175 ddf_msg(LVL_ERROR, "No PCI IDE devices found."); 164 if (rc == ENOENT) 165 goto error; 166 167 if (rc != EOK) { 168 ddf_msg(LVL_ERROR, "Failed initializing ATA controller."); 176 169 rc = EIO; 177 170 goto error; -
uspace/lib/c/test/adt/odict.c
rb6061f8c rc7c6afd 233 233 234 234 e->key = v; 235 odict_insert(&e->odict, &odict, ep ? &ep->odict : NULL);235 odict_insert(&e->odict, &odict, &ep->odict); 236 236 PCUT_ASSERT_ERRNO_VAL(EOK, odict_validate(&odict)); 237 237 v = seq_next(v); -
uspace/lib/c/test/str.c
rb6061f8c rc7c6afd 27 27 */ 28 28 29 #include "pcut/asserts.h"30 29 #include <stdio.h> 31 30 #include <str.h> … … 116 115 } 117 116 118 PCUT_TEST(str_non_shortest)119 {120 /* Overlong zero. */121 const char overlong1[] = { 0b11000000, 0b10000000, 0 };122 const char overlong2[] = { 0b11100000, 0b10000000, 0 };123 const char overlong3[] = { 0b11110000, 0b10000000, 0 };124 125 const char overlong4[] = { 0b11000001, 0b10111111, 0 };126 const char overlong5[] = { 0b11100000, 0b10011111, 0b10111111, 0 };127 const char overlong6[] = { 0b11110000, 0b10001111, 0b10111111, 0b10111111, 0 };128 129 size_t offset = 0;130 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong1, &offset, sizeof(overlong1)));131 offset = 0;132 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong2, &offset, sizeof(overlong2)));133 offset = 0;134 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong3, &offset, sizeof(overlong3)));135 offset = 0;136 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong4, &offset, sizeof(overlong4)));137 offset = 0;138 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong5, &offset, sizeof(overlong5)));139 offset = 0;140 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, str_decode(overlong6, &offset, sizeof(overlong6)));141 142 char sanitized[sizeof(overlong6)];143 str_cpy(sanitized, STR_NO_LIMIT, overlong1);144 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);145 str_cpy(sanitized, STR_NO_LIMIT, overlong2);146 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);147 str_cpy(sanitized, STR_NO_LIMIT, overlong3);148 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);149 str_cpy(sanitized, STR_NO_LIMIT, overlong4);150 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);151 str_cpy(sanitized, STR_NO_LIMIT, overlong5);152 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);153 str_cpy(sanitized, STR_NO_LIMIT, overlong6);154 PCUT_ASSERT_INT_EQUALS(U_SPECIAL, sanitized[0]);155 }156 157 117 PCUT_EXPORT(str);
Note:
See TracChangeset
for help on using the changeset viewer.