<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11912">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ctrl: handle ECONNRESET on initial read gracefully<br><br>When we're reading CTRL header we might get ECONNRESET when previous<br>message was successfully sent and the peer have already closed<br>connection. This is not really an error (for example script requesting<br>single variable have closed the connection right after reading our<br>answer) so just just discard the message and carry on.<br><br>Change-Id: I3cbdb3909660d605181d6923031336d296ea4340<br>---<br>M src/gsm/ipa.c<br>1 file changed, 9 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/12/11912/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gsm/ipa.c b/src/gsm/ipa.c</span><br><span>index 6ee003d..82ca304 100644</span><br><span>--- a/src/gsm/ipa.c</span><br><span>+++ b/src/gsm/ipa.c</span><br><span>@@ -548,7 +548,7 @@</span><br><span>  * \param[in] needed Home many bytes we have to read.</span><br><span>  * \returns boolean indicating whether message should be discarded.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool recv_discard_msg(int *ret, int fd, struct msgb *msg, int needed)</span><br><span style="color: hsl(120, 100%, 40%);">+static inline bool recv_discard_msg(int *ret, int fd, struct msgb *msg, int needed, bool initial)</span><br><span> {</span><br><span>      *ret = recv(fd, msg->tail, needed, 0);</span><br><span> </span><br><span>@@ -563,6 +563,12 @@</span><br><span>                 return false;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (errno == ECONNRESET && initial && needed == 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* that's initial attempt to read IPA header while connection is already closed */</span><br><span style="color: hsl(120, 100%, 40%);">+                *ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* errors indicated by -1 return value, let's save the actual error code */</span><br><span>      *ret = -errno;</span><br><span>       return true;</span><br><span>@@ -607,7 +613,7 @@</span><br><span>   if (msg->l2h == NULL) {</span><br><span>           /* first read our 3-byte header */</span><br><span>           needed = sizeof(*hh) - msg->len;</span><br><span style="color: hsl(0, 100%, 40%);">-             discard = recv_discard_msg(&ret, fd, msg, needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                discard = recv_discard_msg(&ret, fd, msg, needed, true);</span><br><span>                 if (discard)</span><br><span>                        goto discard_msg;</span><br><span> </span><br><span>@@ -648,7 +654,7 @@</span><br><span>   needed = len - msgb_l2len(msg);</span><br><span> </span><br><span>  if (needed > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            discard = recv_discard_msg(&ret, fd, msg, needed);</span><br><span style="color: hsl(120, 100%, 40%);">+                discard = recv_discard_msg(&ret, fd, msg, needed, false);</span><br><span>                if (discard)</span><br><span>                         goto discard_msg;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11912">change 11912</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/11912"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3cbdb3909660d605181d6923031336d296ea4340 </div>
<div style="display:none"> Gerrit-Change-Number: 11912 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>