3 * Testy, Virtual(-izable) Buffer of guint8*'s
5 * "Testy" -- the buffer gets mad when an attempt to access data
6 * beyond the bounds of the buffer. An exception is thrown.
8 * "Virtual" -- the buffer can have its own data, can use a subset of
9 * the data of a backing tvbuff, or can be a composite of
14 * Copyright (c) 2000 by Gilbert Ramirez <gram@alumni.rice.edu>
16 * Code to convert IEEE floating point formats to native floating point
17 * derived from code Copyright (c) Ashok Narayanan, 2000
19 * Wireshark - Network traffic analyzer
20 * By Gerald Combs <gerald@wireshark.org>
21 * Copyright 1998 Gerald Combs
23 * This program is free software; you can redistribute it and/or
24 * modify it under the terms of the GNU General Public License
25 * as published by the Free Software Foundation; either version 2
26 * of the License, or (at your option) any later version.
28 * This program is distributed in the hope that it will be useful,
29 * but WITHOUT ANY WARRANTY; without even the implied warranty of
30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 * GNU General Public License for more details.
33 * You should have received a copy of the GNU General Public License
34 * along with this program; if not, write to the Free Software
35 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
52 #include "proto.h" /* XXX - only used for DISSECTOR_ASSERT, probably a new header file? */
55 ensure_contiguous_no_exception(tvbuff_t *tvb, gint offset, gint length,
59 ensure_contiguous(tvbuff_t *tvb, gint offset, gint length);
61 /* We dole out tvbuff's from this memchunk. */
62 GMemChunk *tvbuff_mem_chunk = NULL;
67 if (!tvbuff_mem_chunk)
68 tvbuff_mem_chunk = g_mem_chunk_create(tvbuff_t, 20, G_ALLOC_AND_FREE);
75 g_mem_chunk_destroy(tvbuff_mem_chunk);
77 tvbuff_mem_chunk = NULL;
84 tvb_init(tvbuff_t *tvb, tvbuff_type type)
86 tvb_backing_t *backing;
87 tvb_comp_t *composite;
90 tvb->initialized = FALSE;
93 tvb->reported_length = 0;
95 tvb->real_data = NULL;
101 case TVBUFF_REAL_DATA:
106 backing = &tvb->tvbuffs.subset;
112 case TVBUFF_COMPOSITE:
113 composite = &tvb->tvbuffs.composite;
114 composite->tvbs = NULL;
115 composite->start_offsets = NULL;
116 composite->end_offsets = NULL;
123 tvb_new(tvbuff_type type)
127 tvb = g_chunk_new(tvbuff_t, tvbuff_mem_chunk);
135 tvb_free(tvbuff_t* tvb)
137 tvbuff_t *member_tvb;
138 tvb_comp_t *composite;
143 if (tvb->usage_count == 0) {
145 case TVBUFF_REAL_DATA:
148 * XXX - do this with a union?
150 tvb->free_cb((gpointer)tvb->real_data);
155 /* This will be NULL if tvb_new_subset() fails because
156 * reported_length < -1 */
157 if (tvb->tvbuffs.subset.tvb) {
158 tvb_decrement_usage_count(tvb->tvbuffs.subset.tvb, 1);
162 case TVBUFF_COMPOSITE:
163 composite = &tvb->tvbuffs.composite;
164 for (slist = composite->tvbs; slist != NULL ; slist = slist->next) {
165 member_tvb = slist->data;
166 tvb_decrement_usage_count(member_tvb, 1);
169 g_slist_free(composite->tvbs);
171 if (composite->start_offsets)
172 g_free(composite->start_offsets);
173 if (composite->end_offsets)
174 g_free(composite->end_offsets);
175 if (tvb->real_data) {
177 * XXX - do this with a union?
179 g_free((gpointer)tvb->real_data);
186 g_slist_free(tvb->used_in);
189 g_chunk_free(tvb, tvbuff_mem_chunk);
194 tvb_increment_usage_count(tvbuff_t* tvb, guint count)
196 tvb->usage_count += count;
198 return tvb->usage_count;
202 tvb_decrement_usage_count(tvbuff_t* tvb, guint count)
204 if (tvb->usage_count <= count) {
205 tvb->usage_count = 1;
210 tvb->usage_count -= count;
211 return tvb->usage_count;
217 tvb_free_chain(tvbuff_t* tvb)
221 /* Recursively call tvb_free_chain() */
222 for (slist = tvb->used_in; slist != NULL ; slist = slist->next) {
223 tvb_free_chain( (tvbuff_t*)slist->data );
226 /* Stop the recursion */
233 tvb_set_free_cb(tvbuff_t* tvb, tvbuff_free_cb_t func)
235 DISSECTOR_ASSERT(tvb->type == TVBUFF_REAL_DATA);
240 add_to_used_in_list(tvbuff_t *tvb, tvbuff_t *used_in)
242 tvb->used_in = g_slist_prepend(tvb->used_in, used_in);
243 tvb_increment_usage_count(tvb, 1);
247 tvb_set_child_real_data_tvbuff(tvbuff_t* parent, tvbuff_t* child)
249 DISSECTOR_ASSERT(parent->initialized);
250 DISSECTOR_ASSERT(child->initialized);
251 DISSECTOR_ASSERT(child->type == TVBUFF_REAL_DATA);
252 add_to_used_in_list(parent, child);
256 tvb_set_real_data(tvbuff_t* tvb, const guint8* data, guint length, gint reported_length)
258 DISSECTOR_ASSERT(tvb->type == TVBUFF_REAL_DATA);
259 DISSECTOR_ASSERT(!tvb->initialized);
261 if (reported_length < -1) {
262 THROW(ReportedBoundsError);
265 tvb->real_data = data;
266 tvb->length = length;
267 tvb->reported_length = reported_length;
268 tvb->initialized = TRUE;
272 tvb_new_real_data(const guint8* data, guint length, gint reported_length)
274 static tvbuff_t *last_tvb=NULL;
277 tvb = tvb_new(TVBUFF_REAL_DATA);
282 /* remember this tvb in case we throw an exception and
283 * lose the pointer to it.
287 tvb_set_real_data(tvb, data, length, reported_length);
290 * This is the top-level real tvbuff for this data source,
291 * so its data source tvbuff is itself.
295 /* ok no exception so we dont need to remember it any longer */
301 /* Computes the absolute offset and length based on a possibly-negative offset
302 * and a length that is possible -1 (which means "to the end of the data").
303 * Returns TRUE/FALSE indicating whether the offset is in bounds or
304 * not. The integer ptrs are modified with the new offset and length.
305 * No exception is thrown.
307 * XXX - we return TRUE, not FALSE, if the offset is positive and right
308 * after the end of the tvbuff (i.e., equal to the length). We do this
309 * so that a dissector constructing a subset tvbuff for the next protocol
310 * will get a zero-length tvbuff, not an exception, if there's no data
311 * left for the next protocol - we want the next protocol to be the one
312 * that gets an exception, so the error is reported as an error in that
313 * protocol rather than the containing protocol. */
315 compute_offset_length(tvbuff_t *tvb, gint offset, gint length,
316 guint *offset_ptr, guint *length_ptr, int *exception)
318 DISSECTOR_ASSERT(offset_ptr);
319 DISSECTOR_ASSERT(length_ptr);
321 /* Compute the offset */
323 /* Positive offset - relative to the beginning of the packet. */
324 if ((guint) offset > tvb->reported_length) {
326 *exception = ReportedBoundsError;
330 else if ((guint) offset > tvb->length) {
332 *exception = BoundsError;
337 *offset_ptr = offset;
341 /* Negative offset - relative to the end of the packet. */
342 if ((guint) -offset > tvb->reported_length) {
344 *exception = ReportedBoundsError;
348 else if ((guint) -offset > tvb->length) {
350 *exception = BoundsError;
355 *offset_ptr = tvb->length + offset;
359 /* Compute the length */
362 /* XXX - ReportedBoundsError? */
363 *exception = BoundsError;
367 else if (length == -1) {
368 *length_ptr = tvb->length - *offset_ptr;
371 *length_ptr = length;
379 check_offset_length_no_exception(tvbuff_t *tvb, gint offset, gint length,
380 guint *offset_ptr, guint *length_ptr, int *exception)
384 DISSECTOR_ASSERT(tvb);
385 DISSECTOR_ASSERT(tvb->initialized);
387 if (!compute_offset_length(tvb, offset, length, offset_ptr, length_ptr, exception)) {
392 * Compute the offset of the first byte past the length.
394 end_offset = *offset_ptr + *length_ptr;
397 * Check for an overflow, and clamp "end_offset" at the maximum
398 * if we got an overflow - that should force us to indicate that
399 * we're past the end of the tvbuff.
401 if (end_offset < *offset_ptr)
402 end_offset = UINT_MAX;
405 * Check whether that offset goes more than one byte past the
408 * If not, return TRUE; otherwise, return FALSE and, if "exception"
409 * is non-null, return the appropriate exception through it.
411 if (end_offset <= tvb->length) {
414 else if (end_offset <= tvb->reported_length) {
416 *exception = BoundsError;
422 *exception = ReportedBoundsError;
427 DISSECTOR_ASSERT_NOT_REACHED();
430 /* Checks (+/-) offset and length and throws an exception if
431 * either is out of bounds. Sets integer ptrs to the new offset
434 check_offset_length(tvbuff_t *tvb, gint offset, gint length,
435 guint *offset_ptr, guint *length_ptr)
439 if (!check_offset_length_no_exception(tvb, offset, length, offset_ptr, length_ptr, &exception)) {
440 DISSECTOR_ASSERT(exception > 0);
448 tvb_set_subset(tvbuff_t *tvb, tvbuff_t *backing,
449 gint backing_offset, gint backing_length, gint reported_length)
451 DISSECTOR_ASSERT(tvb->type == TVBUFF_SUBSET);
452 DISSECTOR_ASSERT(!tvb->initialized);
454 if (reported_length < -1) {
455 THROW(ReportedBoundsError);
458 check_offset_length(backing, backing_offset, backing_length,
459 &tvb->tvbuffs.subset.offset,
460 &tvb->tvbuffs.subset.length);
462 tvb->tvbuffs.subset.tvb = backing;
463 tvb->length = tvb->tvbuffs.subset.length;
465 if (reported_length == -1) {
466 tvb->reported_length = backing->reported_length - tvb->tvbuffs.subset.offset;
469 tvb->reported_length = reported_length;
471 tvb->initialized = TRUE;
472 add_to_used_in_list(backing, tvb);
474 /* Optimization. If the backing buffer has a pointer to contiguous, real data,
475 * then we can point directly to our starting offset in that buffer */
476 if (backing->real_data != NULL) {
477 tvb->real_data = backing->real_data + tvb->tvbuffs.subset.offset;
483 tvb_new_subset(tvbuff_t *backing, gint backing_offset, gint backing_length, gint reported_length)
485 static tvbuff_t *last_tvb=NULL;
488 tvb = tvb_new(TVBUFF_SUBSET);
493 /* remember this tvb in case we throw an exception and
494 * lose the pointer to it.
498 tvb_set_subset(tvb, backing, backing_offset, backing_length, reported_length);
501 * The top-level data source of this tvbuff is the top-level
502 * data source of its parent.
504 tvb->ds_tvb = backing->ds_tvb;
506 /* ok no exception so we dont need to remember it any longer */
513 tvb_composite_append(tvbuff_t* tvb, tvbuff_t* member)
515 tvb_comp_t *composite;
517 DISSECTOR_ASSERT(!tvb->initialized);
518 composite = &tvb->tvbuffs.composite;
519 composite->tvbs = g_slist_append( composite->tvbs, member );
520 add_to_used_in_list(member, tvb);
524 tvb_composite_prepend(tvbuff_t* tvb, tvbuff_t* member)
526 tvb_comp_t *composite;
528 DISSECTOR_ASSERT(!tvb->initialized);
529 composite = &tvb->tvbuffs.composite;
530 composite->tvbs = g_slist_prepend( composite->tvbs, member );
531 add_to_used_in_list(member, tvb);
535 tvb_new_composite(void)
537 return tvb_new(TVBUFF_COMPOSITE);
541 tvb_composite_finalize(tvbuff_t* tvb)
545 tvbuff_t *member_tvb;
546 tvb_comp_t *composite;
549 DISSECTOR_ASSERT(!tvb->initialized);
550 DISSECTOR_ASSERT(tvb->length == 0);
552 composite = &tvb->tvbuffs.composite;
553 num_members = g_slist_length(composite->tvbs);
555 composite->start_offsets = g_new(guint, num_members);
556 composite->end_offsets = g_new(guint, num_members);
558 for (slist = composite->tvbs; slist != NULL; slist = slist->next) {
559 DISSECTOR_ASSERT((guint) i < num_members);
560 member_tvb = slist->data;
561 composite->start_offsets[i] = tvb->length;
562 tvb->length += member_tvb->length;
563 composite->end_offsets[i] = tvb->length - 1;
567 tvb->initialized = TRUE;
573 tvb_length(tvbuff_t* tvb)
575 DISSECTOR_ASSERT(tvb->initialized);
581 tvb_length_remaining(tvbuff_t *tvb, gint offset)
583 guint abs_offset, abs_length;
585 DISSECTOR_ASSERT(tvb->initialized);
587 if (compute_offset_length(tvb, offset, -1, &abs_offset, &abs_length, NULL)) {
596 tvb_ensure_length_remaining(tvbuff_t *tvb, gint offset)
598 guint abs_offset, abs_length;
601 DISSECTOR_ASSERT(tvb->initialized);
603 if (!compute_offset_length(tvb, offset, -1, &abs_offset, &abs_length, &exception)) {
606 if (abs_length == 0) {
608 * This routine ensures there's at least one byte available.
609 * There aren't any bytes available, so throw the appropriate
612 if (abs_offset >= tvb->reported_length)
613 THROW(ReportedBoundsError);
623 /* Validates that 'length' bytes are available starting from
624 * offset (pos/neg). Does not throw an exception. */
626 tvb_bytes_exist(tvbuff_t *tvb, gint offset, gint length)
628 guint abs_offset, abs_length;
630 DISSECTOR_ASSERT(tvb->initialized);
632 if (!compute_offset_length(tvb, offset, length, &abs_offset, &abs_length, NULL))
635 if (abs_offset + abs_length <= tvb->length) {
643 /* Validates that 'length' bytes are available starting from
644 * offset (pos/neg). Throws an exception if they aren't. */
646 tvb_ensure_bytes_exist(tvbuff_t *tvb, gint offset, gint length)
648 guint abs_offset, abs_length;
650 DISSECTOR_ASSERT(tvb->initialized);
653 * -1 doesn't mean "until end of buffer", as that's pointless
654 * for this routine. We must treat it as a Really Large Positive
655 * Number, so that we throw an exception; we throw
656 * ReportedBoundsError, as if it were past even the end of a
657 * reassembled packet, and past the end of even the data we
660 * We do the same with other negative lengths.
663 THROW(ReportedBoundsError);
665 check_offset_length(tvb, offset, length, &abs_offset, &abs_length);
669 tvb_offset_exists(tvbuff_t *tvb, gint offset)
671 guint abs_offset, abs_length;
673 DISSECTOR_ASSERT(tvb->initialized);
674 if (!compute_offset_length(tvb, offset, -1, &abs_offset, &abs_length, NULL))
677 if (abs_offset < tvb->length) {
686 tvb_reported_length(tvbuff_t* tvb)
688 DISSECTOR_ASSERT(tvb->initialized);
690 return tvb->reported_length;
694 tvb_reported_length_remaining(tvbuff_t *tvb, gint offset)
696 guint abs_offset, abs_length;
698 DISSECTOR_ASSERT(tvb->initialized);
700 if (compute_offset_length(tvb, offset, -1, &abs_offset, &abs_length, NULL)) {
701 if (tvb->reported_length >= abs_offset)
702 return tvb->reported_length - abs_offset;
711 /* Set the reported length of a tvbuff to a given value; used for protocols
712 whose headers contain an explicit length and where the calling
713 dissector's payload may include padding as well as the packet for
716 Also adjusts the data length. */
718 tvb_set_reported_length(tvbuff_t* tvb, guint reported_length)
720 DISSECTOR_ASSERT(tvb->initialized);
722 if (reported_length > tvb->reported_length)
723 THROW(ReportedBoundsError);
725 tvb->reported_length = reported_length;
726 if (reported_length < tvb->length)
727 tvb->length = reported_length;
732 first_real_data_ptr(tvbuff_t *tvb)
737 case TVBUFF_REAL_DATA:
738 return tvb->real_data;
740 member = tvb->tvbuffs.subset.tvb;
741 return first_real_data_ptr(member);
742 case TVBUFF_COMPOSITE:
743 member = tvb->tvbuffs.composite.tvbs->data;
744 return first_real_data_ptr(member);
747 DISSECTOR_ASSERT_NOT_REACHED();
752 offset_from_real_beginning(tvbuff_t *tvb, int counter)
757 case TVBUFF_REAL_DATA:
760 member = tvb->tvbuffs.subset.tvb;
761 return offset_from_real_beginning(member, counter + tvb->tvbuffs.subset.offset);
762 case TVBUFF_COMPOSITE:
763 member = tvb->tvbuffs.composite.tvbs->data;
764 return offset_from_real_beginning(member, counter);
767 DISSECTOR_ASSERT_NOT_REACHED();
772 composite_ensure_contiguous_no_exception(tvbuff_t *tvb, guint abs_offset,
775 guint i, num_members;
776 tvb_comp_t *composite;
777 tvbuff_t *member_tvb = NULL;
778 guint member_offset, member_length;
781 DISSECTOR_ASSERT(tvb->type == TVBUFF_COMPOSITE);
783 /* Maybe the range specified by offset/length
784 * is contiguous inside one of the member tvbuffs */
785 composite = &tvb->tvbuffs.composite;
786 num_members = g_slist_length(composite->tvbs);
788 for (i = 0; i < num_members; i++) {
789 if (abs_offset <= composite->end_offsets[i]) {
790 slist = g_slist_nth(composite->tvbs, i);
791 member_tvb = slist->data;
795 DISSECTOR_ASSERT(member_tvb);
797 if (check_offset_length_no_exception(member_tvb, abs_offset - composite->start_offsets[i],
798 abs_length, &member_offset, &member_length, NULL)) {
801 * The range is, in fact, contiguous within member_tvb.
803 DISSECTOR_ASSERT(!tvb->real_data);
804 return ensure_contiguous_no_exception(member_tvb, member_offset, member_length, NULL);
807 tvb->real_data = tvb_memdup(tvb, 0, -1);
808 return tvb->real_data + abs_offset;
811 DISSECTOR_ASSERT_NOT_REACHED();
816 ensure_contiguous_no_exception(tvbuff_t *tvb, gint offset, gint length,
819 guint abs_offset, abs_length;
821 if (!check_offset_length_no_exception(tvb, offset, length,
822 &abs_offset, &abs_length, exception)) {
827 * We know that all the data is present in the tvbuff, so
828 * no exceptions should be thrown.
830 if (tvb->real_data) {
831 return tvb->real_data + abs_offset;
835 case TVBUFF_REAL_DATA:
836 DISSECTOR_ASSERT_NOT_REACHED();
838 return ensure_contiguous_no_exception(tvb->tvbuffs.subset.tvb,
839 abs_offset - tvb->tvbuffs.subset.offset,
841 case TVBUFF_COMPOSITE:
842 return composite_ensure_contiguous_no_exception(tvb, abs_offset, abs_length);
846 DISSECTOR_ASSERT_NOT_REACHED();
851 ensure_contiguous(tvbuff_t *tvb, gint offset, gint length)
856 p = ensure_contiguous_no_exception(tvb, offset, length, &exception);
858 DISSECTOR_ASSERT(exception > 0);
865 guint8_find(const guint8* haystack, size_t haystacklen, guint8 needle)
870 for (b = haystack, i = 0; (guint) i < haystacklen; i++, b++) {
880 guint8_pbrk(const guint8* haystack, size_t haystacklen, guint8 *needles)
884 guint8 item, *needlep, needle;
886 for (b = haystack, i = 0; (guint) i < haystacklen; i++, b++) {
889 while ((needle = *needlep) != '\0') {
901 /************** ACCESSORS **************/
904 composite_memcpy(tvbuff_t *tvb, guint8* target, guint abs_offset, guint abs_length)
906 guint i, num_members;
907 tvb_comp_t *composite;
908 tvbuff_t *member_tvb = NULL;
909 guint member_offset, member_length;
913 DISSECTOR_ASSERT(tvb->type == TVBUFF_COMPOSITE);
915 /* Maybe the range specified by offset/length
916 * is contiguous inside one of the member tvbuffs */
917 composite = &tvb->tvbuffs.composite;
918 num_members = g_slist_length(composite->tvbs);
920 for (i = 0; i < num_members; i++) {
921 if (abs_offset <= composite->end_offsets[i]) {
922 slist = g_slist_nth(composite->tvbs, i);
923 member_tvb = slist->data;
927 DISSECTOR_ASSERT(member_tvb);
929 if (check_offset_length_no_exception(member_tvb, abs_offset - composite->start_offsets[i],
930 abs_length, &member_offset, &member_length, NULL)) {
932 DISSECTOR_ASSERT(!tvb->real_data);
933 return tvb_memcpy(member_tvb, target, member_offset, member_length);
936 /* The requested data is non-contiguous inside
937 * the member tvb. We have to memcpy() the part that's in the member tvb,
938 * then iterate across the other member tvb's, copying their portions
939 * until we have copied all data.
941 retval = compute_offset_length(member_tvb, abs_offset - composite->start_offsets[i], -1,
942 &member_offset, &member_length, NULL);
943 DISSECTOR_ASSERT(retval);
945 tvb_memcpy(member_tvb, target, member_offset, member_length);
946 abs_offset += member_length;
947 abs_length -= member_length;
950 if (abs_length > 0) {
951 composite_memcpy(tvb, target + member_length, abs_offset, abs_length);
957 DISSECTOR_ASSERT_NOT_REACHED();
962 tvb_memcpy(tvbuff_t *tvb, guint8* target, gint offset, gint length)
964 guint abs_offset, abs_length;
966 DISSECTOR_ASSERT(length >= -1);
967 check_offset_length(tvb, offset, length, &abs_offset, &abs_length);
969 if (tvb->real_data) {
970 return (guint8*) memcpy(target, tvb->real_data + abs_offset, abs_length);
974 case TVBUFF_REAL_DATA:
975 DISSECTOR_ASSERT_NOT_REACHED();
978 return tvb_memcpy(tvb->tvbuffs.subset.tvb, target,
979 abs_offset - tvb->tvbuffs.subset.offset,
982 case TVBUFF_COMPOSITE:
983 return composite_memcpy(tvb, target, offset, length);
986 DISSECTOR_ASSERT_NOT_REACHED();
992 * XXX - this doesn't treat a length of -1 as an error.
993 * If it did, this could replace some code that calls
994 * "tvb_ensure_bytes_exist()" and then allocates a buffer and copies
997 * "composite_ensure_contiguous_no_exception()" depends on -1 not being
998 * an error; does anything else depend on this routine treating -1 as
999 * meaning "to the end of the buffer"?
1002 tvb_memdup(tvbuff_t *tvb, gint offset, gint length)
1004 guint abs_offset, abs_length;
1007 check_offset_length(tvb, offset, length, &abs_offset, &abs_length);
1009 duped = g_malloc(abs_length);
1010 return tvb_memcpy(tvb, duped, abs_offset, abs_length);
1014 * XXX - this doesn't treat a length of -1 as an error.
1015 * If it did, this could replace some code that calls
1016 * "tvb_ensure_bytes_exist()" and then allocates a buffer and copies
1019 * "composite_ensure_contiguous_no_exception()" depends on -1 not being
1020 * an error; does anything else depend on this routine treating -1 as
1021 * meaning "to the end of the buffer"?
1023 * This function allocates memory from a buffer with packet lifetime.
1024 * You do not have to free this buffer, it will be automatically freed
1025 * when wireshark starts decoding the next packet.
1026 * Do not use this function if you want the allocated memory to be persistent
1027 * after the current packet has been dissected.
1030 ep_tvb_memdup(tvbuff_t *tvb, gint offset, gint length)
1032 guint abs_offset, abs_length;
1035 check_offset_length(tvb, offset, length, &abs_offset, &abs_length);
1037 duped = ep_alloc(abs_length);
1038 return tvb_memcpy(tvb, duped, abs_offset, abs_length);
1044 tvb_get_ptr(tvbuff_t *tvb, gint offset, gint length)
1046 return ensure_contiguous(tvb, offset, length);
1050 tvb_get_guint8(tvbuff_t *tvb, gint offset)
1054 ptr = ensure_contiguous(tvb, offset, sizeof(guint8));
1059 tvb_get_ntohs(tvbuff_t *tvb, gint offset)
1063 ptr = ensure_contiguous(tvb, offset, sizeof(guint16));
1068 tvb_get_ntoh24(tvbuff_t *tvb, gint offset)
1072 ptr = ensure_contiguous(tvb, offset, 3);
1073 return pntoh24(ptr);
1077 tvb_get_ntohl(tvbuff_t *tvb, gint offset)
1081 ptr = ensure_contiguous(tvb, offset, sizeof(guint32));
1086 tvb_get_ntoh64(tvbuff_t *tvb, gint offset)
1090 ptr = ensure_contiguous(tvb, offset, sizeof(guint64));
1091 return pntoh64(ptr);
1095 * Stuff for IEEE float handling on platforms that don't have IEEE
1096 * format as the native floating-point format.
1098 * For now, we treat only the VAX as such a platform.
1100 * XXX - other non-IEEE boxes that can run UNIX include some Crays,
1101 * and possibly other machines.
1103 * It appears that the official Linux port to System/390 and
1104 * zArchitecture uses IEEE format floating point (not a
1107 * I don't know whether there are any other machines that
1108 * could run Wireshark and that don't use IEEE format.
1109 * As far as I know, all of the main commercial microprocessor
1110 * families on which OSes that support Wireshark can run
1111 * use IEEE format (x86, 68k, SPARC, MIPS, PA-RISC, Alpha,
1112 * IA-64, and so on).
1122 #define IEEE_SP_NUMBER_WIDTH 32 /* bits in number */
1123 #define IEEE_SP_EXP_WIDTH 8 /* bits in exponent */
1124 #define IEEE_SP_MANTISSA_WIDTH 23 /* IEEE_SP_NUMBER_WIDTH - 1 - IEEE_SP_EXP_WIDTH */
1126 #define IEEE_SP_SIGN_MASK 0x80000000
1127 #define IEEE_SP_EXPONENT_MASK 0x7F800000
1128 #define IEEE_SP_MANTISSA_MASK 0x007FFFFF
1129 #define IEEE_SP_INFINITY IEEE_SP_EXPONENT_MASK
1131 #define IEEE_SP_IMPLIED_BIT (1 << IEEE_SP_MANTISSA_WIDTH)
1132 #define IEEE_SP_INFINITE ((1 << IEEE_SP_EXP_WIDTH) - 1)
1133 #define IEEE_SP_BIAS ((1 << (IEEE_SP_EXP_WIDTH - 1)) - 1)
1136 ieee_float_is_zero(guint32 w)
1138 return ((w & ~IEEE_SP_SIGN_MASK) == 0);
1142 get_ieee_float(guint32 w)
1148 sign = w & IEEE_SP_SIGN_MASK;
1149 exponent = w & IEEE_SP_EXPONENT_MASK;
1150 mantissa = w & IEEE_SP_MANTISSA_MASK;
1152 if (ieee_float_is_zero(w)) {
1153 /* number is zero, unnormalized, or not-a-number */
1158 * XXX - how to handle this?
1160 if (IEEE_SP_INFINITY == exponent) {
1162 * number is positive or negative infinity, or a special value
1164 return (sign? MINUS_INFINITY: PLUS_INFINITY);
1168 exponent = ((exponent >> IEEE_SP_MANTISSA_WIDTH) - IEEE_SP_BIAS) -
1169 IEEE_SP_MANTISSA_WIDTH;
1170 mantissa |= IEEE_SP_IMPLIED_BIT;
1173 return -mantissa * pow(2, exponent);
1175 return mantissa * pow(2, exponent);
1180 * We assume that if you don't have IEEE floating-point, you have a
1181 * compiler that understands 64-bit integral quantities.
1183 #define IEEE_DP_NUMBER_WIDTH 64 /* bits in number */
1184 #define IEEE_DP_EXP_WIDTH 11 /* bits in exponent */
1185 #define IEEE_DP_MANTISSA_WIDTH 52 /* IEEE_DP_NUMBER_WIDTH - 1 - IEEE_DP_EXP_WIDTH */
1187 #define IEEE_DP_SIGN_MASK 0x8000000000000000LL
1188 #define IEEE_DP_EXPONENT_MASK 0x7FF0000000000000LL
1189 #define IEEE_DP_MANTISSA_MASK 0x000FFFFFFFFFFFFFLL
1190 #define IEEE_DP_INFINITY IEEE_DP_EXPONENT_MASK
1192 #define IEEE_DP_IMPLIED_BIT (1LL << IEEE_DP_MANTISSA_WIDTH)
1193 #define IEEE_DP_INFINITE ((1 << IEEE_DP_EXP_WIDTH) - 1)
1194 #define IEEE_DP_BIAS ((1 << (IEEE_DP_EXP_WIDTH - 1)) - 1)
1197 ieee_double_is_zero(guint64 w)
1199 return ((w & ~IEEE_SP_SIGN_MASK) == 0);
1203 get_ieee_double(guint64 w)
1209 sign = w & IEEE_DP_SIGN_MASK;
1210 exponent = w & IEEE_DP_EXPONENT_MASK;
1211 mantissa = w & IEEE_DP_MANTISSA_MASK;
1213 if (ieee_double_is_zero(w)) {
1214 /* number is zero, unnormalized, or not-a-number */
1219 * XXX - how to handle this?
1221 if (IEEE_DP_INFINITY == exponent) {
1223 * number is positive or negative infinity, or a special value
1225 return (sign? MINUS_INFINITY: PLUS_INFINITY);
1229 exponent = ((exponent >> IEEE_DP_MANTISSA_WIDTH) - IEEE_DP_BIAS) -
1230 IEEE_DP_MANTISSA_WIDTH;
1231 mantissa |= IEEE_DP_IMPLIED_BIT;
1234 return -mantissa * pow(2, exponent);
1236 return mantissa * pow(2, exponent);
1241 * Fetches an IEEE single-precision floating-point number, in
1242 * big-endian form, and returns a "float".
1244 * XXX - should this be "double", in case there are IEEE single-
1245 * precision numbers that won't fit in some platform's native
1249 tvb_get_ntohieee_float(tvbuff_t *tvb, int offset)
1252 return get_ieee_float(tvb_get_ntohl(tvb, offset));
1259 ieee_fp_union.w = tvb_get_ntohl(tvb, offset);
1260 return ieee_fp_union.f;
1265 * Fetches an IEEE double-precision floating-point number, in
1266 * big-endian form, and returns a "double".
1269 tvb_get_ntohieee_double(tvbuff_t *tvb, int offset)
1283 #ifdef WORDS_BIGENDIAN
1284 ieee_fp_union.w[0] = tvb_get_ntohl(tvb, offset);
1285 ieee_fp_union.w[1] = tvb_get_ntohl(tvb, offset+4);
1287 ieee_fp_union.w[0] = tvb_get_ntohl(tvb, offset+4);
1288 ieee_fp_union.w[1] = tvb_get_ntohl(tvb, offset);
1291 return get_ieee_double(ieee_fp_union.dw);
1293 return ieee_fp_union.d;
1298 tvb_get_letohs(tvbuff_t *tvb, gint offset)
1302 ptr = ensure_contiguous(tvb, offset, sizeof(guint16));
1303 return pletohs(ptr);
1307 tvb_get_letoh24(tvbuff_t *tvb, gint offset)
1311 ptr = ensure_contiguous(tvb, offset, 3);
1312 return pletoh24(ptr);
1316 tvb_get_letohl(tvbuff_t *tvb, gint offset)
1320 ptr = ensure_contiguous(tvb, offset, sizeof(guint32));
1321 return pletohl(ptr);
1325 tvb_get_letoh64(tvbuff_t *tvb, gint offset)
1329 ptr = ensure_contiguous(tvb, offset, sizeof(guint64));
1330 return pletoh64(ptr);
1334 * Fetches an IEEE single-precision floating-point number, in
1335 * little-endian form, and returns a "float".
1337 * XXX - should this be "double", in case there are IEEE single-
1338 * precision numbers that won't fit in some platform's native
1342 tvb_get_letohieee_float(tvbuff_t *tvb, int offset)
1345 return get_ieee_float(tvb_get_letohl(tvb, offset));
1352 ieee_fp_union.w = tvb_get_letohl(tvb, offset);
1353 return ieee_fp_union.f;
1358 * Fetches an IEEE double-precision floating-point number, in
1359 * little-endian form, and returns a "double".
1362 tvb_get_letohieee_double(tvbuff_t *tvb, int offset)
1376 #ifdef WORDS_BIGENDIAN
1377 ieee_fp_union.w[0] = tvb_get_letohl(tvb, offset+4);
1378 ieee_fp_union.w[1] = tvb_get_letohl(tvb, offset);
1380 ieee_fp_union.w[0] = tvb_get_letohl(tvb, offset);
1381 ieee_fp_union.w[1] = tvb_get_letohl(tvb, offset+4);
1384 return get_ieee_double(ieee_fp_union.dw);
1386 return ieee_fp_union.d;
1390 /* Fetch an IPv4 address, in network byte order.
1391 * We do *not* convert them to host byte order; we leave them in
1392 * network byte order. */
1394 tvb_get_ipv4(tvbuff_t *tvb, gint offset)
1399 ptr = ensure_contiguous(tvb, offset, sizeof(guint32));
1400 memcpy(&addr, ptr, sizeof addr);
1404 /* Fetch an IPv6 address. */
1406 tvb_get_ipv6(tvbuff_t *tvb, gint offset, struct e_in6_addr *addr)
1410 ptr = ensure_contiguous(tvb, offset, sizeof(*addr));
1411 memcpy(addr, ptr, sizeof *addr);
1416 tvb_get_ntohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid)
1418 ensure_contiguous(tvb, offset, sizeof(*guid));
1419 guid->data1 = tvb_get_ntohl(tvb, offset);
1420 guid->data2 = tvb_get_ntohs(tvb, offset + 4);
1421 guid->data3 = tvb_get_ntohs(tvb, offset + 6);
1422 tvb_memcpy(tvb, guid->data4, offset + 8, sizeof guid->data4);
1426 tvb_get_letohguid(tvbuff_t *tvb, gint offset, e_guid_t *guid)
1428 ensure_contiguous(tvb, offset, sizeof(*guid));
1429 guid->data1 = tvb_get_letohl(tvb, offset);
1430 guid->data2 = tvb_get_letohs(tvb, offset + 4);
1431 guid->data3 = tvb_get_letohs(tvb, offset + 6);
1432 tvb_memcpy(tvb, guid->data4, offset + 8, sizeof guid->data4);
1436 tvb_get_guid(tvbuff_t *tvb, gint offset, e_guid_t *guid, gboolean little_endian)
1438 if (little_endian) {
1439 tvb_get_letohguid(tvb, offset, guid);
1441 tvb_get_ntohguid(tvb, offset, guid);
1445 /* Find first occurence of needle in tvbuff, starting at offset. Searches
1446 * at most maxlength number of bytes; if maxlength is -1, searches to
1448 * Returns the offset of the found needle, or -1 if not found.
1449 * Will not throw an exception, even if maxlength exceeds boundary of tvbuff;
1450 * in that case, -1 will be returned if the boundary is reached before
1451 * finding needle. */
1453 tvb_find_guint8(tvbuff_t *tvb, gint offset, gint maxlength, guint8 needle)
1455 const guint8 *result;
1456 guint abs_offset, junk_length;
1460 check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
1462 /* Only search to end of tvbuff, w/o throwing exception. */
1463 tvbufflen = tvb_length_remaining(tvb, abs_offset);
1464 if (maxlength == -1) {
1465 /* No maximum length specified; search to end of tvbuff. */
1468 else if (tvbufflen < (guint) maxlength) {
1469 /* Maximum length goes past end of tvbuff; search to end
1474 /* Maximum length doesn't go past end of tvbuff; search
1479 /* If we have real data, perform our search now. */
1480 if (tvb->real_data) {
1481 result = guint8_find(tvb->real_data + abs_offset, limit, needle);
1482 if (result == NULL) {
1486 return result - tvb->real_data;
1491 case TVBUFF_REAL_DATA:
1492 DISSECTOR_ASSERT_NOT_REACHED();
1495 return tvb_find_guint8(tvb->tvbuffs.subset.tvb,
1496 abs_offset - tvb->tvbuffs.subset.offset,
1499 case TVBUFF_COMPOSITE:
1500 DISSECTOR_ASSERT_NOT_REACHED();
1501 /* XXX - return composite_find_guint8(tvb, offset, limit, needle); */
1504 DISSECTOR_ASSERT_NOT_REACHED();
1508 /* Find first occurence of any of the needles in tvbuff, starting at offset.
1509 * Searches at most maxlength number of bytes; if maxlength is -1, searches
1511 * Returns the offset of the found needle, or -1 if not found.
1512 * Will not throw an exception, even if maxlength exceeds boundary of tvbuff;
1513 * in that case, -1 will be returned if the boundary is reached before
1514 * finding needle. */
1516 tvb_pbrk_guint8(tvbuff_t *tvb, gint offset, gint maxlength, guint8 *needles)
1518 const guint8 *result;
1519 guint abs_offset, junk_length;
1523 check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
1525 /* Only search to end of tvbuff, w/o throwing exception. */
1526 tvbufflen = tvb_length_remaining(tvb, abs_offset);
1527 if (maxlength == -1) {
1528 /* No maximum length specified; search to end of tvbuff. */
1531 else if (tvbufflen < (guint) maxlength) {
1532 /* Maximum length goes past end of tvbuff; search to end
1537 /* Maximum length doesn't go past end of tvbuff; search
1542 /* If we have real data, perform our search now. */
1543 if (tvb->real_data) {
1544 result = guint8_pbrk(tvb->real_data + abs_offset, limit, needles);
1545 if (result == NULL) {
1549 return result - tvb->real_data;
1554 case TVBUFF_REAL_DATA:
1555 DISSECTOR_ASSERT_NOT_REACHED();
1558 return tvb_pbrk_guint8(tvb->tvbuffs.subset.tvb,
1559 abs_offset - tvb->tvbuffs.subset.offset,
1562 case TVBUFF_COMPOSITE:
1563 DISSECTOR_ASSERT_NOT_REACHED();
1564 /* XXX - return composite_pbrk_guint8(tvb, offset, limit, needle); */
1567 DISSECTOR_ASSERT_NOT_REACHED();
1571 /* Find size of stringz (NUL-terminated string) by looking for terminating
1572 * NUL. The size of the string includes the terminating NUL.
1574 * If the NUL isn't found, it throws the appropriate exception.
1577 tvb_strsize(tvbuff_t *tvb, gint offset)
1579 guint abs_offset, junk_length;
1582 check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
1583 nul_offset = tvb_find_guint8(tvb, abs_offset, -1, 0);
1584 if (nul_offset == -1) {
1586 * OK, we hit the end of the tvbuff, so we should throw
1589 * Did we hit the end of the captured data, or the end
1590 * of the actual data? If there's less captured data
1591 * than actual data, we presumably hit the end of the
1592 * captured data, otherwise we hit the end of the actual
1595 if (tvb_length(tvb) < tvb_reported_length(tvb)) {
1598 THROW(ReportedBoundsError);
1601 return (nul_offset - abs_offset) + 1;
1604 /* Find length of string by looking for end of string ('\0'), up to
1605 * 'maxlength' characters'; if 'maxlength' is -1, searches to end
1607 * Returns -1 if 'maxlength' reached before finding EOS. */
1609 tvb_strnlen(tvbuff_t *tvb, gint offset, guint maxlength)
1612 guint abs_offset, junk_length;
1614 check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
1616 result_offset = tvb_find_guint8(tvb, abs_offset, maxlength, 0);
1618 if (result_offset == -1) {
1622 return result_offset - abs_offset;
1627 * Implement strneql etc
1631 * Call strncmp after checking if enough chars left, returning 0 if
1632 * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
1635 tvb_strneql(tvbuff_t *tvb, gint offset, const gchar *str, gint size)
1639 ptr = ensure_contiguous_no_exception(tvb, offset, size, NULL);
1642 int cmp = strncmp((const char *)ptr, str, size);
1645 * Return 0 if equal, -1 otherwise.
1647 return (cmp == 0 ? 0 : -1);
1650 * Not enough characters in the tvbuff to match the
1658 * Call strncasecmp after checking if enough chars left, returning 0 if
1659 * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
1662 tvb_strncaseeql(tvbuff_t *tvb, gint offset, const gchar *str, gint size)
1666 ptr = ensure_contiguous_no_exception(tvb, offset, size, NULL);
1669 int cmp = strncasecmp((const char *)ptr, str, size);
1672 * Return 0 if equal, -1 otherwise.
1674 return (cmp == 0 ? 0 : -1);
1677 * Not enough characters in the tvbuff to match the
1685 * Call memcmp after checking if enough chars left, returning 0 if
1686 * it returns 0 (meaning "equal") and -1 otherwise, otherwise return -1.
1689 tvb_memeql(tvbuff_t *tvb, gint offset, const guint8 *str, gint size)
1693 ptr = ensure_contiguous_no_exception(tvb, offset, size, NULL);
1696 int cmp = memcmp(ptr, str, size);
1699 * Return 0 if equal, -1 otherwise.
1701 return (cmp == 0 ? 0 : -1);
1704 * Not enough characters in the tvbuff to match the
1711 /* Convert a string from Unicode to ASCII. At the moment we fake it by
1712 * replacing all non-ASCII characters with a '.' )-: The caller must
1713 * free the result returned. The len parameter is the number of guint16's
1714 * to convert from Unicode. */
1716 tvb_fake_unicode(tvbuff_t *tvb, int offset, int len, gboolean little_endian)
1722 /* Make sure we have enough data before allocating the buffer,
1723 so we don't blow up if the length is huge. */
1724 tvb_ensure_bytes_exist(tvb, offset, 2*len);
1726 /* We know we won't throw an exception, so we don't have to worry
1727 about leaking this buffer. */
1728 buffer = g_malloc(len + 1);
1730 for (i = 0; i < len; i++) {
1731 character = little_endian ? tvb_get_letohs(tvb, offset)
1732 : tvb_get_ntohs(tvb, offset);
1733 buffer[i] = character < 256 ? character : '.';
1742 /* Convert a string from Unicode to ASCII. At the moment we fake it by
1743 * replacing all non-ASCII characters with a '.' )-: The len parameter is
1744 * the number of guint16's to convert from Unicode.
1746 * This function allocates memory from a buffer with packet lifetime.
1747 * You do not have to free this buffer, it will be automatically freed
1748 * when wireshark starts decoding the next packet.
1751 tvb_get_ephemeral_faked_unicode(tvbuff_t *tvb, int offset, int len, gboolean little_endian)
1757 /* Make sure we have enough data before allocating the buffer,
1758 so we don't blow up if the length is huge. */
1759 tvb_ensure_bytes_exist(tvb, offset, 2*len);
1761 /* We know we won't throw an exception, so we don't have to worry
1762 about leaking this buffer. */
1763 buffer = ep_alloc(len + 1);
1765 for (i = 0; i < len; i++) {
1766 character = little_endian ? tvb_get_letohs(tvb, offset)
1767 : tvb_get_ntohs(tvb, offset);
1768 buffer[i] = character < 256 ? character : '.';
1778 * Format the data in the tvb from offset for length ...
1782 tvb_format_text(tvbuff_t *tvb, gint offset, gint size)
1787 if ((ptr = ensure_contiguous(tvb, offset, size)) == NULL) {
1789 len = tvb_length_remaining(tvb, offset);
1790 ptr = ensure_contiguous(tvb, offset, len);
1794 return format_text(ptr, len);
1799 * Like "tvb_format_text()", but for null-padded strings; don't show
1800 * the null padding characters as "\000".
1803 tvb_format_stringzpad(tvbuff_t *tvb, gint offset, gint size)
1805 const guint8 *ptr, *p;
1809 if ((ptr = ensure_contiguous(tvb, offset, size)) == NULL) {
1811 len = tvb_length_remaining(tvb, offset);
1812 ptr = ensure_contiguous(tvb, offset, len);
1816 for (p = ptr, stringlen = 0; stringlen < len && *p != '\0'; p++, stringlen++)
1818 return format_text(ptr, stringlen);
1823 * Given a tvbuff, an offset, and a length, allocate a buffer big enough
1824 * to hold a non-null-terminated string of that length at that offset,
1825 * plus a trailing '\0', copy the string into it, and return a pointer
1828 * Throws an exception if the tvbuff ends before the string does.
1831 tvb_get_string(tvbuff_t *tvb, gint offset, gint length)
1834 guint8 *strbuf = NULL;
1836 tvb_ensure_bytes_exist(tvb, offset, length);
1838 ptr = ensure_contiguous(tvb, offset, length);
1839 strbuf = g_malloc(length + 1);
1841 memcpy(strbuf, ptr, length);
1843 strbuf[length] = '\0';
1847 * Given a tvbuff, an offset, and a length, allocate a buffer big enough
1848 * to hold a non-null-terminated string of that length at that offset,
1849 * plus a trailing '\0', copy the string into it, and return a pointer
1852 * Throws an exception if the tvbuff ends before the string does.
1854 * This function allocates memory from a buffer with packet lifetime.
1855 * You do not have to free this buffer, it will be automatically freed
1856 * when wireshark starts decoding the next packet.
1857 * Do not use this function if you want the allocated memory to be persistent
1858 * after the current packet has been dissected.
1861 tvb_get_ephemeral_string(tvbuff_t *tvb, gint offset, gint length)
1864 guint8 *strbuf = NULL;
1866 tvb_ensure_bytes_exist(tvb, offset, length);
1868 ptr = ensure_contiguous(tvb, offset, length);
1869 strbuf = ep_alloc(length + 1);
1871 memcpy(strbuf, ptr, length);
1873 strbuf[length] = '\0';
1879 * Given a tvbuff and an offset, with the offset assumed to refer to
1880 * a null-terminated string, find the length of that string (and throw
1881 * an exception if the tvbuff ends before we find the null), allocate
1882 * a buffer big enough to hold the string, copy the string into it,
1883 * and return a pointer to the string. Also return the length of the
1884 * string (including the terminating null) through a pointer.
1887 tvb_get_stringz(tvbuff_t *tvb, gint offset, gint *lengthp)
1892 size = tvb_strsize(tvb, offset);
1893 strptr = g_malloc(size);
1894 tvb_memcpy(tvb, strptr, offset, size);
1899 * Given a tvbuff and an offset, with the offset assumed to refer to
1900 * a null-terminated string, find the length of that string (and throw
1901 * an exception if the tvbuff ends before we find the null), allocate
1902 * a buffer big enough to hold the string, copy the string into it,
1903 * and return a pointer to the string. Also return the length of the
1904 * string (including the terminating null) through a pointer.
1906 * This function allocates memory from a buffer with packet lifetime.
1907 * You do not have to free this buffer, it will be automatically freed
1908 * when wireshark starts decoding the next packet.
1909 * Do not use this function if you want the allocated memory to be persistent
1910 * after the current packet has been dissected.
1913 tvb_get_ephemeral_stringz(tvbuff_t *tvb, gint offset, gint *lengthp)
1918 size = tvb_strsize(tvb, offset);
1919 strptr = ep_alloc(size);
1920 tvb_memcpy(tvb, strptr, offset, size);
1925 /* Looks for a stringz (NUL-terminated string) in tvbuff and copies
1926 * no more than bufsize number of bytes, including terminating NUL, to buffer.
1927 * Returns length of string (not including terminating NUL), or -1 if the string was
1928 * truncated in the buffer due to not having reached the terminating NUL.
1929 * In this way, it acts like g_snprintf().
1931 * bufsize MUST be greater than 0.
1933 * When processing a packet where the remaining number of bytes is less
1934 * than bufsize, an exception is not thrown if the end of the packet
1935 * is reached before the NUL is found. If no NUL is found before reaching
1936 * the end of the short packet, -1 is still returned, and the string
1937 * is truncated with a NUL, albeit not at buffer[bufsize - 1], but
1938 * at the correct spot, terminating the string.
1940 * *bytes_copied will contain the number of bytes actually copied,
1941 * including the terminating-NUL.
1944 _tvb_get_nstringz(tvbuff_t *tvb, gint offset, guint bufsize, guint8* buffer,
1948 guint abs_offset, junk_length;
1950 gboolean decreased_max = FALSE;
1952 check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
1954 /* There must at least be room for the terminating NUL. */
1955 DISSECTOR_ASSERT(bufsize != 0);
1957 /* If there's no room for anything else, just return the NUL. */
1964 /* Only read to end of tvbuff, w/o throwing exception. */
1965 len = tvb_length_remaining(tvb, abs_offset);
1967 /* check_offset_length() won't throw an exception if we're
1968 * looking at the byte immediately after the end of the tvbuff. */
1970 THROW(ReportedBoundsError);
1973 /* This should not happen because check_offset_length() would
1974 * have already thrown an exception if 'offset' were out-of-bounds.
1976 DISSECTOR_ASSERT(len != -1);
1979 * If we've been passed a negative number, bufsize will
1982 DISSECTOR_ASSERT(bufsize <= G_MAXINT);
1984 if ((guint)len < bufsize) {
1986 decreased_max = TRUE;
1992 stringlen = tvb_strnlen(tvb, abs_offset, limit - 1);
1993 /* If NUL wasn't found, copy the data and return -1 */
1994 if (stringlen == -1) {
1995 tvb_memcpy(tvb, buffer, abs_offset, limit);
1996 if (decreased_max) {
1998 /* Add 1 for the extra NUL that we set at buffer[limit],
1999 * pretending that it was copied as part of the string. */
2000 *bytes_copied = limit + 1;
2003 *bytes_copied = limit;
2008 /* Copy the string to buffer */
2009 tvb_memcpy(tvb, buffer, abs_offset, stringlen + 1);
2010 *bytes_copied = stringlen + 1;
2014 /* Looks for a stringz (NUL-terminated string) in tvbuff and copies
2015 * no more than bufsize number of bytes, including terminating NUL, to buffer.
2016 * Returns length of string (not including terminating NUL), or -1 if the string was
2017 * truncated in the buffer due to not having reached the terminating NUL.
2018 * In this way, it acts like g_snprintf().
2020 * When processing a packet where the remaining number of bytes is less
2021 * than bufsize, an exception is not thrown if the end of the packet
2022 * is reached before the NUL is found. If no NUL is found before reaching
2023 * the end of the short packet, -1 is still returned, and the string
2024 * is truncated with a NUL, albeit not at buffer[bufsize - 1], but
2025 * at the correct spot, terminating the string.
2028 tvb_get_nstringz(tvbuff_t *tvb, gint offset, guint bufsize, guint8* buffer)
2032 return _tvb_get_nstringz(tvb, offset, bufsize, buffer, &bytes_copied);
2035 /* Like tvb_get_nstringz(), but never returns -1. The string is guaranteed to
2036 * have a terminating NUL. If the string was truncated when copied into buffer,
2037 * a NUL is placed at the end of buffer to terminate it.
2040 tvb_get_nstringz0(tvbuff_t *tvb, gint offset, guint bufsize, guint8* buffer)
2042 gint len, bytes_copied;
2044 len = _tvb_get_nstringz(tvb, offset, bufsize, buffer, &bytes_copied);
2047 buffer[bufsize - 1] = 0;
2048 return bytes_copied - 1;
2056 * Given a tvbuff, an offset into the tvbuff, and a length that starts
2057 * at that offset (which may be -1 for "all the way to the end of the
2058 * tvbuff"), find the end of the (putative) line that starts at the
2059 * specified offset in the tvbuff, going no further than the specified
2062 * Return the length of the line (not counting the line terminator at
2063 * the end), or, if we don't find a line terminator:
2065 * if "deseg" is true, return -1;
2067 * if "deseg" is false, return the amount of data remaining in
2070 * Set "*next_offset" to the offset of the character past the line
2071 * terminator, or past the end of the buffer if we don't find a line
2072 * terminator. (It's not set if we return -1.)
2075 tvb_find_line_end(tvbuff_t *tvb, gint offset, int len, gint *next_offset,
2083 len = tvb_length_remaining(tvb, offset);
2085 * XXX - what if "len" is still -1, meaning "offset is past the
2086 * end of the tvbuff"?
2088 eob_offset = offset + len;
2091 * Look either for a CR or an LF.
2093 eol_offset = tvb_pbrk_guint8(tvb, offset, len, (guint8 *)"\r\n");
2094 if (eol_offset == -1) {
2096 * No CR or LF - line is presumably continued in next packet.
2100 * Tell our caller we saw no EOL, so they can
2101 * try to desegment and get the entire line
2107 * Pretend the line runs to the end of the tvbuff.
2109 linelen = eob_offset - offset;
2110 *next_offset = eob_offset;
2114 * Find the number of bytes between the starting offset
2117 linelen = eol_offset - offset;
2122 if (tvb_get_guint8(tvb, eol_offset) == '\r') {
2124 * Yes - is it followed by an LF?
2126 if (eol_offset + 1 >= eob_offset) {
2128 * Dunno - the next byte isn't in this
2133 * We'll return -1, although that
2134 * runs the risk that if the line
2135 * really *is* terminated with a CR,
2136 * we won't properly dissect this
2139 * It's probably more likely that
2140 * the line ends with CR-LF than
2141 * that it ends with CR by itself.
2147 * Well, we can at least look at the next
2150 if (tvb_get_guint8(tvb, eol_offset + 1) == '\n') {
2152 * It's an LF; skip over the CR.
2160 * Return the offset of the character after the last
2161 * character in the line, skipping over the last character
2162 * in the line terminator.
2164 *next_offset = eol_offset + 1;
2170 * Given a tvbuff, an offset into the tvbuff, and a length that starts
2171 * at that offset (which may be -1 for "all the way to the end of the
2172 * tvbuff"), find the end of the (putative) line that starts at the
2173 * specified offset in the tvbuff, going no further than the specified
2176 * However, treat quoted strings inside the buffer specially - don't
2177 * treat newlines in quoted strings as line terminators.
2179 * Return the length of the line (not counting the line terminator at
2180 * the end), or the amount of data remaining in the buffer if we don't
2181 * find a line terminator.
2183 * Set "*next_offset" to the offset of the character past the line
2184 * terminator, or past the end of the buffer if we don't find a line
2188 tvb_find_line_end_unquoted(tvbuff_t *tvb, gint offset, int len,
2191 gint cur_offset, char_offset;
2198 len = tvb_length_remaining(tvb, offset);
2200 * XXX - what if "len" is still -1, meaning "offset is past the
2201 * end of the tvbuff"?
2203 eob_offset = offset + len;
2205 cur_offset = offset;
2209 * Is this part of the string quoted?
2213 * Yes - look only for the terminating quote.
2215 char_offset = tvb_find_guint8(tvb, cur_offset, len,
2219 * Look either for a CR, an LF, or a '"'.
2221 char_offset = tvb_pbrk_guint8(tvb, cur_offset, len,
2222 (guint8 *)"\r\n\"");
2224 if (char_offset == -1) {
2226 * Not found - line is presumably continued in
2228 * We pretend the line runs to the end of the tvbuff.
2230 linelen = eob_offset - offset;
2231 *next_offset = eob_offset;
2237 * We're processing a quoted string.
2238 * We only looked for ", so we know it's a ";
2239 * as we're processing a quoted string, it's a
2247 c = tvb_get_guint8(tvb, char_offset);
2250 * Un-quoted "; it begins a quoted
2256 * It's a CR or LF; we've found a line
2259 * Find the number of bytes between the
2260 * starting offset and the CR or LF.
2262 linelen = char_offset - offset;
2269 * Yes; is it followed by an LF?
2271 if (char_offset + 1 < eob_offset &&
2272 tvb_get_guint8(tvb, char_offset + 1)
2275 * Yes; skip over the CR.
2282 * Return the offset of the character after
2283 * the last character in the line, skipping
2284 * over the last character in the line
2285 * terminator, and quit.
2287 *next_offset = char_offset + 1;
2293 * Step past the character we found.
2295 cur_offset = char_offset + 1;
2296 if (cur_offset >= eob_offset) {
2298 * The character we found was the last character
2299 * in the tvbuff - line is presumably continued in
2301 * We pretend the line runs to the end of the tvbuff.
2303 linelen = eob_offset - offset;
2304 *next_offset = eob_offset;
2312 * Format a bunch of data from a tvbuff as bytes, returning a pointer
2313 * to the string with the formatted data, with "punct" as a byte
2317 tvb_bytes_to_str_punct(tvbuff_t *tvb, gint offset, gint len, gchar punct)
2319 return bytes_to_str_punct(tvb_get_ptr(tvb, offset, len), len, punct);
2323 * Format a bunch of data from a tvbuff as bytes, returning a pointer
2324 * to the string with the formatted data.
2327 tvb_bytes_to_str(tvbuff_t *tvb, gint offset, gint len)
2329 return bytes_to_str(tvb_get_ptr(tvb, offset, len), len);
2332 /* Find a needle tvbuff within a haystack tvbuff. */
2334 tvb_find_tvb(tvbuff_t *haystack_tvb, tvbuff_t *needle_tvb, gint haystack_offset)
2336 guint haystack_abs_offset, haystack_abs_length;
2337 const guint8 *haystack_data;
2338 const guint8 *needle_data;
2339 const guint needle_len = needle_tvb->length;
2340 const guint8 *location;
2342 if (haystack_tvb->length < 1 || needle_tvb->length < 1) {
2346 /* Get pointers to the tvbuffs' data. */
2347 haystack_data = tvb_get_ptr(haystack_tvb, 0, -1);
2348 needle_data = tvb_get_ptr(needle_tvb, 0, -1);
2350 check_offset_length(haystack_tvb, haystack_offset, -1,
2351 &haystack_abs_offset, &haystack_abs_length);
2353 location = epan_memmem(haystack_data + haystack_abs_offset, haystack_abs_length,
2354 needle_data, needle_len);
2357 return location - haystack_data;
2368 * Uncompresses a zlib compressed packet inside a message of tvb at offset with
2369 * length comprlen. Returns an uncompressed tvbuffer if uncompression
2370 * succeeded or NULL if uncompression failed.
2372 #define TVB_Z_MIN_BUFSIZ 32768
2373 #define TVB_Z_MAX_BUFSIZ 1048576 * 10
2374 /* #define TVB_Z_DEBUG 1 */
2378 tvb_uncompress(tvbuff_t *tvb, int offset, int comprlen)
2383 guint bytes_out = 0;
2384 guint8 *compr = NULL;
2385 guint8 *uncompr = NULL;
2386 tvbuff_t *uncompr_tvb = NULL;
2387 z_streamp strm = NULL;
2388 Bytef *strmbuf = NULL;
2389 guint inits_done = 0;
2390 gint wbits = MAX_WBITS;
2391 guint8 *next = NULL;
2392 guint bufsiz = TVB_Z_MIN_BUFSIZ;
2394 guint inflate_passes = 0;
2395 guint bytes_in = tvb_length_remaining(tvb, offset);
2402 strm = g_malloc0(sizeof(z_stream));
2408 compr = tvb_memdup(tvb, offset, comprlen);
2416 * Assume that the uncompressed data is at least twice as big as
2417 * the compressed size.
2419 bufsiz = tvb_length_remaining(tvb, offset) * 2;
2421 if (bufsiz < TVB_Z_MIN_BUFSIZ) {
2422 bufsiz = TVB_Z_MIN_BUFSIZ;
2423 } else if (bufsiz > TVB_Z_MAX_BUFSIZ) {
2424 bufsiz = TVB_Z_MIN_BUFSIZ;
2428 printf("bufsiz: %u bytes\n", bufsiz);
2433 strm->next_in = next;
2434 strm->avail_in = comprlen;
2437 strmbuf = g_malloc0(bufsiz);
2439 if(strmbuf == NULL) {
2445 strm->next_out = strmbuf;
2446 strm->avail_out = bufsiz;
2448 err = inflateInit2(strm, wbits);
2459 memset(strmbuf, '\0', bufsiz);
2460 strm->next_out = strmbuf;
2461 strm->avail_out = bufsiz;
2463 err = inflate(strm, Z_SYNC_FLUSH);
2465 if (err == Z_OK || err == Z_STREAM_END) {
2466 guint bytes_pass = bufsiz - strm->avail_out;
2472 if (uncompr == NULL) {
2473 uncompr = g_memdup(strmbuf, bytes_pass);
2475 guint8 *new_data = g_malloc0(bytes_out +
2478 if (new_data == NULL) {
2484 if (uncompr != NULL) {
2491 g_memmove(new_data, uncompr, bytes_out);
2492 g_memmove((new_data + bytes_out), strmbuf,
2499 bytes_out += bytes_pass;
2501 if ( err == Z_STREAM_END) {
2507 } else if (err == Z_BUF_ERROR) {
2509 * It's possible that not enough frames were captured
2510 * to decompress this fully, so return what we've done
2517 if (uncompr != NULL) {
2524 } else if (err == Z_DATA_ERROR && inits_done == 1
2525 && uncompr == NULL && (*compr == 0x1f) &&
2526 (*(compr + 1) == 0x8b)) {
2528 * inflate() is supposed to handle both gzip and deflate
2529 * streams automatically, but in reality it doesn't
2530 * seem to handle either (at least not within the
2531 * context of an HTTP response.) We have to try
2532 * several tweaks, depending on the type of data and
2533 * version of the library installed.
2537 * Gzip file format. Skip past the header, since the
2538 * fix to make it work (setting windowBits to 31)
2539 * doesn't work with all versions of the library.
2541 Bytef *c = compr + 2;
2544 if (*c == Z_DEFLATED) {
2556 /* Skip past the MTIME, XFL, and OS fields. */
2559 if (flags & (1 << 2)) {
2560 /* An Extra field is present. */
2561 gint xsize = (gint)(*c |
2567 if (flags & (1 << 3)) {
2568 /* A null terminated filename */
2570 while (*c != '\0') {
2577 if (flags & (1 << 4)) {
2578 /* A null terminated comment */
2580 while (*c != '\0') {
2590 strm->next_in = next;
2591 if (c - compr > comprlen) {
2598 comprlen -= (c - compr);
2601 err = inflateInit2(strm, wbits);
2603 } else if (err == Z_DATA_ERROR && uncompr == NULL &&
2607 * Re-init the stream with a negative
2608 * MAX_WBITS. This is necessary due to
2609 * some servers (Apache) not sending
2610 * the deflate header with the
2611 * content-encoded response.
2617 strm->next_in = next;
2618 strm->avail_in = comprlen;
2620 memset(strmbuf, '\0', bufsiz);
2621 strm->next_out = strmbuf;
2622 strm->avail_out = bufsiz;
2624 err = inflateInit2(strm, wbits);
2642 if (uncompr == NULL) {
2651 printf("inflate() total passes: %u\n", inflate_passes);
2652 printf("bytes in: %u\nbytes out: %u\n\n", bytes_in, bytes_out);
2655 if (uncompr != NULL) {
2656 uncompr_tvb = tvb_new_real_data((guint8*) uncompr, bytes_out,
2658 tvb_set_free_cb(uncompr_tvb, g_free);
2665 tvb_uncompress(tvbuff_t *tvb _U_, int offset _U_, int comprlen _U_)