@@ -995,16 +995,16 @@
}
/**
- * Run the command: netsh interface ip $action wins $if_name [static] $addr
+ * Run the command: netsh interface ip $action wins $if_index [static] $addr
* @param action "delete", "add" or "set"
- * @param if_name "name_of_interface"
+ * @param if_index index of the interface to modify WINS for
* @param addr IPv4 address as a string
*
* If addr is null and action = "delete" all addresses are deleted.
* if action = "set" then "static" is added before $addr
*/
static DWORD
-netsh_wins_cmd(const wchar_t *action, const wchar_t *if_name, const wchar_t *addr)
+netsh_wins_cmd(const wchar_t *action, int if_index, const wchar_t *addr)
{
DWORD err = 0;
int timeout = 30000; /* in msec */
@@ -1030,10 +1030,10 @@
/* cmd template:
* netsh interface ip $action wins $if_name $static $addr
*/
- const wchar_t *fmt = L"netsh interface ip %ls wins \"%ls\" %ls %ls";
+ const wchar_t *fmt = L"netsh interface ip %ls wins %d %ls %ls";
/* max cmdline length in wchars -- include room for worst case and some */
- size_t ncmdline = wcslen(fmt) + wcslen(if_name) + wcslen(action) + wcslen(addr)
+ size_t ncmdline = wcslen(fmt) + 11 /*if_index*/ + wcslen(action) + wcslen(addr)
+ wcslen(addr_static) + 32 + 1;
cmdline = malloc(ncmdline * sizeof(wchar_t));
if (!cmdline)
@@ -1042,7 +1042,7 @@
goto out;
}
- swprintf(cmdline, ncmdline, fmt, action, if_name, addr_static, addr);
+ swprintf(cmdline, ncmdline, fmt, action, if_index, addr_static, addr);
err = ExecCommand(argv0, cmdline, timeout);
@@ -1051,12 +1051,6 @@
return err;
}
-static BOOL
-CmpWString(LPVOID item, LPVOID str)
-{
- return (wcscmp(item, str) == 0) ? TRUE : FALSE;
-}
-
/**
* Signal the DNS resolver (and others potentially) to reload the
* group policy (DNS) settings on 32 bit Windows systems
@@ -2882,7 +2876,7 @@
static DWORD
HandleWINSConfigMessage(const wins_cfg_message_t *msg, undo_lists_t *lists)
{
- DWORD err = 0;
+ DWORD err = NO_ERROR;
wchar_t addr[16]; /* large enough to hold string representation of an ipv4 */
int addr_len = msg->addr_len;
@@ -2892,38 +2886,25 @@
addr_len = _countof(msg->addr);
}
- if (!msg->iface.name[0]) /* interface name is required */
+ if (!msg->iface.index) /* interface index is required */
{
return ERROR_MESSAGE_DATA;
}
- /* use a non-const reference with limited scope to enforce null-termination of strings from
- * client */
- {
- wins_cfg_message_t *msgptr = (wins_cfg_message_t *)msg;
- msgptr->iface.name[_countof(msg->iface.name) - 1] = '\0';
- }
-
- wchar_t *wide_name = utf8to16(msg->iface.name); /* utf8 to wide-char */
- if (!wide_name)
- {
- return ERROR_OUTOFMEMORY;
- }
-
/* We delete all current addresses before adding any
* OR if the message type is del_wins_cfg
*/
if (addr_len > 0 || msg->header.type == msg_del_wins_cfg)
{
- err = netsh_wins_cmd(L"delete", wide_name, NULL);
+ err = netsh_wins_cmd(L"delete", msg->iface.index, NULL);
if (err)
{
goto out;
}
- free(RemoveListItem(&(*lists)[undo_wins], CmpWString, wide_name));
+ free(RemoveListItem(&(*lists)[undo_wins], CmpAny, NULL));
}
- if (msg->header.type == msg_del_wins_cfg)
+ if (addr_len == 0 || msg->header.type == msg_del_wins_cfg)
{
goto out; /* job done */
}
@@ -2931,7 +2912,7 @@
for (int i = 0; i < addr_len; ++i)
{
RtlIpv4AddressToStringW(&msg->addr[i].ipv4, addr);
- err = netsh_wins_cmd(i == 0 ? L"set" : L"add", wide_name, addr);
+ err = netsh_wins_cmd(i == 0 ? L"set" : L"add", msg->iface.index, addr);
if (i == 0 && err)
{
goto out;
@@ -2941,22 +2922,23 @@
*/
}
- err = 0;
-
- if (addr_len > 0)
+ int *if_index = malloc(sizeof(msg->iface.index));
+ if (if_index)
{
- wchar_t *tmp_name = _wcsdup(wide_name);
- if (!tmp_name || AddListItem(&(*lists)[undo_wins], tmp_name))
- {
- free(tmp_name);
- netsh_wins_cmd(L"delete", wide_name, NULL);
- err = ERROR_OUTOFMEMORY;
- goto out;
- }
+ *if_index = msg->iface.index;
}
+ if (!if_index || AddListItem(&(*lists)[undo_wins], if_index))
+ {
+ free(if_index);
+ netsh_wins_cmd(L"delete", msg->iface.index, NULL);
+ err = ERROR_OUTOFMEMORY;
+ goto out;
+ }
+
+ err = 0;
+
out:
- free(wide_name);
return err;
}
@@ -3206,7 +3188,7 @@
break;
case undo_wins:
- netsh_wins_cmd(L"delete", item->data, NULL);
+ netsh_wins_cmd(L"delete", *(int *)item->data, NULL);
break;
case wfp_block: