[Git][cmucl/cmucl][issue-130-file-author-in-c] Apply 1 suggestion(s) to 1 file(s)

Raymond Toy (@rtoy) gitlab at common-lisp.net
Mon Sep 5 05:00:11 UTC 2022



Raymond Toy pushed to branch issue-130-file-author-in-c at cmucl / cmucl


Commits:
518ef959 by Carl S. Shapiro at 2022-09-05T04:59:53+00:00
Apply 1 suggestion(s) to 1 file(s)
- - - - -


1 changed file:

- src/lisp/os-common.c


Changes:

=====================================
src/lisp/os-common.c
=====================================
@@ -727,66 +727,42 @@ os_lstat(const char* path, u_int64_t *dev, u_int64_t *ino, unsigned int *mode, u
 char *
 os_file_author(const char *path)
 {
-    int status;
-    struct stat statbuf;
-    char* author = NULL;
-    bool nomem = false;
-    size_t bufsize;
-    char* buf = NULL;
-    char* buf2 = NULL;
+    struct stat sb;
+    char initial[1024];
+    char *buffer, *obuffer;
+    size_t size;
     struct passwd pwd;
-    struct passwd *result = NULL;
-    
-    status = stat(path, &statbuf);
+    struct passwd *ppwd;
+    char *result;
 
-    if (status != 0) {
+    if (stat(path, &sb) != 0) {
         return NULL;
     }
-
-    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
-
-    /*
-     * If sysconf fails, just use a small initial buffer size that we
-     * will keep growing up to some maximum size.
-     */
-    if (bufsize == -1) {
-        bufsize = 1024;
-    }
-    
-    while (1) {
-        buf2 = realloc(buf, bufsize);
-        
-        if (buf2 == NULL) {
-            result = NULL;
-            nomem = true;
-            break;
-        }
-        
-        buf = buf2;
-        status = getpwuid_r(statbuf.st_uid, &pwd, buf, bufsize, &result);
-
-        if (status != 0) {
-            result = NULL;
-        }
-        if ((result != NULL) || (status != ERANGE)) {
-            break;
-        }
-        /* If bufsize exceeds some large size, give up. */
-        if (bufsize > 16384) {
-            nomem = true;
-            break;
+    result = NULL;
+    buffer = initial;
+    size = ARRAYSIZE(initial);
+    assert(sysconf(_SC_GETPW_R_SIZE_MAX) <= 16384));
+    while (size <= 16384) {
+        switch (getpwuid_r(sb.st_uid, &pwd, buffer, size, &ppwd)) {
+        case 0:
+            /* Success, though we might not have a matching entry */
+            result = (ppwd == NULL) ? NULL : strdup(pwd.pw_name);
+            goto exit;
+        case ERANGE:
+            /* Buffer is too small, double its size and try again */
+            size *= 2;
+            obuffer = (buffer == initial) ? NULL : buffer;
+            if ((buffer = realloc(obuffer, size)) == NULL) {
+                free(obuffer); 
+                goto exit;
+            }
+            continue;
+        default:
+            /* All other errors */
+            goto exit;
         }
-
-        bufsize <<= 1;
     }
-    
-    if (result) {
-        author = strdup(result->pw_name);
-    }
-
-    if (buf) {
-        free(buf);
-    }
-
-    return author;
+exit:
+    free(buffer);
+    return result;
 }



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/518ef95922f48ff2e2908786ad1848427b93267b

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/518ef95922f48ff2e2908786ad1848427b93267b
You're receiving this email because of your account on gitlab.common-lisp.net.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20220905/6ee26a32/attachment-0001.html>


More information about the cmucl-cvs mailing list