when we fork a thread to handle the callback, the arguments we got from
parsing the callback operations in the callback thread are on the stack.
we need to allocate memory for same-size data structure and copy them,
not just copy the pointer.
/* we shouldn't ever see this, but a buggy server could
* send us into an infinite loop. return NFS4ERR_IO */
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
added nfs41_abs_path symlink to struct open_upcall_args. we can't write the symlink target back to args->path anymore, since it's a pointer into the upcall buffer
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
in handle_mount(), the call to nfs41_lookup() requires a mutable nfs41_abs_path because it can change on referrals, so make a copy for it
removed unused fields in struct nfs41_root and related arguments to nfs41_root_create()
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
because we no longer have to convert strings from unicode, we can avoid copying them out of the upcall buffer
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
marshall_unicode_as_ansi() calls RtlUnicodeStringToAnsiString() to convert the string directly into the upcall buffer
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
when open parsing fails, we were still returning upcall.status==NO_ERROR, so the driver assumed the open succeeded. other operations then sent up an open_state==NULL, and crashed the daemon. when upcall_parse() returns an error, set upcall.status to notify the driver
upcall_parse() prints a 'parsing of upcall <name> failed with <error>.' message on failure, so i removed redundant messages from the individual upcall parsing functions
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
on ERROR_REPARSE, nfs41_Create() generates an absolute path for the symlink target using the format "DeviceName+NetRootName+symlink", and calls RxPrepareToReparseSymbolicLink()
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
when handle_open() encounters a file of type NF4LNK and the FILE_OPEN_REPARSE_POINT flag is not present, it calls READLINK for the symlink's target path. it then calls abs_path_link() to update the filename (args->path), whether the symlink target is an absolute or relative path. abs_path_link() also takes into account the special characters . and .., though it doesn't allow traversing .. entries below the root of the server's namespace
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
on last_error == ERROR_REPARSE, the daemon converts args->path back to wchar and passes it down to the driver
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
caused memory leaks of nfs41_open_state. we have the FileDispositionInformation upcall for exactly this, so there's no need to complicate the close code path
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
if readdir fails to look up a referred entry, set its type to NF4DIR so windows explorer shows it as a directory. when you double-click on the directory, it gives a message saying that it "refers to a location that is unavailable"
Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
moved the FileSystemName definition back down to the kernel, so the daemon is no longer responsible for setting it. the driver uses the string length to calculate the buffer size needed for NFS41_V_NET_ROOT_EXTENSION.FsAttrs, and copies in the FileSystemName after the first successful volume attributes upcall
Signed-off-by: Casey Bodley <cbodley@umich.edu>
added -p argument to nfs_mount.exe to make the mount persist over reboots
when -p is specified, we pass the flag CONNECT_UPDATE_PROFILE to WNetUseConnection(): "If this bit flag is set, the registry will store the connection information and make it available when the system reboots."
Signed-off-by: Casey Bodley <cbodley@umich.edu>
bug: connections created through 'net use' or 'map network drive' are not fully removed by 'nfs_mount -d'. the UNMOUNT upcall completes successfully, but the mount remains visible in net use and windows explorer; the next attempted use of the drive will send a new MOUNT and continue normally
solution: added flag CONNECT_UPDATE_PROFILE to WNetCancelConnection2(): "The system updates the user profile with the information that the connection is no longer a persistent one."
Signed-off-by: Casey Bodley <cbodley@umich.edu>
adds support for mounting with 'net use' and 'Map Network Drive'
if we don't have extended attributes on mount (i.e. not using nfs_mount), don't fail! instead, use SrvName=SrvCallName and MntPt=""
updated nfs41_MountConfig_InitDefaults() to initialize SrvName and MntPt with Length=0
Signed-off-by: Casey Bodley <cbodley@umich.edu>
removed the Config field from NFS41_NETROOT_EXTENSION and NFS41_V_NET_ROOT_EXTENSION and made it local to CreateVNetRoot(), as that's the only place it's accessed and we no longer rely on storing Config.Initialized with the NET_ROOT
Signed-off-by: Casey Bodley <cbodley@umich.edu>
was previously setting pNetRootContext->session to INVALID_HANDLE_VALUE on error, and required checking for both that and NULL. since it starts initialized to NULL, keep it that way
Signed-off-by: Casey Bodley <cbodley@umich.edu>
added time_delta argument to xdr_settime4(). if the normal 'time' argument is within time_delta of the current time (get_nfs_time()), it uses time_how=SET_TO_SERVER_TIME4. otherwise, it uses SET_TO_CLIENT_TIME4 and encodes the time as usual
handle_nfs41_setattr() ignores times if superblock->cansettime==0. otherwise, it passes in superblock->time_delta (via info.time_delta) along with the other time attributes, for use with xdr_settime4()
Signed-off-by: Casey Bodley <cbodley@umich.edu>
added FILE_FS_ATTRIBUTE_INFORMATION and FileSystemAttributes flags to from_kernel.h
queries case_preserving, case_insensitive attributes to fill in FileSystemAttributes, and uses #defines from nfs41_const.h for MaximumComponentNameLength and FileSystemName
Signed-off-by: Casey Bodley <cbodley@umich.edu>
added FS_INFORMATION_CLASS, FILE_FS_SIZE_INFORMATION, FILE_FS_FULL_SIZE_INFORMATION to from_kernel.h
moved get_volume_size_info() and byte->unit conversion up to the daemon
Signed-off-by: Casey Bodley <cbodley@umich.edu>
was doing a memcpy from entry->u.QueryFile.buf to RxContext->Info.Buffer, even though we set entry->u.QueryFile.buf = RxContext->Info.Buffer
Signed-off-by: Casey Bodley <cbodley@umich.edu>
symptom: in certain cases, name_cache_find_or_create() was returning ERROR_FILE_EXISTS, which should never happen!
cause: the string comparisons in name_cache_search() and name_cache_insert() were returning different results when the argument to name_cache_search() is a) not null-terminated, and b) shorter than the other string. this caused name_cache_search() to search the wrong branch of the rbtree and fail to find the component, while name_cache_insert() would correctly find it and return ERROR_FILE_EXISTS
fix: compare the string lengths before calling strncmp() to avoid comparing past the end of the component. moved the comparisons to a separate component_cmp() function called by both name_cache_search() and name_cache_insert() to make sure they get the same result!
Signed-off-by: Casey Bodley <cbodley@umich.edu>