summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2017-02-10 06:34:52 +0000
committerngie <ngie@FreeBSD.org>2017-02-10 06:34:52 +0000
commit3ce81f6a4bc9f6a3092f2bce4b4ed7be4fbcf598 (patch)
tree47784d23a799ba75452be1d2403fbbc274b38965 /lib/libc
parentf8763cdd5b2a914ef103387aad7a1da0872f83ad (diff)
downloadFreeBSD-src-3ce81f6a4bc9f6a3092f2bce4b4ed7be4fbcf598.zip
FreeBSD-src-3ce81f6a4bc9f6a3092f2bce4b4ed7be4fbcf598.tar.gz
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)
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/db/hash/hash_page.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/libc/db/hash/hash_page.c b/lib/libc/db/hash/hash_page.c
index 8040419..f9a7289 100644
--- a/lib/libc/db/hash/hash_page.c
+++ b/lib/libc/db/hash/hash_page.c
@@ -572,7 +572,9 @@ __get_page(HTAB *hashp, char *p, u_int32_t bucket, int is_bucket, int is_disk,
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_t bucket, int is_bucket, int is_bitmap)
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);
OpenPOWER on IntegriCloud