Pcapng: clean up Section Header Block handling

Change-Id: I8516d0c561ed0b63e49a3594027c9c15bb789258
Reviewed-on: https://code.wireshark.org/review/9726
Reviewed-by: Hadriel Kaplan <hadrielk@yahoo.com>
Petri-Dish: Hadriel Kaplan <hadrielk@yahoo.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Hadriel Kaplan 2015-07-20 11:09:06 -04:00 committed by Anders Broman
parent 4048ca0a27
commit e25562badd
10 changed files with 150 additions and 85 deletions

View File

@ -1012,7 +1012,7 @@ process_cap_file(wtap *wth, const char *filename)
nstime_t prev_time;
gboolean know_order = FALSE;
order_t order = IN_ORDER;
wtapng_section_t *shb_inf;
const gchar *shb_comment;
gchar *p;
@ -1167,19 +1167,18 @@ process_cap_file(wtap *wth, const char *filename)
}
cf_info.comment = NULL;
shb_inf = wtap_file_get_shb_info(wth);
if (shb_inf) {
shb_comment = wtap_file_get_shb_comment(wth);
if (shb_comment) {
/* opt_comment is always 0-terminated by pcapng_read_section_header_block */
cf_info.comment = g_strdup(shb_inf->opt_comment);
}
g_free(shb_inf);
if (cf_info.comment) {
cf_info.comment = g_strdup(shb_comment);
/* multi-line comments would conflict with the formatting that capinfos uses
we replace linefeeds with spaces */
we replace carriage-returns/linefeeds with spaces */
p = cf_info.comment;
while (*p != '\0') {
if (*p == '\n')
*p = ' ';
if (*p == '\r')
*p = ' ';
p++;
}
}

View File

@ -50,9 +50,12 @@ libwiretap.so.0 libwiretap0 #MINVER#
wtap_fdreopen@Base 1.9.1
wtap_file_encap@Base 1.9.1
wtap_file_get_idb_info@Base 1.9.1
wtap_file_get_shb_info@Base 1.9.1
wtap_file_get_nrb_for_new_file@Base 1.99.9
wtap_file_get_shb@Base 1.99.9
wtap_file_get_shb_comment@Base 1.99.9
wtap_file_get_shb_for_new_file@Base 1.99.9
wtap_free_nrb@Base 1.99.9
wtap_free_shb@Base 1.99.9
wtap_file_size@Base 1.9.1
wtap_file_tsprec@Base 1.99.0
wtap_file_type_subtype@Base 1.12.0~rc1

View File

@ -1285,7 +1285,7 @@ DIAG_ON(cast-qual)
wtap_file_type_subtype_string(wtap_file_type_subtype(wth)));
}
shb_hdr = wtap_file_get_shb_info(wth);
shb_hdr = wtap_file_get_shb_for_new_file(wth);
idb_inf = wtap_file_get_idb_info(wth);
nrb_hdr = wtap_file_get_nrb_for_new_file(wth);
@ -1320,7 +1320,7 @@ DIAG_ON(cast-qual)
if (read_count == 1) {
if (split_packet_count > 0 || secs_per_block > 0) {
if (!fileset_extract_prefix_suffix(argv[optind+1], &fprefix, &fsuffix))
exit(2);
goto error_on_exit;
filename = fileset_get_filename_by_pattern(block_cnt++, phdr, fprefix, fsuffix);
} else {
@ -1340,7 +1340,7 @@ DIAG_ON(cast-qual)
if (pdh == NULL) {
fprintf(stderr, "editcap: Can't open or create %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
} /* first packet only handling */
@ -1365,7 +1365,7 @@ DIAG_ON(cast-qual)
if (!wtap_dump_close(pdh, &err)) {
fprintf(stderr, "editcap: Error writing to %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
block_start.secs = block_start.secs + secs_per_block; /* reset for next interval */
g_free(filename);
@ -1382,7 +1382,7 @@ DIAG_ON(cast-qual)
if (pdh == NULL) {
fprintf(stderr, "editcap: Can't open or create %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
}
}
@ -1394,7 +1394,7 @@ DIAG_ON(cast-qual)
if (!wtap_dump_close(pdh, &err)) {
fprintf(stderr, "editcap: Error writing to %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
g_free(filename);
@ -1410,7 +1410,7 @@ DIAG_ON(cast-qual)
if (pdh == NULL) {
fprintf(stderr, "editcap: Can't open or create %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
}
} /* split packet handling */
@ -1747,7 +1747,7 @@ DIAG_ON(cast-qual)
filename, wtap_strerror(err));
break;
}
exit(2);
goto error_on_exit;
}
written_count++;
}
@ -1781,7 +1781,7 @@ DIAG_ON(cast-qual)
if (pdh == NULL) {
fprintf(stderr, "editcap: Can't open or create %s: %s\n",
filename, wtap_strerror(err));
exit(2);
goto error_on_exit;
}
}
@ -1791,9 +1791,9 @@ DIAG_ON(cast-qual)
if (!wtap_dump_close(pdh, &err)) {
fprintf(stderr, "editcap: Error writing to %s: %s\n", filename,
wtap_strerror(err));
exit(2);
goto error_on_exit;
}
g_free(shb_hdr);
wtap_free_shb(shb_hdr);
shb_hdr = NULL;
wtap_free_nrb(nrb_hdr);
nrb_hdr = NULL;
@ -1817,6 +1817,12 @@ DIAG_ON(cast-qual)
}
return 0;
error_on_exit:
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
g_free(idb_inf);
exit(2);
}
/* Skip meta-information read from file to return offset of real

37
file.c
View File

@ -1306,7 +1306,7 @@ cf_merge_files(char **out_filenamep, int in_file_count,
fake_interface_ids = TRUE;
/* Create SHB info */
shb_hdr = wtap_file_get_shb_info(in_files[0].wth);
shb_hdr = wtap_file_get_shb_for_new_file(in_files[0].wth);
comment_gstr = g_string_new("");
g_string_append_printf(comment_gstr, "%s \n",shb_hdr->opt_comment);
g_string_append_printf(comment_gstr, "File created by merging: \n");
@ -1315,14 +1315,10 @@ cf_merge_files(char **out_filenamep, int in_file_count,
for (i = 0; i < in_file_count; i++) {
g_string_append_printf(comment_gstr, "File%d: %s \n",i+1,in_files[i].filename);
}
shb_hdr->section_length = -1;
/* options */
/* TODO: handle comments from each file being merged */
if (shb_hdr->opt_comment)
g_free(shb_hdr->opt_comment);
shb_hdr->opt_comment = g_string_free(comment_gstr, FALSE); /* NULL if not available */
shb_hdr->shb_hardware = NULL; /* NULL if not available, UTF-8 string containing the */
/* description of the hardware used to create this section. */
shb_hdr->shb_os = NULL; /* NULL if not available, UTF-8 string containing the name */
/* of the operating system used to create this section. */
shb_hdr->shb_user_appl = g_strdup("Wireshark"); /* NULL if not available, UTF-8 string containing the name */
/* of the application used to create this section. */
@ -3921,39 +3917,26 @@ cf_unignore_frame(capture_file *cf, frame_data *frame)
const gchar *
cf_read_shb_comment(capture_file *cf)
{
wtapng_section_t *shb_inf;
const gchar *temp_str;
/* Get info from SHB */
shb_inf = wtap_file_get_shb_info(cf->wth);
if (shb_inf == NULL)
return NULL;
temp_str = shb_inf->opt_comment;
g_free(shb_inf);
return temp_str;
return wtap_file_get_shb_comment(cf->wth);
}
void
cf_update_capture_comment(capture_file *cf, gchar *comment)
{
wtapng_section_t *shb_inf;
const gchar *shb_comment;
/* Get info from SHB */
shb_inf = wtap_file_get_shb_info(cf->wth);
shb_comment = wtap_file_get_shb_comment(cf->wth);
/* See if the comment has changed or not */
if (shb_inf && shb_inf->opt_comment) {
if (strcmp(shb_inf->opt_comment, comment) == 0) {
if (shb_comment) {
if (strcmp(shb_comment, comment) == 0) {
g_free(comment);
g_free(shb_inf);
return;
}
}
g_free(shb_inf);
/* The comment has changed, let's update it */
wtap_write_shb_comment(cf->wth, comment);
/* Mark the file as having unsaved changes */
@ -4681,7 +4664,7 @@ cf_save_records(capture_file *cf, const char *fname, guint save_format,
int encap;
/* XXX: what free's this shb_hdr? */
shb_hdr = wtap_file_get_shb_info(cf->wth);
shb_hdr = wtap_file_get_shb_for_new_file(cf->wth);
idb_inf = wtap_file_get_idb_info(cf->wth);
nrb_hdr = wtap_file_get_nrb_for_new_file(cf->wth);
@ -4913,7 +4896,7 @@ cf_export_specified_packets(capture_file *cf, const char *fname,
and then write it out if it's one of the specified ones. */
/* XXX: what free's this shb_hdr? */
shb_hdr = wtap_file_get_shb_info(cf->wth);
shb_hdr = wtap_file_get_shb_for_new_file(cf->wth);
idb_inf = wtap_file_get_idb_info(cf->wth);
nrb_hdr = wtap_file_get_nrb_for_new_file(cf->wth);

View File

@ -274,7 +274,7 @@ DIAG_ON(cast-qual)
}
DEBUG_PRINT("file_type_subtype is %u\n", wtap_file_type_subtype(wth));
shb_hdr = wtap_file_get_shb_info(wth);
shb_hdr = wtap_file_get_shb_for_new_file(wth);
idb_inf = wtap_file_get_idb_info(wth);
nrb_hdr = wtap_file_get_nrb_for_new_file(wth);
@ -287,7 +287,7 @@ DIAG_ON(cast-qual)
if (pdh == NULL) {
fprintf(stderr, "reordercap: Failed to open output file: (%s) - error %s\n",
outfile, wtap_strerror(err));
g_free(shb_hdr);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
exit(1);
}
@ -361,11 +361,11 @@ DIAG_ON(cast-qual)
if (!wtap_dump_close(pdh, &err)) {
fprintf(stderr, "reordercap: Error closing %s: %s\n", outfile,
wtap_strerror(err));
g_free(shb_hdr);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
exit(1);
}
g_free(shb_hdr);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
/* Finally, close infile */

View File

@ -105,7 +105,7 @@ summary_fill_in(capture_file *cf, summary_tally *st)
{
frame_data *first_frame, *cur_frame;
guint32 framenum;
wtapng_section_t* shb_inf;
const wtapng_section_t* shb_inf;
iface_options iface;
guint i;
wtapng_iface_descriptions_t* idb_info;
@ -156,7 +156,7 @@ summary_fill_in(capture_file *cf, summary_tally *st)
st->dfilter = cf->dfilter;
/* Get info from SHB */
shb_inf = wtap_file_get_shb_info(cf->wth);
shb_inf = wtap_file_get_shb(cf->wth);
if(shb_inf == NULL){
st->opt_comment = NULL;
st->shb_hardware = NULL;
@ -167,7 +167,6 @@ summary_fill_in(capture_file *cf, summary_tally *st)
st->shb_hardware = shb_inf->shb_hardware;
st->shb_os = shb_inf->shb_os;
st->shb_user_appl = shb_inf->shb_user_appl;
g_free(shb_inf);
}
st->ifaces = g_array_new(FALSE, FALSE, sizeof(iface_options));

View File

@ -3137,14 +3137,12 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
wtapng_section_t *shb_hdr = NULL;
wtapng_iface_descriptions_t *idb_inf = NULL;
wtapng_name_res_t *nrb_hdr = NULL;
char *appname = NULL;
struct wtap_pkthdr phdr;
Buffer buf;
epan_dissect_t *edt = NULL;
wtap_phdr_init(&phdr);
shb_hdr = wtap_file_get_shb_info(cf->wth);
idb_inf = wtap_file_get_idb_info(cf->wth);
#ifdef PCAP_NG_DEFAULT
if (idb_inf->interface_data->len > 1) {
@ -3166,12 +3164,13 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
snapshot_length = WTAP_MAX_PACKET_SIZE;
}
shb_hdr = wtap_file_get_shb_for_new_file(cf->wth);
nrb_hdr = wtap_file_get_nrb_for_new_file(cf->wth);
/* If we don't have an application name add Tshark */
if (shb_hdr->shb_user_appl == NULL) {
appname = g_strdup_printf("TShark (Wireshark) %s", get_ws_vcs_version_info());
shb_hdr->shb_user_appl = appname;
/* this is free'd by wtap_free_shb() later */
shb_hdr->shb_user_appl = g_strdup_printf("TShark (Wireshark) %s", get_ws_vcs_version_info());
}
if (linktype != WTAP_ENCAP_PER_PACKET &&
@ -3382,8 +3381,7 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
break;
}
wtap_dump_close(pdh, &err);
g_free(shb_hdr);
g_free(appname);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
exit(2);
}
@ -3488,8 +3486,7 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
break;
}
wtap_dump_close(pdh, &err);
g_free(shb_hdr);
g_free(appname);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
exit(2);
}
@ -3603,8 +3600,7 @@ out:
cf->wth = NULL;
g_free(save_file_string);
g_free(shb_hdr);
g_free(appname);
wtap_free_shb(shb_hdr);
wtap_free_nrb(nrb_hdr);
return err;

View File

@ -119,7 +119,7 @@ exp_pdu_file_open(exp_pdu_t *exp_pdu_tap_data)
appname = g_strdup_printf("Wireshark %s", get_ws_vcs_version_info());
shb_hdr = g_new(wtapng_section_t,1);
shb_hdr = g_new0(wtapng_section_t,1);
shb_hdr->section_length = -1;
/* options */
shb_hdr->opt_comment = g_strdup_printf("Dump of PDUs from %s", cfile.filename);

View File

@ -167,21 +167,32 @@ wtap_file_tsprec(wtap *wth)
return wth->file_tsprec;
}
wtapng_section_t *
wtap_file_get_shb_info(wtap *wth)
const gchar *
wtap_file_get_shb_comment(wtap *wth)
{
wtapng_section_t *shb_hdr;
return wth ? wth->shb_hdr.opt_comment : NULL;
}
if(wth == NULL)
return NULL;
shb_hdr = g_new(wtapng_section_t,1);
shb_hdr->section_length = wth->shb_hdr.section_length;
const wtapng_section_t *
wtap_file_get_shb(wtap *wth)
{
return wth ? &(wth->shb_hdr) : NULL;
}
wtapng_section_t *
wtap_file_get_shb_for_new_file(wtap *wth)
{
wtapng_section_t *shb_hdr;
if (wth == NULL)
return NULL;
shb_hdr = g_new0(wtapng_section_t,1);
shb_hdr->section_length = -1;
/* options */
shb_hdr->opt_comment = wth->shb_hdr.opt_comment; /* NULL if not available */
shb_hdr->shb_hardware = wth->shb_hdr.shb_hardware; /* NULL if not available, UTF-8 string containing the description of the hardware used to create this section. */
shb_hdr->shb_os = wth->shb_hdr.shb_os; /* NULL if not available, UTF-8 string containing the name of the operating system used to create this section. */
shb_hdr->shb_user_appl = wth->shb_hdr.shb_user_appl; /* NULL if not available, UTF-8 string containing the name of the application used to create this section. */
shb_hdr->opt_comment = g_strdup(wth->shb_hdr.opt_comment);
/* the rest of the options remain NULL */
return shb_hdr;
}
@ -219,6 +230,19 @@ wtap_write_nrb_comment(wtap *wth, gchar *comment)
wth->nrb_hdr->opt_comment = comment;
}
void
wtap_free_shb(wtapng_section_t *shb_hdr)
{
if (shb_hdr == NULL)
return;
g_free(shb_hdr->opt_comment);
g_free(shb_hdr->shb_hardware);
g_free(shb_hdr->shb_os);
g_free(shb_hdr->shb_user_appl);
g_free(shb_hdr);
}
void
wtap_write_shb_comment(wtap *wth, gchar *comment)
{

View File

@ -1222,6 +1222,9 @@ typedef struct wtapng_section_s {
* following section.
* Section Length equal -1 (0xFFFFFFFFFFFFFFFF) means
* that the size of the section is not specified
* Note: if writing to a new file, this length will
* be invalid if anything changes, such as the other
* members of this struct, or the packets written.
*/
/* options */
gchar *opt_comment; /**< NULL if not available */
@ -1232,7 +1235,7 @@ typedef struct wtapng_section_s {
gchar *shb_os; /**< NULL if not available, UTF-8 string containing the
* name of the operating system used to create this section.
*/
gchar *shb_user_appl; /**< NULL if not available, UTF-8 string containing the
gchar *shb_user_appl; /**< NULL if not available, UTF-8 string containing the
* name of the application used to create this section.
*/
} wtapng_section_t;
@ -1659,8 +1662,64 @@ WS_DLL_PUBLIC
int wtap_file_encap(wtap *wth);
WS_DLL_PUBLIC
int wtap_file_tsprec(wtap *wth);
/**
* @brief Gets existing section header block, not for new file.
* @details Returns the pointer to the existing SHB, without creating a
* new one. This should only be used for accessing info, not
* for creating a new file based on existing SHB info. Use
* wtap_file_get_shb_for_new_file() for that.
*
* @param wth The wiretap session.
* @return The existing section header, which must NOT be g_free'd.
*/
WS_DLL_PUBLIC
wtapng_section_t* wtap_file_get_shb_info(wtap *wth);
const wtapng_section_t* wtap_file_get_shb(wtap *wth);
/**
* @brief Gets new section header block for new file, based on existing info.
* @details Creates a new wtapng_section_t section header block and only
* copies appropriate members of the SHB for a new file. In
* particular, the comment string is copied, and any custom options
* which should be copied are copied. The os, hardware, and
* application strings are *not* copied.
*
* @note Use wtap_free_shb() to free the returned section header.
*
* @param wth The wiretap session.
* @return The new section header, which must be wtap_free_shb'd.
*/
WS_DLL_PUBLIC
wtapng_section_t* wtap_file_get_shb_for_new_file(wtap *wth);
/**
* Free's a section header block and all of its members.
*/
WS_DLL_PUBLIC
void wtap_free_shb(wtapng_section_t *shb_hdr);
/**
* @brief Gets the section header comment string.
* @details This gets the pointer, without duplicating the string.
*
* @param wth The wtap session.
* @return The comment string.
*/
WS_DLL_PUBLIC
const gchar* wtap_file_get_shb_comment(wtap *wth);
/**
* @brief Sets or replaces the section header comment.
* @details The passed-in comment string is set to be the comment
* for the section header block. The passed-in string's
* ownership will be owned by the block, so it should be
* duplicated before passing into this function.
*
* @param wth The wiretap session.
* @param comment The comment string.
*/
WS_DLL_PUBLIC
void wtap_write_shb_comment(wtap *wth, gchar *comment);
/**
* @brief Gets existing interface descriptions.
@ -1669,7 +1728,7 @@ wtapng_section_t* wtap_file_get_shb_info(wtap *wth);
* @note The returned pointer must be g_free'd, but its internal
* interface_data must not.
*
* @param wth The current wtap.
* @param wth The wiretap session.
* @return A new struct of the existing section descriptions, which must be g_free'd.
*/
WS_DLL_PUBLIC
@ -1682,7 +1741,7 @@ wtapng_iface_descriptions_t *wtap_file_get_idb_info(wtap *wth);
*
* @note Use wtap_free_nrb() to free the returned pointer.
*
* @param wth The current wiretap header.
* @param wth The wiretap session.
* @return The new name resolution info, which must be wtap_free_nrb'd.
*/
WS_DLL_PUBLIC
@ -1718,10 +1777,6 @@ const gchar* wtap_get_nrb_comment(wtap *wth);
WS_DLL_PUBLIC
void wtap_write_nrb_comment(wtap *wth, gchar *comment);
/*** sets/replaces the section header comment ***/
WS_DLL_PUBLIC
void wtap_write_shb_comment(wtap *wth, gchar *comment);
/*** close the file descriptors for the current file ***/
WS_DLL_PUBLIC
void wtap_fdclose(wtap *wth);