Sfoglia il codice sorgente

Fix various bad memory free bugs

David Boreham 20 anni fa
parent
commit
00672ce8af
2 ha cambiato i file con 47 aggiunte e 20 eliminazioni
  1. 2 2
      ldap/servers/ntds/netman/Makefile
  2. 45 18
      ldap/servers/ntds/netman/netman.cpp

+ 2 - 2
ldap/servers/ntds/netman/Makefile

@@ -76,10 +76,10 @@ $(JAVA_DEST_DIR)/ntds/jnetman.jar:	$(OBJDEST)/jnetman_wrap.cxx
 $(OBJDEST)/jnetman.dll:  $(OBJDEST)/netman.obj $(OBJDEST)/jnetman_wrap.obj
 	$(LINK_DLL) /out:$(OBJDEST)/jnetman.dll    $(EXTRA_LIBS) netapi32.lib  $(OBJDEST)/netman.obj $(OBJDEST)/jnetman_wrap.obj
 
-$(OBJDEST)/netman.obj:
+$(OBJDEST)/netman.obj: netman.cpp netman.h
 	$(CC) -c netman.cpp $(CFLAGS)   $(MCC_INCLUDE) -Fo$(OBJDEST)/ $(CBSCFLAGS)
 
-$(OBJDEST)/jnetman_wrap.obj:
+$(OBJDEST)/jnetman_wrap.obj: $(OBJDEST)/jnetman_wrap.cxx
 	$(CC) -c  $(OBJDEST)/jnetman_wrap.cxx $(CFLAGS)   $(MCC_INCLUDE) -Fo$(OBJDEST)/ $(CBSCFLAGS) /I$(JAVA_HOME)/include /I$(JAVA_HOME)/include/win32 /I.
 
 veryclean: clean

+ 45 - 18
ldap/servers/ntds/netman/netman.cpp

@@ -71,36 +71,36 @@ unsigned short* UTF8ToUTF16(char* inString)
 }
 
 // ****************************************************************
-// SIDToHexStr
+// BinToHexStr
 // ****************************************************************
-int SIDToHexStr(char* sid, unsigned long sidLen, char** hexStr)
+int BinToHexStr(char* bin, unsigned long binLen, char** hexStr)
 {
-	int hexStrLen = sidLen * 2 + 1;
+	int hexStrLen = binLen * 2 + 1;
 
 	*hexStr = (char*)calloc(hexStrLen, sizeof(char));
 
-	for(unsigned long i = 0; i < sidLen; i++)
+	for(unsigned long i = 0; i < binLen; i++)
 	{
-		sprintf(&(*hexStr)[i * 2], "%02X", (unsigned char)sid[i]);
+		sprintf(&(*hexStr)[i * 2], "%02X", (unsigned char)bin[i]);
 	}
 
 	return 0;
 }
 
 // ****************************************************************
-// HexStrToSID
+// HexStrToBin
 // ****************************************************************
-int HexStrToSID(char* hexStr, char** sid, unsigned long* sidLen)
+int HexStrToBin(char* hexStr, char** bin, unsigned long* binLen)
 {
 	int temp;
-	*sidLen = strlen(hexStr) / 2;
+	*binLen = strlen(hexStr) / 2;
 
-	*sid = (char*)malloc(*sidLen);
+	*bin = (char*)malloc(*binLen);
 
-	for(unsigned long i = 0; i < *sidLen; i++)
+	for(unsigned long i = 0; i < *binLen; i++)
 	{
 		sscanf(&hexStr[i * 2], "%02X", &temp);
-		(*sid)[i] = (unsigned char)temp;
+		(*bin)[i] = (unsigned char)temp;
 	}
 
 	return 0;
@@ -200,7 +200,7 @@ int GetSIDHexStrByAccountName(char* accountName, char** sidHexStr)
 	}
 
 
-	SIDToHexStr(sid, sidLen, sidHexStr);
+	BinToHexStr(sid, sidLen, sidHexStr);
 
 	return result;
 }
@@ -219,7 +219,7 @@ int GetAccountNameBySIDHexStr(char* sidHexStr, char** accountName)
 
 	unsigned long accountNameLen = 0;
 
-	HexStrToSID(sidHexStr, &sid, &sidLen);
+	HexStrToBin(sidHexStr, &sid, &sidLen);
 
 	if(LookupAccountSid(NULL, sid, NULL, &accountNameLen, NULL, &domainLen, &testType) == 0)
 	{
@@ -292,7 +292,7 @@ void NTUser::NewUser(char* username)
 		userInfo = NULL;
 	}
 
