- From 07c872bfd7b43ad19c9dc211996b38df55fd986e Mon Sep 17 00:00:00 2001
- From: Cedric Blancher <cedric.blancher@gmail.com>
- Date: Tue, 7 Nov 2023 14:50:11 +0100
- Subject: [PATCH 1/4] daemon: Fix random hostname failures + debug output for
- hostname lookup
- Fix random getaddrinfo() failures by replacing it with
- GetAddrInfoExA() and add dprintf() output to see what hostname
- address lookup is doing.
- Also print all returned addresses and not only the first one,
- per Rolands review suggestion.
- Signed-off-by: Roland Mainz <roland.mainz@nrubsig.org>
- ---
- daemon/nfs41_server.c | 81 ++++++++++++++++++++++++++++++++++---------
- 1 file changed, 65 insertions(+), 16 deletions(-)
- diff --git a/daemon/nfs41_server.c b/daemon/nfs41_server.c
- index ef8f0ac..db2d2b6 100644
- --- a/daemon/nfs41_server.c
- +++ b/daemon/nfs41_server.c
- @@ -279,37 +279,70 @@ int nfs41_server_resolve(
- {
- int status = ERROR_BAD_NET_NAME;
- char service[16];
- - struct addrinfo hints = { 0 }, *res, *info;
- + struct addrinfoexA hints = { 0 }, *res, *info;
- struct netconfig *nconf;
- struct netbuf addr;
- char *netid, *uaddr;
- + int wse; /* Windows Socket Error */
- + int retry_getaddrinfoex_counter = 0;
- - dprintf(SRVLVL, "--> nfs41_server_resolve(%s:%u)\n",
- + dprintf(SRVLVL, "--> nfs41_server_resolve('%s':%u)\n",
- hostname, port);
- addrs->count = 0;
- - StringCchPrintfA(service, 16, "%u", port);
- + /*
- + * Windows (10) /cygdrive/c/Windows/System32/drivers/etc/services
- + * only has an UDP entry for NFS ("2049/udp") but none for TCP,
- + * so we have to pass the numeric value here.
- + */
- + StringCchPrintfA(service, sizeof(service), "%u", (int)port);
- /* request a list of tcp addrs for the given hostname,port */
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- + /* AI_NUMERICSERV - no service name resolution, we pass a number */
- + hints.ai_flags |= AI_NUMERICSERV;
- +#if 1 /* experimental */
- + hints.ai_flags |= AI_FILESERVER;
- +#endif
- +
- +retry_getaddrinfoex:
- + wse = GetAddrInfoExA(hostname, service, 0, NULL, &hints, &res,
- + NULL, NULL, NULL, NULL);
- + if (wse != 0) {
- + dprintf(SRVLVL, "GetAddrInfoExA() failed with wse=%d/'%s'\n",
- + wse, gai_strerrorA(wse));
- + if ((wse == WSATRY_AGAIN) && (retry_getaddrinfoex_counter < 4)) {
- + dprintf(SRVLVL, "GetAddrInfoExA() returned WSATRY_AGAIN, "
- + "retry %d with delay...\n",
- + retry_getaddrinfoex_counter);
- +
- + retry_getaddrinfoex_counter++;
- + Sleep(500*retry_getaddrinfoex_counter);
- + goto retry_getaddrinfoex;
- + }
- - if (getaddrinfo(hostname, service, &hints, &res) != 0)
- goto out;
- + }
- for (info = res; info != NULL; info = info->ai_next) {
- + dprintf(SRVLVL, "GetAddrInfoExA() returned: info.{ai_family=%d}\n",
- + info->ai_family);
- +
- /* find the appropriate entry in /etc/netconfig */
- switch (info->ai_family) {
- - case AF_INET: netid = "tcp"; break;
- - case AF_INET6: netid = "tcp6"; break;
- - default: continue;
- + case AF_INET: netid = "tcp"; break;
- + case AF_INET6: netid = "tcp6"; break;
- + default: continue;
- }
- nconf = getnetconfigent(netid);
- - if (nconf == NULL)
- + if (nconf == NULL) {
- + dprintf(SRVLVL, "getnetconfigent(netid='%s') failed.\n", netid);
- continue;
- + }
- /* convert to a transport-independent universal address */
- addr.buf = info->ai_addr;
- @@ -318,8 +351,10 @@ int nfs41_server_resolve(
- uaddr = taddr2uaddr(nconf, &addr);
- freenetconfigent(nconf);
- - if (uaddr == NULL)
- + if (uaddr == NULL) {
- + dprintf(SRVLVL, "taddr2uaddr() failed.\n");
- continue;
- + }
- StringCchCopyA(addrs->arr[addrs->count].netid,
- NFS41_NETWORK_ID_LEN+1, netid);
- @@ -328,16 +363,30 @@ int nfs41_server_resolve(
- freeuaddr(uaddr);
- status = NO_ERROR;
- - if (++addrs->count >= NFS41_ADDRS_PER_SERVER)
- + if (++addrs->count >= NFS41_ADDRS_PER_SERVER) {
- + dprintf(SRVLVL, "error: too many NFS41_ADDRS_PER_SERVER.\n");
- break;
- + }
- }
- - freeaddrinfo(res);
- + FreeAddrInfoEx(res);
- out:
- - if (status)
- - dprintf(SRVLVL, "<-- nfs41_server_resolve(%s:%u) returning "
- + if (status) {
- + dprintf(SRVLVL, "<-- nfs41_server_resolve('%s':%u) returning "
- "error %d\n", hostname, port, status);
- - else
- - dprintf(SRVLVL, "<-- nfs41_server_resolve(%s:%u) returning "
- - "OK %s\n", hostname, port, addrs->arr[0].uaddr);
- + }
- + else {
- + unsigned int i;
- + char buff[256];
- + char *b = buff;
- +
- + for (i=0 ; i < addrs->count ; i++) {
- + b+=snprintf(b,
- + ((sizeof(buff)-1) - (b-buff)),
- + "'%s', ", addrs->arr[i].uaddr);
- + }
- +
- + dprintf(SRVLVL, "<-- nfs41_server_resolve('%s':%u) returning "
- + "OK { %s }\n", hostname, port, buff);
- + }
- return status;
- }
- --
- 2.42.1
- From 26bf04263fb89bf6540ce21ce83357bf9a31ba1f Mon Sep 17 00:00:00 2001
- From: Martin Wege <martin.l.wege@gmail.com>
- Date: Tue, 7 Nov 2023 15:14:55 +0100
- Subject: [PATCH 2/4] install: Fix crashes in nfs_install
- - Fix crashes in nfs_install (which is used to add "nfs41_driver"
- to /HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/NetworkProvider/Order/ProviderOrder)
- - Add debug output for nfs_install to cygwin/devel/msnfs41client.bash
- Signed-off-by: Roland Mainz <roland.mainz@nrubsig.org>
- ---
- cygwin/devel/msnfs41client.bash | 6 ++++++
- install/nfs_install.c | 2 +-
- install/nfsreginst.c | 14 +++++++++-----
- install/nfsreginst.h | 1 +
- 4 files changed, 17 insertions(+), 6 deletions(-)
- diff --git a/cygwin/devel/msnfs41client.bash b/cygwin/devel/msnfs41client.bash
- index 23ca032..c953ebc 100644
- --- a/cygwin/devel/msnfs41client.bash
- +++ b/cygwin/devel/msnfs41client.bash
- @@ -64,7 +64,13 @@ function nfsclient_install
- # install.bat needs PATH to include $PWD
- PATH="$PWD:$PATH" cmd /c install.bat
- else
- + # devel: set default in case "nfs_install" ruined it:
- + #regtool -s set '/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/NetworkProvider/Order/ProviderOrder' 'RDPNP,LanmanWorkstation,webclient'
- +
- + printf 'before nfs_install: ProviderOrder="%s"\n' "$( strings -a '/proc/registry/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/NetworkProvider/Order/ProviderOrder')"
- nfs_install
- + printf 'after nfs_install: ProviderOrder="%s"\n' "$( strings -a '/proc/registry/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/NetworkProvider/Order/ProviderOrder')"
- +
- rundll32 setupapi.dll,InstallHinfSection DefaultInstall 132 ./nfs41rdr.inf
- fi
- diff --git a/install/nfs_install.c b/install/nfs_install.c
- index d1e6b74..50b1ce2 100644
- --- a/install/nfs_install.c
- +++ b/install/nfs_install.c
- @@ -33,7 +33,7 @@
- void __cdecl _tmain(int argc, TCHAR *argv[])
- {
- - if(argc == 1 || atoi(argv[1]) == 1)
- + if(argc == 1 || _tstoi(argv[1]) == 1)
- {
- RdrSetupProviderOrder();
- }
- diff --git a/install/nfsreginst.c b/install/nfsreginst.c
- index f4bb3e4..e7ad7b4 100644
- --- a/install/nfsreginst.c
- +++ b/install/nfsreginst.c
- @@ -46,7 +46,7 @@ BOOL RdrSetupProviderOrder( void )
- while( RdrRemoveProviderFromOrder() ) {};
- len = RdrGetProviderOrderString( &pOrderString ) * sizeof(TCHAR);
- - if ( len > 0 && pOrderString )
- + if ( (len > 0) && pOrderString )
- {
- len += sizeof( PROVIDER_NAME ) + (2 * sizeof(TCHAR)); // add 2 for comma delimeter and null
- pNewOrderString = malloc( len );
- @@ -74,11 +74,14 @@ BOOL RdrSetupProviderOrder( void )
- ULONG_PTR RdrGetProviderOrderString( __out LPTSTR *OrderString )
- {
- - HKEY hOrderKey;
- + HKEY hOrderKey = NULL;
- ULONG_PTR len = 0;
- if ( OpenKey( PROVIDER_ORDER_KEY, &hOrderKey ) )
- {
- + if (hOrderKey == NULL)
- + return 0;
- +
- ReadRegistryKeyValues( hOrderKey,
- sizeof(ProviderOrderKeyValues) / sizeof(REGENTRY),
- ProviderOrderKeyValues);
- @@ -99,7 +102,7 @@ BOOL RdrSetProviderOrderString( __in LPTSTR OrderString )
- if ( CreateKey( PROVIDER_ORDER_KEY, &hOrderKey ) )
- {
- - ProviderOrderKeyValues[0].dwLength = ( lstrlen( OrderString ) + 1 ) * sizeof( TCHAR );
- + ProviderOrderKeyValues[0].dwLength = ( _tcsclen( OrderString ) + 1 ) * sizeof( TCHAR );
- ProviderOrderKeyValues[0].pvValue = OrderString;
- WriteRegistryKeyValues( hOrderKey,
- sizeof(ProviderOrderKeyValues) / sizeof(REGENTRY),
- @@ -115,7 +118,7 @@ BOOL RdrSetProviderOrderString( __in LPTSTR OrderString )
- BOOL RdrRemoveProviderFromOrder( void )
- {
- - LPTSTR pCompare, OrderString, pOrig, Provider = PROVIDER_NAME;
- + LPTSTR pCompare = NULL, OrderString = NULL, pOrig = NULL, Provider = PROVIDER_NAME;
- BOOL match = FALSE;
- ULONG_PTR len = 0;
- @@ -127,7 +130,7 @@ BOOL RdrRemoveProviderFromOrder( void )
- while ( *OrderString )
- {
- - if ( toupper(*OrderString) != toupper(*pCompare++) )
- + if ( _toupper(*OrderString) != _toupper(*pCompare++) )
- {
- pCompare = Provider;
- while ( ( *OrderString != TEXT(',') ) && ( *OrderString != TEXT('\0') ) )
- @@ -141,6 +144,7 @@ BOOL RdrRemoveProviderFromOrder( void )
- if ( ( *OrderString == TEXT(',') ) || ( *OrderString == TEXT('\0') ) )
- {
- LPTSTR pNewString;
- + len += 4096;
- pNewString = malloc( len ); //Yes, this is a little larger than necessary
- //No, I don't care that much
- StringCchCopy(pNewString, len, pOrig);
- diff --git a/install/nfsreginst.h b/install/nfsreginst.h
- index 93bf954..c328b11 100644
- --- a/install/nfsreginst.h
- +++ b/install/nfsreginst.h
- @@ -33,6 +33,7 @@ Abstract:
- #include <windows.h>
- #include <stdlib.h>
- +#include <tchar.h>
- #include <strsafe.h>
- #include "nfs41_driver.h"
- --
- 2.42.1
- From 2f25d58571c5989391fb596693b42a5c9050d075 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Tue, 7 Nov 2023 18:29:15 +0100
- Subject: [PATCH 3/4] daemon: |handle_mount()| should reject mount requests
- without paths
- |handle_mount()| should reject mount requests without |args->path|.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/mount.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
- diff --git a/daemon/mount.c b/daemon/mount.c
- index 4870e09..9625387 100644
- --- a/daemon/mount.c
- +++ b/daemon/mount.c
- @@ -69,6 +69,14 @@ static int handle_mount(void *daemon_context, nfs41_upcall *upcall)
- nfs41_client *client;
- nfs41_path_fh file;
- + EASSERT(args->hostport != NULL);
- +
- + if ((args->path == NULL) || (strlen(args->path) == 0)) {
- + eprintf("handle_mount: empty mount root\n");
- + status = ERROR_BAD_NETPATH;
- + goto out;
- + }
- +
- (void)strcpy_s(hostname, sizeof(hostname), args->hostport);
- if (s = strchr(hostname, '@')) {
- *s++ = '\0';
- --
- 2.42.1
- From 7815c2f0c27bcef2242a2320c74581ba7f50d261 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Tue, 7 Nov 2023 18:33:04 +0100
- Subject: [PATCH 4/4] msnfs41client.bash: Consolidate server args in a shell
- array
- cygwin/devel/msnfs41client.bash: Consolidate server args in a
- shell array, which is much easier to maintain.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- cygwin/devel/msnfs41client.bash | 35 +++++++++++++++++++++++++--------
- 1 file changed, 27 insertions(+), 8 deletions(-)
- diff --git a/cygwin/devel/msnfs41client.bash b/cygwin/devel/msnfs41client.bash
- index c953ebc..8f9bf14 100644
- --- a/cygwin/devel/msnfs41client.bash
- +++ b/cygwin/devel/msnfs41client.bash
- @@ -114,6 +114,13 @@ function nfsclient_rundeamon
- set -o xtrace
- set -o nounset
- + typeset -a nfsd_args=(
- + 'nfsd_debug.exe'
- + '-d' '0'
- + '--noldap'
- + #'--gid' '1616' '--uid' '1616'
- + )
- +
- #
- # cdb cheat sheet:
- #
- @@ -123,12 +130,14 @@ function nfsclient_rundeamon
- #
- if false ; then
- - gdb -ex=run --args nfsd_debug -d 0 --noldap #--gid 1616 --uid 1616
- - else
- + gdb -ex=run --args "${nfsd_args[@]}"
- + elif false ; then
- export _NT_ALT_SYMBOL_PATH="$(cygpath -w "$PWD");srv*https://msdl.microsoft.com/download/symbols"
- # use '!gflag +full;g' for heap tests, eats lots of memory
- - cdb -c '!gflag +soe;sxe -c "kp;gn" *;g' "$(cygpath -w "$PWD/nfsd_debug.exe")" -d 0 --noldap #--gid 1616 --uid 1616
- - fi
- + cdb -c '!gflag +soe;sxe -c "kp;gn" *;g' "$(cygpath -w "$PWD/${nfsd_args[0]}")" "${nfsd_args[@]:1}"
- + else
- + "${nfsd_args[@]}"
- + fi
- return $?
- }
- @@ -137,13 +146,23 @@ function nfsclient_system_rundeamon
- set -o xtrace
- set -o nounset
- + typeset -a nfsd_args=(
- + 'nfsd_debug.exe'
- + '-d' '0'
- + '--noldap'
- + #'--gid' '1616' '--uid' '1616'
- + )
- +
- +
- if false ; then
- - su_system gdb -ex=run --args nfsd_debug -d 0 --noldap #--gid 1616 --uid 1616
- - else
- + su_system gdb -ex=run --args "${nfsd_args[@]}"
- + elif false ; then
- export _NT_ALT_SYMBOL_PATH="$(cygpath -w "$PWD");srv*https://msdl.microsoft.com/download/symbols"
- # use '!gflag +full;g' for heap tests, eats lots of memory
- - su_system cdb -c '!gflag +soe;sxe -c "kp;gn" *;g' "$(cygpath -w "$PWD/nfsd_debug.exe")" -d 0 --noldap #--gid 1616 --uid 1616
- - fi
- + su_system cdb -c '!gflag +soe;sxe -c "kp;gn" *;g' "$(cygpath -w "$PWD/${nfsd_args[0]}")" "${nfsd_args[@]:1}"
- + else
- + "${nfsd_args[@]}"
- + fi
- return $?
- }
- --
- 2.42.1
msnfs41client: hostname address lookup, installer, stability and misc fixes, 2023-11-07
Posted by Anonymous on Wed 8th Nov 2023 10:53
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.