Browse code

Use undo_lists for saving ring-buffer handles in interactive service

HandleRegisterRingBuffers() in interactive.c did not follow the
the original API of HandleMessage(): a new argument was added
to HandleMessage to pass-in prer-process ring-buffer handles. The
existing undo lists argument is meant for such use.

Rewrite following the original design.

Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <20221229182739.1477336-1-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25864.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit 6ea9cf8146b1d72aa6a4790bc3ac2b99562b2cac)

Selva Nair authored on 2022/12/30 03:27:38
Showing 1 changed files
... ...
@@ -92,6 +92,7 @@ typedef enum {
92 92
     undo_dns4,
93 93
     undo_dns6,
94 94
     undo_domain,
95
+    undo_ring_buffer,
95 96
     _undo_type_max
96 97
 } undo_type_t;
97 98
 typedef list_item_t *undo_lists_t[_undo_type_max];
... ...
@@ -780,7 +781,7 @@ BlockDNSErrHandler(DWORD err, const char *msg)
780 780
 
781 781
 /* Use an always-true match_fn to get the head of the list */
782 782
 static BOOL
783
-CmpEngine(LPVOID item, LPVOID any)
783
+CmpAny(LPVOID item, LPVOID any)
784 784
 {
785 785
     return TRUE;
786 786
 }
... ...
@@ -835,7 +836,7 @@ HandleBlockDNSMessage(const block_dns_message_t *msg, undo_lists_t *lists)
835 835
     }
836 836
     else
