added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4' old head: 94c47dc6a85fa8c028382eb3b54e04f40d08590c new head: feb15cc63ce6f32dc73e8322c165266d4a11b149 ---------------------------------------------------------------------------- 8019eaf: nfs4: Several minor fixes feb15cc: nfs4: Reply to incorrect and CB_NULL callback requests [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 12 files changed, 207 insertions(+), 63 deletions(-) .../kernel/file_systems/nfs4/Connection.cpp | 6 +- src/add-ons/kernel/file_systems/nfs4/Jamfile | 1 + src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp | 2 + src/add-ons/kernel/file_systems/nfs4/RPCAuth.h | 5 -- src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp | 14 +--- .../kernel/file_systems/nfs4/RPCCallbackReply.cpp | 49 +++++++++++++ .../kernel/file_systems/nfs4/RPCCallbackReply.h | 42 +++++++++++ .../file_systems/nfs4/RPCCallbackRequest.cpp | 31 ++++---- .../kernel/file_systems/nfs4/RPCCallbackRequest.h | 11 +++ .../kernel/file_systems/nfs4/RPCCallbackServer.cpp | 23 +++++- src/add-ons/kernel/file_systems/nfs4/RPCDefs.h | 61 ++++++++++++++++ src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp | 25 +------ ############################################################################ Commit: 8019eaf184c1cadcf0ef6625e439851d0133de24 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Sun Aug 5 01:10:38 2012 UTC nfs4: Several minor fixes ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp index b9a5f0e..25ed74b 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp @@ -593,7 +593,7 @@ ConnectionListener::Listen(ConnectionListener** _listener, uint16 port) status_t -ConnectionListener::AcceptConnection(Connection** _connection) +ConnectionListener::AcceptConnection(Connection** connection) { object_wait_info object[2]; object[0].object = fWaitCancel; @@ -623,15 +623,13 @@ ConnectionListener::AcceptConnection(Connection** _connection) ServerAddress address; address.fProtocol = IPPROTO_TCP; address.fAddress = addr; - Connection* connection; - status_t result = Connection::SetTo(&connection, sock, address); + status_t result = Connection::SetTo(connection, sock, address); if (result != B_OK) { close(sock); return result; } - *_connection = connection; return B_OK; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp index 39788b1..c484112 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp @@ -26,7 +26,7 @@ enum { PROGRAM_NFS_CB = 0x40000000 }; -#define NFS_VERSION 4 +#define NFS_CB_VERSION 1 CallbackRequest::CallbackRequest(void *buffer, int size) @@ -46,6 +46,9 @@ CallbackRequest::CallbackRequest(void *buffer, int size) if (fStream.GetUInt() != PROGRAM_NFS_CB) return; + if (fStream.GetUInt() != NFS_CB_VERSION) + return; + fProcedure = fStream.GetUInt(); fStream.GetOpaque(NULL); diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp index 837557e..5ff83f6 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp @@ -170,7 +170,7 @@ CallbackServer::NewConnection(Connection* connection) return B_NO_MEMORY; arguments[0] = this; - arguments[1] = connection; + arguments[1] = entry; thread_id thread; thread = spawn_kernel_thread(&CallbackServer::ConnectionThreadLauncher, @@ -224,7 +224,7 @@ status_t CallbackServer::ConnectionThread(ConnectionEntry* entry) { Connection* connection = entry->fConnection; - dprintf("NEW CONNECTION\n"); + while (fThreadRunning) { uint32 size; void* buffer; ############################################################################ Commit: feb15cc63ce6f32dc73e8322c165266d4a11b149 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Sun Aug 5 01:50:30 2012 UTC nfs4: Reply to incorrect and CB_NULL callback requests ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Jamfile b/src/add-ons/kernel/file_systems/nfs4/Jamfile index abe0a46..b6aeed8 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Jamfile +++ b/src/add-ons/kernel/file_systems/nfs4/Jamfile @@ -27,6 +27,7 @@ KernelAddon nfs4 : RPCAuth.cpp RPCCall.cpp RPCCallback.cpp + RPCCallbackReply.cpp RPCCallbackRequest.cpp RPCCallbackServer.cpp RPCReply.cpp diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp index e9ce2aa..b10f2ab 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.cpp @@ -16,6 +16,8 @@ #include <SupportDefs.h> #include <util/kernel_cpp.h> +#include "RPCDefs.h" + using namespace RPC; diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h index 81a127f..d45a7cf 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCAuth.h @@ -14,11 +14,6 @@ namespace RPC { -enum auth_flavour { - AUTH_NONE = 0, - AUTH_SYS = 1 -}; - class Auth { public: inline const XDR::WriteStream& Stream() const; diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp index 323e7f1..fcc3124 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCall.cpp @@ -11,20 +11,10 @@ #include <util/kernel_cpp.h> +#include "RPCDefs.h" -using namespace RPC; - -enum { - CALL = 0 -}; - -#define VERSION 2 -enum { - PROGRAM_NFS = 100003 -}; - -#define NFS_VERSION 4 +using namespace RPC; Call::Call() diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp new file mode 100644 index 0000000..595bb09 --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@xxxxxxxxxxx + */ + + +#include "RPCCallbackReply.h" + +#include <util/kernel_cpp.h> + +#include "RPCDefs.h" + + +using namespace RPC; + + +CallbackReply::CallbackReply() +{ +} + + +CallbackReply* +CallbackReply::Create(uint32 xid, AcceptStat rpcError) +{ + CallbackReply* reply = new(std::nothrow) CallbackReply; + if (reply == NULL) + return NULL; + + reply->fStream.AddUInt(xid); + + reply->fStream.AddInt(REPLY); + reply->fStream.AddUInt(MSG_ACCEPTED); + + reply->fStream.AddInt(AUTH_NONE); + reply->fStream.AddOpaque(NULL, 0); + + reply->fStream.AddUInt(rpcError); + + return reply; +} + + +CallbackReply::~CallbackReply() +{ +} + diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h new file mode 100644 index 0000000..485d5fa --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackReply.h @@ -0,0 +1,42 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@xxxxxxxxxxx + */ +#ifndef RPCCALLBACKREPLY_H +#define RPCCALLBACKREPLY_H + + +#include "RPCDefs.h" +#include "XDR.h" + + +namespace RPC { + +class CallbackReply { +public: + static CallbackReply* Create(uint32 xid, + AcceptStat rpcError = SUCCESS); + ~CallbackReply(); + + inline XDR::WriteStream& Stream(); + +private: + CallbackReply(); + + XDR::WriteStream fStream; +}; + + +inline XDR::WriteStream& +CallbackReply::Stream() +{ + return fStream; +} + +} // namespace RPC + + +#endif // RPCCALLBACKREPLY_H diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp index c484112..4b10efb 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.cpp @@ -12,26 +12,16 @@ #include <stdlib.h> #include "NFS4Defs.h" +#include "RPCDefs.h" using namespace RPC; -enum { - CALL = 0 -}; - -#define VERSION 2 - -enum { - PROGRAM_NFS_CB = 0x40000000 -}; - -#define NFS_CB_VERSION 1 - CallbackRequest::CallbackRequest(void *buffer, int size) : fError(B_BAD_VALUE), + fRPCError(GARBAGE_ARGS), fStream(buffer, size), fBuffer(buffer) { @@ -43,11 +33,15 @@ CallbackRequest::CallbackRequest(void *buffer, int size) if (fStream.GetUInt() != VERSION) return; - if (fStream.GetUInt() != PROGRAM_NFS_CB) + if (fStream.GetUInt() != PROGRAM_NFS_CB) { + fRPCError = PROG_UNAVAIL; return; + } - if (fStream.GetUInt() != NFS_CB_VERSION) + if (fStream.GetUInt() != NFS_CB_VERSION) { + fRPCError = PROG_MISMATCH; return; + } fProcedure = fStream.GetUInt(); @@ -60,9 +54,11 @@ CallbackRequest::CallbackRequest(void *buffer, int size) return; fID = fStream.GetUInt(); - } - - fError = B_OK; + } else if (fProcedure == CallbackProcNull) { + fRPCError = SUCCESS; + fError = B_OK; + } else + fRPCError = PROC_UNAVAIL; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h index 28b822e..01518f3 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackRequest.h @@ -9,6 +9,7 @@ #define RPCCALLBACKREQUEST_H +#include "RPCDefs.h" #include "XDR.h" @@ -25,6 +26,8 @@ public: inline uint32 Procedure(); inline status_t Error(); + inline AcceptStat RPCError(); + inline XDR::ReadStream& Stream(); private: @@ -34,6 +37,7 @@ private: uint32 fProcedure; status_t fError; + AcceptStat fRPCError; XDR::ReadStream fStream; void* fBuffer; @@ -68,6 +72,13 @@ CallbackRequest::Error() } +inline AcceptStat +CallbackRequest::RPCError() +{ + return fRPCError; +} + + inline XDR::ReadStream& CallbackRequest::Stream() { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp index 5ff83f6..651ccc5 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp @@ -11,6 +11,7 @@ #include "NFS4Defs.h" #include "RPCCallback.h" +#include "RPCCallbackReply.h" #include "RPCCallbackRequest.h" @@ -224,6 +225,7 @@ status_t CallbackServer::ConnectionThread(ConnectionEntry* entry) { Connection* connection = entry->fConnection; + CallbackReply* reply; while (fThreadRunning) { uint32 size; @@ -238,15 +240,30 @@ CallbackServer::ConnectionThread(ConnectionEntry* entry) if (request == NULL || request->Error() != B_OK) { free(buffer); continue; + } else if (request != NULL) { + reply = CallbackReply::Create(request->XID(), request->RPCError()); + if (reply != NULL) { + connection->Send(reply->Stream().Buffer(), + reply->Stream().Size()); + delete reply; + } + free(buffer); + continue; } + switch (request->Procedure()) { case CallbackProcCompound: GetCallback(request->ID())->EnqueueRequest(request, connection); break; case CallbackProcNull: - dprintf("GOT CB_NULL %x\n", (int)request->XID()); + reply = CallbackReply::Create(request->XID()); + if (reply != NULL) { + connection->Send(reply->Stream().Buffer(), + reply->Stream().Size()); + delete reply; + } default: free(buffer); diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h new file mode 100644 index 0000000..bd551a6 --- /dev/null +++ b/src/add-ons/kernel/file_systems/nfs4/RPCDefs.h @@ -0,0 +1,61 @@ +/* + * Copyright 2012 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Paweł Dziepak, pdziepak@xxxxxxxxxxx + */ +#ifndef RPCDEFS_H +#define RPCDEFS_H + + +namespace RPC { + +enum { + VERSION = 2 +}; + +enum { + PROGRAM_NFS = 100003, + PROGRAM_NFS_CB = 0x40000000 +}; + +enum { + NFS_VERSION = 4, + NFS_CB_VERSION = 1 +}; + +enum { + CALL = 0, + REPLY = 1 +}; + +enum { + MSG_ACCEPTED = 0, + MSG_DENIED = 1 +}; + +enum AcceptStat { + SUCCESS = 0, /* RPC executed successfully */ + PROG_UNAVAIL = 1, /* remote hasn't exported program */ + PROG_MISMATCH = 2, /* remote can't support version # */ + PROC_UNAVAIL = 3, /* program can't support procedure */ + GARBAGE_ARGS = 4, /* procedure can't decode params */ + SYSTEM_ERR = 5 /* e.g. memory allocation failure */ +}; + +enum RejectStat { + RPC_MISMATCH = 0, /* RPC version number != 2 */ + AUTH_ERROR = 1 /* remote can't authenticate caller */ +}; + +enum AuthFlavour { + AUTH_NONE = 0, + AUTH_SYS = 1 +}; + +} // namespace RPC + + +#endif // RPCDEFS_H + diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp index 3dfa899..3f61357 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCReply.cpp @@ -11,31 +11,10 @@ #include <util/kernel_cpp.h> +#include "RPCDefs.h" -using namespace RPC; - -enum { - REPLY = 1 -}; - -enum { - MSG_ACCEPTED = 0, - MSG_DENIED = 1 -}; -enum accept_stat { - SUCCESS = 0, /* RPC executed successfully */ - PROG_UNAVAIL = 1, /* remote hasn't exported program */ - PROG_MISMATCH = 2, /* remote can't support version # */ - PROC_UNAVAIL = 3, /* program can't support procedure */ - GARBAGE_ARGS = 4, /* procedure can't decode params */ - SYSTEM_ERR = 5 /* e.g. memory allocation failure */ -}; - -enum reject_stat { - RPC_MISMATCH = 0, /* RPC version number != 2 */ - AUTH_ERROR = 1 /* remote can't authenticate caller */ -}; +using namespace RPC; Reply::Reply(void *buffer, int size)