Author: glebius
Date: Tue Oct 29 09:23:51 2013
New Revision: 257320
URL: http://svnweb.freebsd.org/changeset/base/257320

Log:
  Merge r256537 from head:
      Make getutxent(3) more robust against bad utx.log files. Whenever we read
    zeroes, don't stop processing the file, but read until its end or valid
    data.
  
    In collaboration with:      ed
  
  Approved by:  re (kib)

Modified:
  stable/10/lib/libc/gen/getutxent.c
Directory Properties:
  stable/10/lib/libc/   (props changed)

Modified: stable/10/lib/libc/gen/getutxent.c
==============================================================================
--- stable/10/lib/libc/gen/getutxent.c  Tue Oct 29 09:04:25 2013        
(r257319)
+++ stable/10/lib/libc/gen/getutxent.c  Tue Oct 29 09:23:51 2013        
(r257320)
@@ -122,9 +122,20 @@ getfutxent(struct futx *fu)
        if (udb == UTXDB_LOG) {
                uint16_t len;
 
+retry:
                if (fread(&len, sizeof(len), 1, uf) != 1)
                        return (-1);
                len = be16toh(len);
+               if (len == 0) {
+                       /*
+                        * XXX: Though zero-size records are valid in theory,
+                        * they can never occur in practice. Zero-size records
+                        * indicate file corruption. Seek one byte forward, to
+                        * see if we can find a record there.
+                        */
+                       ungetc('\0', uf);
+                       goto retry;
+               }
                if (len > sizeof *fu) {
                        /* Forward compatibility. */
                        if (fread(fu, sizeof(*fu), 1, uf) != 1)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to