From owner-svn-soc-all@FreeBSD.ORG Sun Jun 7 23:00:10 2015 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 9F402983 for ; Sun, 7 Jun 2015 23:00:10 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8DE261E57 for ; Sun, 7 Jun 2015 23:00:10 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id t57N0Am8042599 for ; Sun, 7 Jun 2015 23:00:10 GMT (envelope-from def@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id t57N0ACS042144 for svn-soc-all@FreeBSD.org; Sun, 7 Jun 2015 23:00:10 GMT (envelope-from def@FreeBSD.org) Date: Sun, 7 Jun 2015 23:00:10 GMT Message-Id: <201506072300.t57N0ACS042144@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to def@FreeBSD.org using -f From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r286815 - soc2013/def/crashdump-head/sys/kern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Jun 2015 23:00:10 -0000 Author: def Date: Sun Jun 7 23:00:09 2015 New Revision: 286815 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=286815 Log: ddb(4) writes textdumps backwards. Assume that data have to be aligned to block size. Assume that the last call to dump_write and the current one write data chunks next to each other. Modified: soc2013/def/crashdump-head/sys/kern/kern_shutdown.c Modified: soc2013/def/crashdump-head/sys/kern/kern_shutdown.c ============================================================================== --- soc2013/def/crashdump-head/sys/kern/kern_shutdown.c Sun Jun 7 21:59:43 2015 (r286814) +++ soc2013/def/crashdump-head/sys/kern/kern_shutdown.c Sun Jun 7 23:00:09 2015 (r286815) @@ -148,9 +148,9 @@ uint8_t kdc_iv[KERNELDUMP_IV_SIZE]; keyInstance kdc_ki; cipherInstance kdc_ci; - off_t kdc_offset; + off_t kdc_lastoffset; + size_t kdc_lastlength; uint8_t kdc_buf[KERNELDUMP_BUFFER_SIZE]; - size_t kdc_bufused; } dumpcrypto; static struct kerneldumpkey *dumpkey = NULL; @@ -878,8 +878,8 @@ if (error <= 0) return (EINVAL); - kdc->kdc_offset = 0; - kdc->kdc_bufused = 0; + kdc->kdc_lastoffset = 0; + kdc->kdc_lastlength = 0; di->kdc = kdc; di->kdk = kdk; @@ -1010,44 +1010,49 @@ struct kerneldumpcrypto *kdc; struct kerneldumpkey *kdk; int error; - size_t len; + size_t nbytes; kdc = di->kdc; kdk = di->kdk; + /* Data have to be aligned to block size. */ + if ((length % KERNELDUMP_BLOCK_SIZE) != 0) + return (EINVAL); + /* Data have to be written continuously. */ - if (kdc->kdc_offset != 0 && kdc->kdc_offset != offset && - kdc->kdc_offset + kdc->kdc_bufused != offset) { + if (kdc->kdc_lastoffset != 0 && + kdc->kdc_lastoffset + kdc->kdc_lastlength != offset && + offset + length != kdc->kdc_lastoffset) { return (EINVAL); } - while (kdc->kdc_bufused + length >= KERNELDUMP_BUFFER_SIZE) { - len = KERNELDUMP_BUFFER_SIZE - kdc->kdc_bufused; - memcpy(kdc->kdc_buf + kdc->kdc_bufused, virtual, len); - kdc->kdc_bufused += len; + kdc->kdc_lastoffset = offset; + kdc->kdc_lastlength = length; + + while (length > 0) { + if (length >= KERNELDUMP_BUFFER_SIZE) + nbytes = KERNELDUMP_BUFFER_SIZE; + else + nbytes = length; + memcpy(kdc->kdc_buf, virtual, nbytes); error = rijndael_blockEncrypt(&kdc->kdc_ci, &kdc->kdc_ki, - kdc->kdc_buf, 8 * KERNELDUMP_BUFFER_SIZE, kdc->kdc_buf); + kdc->kdc_buf, 8 * nbytes, kdc->kdc_buf); if (error <= 0) return (EIO); error = rijndael_cipherInit(&kdc->kdc_ci, MODE_CBC, - kdc->kdc_buf + KERNELDUMP_BUFFER_SIZE - KERNELDUMP_IV_SIZE); + kdc->kdc_buf + nbytes - KERNELDUMP_IV_SIZE); if (error <= 0) return (EIO); error = di->dumper(di->priv, kdc->kdc_buf, physical, - kdc->kdc_offset, KERNELDUMP_BUFFER_SIZE); + offset, nbytes); if (error != 0) return (error); - kdc->kdc_bufused = 0; - kdc->kdc_offset += KERNELDUMP_BUFFER_SIZE; - virtual = (void *)((char *)virtual + len); - length -= len; - } - if (length > 0) { - memcpy(kdc->kdc_buf + kdc->kdc_bufused, virtual, length); - kdc->kdc_bufused += length; + offset += nbytes; + virtual = (void *)((uint8_t *)virtual + nbytes); + length -= nbytes; } return (0); @@ -1106,8 +1111,10 @@ return (error); #ifdef EKCD - if (di->kdc->kdc_enable == 1) - di->kdc->kdc_offset = offset + sizeof(*kdh); + if (di->kdc->kdc_enable == 1) { + di->kdc->kdc_lastoffset = offset; + di->kdc->kdc_lastlength = sizeof(*kdh); + } #endif return (0); @@ -1129,8 +1136,10 @@ return (error); #ifdef EKCD - if (di->kdc->kdc_enable == 1) - di->kdc->kdc_offset = offset + kerneldumpkey_size(kdk); + if (di->kdc->kdc_enable == 1) { + di->kdc->kdc_lastoffset = offset; + di->kdc->kdc_lastlength = kerneldumpkey_size(kdk); + } #endif return (0);