nfs4: Fix several problems with IdMapper error handling

This commit is contained in:
Pawel Dziepak
2012-07-04 16:30:16 +02:00
parent 085c6e2d99
commit 7ef9380fb3
2 changed files with 34 additions and 19 deletions
@@ -89,8 +89,8 @@ IdMap::_GetValue(const char* buffer, int32 code)
if (code != MsgReply)
return 0;
else
return value;
return value;
} while (true);
}
@@ -135,8 +135,9 @@ IdMap::_GetBuffer(T value, int32 code)
if (code != MsgReply) {
free(buffer);
return NULL;
} else
return buffer;
}
return buffer;
} while (true);
}
@@ -62,6 +62,8 @@ AddDomain(const char* name)
{
uint32 fullLength = strlen(name) + strlen(gDomainName) + 2;
char* fullName = reinterpret_cast<char*>(malloc(fullLength));
if (fullName == NULL)
return NULL;
strcpy(fullName, name);
strcat(fullName, "@");
@@ -93,17 +95,23 @@ UIDToName(void* buffer)
{
uid_t userId = *reinterpret_cast<uid_t*>(buffer);
const char* fullName = kNobodyName;
const char* name = NULL;
struct passwd* userInfo = getpwuid(userId);
if (userInfo != NULL) {
const char* name = userInfo->pw_name;
fullName = AddDomain(name);
name = userInfo->pw_name;
name = AddDomain(name);
}
status_t result = write_port(gReplyPort, MsgReply, fullName,
strlen(fullName) + 1);
free(const_cast<char*>(fullName));
status_t result;
if (name != NULL) {
result = write_port(gReplyPort, MsgReply, name, strlen(name) + 1);
free(const_cast<char*>(name));
} else {
result = write_port(gReplyPort, MsgReply, kNobodyName,
strlen(kNobodyName) + 1);
}
return result;
}
@@ -133,17 +141,23 @@ GIDToName(void* buffer)
{
gid_t groupId = *reinterpret_cast<gid_t*>(buffer);
const char* fullName = kNogroupName;
const char* name = NULL;
struct group* groupInfo = getgrgid(groupId);
if (groupInfo != NULL) {
const char* name = groupInfo->gr_name;
fullName = AddDomain(name);
name = groupInfo->gr_name;
name = AddDomain(name);
}
status_t result = write_port(gReplyPort, MsgReply, fullName,
strlen(fullName) + 1);
free(const_cast<char*>(fullName));
status_t result;
if (name != NULL) {
result = write_port(gReplyPort, MsgReply, name, strlen(name) + 1);
free(const_cast<char*>(name));
} else {
result = write_port(gReplyPort, MsgReply, kNogroupName,
strlen(kNogroupName) + 1);
}
return result;
}
@@ -193,7 +207,7 @@ MainLoop()
result = ParseRequest(code, buffer);
free(buffer);
if (result == B_BAD_PORT_ID)
if (result != B_OK)
return 0;
} while (true);
@@ -236,13 +250,13 @@ int
main(int argc, char** argv)
{
gRequestPort = find_port(kRequestPortName);
if (gRequestPort == B_NAME_NOT_FOUND) {
if (gRequestPort < B_OK) {
fprintf(stderr, "%s\n", strerror(gRequestPort));
return gRequestPort;
}
gReplyPort = find_port(kReplyPortName);
if (gReplyPort == B_NAME_NOT_FOUND) {
if (gReplyPort < B_OK) {
fprintf(stderr, "%s\n", strerror(gReplyPort));
return gReplyPort;
}