From 5a02c9dbedb04f1c6a5bee4610a50cae55294b2d Mon Sep 17 00:00:00 2001
From: Alexander Alashkin <alexander.alashkin@cesanta.com>
Date: Fri, 1 Apr 2016 13:09:50 +0100
Subject: [PATCH] Fix create and close conn for UDP. Closes cesanta/dev#3162

PUBLISHED_FROM=071fb54d90750143751c1badc52757f0ba90bdb5
---
 mongoose.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index 2e69976d7..bc6afca74 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2328,7 +2328,7 @@ int mg_resolve(const char *host, char *buf, size_t n) {
 }
 #endif /* MG_DISABLE_SYNC_RESOLVER */
 
-MG_INTERNAL struct mg_connection *mg_create_connection(
+MG_INTERNAL struct mg_connection *mg_create_connection_base(
     struct mg_mgr *mgr, mg_event_handler_t callback,
     struct mg_add_sock_opts opts) {
   struct mg_connection *conn;
@@ -2346,13 +2346,22 @@ MG_INTERNAL struct mg_connection *mg_create_connection(
      * doesn't compile with pedantic ansi flags.
      */
     conn->recv_mbuf_limit = ~0;
-    if (!mg_if_create_conn(conn)) {
-      MG_FREE(conn);
-      conn = NULL;
-      MG_SET_PTRPTR(opts.error_string, "failed init connection");
-    }
   } else {
-    MG_SET_PTRPTR(opts.error_string, "failed create connection");
+    MG_SET_PTRPTR(opts.error_string, "failed to create connection");
+  }
+
+  return conn;
+}
+
+MG_INTERNAL struct mg_connection *mg_create_connection(
+    struct mg_mgr *mgr, mg_event_handler_t callback,
+    struct mg_add_sock_opts opts) {
+  struct mg_connection *conn = mg_create_connection_base(mgr, callback, opts);
+
+  if (!mg_if_create_conn(conn)) {
+    MG_FREE(conn);
+    conn = NULL;
+    MG_SET_PTRPTR(opts.error_string, "failed to init connection");
   }
 
   return conn;
@@ -2694,7 +2703,8 @@ void mg_if_recv_udp_cb(struct mg_connection *nc, void *buf, int len,
     if (nc == NULL) {
       struct mg_add_sock_opts opts;
       memset(&opts, 0, sizeof(opts));
-      nc = mg_create_connection(lc->mgr, lc->handler, opts);
+      /* Create fake connection w/out sock initialization */
+      nc = mg_create_connection_base(lc->mgr, lc->handler, opts);
       if (nc != NULL) {
         nc->sock = lc->sock;
         nc->listener = lc;
-- 
GitLab