From 5666e57db9792d5e2f4faf89599812a570b39b96 Mon Sep 17 00:00:00 2001
From: ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>
Date: Thu, 16 Jun 2011 17:01:09 +0000
Subject: Fixed DBMap's db_dup_key to allocate only as much as necessary
 (bugreport:4969). This reduces default eA's memory usage by about 400kB.

git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14853 54d463be-8e91-2dee-dedb-b68131a5f0ec
---
 Changelog-Trunk.txt |  1 +
 src/common/db.c     | 16 ++++++++--------
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 42bda730a..fb62478e2 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -1,6 +1,7 @@
 Date	Added
 
 2011/06/16
+	* Fixed DBMap's db_dup_key to allocate only as much as necessary (bugreport:4969) [ultramage]
 	* Fixed char-converter not being able to compile due to both char.h being included. (caused by last commit) [FlavioJS]
 	* Merges from charmerge:
 	- Added DBMap::exists. (r14090)
diff --git a/src/common/db.c b/src/common/db.c
index 935fe472f..5622a2433 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -631,19 +631,19 @@ static int db_is_key_null(DBType type, DBKey key)
 static DBKey db_dup_key(DBMap_impl* db, DBKey key)
 {
 	char *str;
+	size_t len;
+	unsigned short maxlen;
 
 	DB_COUNTSTAT(db_dup_key);
 	switch (db->type) {
 		case DB_STRING:
 		case DB_ISTRING:
-			if (db->maxlen) {
-				CREATE(str, char, db->maxlen +1);
-				strncpy(str, key.str, db->maxlen);
-				str[db->maxlen] = '\0';
-				key.str = str;
-			} else {
-				key.str = (char *)aStrdup(key.str);
-			}
+			maxlen = ( db->maxlen != 0 ) ? db->maxlen : UINT16_MAX;
+			len = strnlen(key.str, maxlen);
+			str = (char*)aMalloc(len + 1);
+			memcpy(str, key.str, len);
+			str[len] = '\0';
+			key.str = str;
 			return key;
 
 		default:
-- 
cgit v1.2.3-70-g09d2