837 837
     {
838
-        interface_data = RemoveListItem(&(*lists)[block_dns], CmpEngine, NULL);
838
+        interface_data = RemoveListItem(&(*lists)[block_dns], CmpAny, NULL);
839 839
         if (interface_data)
840 840
         {
841 841
             engine = interface_data->engine;
... ...
@@ -1354,40 +1355,49 @@ DuplicateAndMapRing(HANDLE ovpn_proc, HANDLE orig_handle, HANDLE *new_handle, st
1354 1354
 
1355 1355
 static DWORD
1356 1356
 HandleRegisterRingBuffers(const register_ring_buffers_message_t *rrb, HANDLE ovpn_proc,
1357
-                          ring_buffer_handles_t *ring_buffer_handles)
1357
+                          undo_lists_t *lists)
1358 1358
 {
1359 1359
     DWORD err = 0;
1360 1360
 
1361
-    CloseRingBufferHandles(ring_buffer_handles);
1361
+    ring_buffer_handles_t *ring_buffer_handles = RemoveListItem(&(*lists)[undo_ring_buffer], CmpAny, NULL);
1362
+
1363
+    if (ring_buffer_handles)
1364
+    {
1365
+        CloseRingBufferHandles(ring_buffer_handles);
1366
+    }
1367
+    else if ((ring_buffer_handles = calloc(1, sizeof(*ring_buffer_handles))) == NULL)
1368
+    {
1369
+        return ERROR_OUTOFMEMORY;
1370
+    }
1362 1371
 
1363 1372
     err = OvpnDuplicateHandle(ovpn_proc, rrb->device, &ring_buffer_handles->device);
1364 1373
     if (err != ERROR_SUCCESS)
1365 1374
     {
1366
-        return err;
1375
+        goto out;
1367 1376
     }
1368 1377
 
1369 1378
     err = DuplicateAndMapRing(ovpn_proc, rrb->send_ring_handle, &ring_buffer_handles->send_ring_handle, &ring_buffer_handles->send_ring);
1370 1379
     if (err != ERROR_SUCCESS)
1371 1380
     {
1372
-        return err;
1381
+        goto out;
1373 1382
     }
1374 1383
 
1375 1384
     err = DuplicateAndMapRing(ovpn_proc, rrb->receive_ring_handle, &ring_buffer_handles->receive_ring_handle, &ring_buffer_handles->receive_ring);
1376 1385
     if (err != ERROR_SUCCESS)
1377 1386
     {
1378
-        return err;
1387
+        goto out;
1379 1388
     }
1380 1389
 
1381 1390
     err = OvpnDuplicateHandle(ovpn_proc, rrb->send_tail_moved, &ring_buffer_handles->send_tail_moved);
1382 1391
     if (err != ERROR_SUCCESS)
1383 1392
     {
1384
-        return err;
1393
+        goto out;
1385 1394
     }
1386 1395
 
1387 1396
     err = OvpnDuplicateHandle(ovpn_proc, rrb->receive_tail_moved, &ring_buffer_handles->receive_tail_moved);
1388 1397
     if (err != ERROR_SUCCESS)
1389 1398
     {
1390
-        return err;
1399
+        goto out;
1391 1400
     }
1392 1401
 
1393 1402
     if (!register_ring_buffers(ring_buffer_handles->device, ring_buffer_handles->send_ring,
... ...
@@ -1396,6 +1406,16 @@ HandleRegisterRingBuffers(const register_ring_buffers_message_t *rrb, HANDLE ovp
1396 1396
     {
1397 1397
         err = GetLastError();
1398 1398
         MsgToEventLog(M_SYSERR, TEXT("Could not register ring buffers"));
1399
+        goto out;
1400
+    }
1401
+
1402
+    err = AddListItem(&(*lists)[undo_ring_buffer], ring_buffer_handles);
1403
+
1404
+out:
1405
+    if (err != ERROR_SUCCESS && ring_buffer_handles)
1406
+    {
1407
+        CloseRingBufferHandles(ring_buffer_handles);
1408
+        free(ring_buffer_handles);
1399 1409
     }
1400 1410
 
1401 1411
     return err;
... ...
@@ -1425,7 +1445,7 @@ HandleMTUMessage(const set_mtu_message_t *mtu)
1425 1425
 }
1426 1426
 
1427 1427
 static VOID
1428
-HandleMessage(HANDLE pipe, HANDLE ovpn_proc, ring_buffer_handles_t *ring_buffer_handles,
1428
+HandleMessage(HANDLE pipe, HANDLE ovpn_proc,
1429 1429
               DWORD bytes, DWORD count, LPHANDLE events, undo_lists_t *lists)
1430 1430
 {
1431 1431
     DWORD read;
... ...
@@ -1509,7 +1529,7 @@ HandleMessage(HANDLE pipe, HANDLE ovpn_proc, ring_buffer_handles_t *ring_buffer_
1509 1509
         case msg_register_ring_buffers:
1510 1510
             if (msg.header.size == sizeof(msg.rrb))
1511 1511
             {
1512
-                ack.error_number = HandleRegisterRingBuffers(&msg.rrb, ovpn_proc, ring_buffer_handles);
1512
+                ack.error_number = HandleRegisterRingBuffers(&msg.rrb, ovpn_proc, lists);
1513 1513
             }
1514 1514
             break;
1515 1515
 
... ...
@@ -1579,6 +1599,10 @@ Undo(undo_lists_t *lists)
1579 1579
                     }
1580 1580
                     break;
1581 1581
 
1582
+                case undo_ring_buffer:
1583
+                    CloseRingBufferHandles(item->data);
1584
+                    break;
1585
+
1582 1586
                 case _undo_type_max:
1583 1587
                     /* unreachable */
1584 1588
                     break;
... ...
@@ -1611,7 +1635,6 @@ RunOpenvpn(LPVOID p)
1611 1611
     WCHAR *cmdline = NULL;
1612 1612
     size_t cmdline_size;
1613 1613
     undo_lists_t undo_lists;
1614
-    ring_buffer_handles_t ring_buffer_handles;
1615 1614
     WCHAR errmsg[512] = L"";
1616 1615
 
1617 1616
     SECURITY_ATTRIBUTES inheritable = {
... ...
@@ -1633,7 +1656,6 @@ RunOpenvpn(LPVOID p)
1633 1633
     ZeroMemory(&startup_info, sizeof(startup_info));
1634 1634
     ZeroMemory(&undo_lists, sizeof(undo_lists));
1635 1635
     ZeroMemory(&proc_info, sizeof(proc_info));
1636
-    ZeroMemory(&ring_buffer_handles, sizeof(ring_buffer_handles));
1637 1636
 
1638 1637
     if (!GetStartupData(pipe, &sud))
1639 1638
     {
... ...
@@ -1866,7 +1888,7 @@ RunOpenvpn(LPVOID p)
1866 1866
             break;
1867 1867
         }
1868 1868
 
1869
-        HandleMessage(ovpn_pipe, proc_info.hProcess, &ring_buffer_handles, bytes, 1, &exit_event, &undo_lists);
1869
+        HandleMessage(ovpn_pipe, proc_info.hProcess, bytes, 1, &exit_event, &undo_lists);
1870 1870
     }
1871 1871
 
1872 1872
     WaitForSingleObject(proc_info.hProcess, IO_TIMEOUT);
... ...
@@ -1893,7 +1915,6 @@ out:
1893 1893
     free(cmdline);
1894 1894
     DestroyEnvironmentBlock(user_env);
1895 1895
     FreeStartupData(&sud);
1896
-    CloseRingBufferHandles(&ring_buffer_handles);
1897 1896
     CloseHandleEx(&proc_info.hProcess);
1898 1897
     CloseHandleEx(&proc_info.hThread);
1899 1898
     CloseHandleEx(&stdin_read);