commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-2.2-694-g84c7934


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-694-g84c7934
Date: Mon, 08 Dec 2014 11:45:51 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=84c79341d577d5574d3eb450007219322e87fd7d

The branch, master has been updated
       via  84c79341d577d5574d3eb450007219322e87fd7d (commit)
      from  d0590302f3bde188c5548c06538df7b172f12521 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 84c79341d577d5574d3eb450007219322e87fd7d
Author: Sergey Poznyakoff <address@hidden>
Date:   Mon Dec 8 12:59:36 2014 +0200

    Fix alignment issues in fgetpwent_r
    
    * libmailutils/base/fgetpwent.c: Place struct passwd at the
    beginning of the buffer.  Account for eventual missing newline
    at the end of file.

-----------------------------------------------------------------------

Summary of changes:
 libmailutils/base/fgetpwent.c |   63 +++++++++++++++++++++-------------------
 1 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/libmailutils/base/fgetpwent.c b/libmailutils/base/fgetpwent.c
index 6b32744..78f2b73 100644
--- a/libmailutils/base/fgetpwent.c
+++ b/libmailutils/base/fgetpwent.c
@@ -41,14 +41,17 @@
     ENOMEM - not enough memory
     ENOENT - no more entries.
 */
+#define SPWDSIZ (sizeof (struct passwd))
 
 int
 mu_fgetpwent_r (FILE *fp, char **bufp, size_t *bufs, struct passwd **result)
 {
   char *buffer = *bufp;
   size_t buflen = *bufs;
+  char *nb;
+  size_t ns;
   struct passwd *pwbuf;
-  size_t pos = 0;
+  size_t pos = SPWDSIZ;
   int c;
   size_t off[6];
   int i = 0;
@@ -56,22 +59,19 @@ mu_fgetpwent_r (FILE *fp, char **bufp, size_t *bufs, struct 
passwd **result)
   if (!buffer)
     buflen = 0;
   
-  while ((c = fgetc(fp)) != EOF)
+  while ((c = fgetc (fp)) != EOF)
     {
-      if (pos == buflen)
+      if (pos >= buflen)
        {
-         char *nb;
-         size_t ns;
-         
          if (buflen == 0)
-           ns = 128;
+           ns = SPWDSIZ + 128;
          else
            {
              ns = ns * 2;
              if (ns < buflen)
                return ENOMEM;
            }
-         nb = realloc(buffer, ns);
+         nb = realloc (buffer, ns);
          if (!nb)
            return ENOMEM;
          buffer = nb;
@@ -80,44 +80,47 @@ mu_fgetpwent_r (FILE *fp, char **bufp, size_t *bufs, struct 
passwd **result)
       if (c == '\n')
        {
          buffer[pos++] = 0;
-         if (i != sizeof(off)/sizeof(off[0]))
-           continue;
+         if (i != sizeof (off) / sizeof (off[0]))
+           {
+             pos = SPWDSIZ;
+             continue;
+           }
          break;
        }
       if (c == ':')
        {
          buffer[pos++] = 0;
-         if (i < sizeof(off)/sizeof(off[0]))
+         if (i < sizeof (off) / sizeof (off[0]))
            off[i++] = pos;
        }
       else
        buffer[pos++] = c;
     }
 
-  if (pos == 0)
+  if (pos == SPWDSIZ)
     return ENOENT;
 
-  if (pos + sizeof(struct passwd) > buflen)
+  if (c == EOF)
     {
-      char *nb;
-      size_t ns;
-         
-      ns = pos + sizeof(struct passwd);
-      if (ns < buflen)
-       return ENOMEM;
-    
-      nb = realloc(buffer, ns);
-      if (!nb)
-       return ENOMEM;
-      buffer = nb;
-      buflen = ns;
+      if (i != sizeof (off) / sizeof (off[0]))
+       return ENOENT;
+      if (pos == buflen)
+       {
+         nb = realloc (buffer, buflen + 1);
+         if (!nb)
+           return ENOMEM;
+         buffer = nb;
+         buflen = ns;
+       }
+      buffer[pos++] = 0;
     }
-  pwbuf = (struct passwd*)((char*) buffer + pos);
   
-  pwbuf->pw_name   = buffer;
+  pwbuf = (struct passwd*) buffer;
+  
+  pwbuf->pw_name   = buffer + SPWDSIZ;
   pwbuf->pw_passwd = buffer + off[0];
-  pwbuf->pw_uid    = strtoul(buffer + off[1], NULL, 10);
-  pwbuf->pw_gid    = strtoul(buffer + off[2], NULL, 10);
+  pwbuf->pw_uid    = strtoul (buffer + off[1], NULL, 10);
+  pwbuf->pw_gid    = strtoul (buffer + off[2], NULL, 10);
   pwbuf->pw_gecos  = buffer + off[3];
   pwbuf->pw_dir    = buffer + off[4];
   pwbuf->pw_shell  = buffer + off[5];
@@ -196,7 +199,7 @@ main (int argc, char **argv)
         }
       printf ("======================================\n");
       printf ("End of %s\n", file);
-      close (fp);
+      fclose (fp);
     }
   return 0;
 }


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]