<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Discussion</title><link href="https://sourceforge.net/p/linx/discussion/" rel="alternate"/><link href="https://sourceforge.net/p/linx/discussion/feed.atom" rel="self"/><id>https://sourceforge.net/p/linx/discussion/</id><updated>2020-08-03T10:00:08.890000Z</updated><subtitle>Recent posts to Discussion</subtitle><entry><title>Suspecting double kfree in function: reset_receive_filter , file : af_linx.c</title><link href="https://sourceforge.net/p/linx/discussion/644155/thread/ab725b3a0b/?limit=25#4c6f" rel="alternate"/><published>2020-08-03T10:00:08.890000Z</published><updated>2020-08-03T10:00:08.890000Z</updated><author><name>Rajesh Kumar Vishwakarma</name><uri>https://sourceforge.net/u/z00msup/</uri></author><id>https://sourceforge.netae3ef3b9e9cfb655dda487e936075a43f94e01de</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi *,&lt;br/&gt;
i was browsing the linx code and i found  some suspeted code as below.&lt;br/&gt;
In &lt;strong&gt;reset_receive_filter &lt;/strong&gt;function taking lock and reseting the filter , but storing the filter outside the lock.&lt;br/&gt;
since "filter =  linx_sk(sk)-&amp;gt;filter;" is outside the lock , so there can be multiple threades which can store the memory and free it multiple times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Assuming &lt;strong&gt;reset_receive_filter &lt;/strong&gt;  can be accessed by multiple threads for same sock*, that's why it is protected with lock.&lt;/p&gt;
&lt;p&gt;static void reset_receive_filter(struct sock &lt;em&gt;sk)&lt;br/&gt;
{&lt;br/&gt;
    LINX_SIGSELECT &lt;/em&gt;filter;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;linx_trace_enter&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;LINX_TRACEGROUP_AF_LINX&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;, &lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;unlikely&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nv"&gt;NULL&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt; {
    &lt;span class="nv"&gt;spin_lock_bh&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;sk_receive_queue&lt;/span&gt;.&lt;span class="nv"&gt;lock&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;from_filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;LINX_ILLEGAL_SPID&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;NULL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;spin_unlock_bh&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;sk_receive_queue&lt;/span&gt;.&lt;span class="nv"&gt;lock&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;linx_kfree&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;so i think ,  it should be somting like below:&lt;/p&gt;
&lt;p&gt;static void reset_receive_filter(struct sock &lt;em&gt;sk)&lt;br/&gt;
{&lt;br/&gt;
    LINX_SIGSELECT &lt;/em&gt;filter;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;linx_trace_enter&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;LINX_TRACEGROUP_AF_LINX&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%p&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;, &lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nv"&gt;spin_lock_bh&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;sk_receive_queue&lt;/span&gt;.&lt;span class="nv"&gt;lock&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;**&lt;/span&gt;
&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;unlikely&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nv"&gt;NULL&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt; {
    &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;from_filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;LINX_ILLEGAL_SPID&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;linx_sk&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sk&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;NULL&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;    spin_unlock_bh(&amp;amp;sk-&amp;gt;sk_receive_queue.lock);&lt;/strong&gt;&lt;br/&gt;
&lt;strong&gt;    if (unlikely(filter != NULL)) {&lt;br/&gt;
            linx_kfree(filter);&lt;br/&gt;
     }&lt;br/&gt;
&lt;/strong&gt;}&lt;/p&gt;
&lt;p&gt;there are more places code is present in same way... for ex in setup_receive_filter, linx_ioctl_receive etc....&lt;/p&gt;
&lt;p&gt;please provide your the feedback.&lt;/p&gt;
&lt;p&gt;Thanks in advance,&lt;br/&gt;
Rajesh Kumar Vishwakarma&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Different sender and receiver threads II</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/39df39e8/?limit=25#c22a" rel="alternate"/><published>2018-07-13T17:28:19.447000Z</published><updated>2018-07-13T17:28:19.447000Z</updated><author><name>Matthew Morgan</name><uri>https://sourceforge.net/u/mattmorgan/</uri></author><id>https://sourceforge.net5bddd5ce4427feb9a81509fdc18041fb4837060c</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Oh sorry.  VxWorks is a whole different thing.  I can help with Linux environments but for VxWorks I think you need to contact Enea.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Different sender and receiver threads II</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/39df39e8/?limit=25#b041/0c14" rel="alternate"/><published>2018-07-13T15:17:11.360000Z</published><updated>2018-07-13T15:17:11.360000Z</updated><author><name>Dev</name><uri>https://sourceforge.net/u/dev91/</uri></author><id>https://sourceforge.net159bd1193ba430c01acb2d0f6328981b77392500</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I tried but I am unable to use mkethcon or any other command on vxworks shell. &lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Different sender and receiver threads II</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/39df39e8/?limit=25#b041" rel="alternate"/><published>2018-07-13T14:26:38.548000Z</published><updated>2018-07-13T14:26:38.548000Z</updated><author><name>Matthew Morgan</name><uri>https://sourceforge.net/u/mattmorgan/</uri></author><id>https://sourceforge.netf110a4b5daa835d58e13647e215559430fb0df06</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;you need to setup a connection between the two machines.  See section 4.5 of the user guide&lt;br/&gt;
&lt;a href="http://linx.sourceforge.net/linxdoc/doc/usersguide/UsersGuide_LINX_for_Linux.html#inter-node"&gt;http://linx.sourceforge.net/linxdoc/doc/usersguide/UsersGuide_LINX_for_Linux.html#inter-node&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Different sender and receiver threads II</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/39df39e8/?limit=25#bba9" rel="alternate"/><published>2018-07-12T12:50:38.902000Z</published><updated>2018-07-12T12:50:38.902000Z</updated><author><name>Dev</name><uri>https://sourceforge.net/u/dev91/</uri></author><id>https://sourceforge.netdf41fad19cf043a818717948dab6c8e6c116a910</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I am trying to use linx socket between two machines. How can I do that?&lt;/p&gt;
&lt;p&gt;Unable to proceed further on my project.&lt;br/&gt;
Can someone post a sample client server program on LINX which communicates between client and server in C or C++.&lt;/p&gt;
&lt;p&gt;Any help would be highly appreciated.&lt;/p&gt;
&lt;p&gt;Thanks&lt;br/&gt;
Dev&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>linx_receive_w_tmo</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/bd9d1daa/?limit=25#bcaa" rel="alternate"/><published>2017-03-15T21:36:59.518000Z</published><updated>2017-03-15T21:36:59.518000Z</updated><author><name>Aditya</name><uri>https://sourceforge.net/u/adityaaggarwal6/</uri></author><id>https://sourceforge.net69d7fa5cbcd292ba5d35044b93d7d2dc7c3b819f</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;I am calling this function linx_receive_w_tmo with 30000ms timeout but after 30 seconds timeout, it is not returning. But if i give 5 seconds timeout, it works perfectly. What could be the reason if it is not returning?&lt;/p&gt;
&lt;p&gt;I am using LINX communication between threads. Please help me!!&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Help with linx_open errno 95</title><link href="https://sourceforge.net/p/linx/discussion/644156/thread/e6214577/" rel="alternate"/><published>2016-05-19T14:56:33.880000Z</published><updated>2016-05-19T14:56:33.880000Z</updated><author><name>john richey</name><uri>https://sourceforge.net/u/johnwrichey/</uri></author><id>https://sourceforge.netfaaf35324243a8a9b3dfa3de3cbec90ef7b48d05</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Bin (bbzhang) identified the root cause of this issue.  We think that the following update is needed:&lt;/p&gt;
&lt;p&gt;This block of code in net/linx/af_linx.c:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;    /* linx_publish() must be done first, it sets linx_sk(sk)-&amp;gt;addr! */
    err = linx_sock_stats_add(linx_sk(sk));
    if (err != 0) {
            goto out_release;
    }
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;needs to be updated to:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;    /* linx_publish() must be done first, it sets linx_sk(sk)-&amp;gt;addr! */
    err = linx_sock_stats_add(linx_sk(sk));
    if (err != 0) {

            /* The following code is the fix for linx_open failure. */

            /* if the return code is ERESTARTSYS, clean up before return */
            if(err == -ERESTARTSYS) {
                linx_unpublish(sk);
                linx_sk(sk)-&amp;gt;addr = NULL;
            }

            goto out_release;
    }
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;</summary></entry></feed>