Fix memory allocation loop accepted/tizen_3.0_common accepted/tizen_3.0_ivi accepted/tizen/3.0/common/20170810.115355 accepted/tizen/3.0/ivi/20170810.094219 accepted/tizen/3.0/mobile/20170810.094208 accepted/tizen/3.0/wearable/20170810.094223 submit/tizen_3.0/20170801.044417 submit/tizen_3.0/20170810.013126
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Mon, 12 Jun 2017 10:14:19 +0000 (12:14 +0200)
committerjin-gyu.kim <jin-gyu.kim@samsung.com>
Tue, 1 Aug 2017 03:20:55 +0000 (12:20 +0900)
Old implementation always exit loop after buffer resize without
any try to input data once again.

src/nss/nss_securitymanager.cpp

index 2a975e695996d80a2497d684f57c4856c19de528..4c7eef3f48ea792ab784334b84f5d6c6d5959856 100644 (file)
@@ -88,13 +88,11 @@ enum nss_status _nss_securitymanager_initgroups_dyn(const char *user, gid_t grou
         passwd pwnambuffer;
         passwd *pwnam = NULL;
 
-        do {
-            ret = TEMP_FAILURE_RETRY(getpwnam_r(user, &pwnambuffer, buffer.data(), buffer.size(), &pwnam));
-            if (ret == ERANGE && buffer.size() < MEMORY_LIMIT) {
-                buffer.resize(buffer.size() << 1);
-                continue;
-            }
-        } while (0);
+        while (ERANGE == (ret = TEMP_FAILURE_RETRY(getpwnam_r(user, &pwnambuffer, buffer.data(), buffer.size(), &pwnam)))
+               && buffer.size() < MEMORY_LIMIT)
+        {
+            buffer.resize(buffer.size() << 1);
+        }
 
         if (ret == ERANGE) {
             *errnop = ENOMEM;