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)
| ... | ... |
@@ -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); |