Fix use-after-free bug 28/178328/2 accepted/tizen_5.0_unified tizen_5.0 accepted/tizen/5.0/unified/20181102.020045 accepted/tizen/unified/20180510.070817 submit/tizen/20180509.100419 submit/tizen_5.0/20181101.000003
authorsangwan.kwon <sangwan.kwon@samsung.com>
Wed, 9 May 2018 09:47:49 +0000 (18:47 +0900)
committersangwan.kwon <sangwan.kwon@samsung.com>
Wed, 9 May 2018 09:49:48 +0000 (18:49 +0900)
Change-Id: I35ba8a8b687024311b40796a3ae3640f1b9cd71d
Signed-off-by: sangwan.kwon <sangwan.kwon@samsung.com>
src/server/plugin/generic-backend/ipassword-file.h
src/server/plugin/sw-backend/password-file.h
src/server/plugin/tz-backend/password-file.h
src/server/service/include/password-manager.h
src/server/service/password-manager.cpp

index c0d26eba397268628c26e9fbe940547069f5f2e5..33246cf88c3fdf1d6d1a48e2d7e1e095244d579f 100644 (file)
@@ -28,8 +28,15 @@ namespace AuthPasswd {
 constexpr time_t PASSWORD_INFINITE_EXPIRATION_TIME = std::numeric_limits<time_t>::max();
 
 struct IPasswordFile {
+       IPasswordFile() = default;
        virtual ~IPasswordFile() = default;
 
+       IPasswordFile(const IPasswordFile&) = delete;
+       IPasswordFile& operator=(const IPasswordFile&) = delete;
+
+       IPasswordFile(IPasswordFile&&) = delete;
+       IPasswordFile& operator=(IPasswordFile&&) = delete;
+
        virtual void writeMemoryToFile() const = 0;
        virtual void writeAttemptToFile() const = 0;
 
index a5097e5b529eed609c8b08d32a11b514ad911c50..15f496b36fb3aec5b584d43713dd94e7bab72ddc 100644 (file)
@@ -60,6 +60,13 @@ namespace SWBackend {
 class PasswordFile : public IPasswordFile {
 public:
        PasswordFile(unsigned int user);
+       ~PasswordFile() = default;
+
+       PasswordFile(const PasswordFile&) = delete;
+       PasswordFile& operator=(const PasswordFile&) = delete;
+
+       PasswordFile(PasswordFile&&) = delete;
+       PasswordFile& operator=(PasswordFile&&) = delete;
 
        void writeMemoryToFile() const override;
        void writeAttemptToFile() const override;
index 7749c91f480fee4440a2994d9ce22ed370637d20..16cc04bfca447ff77d39d88911e1c5ee91685c42 100644 (file)
@@ -26,6 +26,12 @@ class PasswordFile : public IPasswordFile {
 public:
        PasswordFile(unsigned int user);
 
+       PasswordFile(const PasswordFile&) = delete;
+       PasswordFile& operator=(const PasswordFile&) = delete;
+
+       PasswordFile(PasswordFile&&) = delete;
+       PasswordFile& operator=(PasswordFile&&) = delete;
+
        void writeMemoryToFile() const override;
        void writeAttemptToFile() const override;
 
index b0b604aaac8b1ce02ee34bf7f6d36faafe5f8e82..a63ea5de3ef33e607b7ddf22a3d387039ec1cc44 100644 (file)
 namespace AuthPasswd {
 class PasswordManager final {
 public:
-       typedef std::map<unsigned int, std::shared_ptr<IPasswordFile>> PasswordFileMap;
+       typedef std::map<unsigned int, IPasswordFile*> PasswordFileMap;
 
        PasswordManager();
-       ~PasswordManager() = default;
+       ~PasswordManager();
 
        //checking functions
        //no const in checkPassword, attempts are update
index 73dbcc185b71d722d288d898a6d3fb0a45fb6243..b42320f6d6f879d3759e70987198b4bdb65eb6c4 100644 (file)
@@ -69,10 +69,19 @@ PasswordManager::PasswordManager()
        m_pluginManager.loadFactory("PasswordFileFactory", m_factory);
 }
 
+PasswordManager::~PasswordManager()
+{
+       PasswordFileMap::iterator iter;
+       for (iter = m_pwdFile.begin(); iter != m_pwdFile.end(); iter++) {
+               if (iter->second != nullptr)
+                       delete iter->second;
+       }
+}
+
 void PasswordManager::addPassword(unsigned int user)
 {
-       std::shared_ptr<IPasswordFile> passwordFile((*m_factory)(user));
-       m_pwdFile.insert(PasswordFileMap::value_type(user, passwordFile));
+       IPasswordFile* passwordFile = (*m_factory)(user);
+       m_pwdFile[user] = passwordFile;
 }
 
 void PasswordManager::removePassword(unsigned int user)