On 20 June 2013 23:52, Guy Harris <g...@alum.mit.edu> wrote:

>
> On Jun 20, 2013, at 1:05 PM, Nadav Vinik <nadav...@gmail.com> wrote:
>
> >
> >
> > On 20 June 2013 22:47, Guy Harris <g...@alum.mit.edu> wrote:
> >
> > On Jun 20, 2013, at 12:36 PM, Nadav Vinik <nadav...@gmail.com> wrote:
> >
> > > Hoever if I change to pcap_close(&handle) I get the following error:
> >
> > Because code that passes a pointer to a pointer to a pcap_t, rather than
> a pointer to a pcap_t, to pcap_close() is erroneous code.
> >
> > You cannot arrange that libpcap somehow make a pcap_t or a pointer to it
> detectably invalid when you close the handle; if you want to know whether a
> pcap_t has been closed, you will have to make your code explicitly mark it
> as such.  For example, replace all occurrences of
> >
> >         pcap_close(handle);
> >
> > in your code with
> >
> >         pcap_close(handle);
> >         handle = NULL;
> >
> > Back to the original question.
> >
> > Is there a way to check if handle is already free?
>
> No.  If it's freed, what that does to it depends on the implementation of
> free() on your platform.
>
> However:
>
> > my problem is that it become free even before it reach to pcap_close.
>
> Are you certain that's really the case?
>
> > see:
> > https://mail.gnome.org/archives/vala-list/2013-June/msg00022.html
>
> Which says:
>
> > tmp18_ = pcap_next (_tmp16_, &_tmp17_);
> >      (&header);
> >     header = _tmp17_;
> >     _tmp19_ = _tmp18_;
> >     _tmp19__length1 = -1;
> >     *//_tmp19_ = (g_free (_tmp19_), NULL);*
>
> If that first line was really
>
>         _tmp18_ = pcap_next (_tmp16_, &_tmp17_);
>
> then that g_free() call is *WRONG WRONG WRONG*.  The return value of
> pcap_next() is *NOT* allocated by the pcap_next() call, it may well be a
> pointer into the *MIDDLE* of a buffer allocated by libpcap, or might be a
> pointer to a buffer that libpcap allocated for its own purposes and will
> use in future calls, and you *MUST NOT EVER EVER EVER EVER EVER EVER EVER
> EVER EVER EVER EVER* call free() or g_free() or anything else that frees
> memory on it; you must leave it up to libpcap to free whatever memory it's
> contained in.
>
> In addition, you must not assume a pointer returned by the Nth call to
> pcap_next() will be valid after the N+1st call to pcap_next().
>
> If that code was generated by the Vala compiler, either the compiler, or
> whatever file caused the compiler to generate code that hands the result of
> pcap_next() to g_free(), need to be fixed.
>
> As for printing "handle is null", well, let's look at _pcap_close0():
>
> > #define _pcap_close0(var) ((var == NULL) ? NULL : (var = (pcap_close
> (var),
> > NULL)))
>
> That code will set var to NULL if it's not already null; if it's not NULL,
> it will set it to the result of the C expression
>
>         (pcap_close (var), NULL)
>
> which evaluates to NULL with a side-effect of pcap_close() being called on
> its previous value.
>
> I.e., _pcap_close0() does the exact "explicitly mark it as such" I was
> talking about.
>
> On Linux, when libpcap uses the "turbopacket" (memory-mapped) mechanism to
> receive packets (which it does by default), pcap_next() copies the packet
> from the memory-mapped buffer into a buffer it allocated (because that's
> the only way to make sure it'll remain valid after the call that returns
> it, due to the way the memory-mapped mechanism works), and pcap_close()
> frees that buffer.
>
> If something bogusly frees that buffer before pcap_close() is called,
> pcap_close() will attempt to free it, and get a double free error.
>
> The *ONLY* correct way to fix this is *NEVER* to free the result of
> pcap_next().  I don't know how, in Vala, you say "this function returns a
> pointer to an array of Uint8s, but you must not ever free that what that
> pointer points to", but if that needs to be specified in the Vala code for
> pcap_next, and it's not being done, it needs to be done, and if it *is*
> being done, the Vala compiler is broken.


Thanks you very much :)

I fix the problem. using the keyword "unowned" prevent vala to free the
result.
I open bug on it on the vapi binding:
https://github.com/apmasell/vapis/issues/6

Thanks
Nadav

-- 
הבלוג שלי:
http://nadavvin.com
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers

Reply via email to