Prevent run server without filelock 92/318192/2
authorYonggoo Kang <ygace.kang@samsung.com>
Wed, 25 Sep 2024 10:15:24 +0000 (19:15 +0900)
committerYonggoo Kang <ygace.kang@samsung.com>
Wed, 25 Sep 2024 10:40:46 +0000 (19:40 +0900)
Before this patch, the webauthn-server can be launched when flock() is failed.

Change-Id: I2d15f79ceb1ffdb40c5c82146a6437163b7cb546

srcs/common/file-lock.cpp
tests/file-lock-test.cpp

index 3af6603bdfa950bd7c989615685b8845cc4e5ad1..cae975531ac66ca88fc7ea294d64a26459c83ebc 100644 (file)
@@ -71,23 +71,20 @@ void FileLocker::Lock()
         return;
 
     int ret;
-    while ((ret = flock(m_lockFileFd, m_blocking ? LOCK_EX : LOCK_NB | LOCK_EX)) && (errno == EINTR));
-    m_locked = ret == 0;
-    int err = errno;
-    if (ret && err != EWOULDBLOCK)
-        LogErrno("locking a file " << m_lockFile);
-
-    if (m_locked)
-        LogDebug("We have a lock on " << m_lockFile << " file.");
-    else
-        LogDebug("Impossible to lock a file now.");
+    while ((ret = flock(m_lockFileFd, m_blocking ? LOCK_EX : LOCK_NB | LOCK_EX))
+           && errno == EINTR) {}
+    if (ret)
+        ThrowMsg(FileLockerException::LockFailed,
+                 "Failed to lock a file " << m_lockFile << ", errno=" << errno);
+    m_locked = true;
+    LogDebug("We have a lock on " << m_lockFile << " file.");
 }
 
 void FileLocker::Unlock()
 {
     if (m_locked) {
         int ret;
-        while ((ret = flock(m_lockFileFd, LOCK_UN)) && (errno == EINTR));
+        while ((ret = flock(m_lockFileFd, LOCK_UN)) && errno == EINTR) {}
         if (ret)
             LogErrno("unlocking a file " << m_lockFile);
 
index 07189092cfc0a56dec6567011d08245219be595e..4fb66114d17fd457b806c8f6a377b93fb1ea8d4a 100644 (file)
@@ -104,16 +104,12 @@ TEST_F(FileLockerTest, lock_invalid_path_N)
     EXPECT_EQ(ret, 1);
 }
 
-TEST_F(FileLockerTest, lock_to_locked_path_nonblock_P)
+TEST_F(FileLockerTest, try_to_locked_path_N)
 {
     int ret = 0;
     try{
         FileLocker fileLocker("/tmp/.webauthn-test.lock", true);
         FileLocker fileLocker2("/tmp/.webauthn-test.lock", false);
-        EXPECT_EQ(fileLocker.Locked(), true);
-        EXPECT_EQ(fileLocker2.Locked(), false);
-        fileLocker.Unlock();
-        EXPECT_EQ(fileLocker.Locked(), false);
     } catch (FileLockerException::LockFailed &e)
     {
         ret = 1;
@@ -122,7 +118,7 @@ TEST_F(FileLockerTest, lock_to_locked_path_nonblock_P)
         std::cout << "Error in FileLocker" << std::endl;
         ret = -1;
     }
-    EXPECT_EQ(ret, 0);
+    EXPECT_EQ(ret, 1);
 }
 
 } // namespace WebAuthn