-	userInfo = (USER_INFO_3*)malloc(sizeof(USER_INFO_3));
+	NetApiBufferAllocate(sizeof(USER_INFO_3),(LPVOID*)&userInfo);
 	memset(userInfo, 0, sizeof(USER_INFO_3));
 	userInfo->usri3_name = UTF8ToUTF16(username);
 
@@ -746,7 +746,7 @@ char* NTUser::GetLogonHours()
 
 	if(userInfo != NULL)
 	{
-		result = (char*)userInfo->usri3_logon_hours;
+		BinToHexStr((char*)userInfo->usri3_logon_hours, 21, &result);
 	}
 
 	return result;
@@ -758,10 +758,13 @@ char* NTUser::GetLogonHours()
 int NTUser::SetLogonHours(char* logonHours)
 {
 	int result = 0;
+	char* binValue;
+	unsigned long binLen = 0;
 
 	if(userInfo != NULL)
 	{
-		userInfo->usri3_logon_hours = (unsigned char*)logonHours;
+		HexStrToBin(logonHours, &binValue, &binLen);
+		userInfo->usri3_logon_hours = (unsigned char*)binValue;
 	}
 	else
 	{
@@ -1215,6 +1218,8 @@ char* NTUser::NextLocalGroupName()
 // ****************************************************************
 NTUserList::NTUserList()
 {
+	entriesRead = 0;
+	totalEntries = 0;
 	bufptr = NULL;
 	currentEntry = 0;
 	resumeHandle = 0;
@@ -1287,6 +1292,10 @@ char* NTUserList::nextUsername()
 NTGroup::NTGroup()
 {
 	groupInfo = NULL;
+	usersInfo = NULL;
+	currentUserEntry = 0;
+	userEntriesRead = 0;
+	userEntriesTotal = 0;
 }
 
 // ****************************************************************
@@ -1299,6 +1308,11 @@ NTGroup::~NTGroup()
 		NetApiBufferFree(groupInfo);
 		groupInfo = NULL;
 	}
+	if(usersInfo != NULL)
+	{
+		NetApiBufferFree(usersInfo);
+		usersInfo = NULL;
+	}
 }
 
 // ****************************************************************
@@ -1312,7 +1326,7 @@ void NTGroup::NewGroup(char* groupName)
 		groupInfo = NULL;
 	}
 
-	groupInfo = (GROUP_INFO_2*)malloc(sizeof(GROUP_INFO_2));
+	NetApiBufferAllocate(sizeof(GROUP_INFO_2),(LPVOID*)&groupInfo);
 	memset(groupInfo, 0, sizeof(GROUP_INFO_2));
 	groupInfo->grpi2_name = UTF8ToUTF16(groupName);
 }
@@ -1576,6 +1590,8 @@ char* NTGroup::NextUserName()
 // ****************************************************************
 NTGroupList::NTGroupList()
 {
+	entriesRead = 0;
+	totalEntries = 0;
 	bufptr = NULL;
 	currentEntry = 0;
 	resumeHandle = 0;
@@ -1648,6 +1664,10 @@ char* NTGroupList::nextGroupName()
 NTLocalGroup::NTLocalGroup()
 {
 	localGroupInfo = NULL;
+	usersInfo = NULL;
+	currentUserEntry = 0;
+	userEntriesRead = 0;
+	userEntriesTotal = 0;
 }
 
 // ****************************************************************
@@ -1660,6 +1680,11 @@ NTLocalGroup::~NTLocalGroup()
 		NetApiBufferFree(localGroupInfo);
 		localGroupInfo = NULL;
 	}
+	if(usersInfo != NULL)
+	{
+		NetApiBufferFree(usersInfo);
+		usersInfo = NULL;
+	}
 }
 
 // ****************************************************************
@@ -1673,7 +1698,7 @@ void NTLocalGroup::NewLocalGroup(char* localGroupName)
 		localGroupInfo = NULL;
 	}
 
-	localGroupInfo = (LOCALGROUP_INFO_1*)malloc(sizeof(LOCALGROUP_INFO_1));
+	NetApiBufferAllocate(sizeof(LOCALGROUP_INFO_1),(LPVOID*)&localGroupInfo);
 	memset(localGroupInfo, 0, sizeof(LOCALGROUP_INFO_1));
 	localGroupInfo->lgrpi1_name = UTF8ToUTF16(localGroupName);
 }
@@ -1947,6 +1972,8 @@ char* NTLocalGroup::NextUserName()
 // ****************************************************************
 NTLocalGroupList::NTLocalGroupList()
 {
+	entriesRead = 0;
+	totalEntries = 0;
 	bufptr = NULL;
 	currentEntry = 0;
 	resumeHandle = 0;