Bug Summary

File:ui/summary.c
Warning:line 227, column 29
Read function called when stream is in EOF state. Function has no effect

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name summary.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-20/lib/clang/20 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -I /builds/wireshark/wireshark/ui -I /builds/wireshark/wireshark/build/ui -I /builds/wireshark/wireshark/wiretap -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-20/lib/clang/20/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-truncation -Wno-format-nonliteral -Wno-pointer-sign -std=gnu11 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /builds/wireshark/wireshark/sbout/2025-09-16-100354-3934-1 -x c /builds/wireshark/wireshark/ui/summary.c
1/* summary.c
2 * Routines for capture file summary info
3 *
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11#include <config.h>
12
13#include <wiretap/pcap-encap.h>
14#include <wiretap/wtap_opttypes.h>
15
16#include <epan/packet.h>
17#include <wsutil/file_util.h>
18#include <gcrypt.h>
19#include "cfile.h"
20#include "ui/summary.h"
21
22// Strongest to weakest
23#define HASH_SIZE_SHA25632 32
24#define HASH_SIZE_SHA120 20
25
26#define HASH_BUF_SIZE(1024 * 1024) (1024 * 1024)
27
28static void
29tally_frame_data(frame_data *cur_frame, summary_tally *sum_tally)
30{
31 double cur_time;
32
33 sum_tally->bytes += cur_frame->pkt_len;
34 if (cur_frame->passed_dfilter){
35 sum_tally->filtered_count++;
36 sum_tally->filtered_bytes += cur_frame->pkt_len;
37 }
38 if (cur_frame->marked){
39 sum_tally->marked_count++;
40 sum_tally->marked_bytes += cur_frame->pkt_len;
41 }
42 if (cur_frame->ignored){
43 sum_tally->ignored_count++;
44 }
45
46 if (cur_frame->has_ts) {
47 /* This packet has a time stamp. */
48 cur_time = nstime_to_sec(&cur_frame->abs_ts);
49
50 sum_tally->packet_count_ts++;
51 if (cur_time < sum_tally->start_time) {
52 sum_tally->start_time = cur_time;
53 }
54 if (cur_time > sum_tally->stop_time){
55 sum_tally->stop_time = cur_time;
56 }
57 if (cur_frame->passed_dfilter){
58 sum_tally->filtered_count_ts++;
59 /*
60 * If we've seen one filtered packet, this is the first
61 * one.
62 */
63 if (sum_tally->filtered_count == 1){
64 sum_tally->filtered_start= cur_time;
65 sum_tally->filtered_stop = cur_time;
66 } else {
67 if (cur_time < sum_tally->filtered_start) {
68 sum_tally->filtered_start = cur_time;
69 }
70 if (cur_time > sum_tally->filtered_stop) {
71 sum_tally->filtered_stop = cur_time;
72 }
73 }
74 }
75 if (cur_frame->marked){
76 sum_tally->marked_count_ts++;
77 /*
78 * If we've seen one marked packet, this is the first
79 * one.
80 */
81 if (sum_tally->marked_count == 1){
82 sum_tally->marked_start= cur_time;
83 sum_tally->marked_stop = cur_time;
84 } else {
85 if (cur_time < sum_tally->marked_start) {
86 sum_tally->marked_start = cur_time;
87 }
88 if (cur_time > sum_tally->marked_stop) {
89 sum_tally->marked_stop = cur_time;
90 }
91 }
92 }
93 }
94}
95
96static void
97hash_to_str(const unsigned char *hash, size_t length, char *str) {
98 int i;
99
100 for (i = 0; i < (int) length; i++) {
101 snprintf(str+(i*2), 3, "%02x", hash[i]);
102 }
103}
104
105void
106summary_fill_in(capture_file *cf, summary_tally *st)
107{
108 frame_data *first_frame, *cur_frame;
109 uint32_t framenum;
110 iface_summary_info iface;
111 unsigned i;
112 wtapng_iface_descriptions_t* idb_info;
113 wtap_block_t wtapng_if_descr;
114 wtapng_if_descr_mandatory_t *wtapng_if_descr_mand;
115 wtap_block_t if_stats;
116 uint64_t isb_ifdrop;
117 char* if_string;
118 if_filter_opt_t if_filter;
119
120 FILE *fh;
121 char *hash_buf;
122 gcry_md_hd_t hd;
123 size_t hash_bytes;
124
125 st->packet_count_ts = 0;
126 st->start_time = DBL_MAX1.7976931348623157e+308;
127 st->stop_time = DBL_MIN2.2250738585072014e-308;
128 st->bytes = 0;
129 st->filtered_count = 0;
130 st->filtered_count_ts = 0;
131 st->filtered_start = DBL_MAX1.7976931348623157e+308;
132 st->filtered_stop = 0;
133 st->filtered_bytes = 0;
134 st->marked_count = 0;
135 st->marked_count_ts = 0;
136 st->marked_start = DBL_MAX1.7976931348623157e+308;
137 st->marked_stop = 0;
138 st->marked_bytes = 0;
139 st->ignored_count = 0;
140
141 /* initialize the tally */
142 if (cf->count != 0) {
1
Assuming field 'count' is equal to 0
2
Taking false branch
143 first_frame = frame_data_sequence_find(cf->provider.frames, 1);
144 if (first_frame->has_ts) {
145 st->start_time = nstime_to_sec(&first_frame->abs_ts);
146 st->stop_time = nstime_to_sec(&first_frame->abs_ts);
147 }
148
149 for (framenum = 1; framenum <= cf->count; framenum++) {
150 cur_frame = frame_data_sequence_find(cf->provider.frames, framenum);
151 tally_frame_data(cur_frame, st);
152 }
153 }
154
155 st->filename = cf->filename;
156 st->file_length = cf->f_datalen;
157 st->file_type = cf->cd_t;
158 st->compression_type = cf->compression_type;
159 st->is_tempfile = cf->is_tempfile;
160 st->file_encap_type = cf->lnk_t;
161 st->packet_encap_types = cf->linktypes;
162 st->snap = cf->snap;
163 st->elapsed_time = nstime_to_sec(&cf->elapsed_time);
164 st->packet_count = cf->count;
165 st->drops_known = cf->drops_known;
166 st->drops = cf->drops;
167 st->dfilter = cf->dfilter;
168
169 st->ifaces = g_array_new(false0, false0, sizeof(iface_summary_info));
170 idb_info = wtap_file_get_idb_info(cf->provider.wth);
171 for (i = 0; i < idb_info->interface_data->len; i++) {
3
Assuming 'i' is >= field 'len'
4
Loop condition is false. Execution continues on line 214
172 wtapng_if_descr = g_array_index(idb_info->interface_data, wtap_block_t, i)(((wtap_block_t*) (void *) (idb_info->interface_data)->
data) [(i)])
;
173 wtapng_if_descr_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(wtapng_if_descr);
174 if (wtap_block_get_if_filter_option_value(wtapng_if_descr, OPT_IDB_FILTER11, &if_filter) == WTAP_OPTTYPE_SUCCESS) {
175 if (if_filter.type == if_filter_pcap) {
176 iface.cfilter = g_strdup(if_filter.data.filter_str)g_strdup_inline (if_filter.data.filter_str);
177 } else {
178 /* Not a pcap filter string; punt for now */
179 iface.cfilter = NULL((void*)0);
180 }
181 } else {
182 iface.cfilter = NULL((void*)0);
183 }
184 if (wtap_block_get_string_option_value(wtapng_if_descr, OPT_IDB_NAME2, &if_string) == WTAP_OPTTYPE_SUCCESS) {
185 iface.name = g_strdup(if_string)g_strdup_inline (if_string);
186 } else {
187 iface.name = NULL((void*)0);
188 }
189 if (wtap_block_get_string_option_value(wtapng_if_descr, OPT_IDB_DESCRIPTION3, &if_string) == WTAP_OPTTYPE_SUCCESS) {
190 iface.descr = g_strdup(if_string)g_strdup_inline (if_string);
191 } else {
192 iface.descr = NULL((void*)0);
193 }
194 iface.drops_known = false0;
195 iface.drops = 0;
196 iface.snap = wtapng_if_descr_mand->snap_len;
197 iface.encap_type = wtapng_if_descr_mand->wtap_encap;
198 iface.isb_comment = NULL((void*)0);
199 if(wtapng_if_descr_mand->num_stat_entries == 1){
200 /* dumpcap only writes one ISB, only handle that for now */
201 if_stats = g_array_index(wtapng_if_descr_mand->interface_statistics, wtap_block_t, 0)(((wtap_block_t*) (void *) (wtapng_if_descr_mand->interface_statistics
)->data) [(0)])
;
202 if (wtap_block_get_uint64_option_value(if_stats, OPT_ISB_IFDROP5, &isb_ifdrop) == WTAP_OPTTYPE_SUCCESS) {
203 iface.drops_known = true1;
204 iface.drops = isb_ifdrop;
205 }
206 /* XXX: this doesn't get used, and might need to be g_strdup'ed when it does */
207 /* XXX - support multiple comments */
208 if (wtap_block_get_nth_string_option_value(if_stats, OPT_COMMENT1, 0, &iface.isb_comment) != WTAP_OPTTYPE_SUCCESS) {
209 iface.isb_comment = NULL((void*)0);
210 }
211 }
212 g_array_append_val(st->ifaces, iface)g_array_append_vals (st->ifaces, &(iface), 1);
213 }
214 g_free(idb_info);
215
216 (void) g_strlcpy(st->file_sha256, "<unknown>", HASH_STR_SIZE(65));
217 (void) g_strlcpy(st->file_sha1, "<unknown>", HASH_STR_SIZE(65));
218
219 gcry_md_open(&hd, GCRY_MD_SHA256, 0);
220 if (hd) {
5
Assuming 'hd' is non-null
6
Taking true branch
221 gcry_md_enable(hd, GCRY_MD_SHA1);
222 }
223 hash_buf = (char *)g_malloc(HASH_BUF_SIZE(1024 * 1024));
224
225 fh = ws_fopenfopen(cf->filename, "rb");
226 if (fh
6.1
'fh' is non-null
&& hash_buf && hd
7.1
'hd' is non-null
) {
7
Assuming 'hash_buf' is non-null
8
Taking true branch
227 while((hash_bytes = fread(hash_buf, 1, HASH_BUF_SIZE(1024 * 1024), fh)) > 0) {
9
Assuming stream reaches end-of-file here
10
Assuming the condition is true
11
Loop condition is true. Entering loop body
12
Read function called when stream is in EOF state. Function has no effect
228 gcry_md_write(hd, hash_buf, hash_bytes);
229 }
230 gcry_md_final(hd)gcry_md_ctl ((hd), GCRYCTL_FINALIZE, ((void*)0), 0);
231 hash_to_str(gcry_md_read(hd, GCRY_MD_SHA256), HASH_SIZE_SHA25632, st->file_sha256);
232 hash_to_str(gcry_md_read(hd, GCRY_MD_SHA1), HASH_SIZE_SHA120, st->file_sha1);
233 }
234 if (fh) fclose(fh);
235 g_free(hash_buf);
236 gcry_md_close(hd);
237}
238
239#ifdef HAVE_LIBPCAP1
240void
241summary_fill_in_capture(capture_file *cf,capture_options *capture_opts, summary_tally *st)
242{
243 iface_summary_info iface;
244 interface_t *device;
245 unsigned i;
246
247 if (st->ifaces->len == 0) {
248 /*
249 * XXX - do this only if we have a live capture.
250 */
251 for (i = 0; i < capture_opts->all_ifaces->len; i++) {
252 device = &g_array_index(capture_opts->all_ifaces, interface_t, i)(((interface_t*) (void *) (capture_opts->all_ifaces)->data
) [(i)])
;
253 if (!device->selected) {
254 continue;
255 }
256 iface.cfilter = g_strdup(device->cfilter)g_strdup_inline (device->cfilter);
257 iface.name = g_strdup(device->name)g_strdup_inline (device->name);
258 iface.descr = g_strdup(device->display_name)g_strdup_inline (device->display_name);
259 iface.drops_known = cf->drops_known;
260 iface.drops = cf->drops;
261 iface.snap = device->snaplen;
262 iface.encap_type = wtap_pcap_encap_to_wtap_encap(device->active_dlt);
263 g_array_append_val(st->ifaces, iface)g_array_append_vals (st->ifaces, &(iface), 1);
264 }
265 }
266}
267#endif