| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2010 Mozilla Foundation | 2 * Copyright © 2010 Mozilla Foundation |
| 3 * | 3 * |
| 4 * This program is made available under an ISC-style license. See the | 4 * This program is made available under an ISC-style license. See the |
| 5 * accompanying file LICENSE for details. | 5 * accompanying file LICENSE for details. |
| 6 */ | 6 */ |
| 7 #include <assert.h> | 7 #include <assert.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 | 10 |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 else | 687 else |
| 688 *val = value.d; | 688 *val = value.d; |
| 689 return 1; | 689 return 1; |
| 690 } | 690 } |
| 691 | 691 |
| 692 static int | 692 static int |
| 693 ne_read_string(nestegg * ctx, char ** val, uint64_t length) | 693 ne_read_string(nestegg * ctx, char ** val, uint64_t length) |
| 694 { | 694 { |
| 695 char * str; | 695 char * str; |
| 696 int r; | 696 int r; |
| 697 const size_t alloc_size = (size_t)length + 1; |
| 697 | 698 |
| 698 if (length == 0 || length > LIMIT_STRING) | 699 if (length == 0 || length > LIMIT_STRING) |
| 699 return -1; | 700 return -1; |
| 700 str = ne_pool_alloc(length + 1, ctx->alloc_pool); | 701 str = ne_pool_alloc(alloc_size, ctx->alloc_pool); |
| 701 r = ne_io_read(ctx->io, (unsigned char *) str, length); | 702 r = ne_io_read(ctx->io, (unsigned char *) str, alloc_size - 1); |
| 702 if (r != 1) | 703 if (r != 1) |
| 703 return r; | 704 return r; |
| 704 str[length] = '\0'; | 705 str[alloc_size - 1] = '\0'; |
| 705 *val = str; | 706 *val = str; |
| 706 return 1; | 707 return 1; |
| 707 } | 708 } |
| 708 | 709 |
| 709 static int | 710 static int |
| 710 ne_read_binary(nestegg * ctx, struct ebml_binary * val, uint64_t length) | 711 ne_read_binary(nestegg * ctx, struct ebml_binary * val, uint64_t length) |
| 711 { | 712 { |
| 712 if (length == 0 || length > LIMIT_BINARY) | 713 if (length == 0 || length > LIMIT_BINARY) |
| 713 return -1; | 714 return -1; |
| 714 val->data = ne_pool_alloc(length, ctx->alloc_pool); | 715 val->length = (size_t)length; |
| 715 val->length = length; | 716 val->data = ne_pool_alloc(val->length, ctx->alloc_pool); |
| 716 return ne_io_read(ctx->io, val->data, length); | 717 return ne_io_read(ctx->io, val->data, val->length); |
| 717 } | 718 } |
| 718 | 719 |
| 719 static int | 720 static int |
| 720 ne_get_uint(struct ebml_type type, uint64_t * value) | 721 ne_get_uint(struct ebml_type type, uint64_t * value) |
| 721 { | 722 { |
| 722 if (!type.read) | 723 if (!type.read) |
| 723 return -1; | 724 return -1; |
| 724 | 725 |
| 725 assert(type.type == TYPE_UINT); | 726 assert(type.type == TYPE_UINT); |
| 726 | 727 |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 } | 1037 } |
| 1037 } | 1038 } |
| 1038 | 1039 |
| 1039 if (element->type == TYPE_MASTER) { | 1040 if (element->type == TYPE_MASTER) { |
| 1040 if (element->flags & DESC_FLAG_MULTI) | 1041 if (element->flags & DESC_FLAG_MULTI) |
| 1041 ne_read_master(ctx, element); | 1042 ne_read_master(ctx, element); |
| 1042 else | 1043 else |
| 1043 ne_read_single_master(ctx, element); | 1044 ne_read_single_master(ctx, element); |
| 1044 continue; | 1045 continue; |
| 1045 } else { | 1046 } else { |
| 1046 r = ne_read_simple(ctx, element, size); | 1047 r = ne_read_simple(ctx, element, (size_t)size); |
| 1047 if (r < 0) | 1048 if (r < 0) |
| 1048 break; | 1049 break; |
| 1049 } | 1050 } |
| 1050 } else if (ne_is_ancestor_element(id, ctx->ancestor->previous)) { | 1051 } else if (ne_is_ancestor_element(id, ctx->ancestor->previous)) { |
| 1051 ctx->log(ctx, NESTEGG_LOG_DEBUG, "parent element %llx", id); | 1052 ctx->log(ctx, NESTEGG_LOG_DEBUG, "parent element %llx", id); |
| 1052 if (top_level && ctx->ancestor->node == top_level) { | 1053 if (top_level && ctx->ancestor->node == top_level) { |
| 1053 ctx->log(ctx, NESTEGG_LOG_DEBUG, "*** parse about to back up past top_le
vel"); | 1054 ctx->log(ctx, NESTEGG_LOG_DEBUG, "*** parse about to back up past top_le
vel"); |
| 1054 r = 1; | 1055 r = 1; |
| 1055 break; | 1056 break; |
| 1056 } | 1057 } |
| 1057 ne_ctx_pop(ctx); | 1058 ne_ctx_pop(ctx); |
| 1058 } else { | 1059 } else { |
| 1059 r = ne_read_element(ctx, &id, &size); | 1060 r = ne_read_element(ctx, &id, &size); |
| 1060 if (r != 1) | 1061 if (r != 1) |
| 1061 break; | 1062 break; |
| 1062 | 1063 |
| 1063 if (id != ID_VOID && id != ID_CRC32) | 1064 if (id != ID_VOID && id != ID_CRC32) |
| 1064 ctx->log(ctx, NESTEGG_LOG_DEBUG, "unknown element %llx", id); | 1065 ctx->log(ctx, NESTEGG_LOG_DEBUG, "unknown element %llx", id); |
| 1065 r = ne_io_read_skip(ctx->io, size); | 1066 r = ne_io_read_skip(ctx->io, (size_t)size); |
| 1066 if (r != 1) | 1067 if (r != 1) |
| 1067 break; | 1068 break; |
| 1068 } | 1069 } |
| 1069 } | 1070 } |
| 1070 | 1071 |
| 1071 if (r != 1) | 1072 if (r != 1) |
| 1072 while (ctx->ancestor) | 1073 while (ctx->ancestor) |
| 1073 ne_ctx_pop(ctx); | 1074 ne_ctx_pop(ctx); |
| 1074 | 1075 |
| 1075 return r; | 1076 return r; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 ne_read_ebml_lacing(nestegg_io * io, size_t block, size_t * read, uint64_t n, ui
nt64_t * sizes) | 1145 ne_read_ebml_lacing(nestegg_io * io, size_t block, size_t * read, uint64_t n, ui
nt64_t * sizes) |
| 1145 { | 1146 { |
| 1146 int r; | 1147 int r; |
| 1147 uint64_t lace, sum, length; | 1148 uint64_t lace, sum, length; |
| 1148 int64_t slace; | 1149 int64_t slace; |
| 1149 size_t i = 0; | 1150 size_t i = 0; |
| 1150 | 1151 |
| 1151 r = ne_read_vint(io, &lace, &length); | 1152 r = ne_read_vint(io, &lace, &length); |
| 1152 if (r != 1) | 1153 if (r != 1) |
| 1153 return r; | 1154 return r; |
| 1154 *read += length; | 1155 assert(length <= 8); |
| 1156 *read += (size_t)length; |
| 1155 | 1157 |
| 1156 sizes[i] = lace; | 1158 sizes[i] = lace; |
| 1157 sum = sizes[i]; | 1159 sum = sizes[i]; |
| 1158 | 1160 |
| 1159 i += 1; | 1161 i += 1; |
| 1160 n -= 1; | 1162 n -= 1; |
| 1161 | 1163 |
| 1162 while (--n) { | 1164 while (--n) { |
| 1163 r = ne_read_svint(io, &slace, &length); | 1165 r = ne_read_svint(io, &slace, &length); |
| 1164 if (r != 1) | 1166 if (r != 1) |
| 1165 return r; | 1167 return r; |
| 1166 *read += length; | 1168 assert(length <= 8); |
| 1169 *read += (size_t)length; |
| 1167 sizes[i] = sizes[i - 1] + slace; | 1170 sizes[i] = sizes[i - 1] + slace; |
| 1168 sum += sizes[i]; | 1171 sum += sizes[i]; |
| 1169 i += 1; | 1172 i += 1; |
| 1170 } | 1173 } |
| 1171 | 1174 |
| 1172 if (*read + sum > block) | 1175 if (*read + sum > block) |
| 1173 return -1; | 1176 return -1; |
| 1174 | 1177 |
| 1175 /* Last frame is the remainder of the block. */ | 1178 /* Last frame is the remainder of the block. */ |
| 1176 sizes[i] = block - *read - sum; | 1179 sizes[i] = block - *read - sum; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 if (block_size > LIMIT_BLOCK) | 1259 if (block_size > LIMIT_BLOCK) |
| 1257 return -1; | 1260 return -1; |
| 1258 | 1261 |
| 1259 r = ne_read_vint(ctx->io, &track_number, &length); | 1262 r = ne_read_vint(ctx->io, &track_number, &length); |
| 1260 if (r != 1) | 1263 if (r != 1) |
| 1261 return r; | 1264 return r; |
| 1262 | 1265 |
| 1263 if (track_number == 0 || (unsigned int)track_number != track_number) | 1266 if (track_number == 0 || (unsigned int)track_number != track_number) |
| 1264 return -1; | 1267 return -1; |
| 1265 | 1268 |
| 1266 consumed += length; | 1269 assert(length <= 8); |
| 1270 consumed += (size_t)length; |
| 1267 | 1271 |
| 1268 r = ne_read_int(ctx->io, &timecode, 2); | 1272 r = ne_read_int(ctx->io, &timecode, 2); |
| 1269 if (r != 1) | 1273 if (r != 1) |
| 1270 return r; | 1274 return r; |
| 1271 | 1275 |
| 1272 consumed += 2; | 1276 consumed += 2; |
| 1273 | 1277 |
| 1274 r = ne_read_uint(ctx->io, &flags, 1); | 1278 r = ne_read_uint(ctx->io, &flags, 1); |
| 1275 if (r != 1) | 1279 if (r != 1) |
| 1276 return r; | 1280 return r; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1300 if (frames > 256) | 1304 if (frames > 256) |
| 1301 return -1; | 1305 return -1; |
| 1302 | 1306 |
| 1303 switch (lacing) { | 1307 switch (lacing) { |
| 1304 case LACING_NONE: | 1308 case LACING_NONE: |
| 1305 frame_sizes[0] = block_size - consumed; | 1309 frame_sizes[0] = block_size - consumed; |
| 1306 break; | 1310 break; |
| 1307 case LACING_XIPH: | 1311 case LACING_XIPH: |
| 1308 if (frames == 1) | 1312 if (frames == 1) |
| 1309 return -1; | 1313 return -1; |
| 1310 r = ne_read_xiph_lacing(ctx->io, block_size, &consumed, frames, frame_sizes)
; | 1314 r = ne_read_xiph_lacing(ctx->io, (size_t)block_size, &consumed, frames, fram
e_sizes); |
| 1311 if (r != 1) | 1315 if (r != 1) |
| 1312 return r; | 1316 return r; |
| 1313 break; | 1317 break; |
| 1314 case LACING_FIXED: | 1318 case LACING_FIXED: |
| 1315 if ((block_size - consumed) % frames) | 1319 if ((block_size - consumed) % frames) |
| 1316 return -1; | 1320 return -1; |
| 1317 for (i = 0; i < frames; ++i) | 1321 for (i = 0; i < frames; ++i) |
| 1318 frame_sizes[i] = (block_size - consumed) / frames; | 1322 frame_sizes[i] = (block_size - consumed) / frames; |
| 1319 break; | 1323 break; |
| 1320 case LACING_EBML: | 1324 case LACING_EBML: |
| 1321 if (frames == 1) | 1325 if (frames == 1) |
| 1322 return -1; | 1326 return -1; |
| 1323 r = ne_read_ebml_lacing(ctx->io, block_size, &consumed, frames, frame_sizes)
; | 1327 r = ne_read_ebml_lacing(ctx->io, (size_t)block_size, &consumed, frames, fram
e_sizes); |
| 1324 if (r != 1) | 1328 if (r != 1) |
| 1325 return r; | 1329 return r; |
| 1326 break; | 1330 break; |
| 1327 } | 1331 } |
| 1328 | 1332 |
| 1329 /* Sanity check unlaced frame sizes against total block size. */ | 1333 /* Sanity check unlaced frame sizes against total block size. */ |
| 1330 total = consumed; | 1334 total = consumed; |
| 1331 for (i = 0; i < frames; ++i) | 1335 for (i = 0; i < frames; ++i) |
| 1332 total += frame_sizes[i]; | 1336 total += frame_sizes[i]; |
| 1333 if (total > block_size) | 1337 if (total > block_size) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1358 ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu", | 1362 ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu", |
| 1359 block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9
, flags, frames); | 1363 block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9
, flags, frames); |
| 1360 | 1364 |
| 1361 last = NULL; | 1365 last = NULL; |
| 1362 for (i = 0; i < frames; ++i) { | 1366 for (i = 0; i < frames; ++i) { |
| 1363 if (frame_sizes[i] > LIMIT_FRAME) { | 1367 if (frame_sizes[i] > LIMIT_FRAME) { |
| 1364 nestegg_free_packet(pkt); | 1368 nestegg_free_packet(pkt); |
| 1365 return -1; | 1369 return -1; |
| 1366 } | 1370 } |
| 1367 f = ne_alloc(sizeof(*f)); | 1371 f = ne_alloc(sizeof(*f)); |
| 1368 f->data = ne_alloc(frame_sizes[i]); | 1372 f->length = (size_t)frame_sizes[i]; |
| 1369 f->length = frame_sizes[i]; | 1373 f->data = ne_alloc(f->length); |
| 1370 r = ne_io_read(ctx->io, f->data, frame_sizes[i]); | 1374 r = ne_io_read(ctx->io, f->data, f->length); |
| 1371 if (r != 1) { | 1375 if (r != 1) { |
| 1372 free(f->data); | 1376 free(f->data); |
| 1373 free(f); | 1377 free(f); |
| 1374 nestegg_free_packet(pkt); | 1378 nestegg_free_packet(pkt); |
| 1375 return -1; | 1379 return -1; |
| 1376 } | 1380 } |
| 1377 | 1381 |
| 1378 if (!last) | 1382 if (!last) |
| 1379 pkt->frame = f; | 1383 pkt->frame = f; |
| 1380 else | 1384 else |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1399 if (r != 1) | 1403 if (r != 1) |
| 1400 return r; | 1404 return r; |
| 1401 | 1405 |
| 1402 if (id != ID_DISCARD_PADDING) | 1406 if (id != ID_DISCARD_PADDING) |
| 1403 return 1; | 1407 return 1; |
| 1404 | 1408 |
| 1405 element = ne_find_element(id, ctx->ancestor->node); | 1409 element = ne_find_element(id, ctx->ancestor->node); |
| 1406 if (!element) | 1410 if (!element) |
| 1407 return 1; | 1411 return 1; |
| 1408 | 1412 |
| 1409 r = ne_read_simple(ctx, element, size); | 1413 assert((size_t)size == size); |
| 1414 r = ne_read_simple(ctx, element, (size_t)size); |
| 1410 if (r != 1) | 1415 if (r != 1) |
| 1411 return r; | 1416 return r; |
| 1412 storage = (struct ebml_type *) (ctx->ancestor->data + element->offset); | 1417 storage = (struct ebml_type *) (ctx->ancestor->data + element->offset); |
| 1413 pkt->discard_padding = storage->v.i; | 1418 pkt->discard_padding = storage->v.i; |
| 1414 | 1419 |
| 1415 return 1; | 1420 return 1; |
| 1416 } | 1421 } |
| 1417 | 1422 |
| 1418 | 1423 |
| 1419 static uint64_t | 1424 static uint64_t |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1593 size_t length; | 1598 size_t length; |
| 1594 int64_t offset; | 1599 int64_t offset; |
| 1595 }; | 1600 }; |
| 1596 | 1601 |
| 1597 static int | 1602 static int |
| 1598 ne_buffer_read(void * buffer, size_t length, void * user_data) | 1603 ne_buffer_read(void * buffer, size_t length, void * user_data) |
| 1599 { | 1604 { |
| 1600 struct sniff_buffer * sb = user_data; | 1605 struct sniff_buffer * sb = user_data; |
| 1601 | 1606 |
| 1602 int rv = 1; | 1607 int rv = 1; |
| 1603 size_t available = sb->length - sb->offset; | 1608 size_t available = sb->length - (size_t)sb->offset; |
| 1604 | 1609 |
| 1605 if (available < length) | 1610 if (available < length) |
| 1606 return 0; | 1611 return 0; |
| 1607 | 1612 |
| 1608 memcpy(buffer, sb->buffer + sb->offset, length); | 1613 memcpy(buffer, sb->buffer + sb->offset, length); |
| 1609 sb->offset += length; | 1614 sb->offset += length; |
| 1610 | 1615 |
| 1611 return rv; | 1616 return rv; |
| 1612 } | 1617 } |
| 1613 | 1618 |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2067 i += 1; | 2072 i += 1; |
| 2068 } | 2073 } |
| 2069 sizes[i] = codec_private.length - total - (p - codec_private.data); | 2074 sizes[i] = codec_private.length - total - (p - codec_private.data); |
| 2070 | 2075 |
| 2071 for (i = 0; i < item; ++i) { | 2076 for (i = 0; i < item; ++i) { |
| 2072 if (sizes[i] > LIMIT_FRAME) | 2077 if (sizes[i] > LIMIT_FRAME) |
| 2073 return -1; | 2078 return -1; |
| 2074 p += sizes[i]; | 2079 p += sizes[i]; |
| 2075 } | 2080 } |
| 2076 *data = p; | 2081 *data = p; |
| 2077 *length = sizes[item]; | 2082 *length = (size_t)sizes[item]; |
| 2078 } else { | 2083 } else { |
| 2079 *data = codec_private.data; | 2084 *data = codec_private.data; |
| 2080 *length = codec_private.length; | 2085 *length = codec_private.length; |
| 2081 } | 2086 } |
| 2082 | 2087 |
| 2083 return 0; | 2088 return 0; |
| 2084 } | 2089 } |
| 2085 | 2090 |
| 2086 int | 2091 int |
| 2087 nestegg_track_video_params(nestegg * ctx, unsigned int track, | 2092 nestegg_track_video_params(nestegg * ctx, unsigned int track, |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2309 user_data.length = length; | 2314 user_data.length = length; |
| 2310 user_data.offset = 0; | 2315 user_data.offset = 0; |
| 2311 | 2316 |
| 2312 io.read = ne_buffer_read; | 2317 io.read = ne_buffer_read; |
| 2313 io.seek = ne_buffer_seek; | 2318 io.seek = ne_buffer_seek; |
| 2314 io.tell = ne_buffer_tell; | 2319 io.tell = ne_buffer_tell; |
| 2315 io.userdata = &user_data; | 2320 io.userdata = &user_data; |
| 2316 return ne_match_webm(io, length); | 2321 return ne_match_webm(io, length); |
| 2317 } | 2322 } |
| 2318 | 2323 |
| OLD | NEW |