Author: ngie
Date: Fri Feb 10 06:34:52 2017
New Revision: 313532
URL: https://svnweb.freebsd.org/changeset/base/313532

Log:
  MFC r306349:
  r306349 (by pfg):
  
  hash(3): protect in-memory page when using cross-endianness.
  
  When writing out pages in the "other endian" format, make a copy
  instead of trashing the in-memory one.
  
  Obtained from:        NetBSD (CVS rev. 1.29)

Modified:
  stable/10/lib/libc/db/hash/hash_page.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/db/hash/hash_page.c
==============================================================================
--- stable/10/lib/libc/db/hash/hash_page.c      Fri Feb 10 06:31:31 2017        
(r313531)
+++ stable/10/lib/libc/db/hash/hash_page.c      Fri Feb 10 06:34:52 2017        
(r313532)
@@ -572,7 +572,9 @@ __get_page(HTAB *hashp, char *p, u_int32
 int
 __put_page(HTAB *hashp, char *p, u_int32_t bucket, int is_bucket, int 
is_bitmap)
 {
-       int fd, page, size, wsize;
+       int fd, page, size;
+       ssize_t wsize;
+       char pbuf[MAX_BSIZE];
 
        size = hashp->BSIZE;
        if ((hashp->fp == -1) && open_temp(hashp))
@@ -582,15 +584,18 @@ __put_page(HTAB *hashp, char *p, u_int32
        if (hashp->LORDER != BYTE_ORDER) {
                int i, max;
 
+               memcpy(pbuf, p, size);
                if (is_bitmap) {
                        max = hashp->BSIZE >> 2;        /* divide by 4 */
                        for (i = 0; i < max; i++)
-                               M_32_SWAP(((int *)p)[i]);
+                               M_32_SWAP(((int *)pbuf)[i]);
                } else {
-                       max = ((u_int16_t *)p)[0] + 2;
+                       uint16_t *bp = (uint16_t *)(void *)pbuf;
+                       max = bp[0] + 2;
                        for (i = 0; i <= max; i++)
-                               M_16_SWAP(((u_int16_t *)p)[i]);
+                               M_16_SWAP(bp[i]);
                }
+               p = pbuf;
        }
        if (is_bucket)
                page = BUCKET_TO_PAGE(bucket);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to