ANNOUNCEMENT: Live Wireshark University & Allegro Packets online APAC Wireshark Training Session
April 17th, 2024 | 14:30-16:00 SGT (UTC+8) | Online

Wireshark-dev: [Wireshark-dev] Possible bug in dissect_pipe_dcerpc() (packet-smb-pipe.c)

From: Pascal Quantin <pascal.quantin@xxxxxxxxx>
Date: Sat, 28 Jul 2012 00:14:04 +0200
Hi all,

while working on fixing a few Clang warnings in packet-smb-pipe.c, I discovered that the hash_key variable in dissect_pipe_dcerpc() function is never used.
According to the nice comment Guy put in revision 7777 above the variable assignment, I have the feeling that it is actually useful in case of reassembly in both directions and that the following patch should be applied:

Index: packet-smb-pipe.c
===================================================================
--- packet-smb-pipe.c   (révision 44082)
+++ packet-smb-pipe.c   (copie de travail)
@@ -3348,7 +3348,7 @@
                 * in this direction, by searching for its reassembly
                 * structure.
                 */
-               fd_head=fragment_get(pinfo, fid, dcerpc_fragment_table);
+               fd_head=fragment_get(pinfo, hash_key, dcerpc_fragment_table);
                if(!fd_head){
                        /* No reassembly, so this is a new pdu. check if the
                           dissector wants us to reassemble it or if we
@@ -3370,11 +3370,11 @@
                           more data ?
                        */
                        if(pinfo->desegment_len){
-                               fragment_add_check(d_tvb, 0, pinfo, fid,
+                               fragment_add_check(d_tvb, 0, pinfo, hash_key,
                                        dcerpc_fragment_table,
                                        dcerpc_reassembled_table,
                                        0, reported_len, TRUE);
-                               fragment_set_tot_len(pinfo, fid,
+                               fragment_set_tot_len(pinfo, hash_key,
                                        dcerpc_fragment_table,
                                        pinfo->desegment_len+reported_len);
                        }
@@ -3392,7 +3392,7 @@
                while(fd_head->next){
                        fd_head=fd_head->next;
                }
-               fd_head=fragment_add_check(d_tvb, 0, pinfo, fid,
+               fd_head=fragment_add_check(d_tvb, 0, pinfo, hash_key,
                        dcerpc_fragment_table, dcerpc_reassembled_table,
                        fd_head->offset+fd_head->len,
                        reported_len, TRUE);
@@ -3426,7 +3426,7 @@
         * up so that we don't have to distinguish between the first
         * pass and subsequent passes?
         */
-       fd_head=fragment_add_check(d_tvb, 0, pinfo, fid, dcerpc_fragment_table,
+       fd_head=fragment_add_check(d_tvb, 0, pinfo, hash_key, dcerpc_fragment_table,
            dcerpc_reassembled_table, 0, 0, TRUE);
        if(!fd_head){
                /* we didnt find it, try any of the heuristic dissectors

Am I right or should we remove the hash_key variable?

Regards,
Pascal.