Module Name: src Committed By: mlelstv Date: Sat Mar 23 09:33:16 UTC 2019
Modified Files: src/bin/dd: dd.c Log Message: When buffers are at least page sized, explicitely request page alignment. To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/bin/dd/dd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/dd/dd.c diff -u src/bin/dd/dd.c:1.51 src/bin/dd/dd.c:1.52 --- src/bin/dd/dd.c:1.51 Mon Sep 5 01:00:07 2016 +++ src/bin/dd/dd.c Sat Mar 23 09:33:16 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dd.c,v 1.51 2016/09/05 01:00:07 sevan Exp $ */ +/* $NetBSD: dd.c,v 1.52 2019/03/23 09:33:16 mlelstv Exp $ */ /*- * Copyright (c) 1991, 1993, 1994 @@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1991, 19 #if 0 static char sccsid[] = "@(#)dd.c 8.5 (Berkeley) 4/2/94"; #else -__RCSID("$NetBSD: dd.c,v 1.51 2016/09/05 01:00:07 sevan Exp $"); +__RCSID("$NetBSD: dd.c,v 1.52 2019/03/23 09:33:16 mlelstv Exp $"); #endif #endif /* not lint */ @@ -72,6 +72,7 @@ static void dd_in(void); static void getfdtype(IO *); static void redup_clean_fd(IO *); static void setup(void); +static void *buffer_alloc(size_t); IO in, out; /* input/output state */ STAT st; /* statistics */ @@ -150,6 +151,20 @@ main(int argc, char *argv[]) /* NOTREACHED */ } +static void * +buffer_alloc(size_t sz) +{ + size_t align = getpagesize(); + void *res; + + if (sz < align) + res = malloc(sz); + else if (posix_memalign(&res, align, sz) != 0) + res = NULL; + + return res; +} + static void setup(void) { @@ -233,14 +248,14 @@ setup(void) size_t dbsz = out.dbsz; if (!(ddflags & C_BS)) dbsz += in.dbsz - 1; - if ((in.db = malloc(dbsz)) == NULL) { + if ((in.db = buffer_alloc(dbsz)) == NULL) { err(EXIT_FAILURE, NULL); /* NOTREACHED */ } out.db = in.db; } else if ((in.db = - malloc((u_int)(MAX(in.dbsz, cbsz) + cbsz))) == NULL || - (out.db = malloc((u_int)(out.dbsz + cbsz))) == NULL) { + buffer_alloc((u_int)(MAX(in.dbsz, cbsz) + cbsz))) == NULL || + (out.db = buffer_alloc((u_int)(out.dbsz + cbsz))) == NULL) { err(EXIT_FAILURE, NULL); /* NOTREACHED */ }