Wireshark-dev: [Wireshark-dev] header alignment fix for wiretap/nettl.c
From: Kenichi Okuyama <kenichi.okuyama@xxxxxxxxx>
Date: Thu, 22 Sep 2011 01:57:21 +0900
Dear list, I was wondering around with the reason why my customer's TRC0 file captured by HPUX 10.20 can not be analyzed using Wireshark 1.6.2. I think I found a way to make it work, but I really don't know if this works for other versions of HPUX. So, I'd like to disclose it here asking for someone to test if this works for TRC0 files captured by other than HPUX 10.20. # diff files are attached. This patch work for both 1.6.2 and trunc. In short, in old magic number ( HPUX till 9 ) header is aligned to 2 bytes. On other hand, in new magic number, header is aligned to 4 bytes. That seems to be the reason why we need extra 2 bytes for padding (probably). The reason why old code didn't work, was because it assumed that extra 2 bytes were necessary only for HPUX 11. But it was really for all the TRC0 files with new header.... I really don't know if my guess is correct, but at least, it's working on my data so far... Hope this will be a hint for someone who concur this problem. best regards, -- Kenichi Okuyama URL: http://www.dd.iij4u.or.jp/~okuyamak/
Index: wiretap/nettl.c =================================================================== --- wiretap/nettl.c (revision 39072) +++ wiretap/nettl.c (working copy) @@ -176,7 +176,7 @@ /* header is followed by data and once again the total length (2 bytes) ! */ typedef struct { - gboolean is_hpux_11; + int align; } nettl_t; static gboolean nettl_read(wtap *wth, int *err, gchar **err_info, @@ -231,10 +231,16 @@ wth->file_type = WTAP_FILE_NETTL; nettl = g_malloc(sizeof(nettl_t)); wth->priv = (void *)nettl; - if (file_hdr.os_vers[2] == '1' && file_hdr.os_vers[3] == '1') - nettl->is_hpux_11 = TRUE; - else - nettl->is_hpux_11 = FALSE; + + if ( memcmp(file_hdr.magic, nettl_magic_hpux9, MAGIC_SIZE) == 0 ) { + nettl->align = 2; + } else if ( memcmp(file_hdr.magic, nettl_magic_hpux10, MAGIC_SIZE) == 0 ) { + nettl->align = 4; + } else { + // You shouldn't be coming here. + nettl->align = 1; + } + wth->subtype_read = nettl_read; wth->subtype_seek_read = nettl_seek_read; wth->snapshot_length = 0; /* not available */ @@ -575,11 +581,22 @@ * nettl files from HP-UX 11? * * And what are the extra two bytes? + * + * OKKY: seems like this extra two bytes are to align header size + * to 4 bytes in case of HPUX 10 and 11. */ - if (nettl->is_hpux_11) { - if (file_seek(fh, 2, SEEK_CUR, err) == -1) return -1; - offset += 2; - } + { + int alignment_offset; + + alignment_offset = ( nettl->align - (( offset ) % nettl->align )) % nettl->align; + if ( alignment_offset != 0 ) { + if ( file_seek( fh, alignment_offset, SEEK_CUR, err ) == -1 ) + return -1; + } + + offset += alignment_offset; + } + padlen = 0; break;
- Prev by Date: [Wireshark-dev] exTabSettings Visual Studio addin
- Next by Date: Re: [Wireshark-dev] AthTek NetWalk
- Previous by thread: [Wireshark-dev] exTabSettings Visual Studio addin
- Next by thread: [Wireshark-dev] Problem compiling SVN because of a mismatch 32/64 bits ?
- Index(es):