Date: Sun, 9 Aug 2015 22:38:30 GMT From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r289487 - soc2013/def/crashdump-head/sys/kern Message-ID: <201508092238.t79McUYX015508@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: def Date: Sun Aug 9 22:38:29 2015 New Revision: 289487 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289487 Log: Add a generic function to dump raw data. 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 Aug 9 21:32:05 2015 (r289486) +++ soc2013/def/crashdump-head/sys/kern/kern_shutdown.c Sun Aug 9 22:38:29 2015 (r289487) @@ -1001,6 +1001,22 @@ return (0); } +static int +dump_check_bounds(struct dumperinfo *di, off_t offset, size_t length) +{ + + if (length != 0 && (offset < di->mediaoffset || + offset - di->mediaoffset + length > di->mediasize)) { + printf("Attempt to write outside dump device boundaries.\n" + "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n", + (intmax_t)offset, (intmax_t)di->mediaoffset, + (uintmax_t)length, (intmax_t)di->mediasize); + return (ENOSPC); + } + + return (0); +} + #ifdef EKCD /* Encrypt data and call dumper. */ static int @@ -1015,6 +1031,10 @@ kdc = di->kdc; kdk = di->kdk; + error = dump_check_bounds(di, offset, length); + if (error != 0) + return (error); + /* Data have to be aligned to block size. */ if ((length % KERNELDUMP_BLOCK_SIZE) != 0) return (EINVAL); @@ -1059,32 +1079,24 @@ } #endif +/* Call dumper with bounds checking. */ static int -dump_check_bounds(struct dumperinfo *di, off_t offset, size_t length) +dump_raw_write(struct dumperinfo *di, void *virtual, vm_offset_t physical, + off_t offset, size_t length) { + int error; - if (length != 0 && (offset < di->mediaoffset || - offset - di->mediaoffset + length > di->mediasize)) { - printf("Attempt to write outside dump device boundaries.\n" - "offset(%jd), mediaoffset(%jd), length(%ju), mediasize(%jd).\n", - (intmax_t)offset, (intmax_t)di->mediaoffset, - (uintmax_t)length, (intmax_t)di->mediasize); - return (ENOSPC); - } + error = dump_check_bounds(di, offset, length); + if (error != 0) + return (error); - return (0); + return (di->dumper(di->priv, virtual, physical, offset, length)); } -/* Call dumper with bounds checking. */ int dump_write(struct dumperinfo *di, void *virtual, vm_offset_t physical, off_t offset, size_t length) { - int error; - - error = dump_check_bounds(di, offset, length); - if (error != 0) - return (error); #ifdef EKCD if (di->kdc->kdc_enable == 1) { @@ -1093,56 +1105,24 @@ } #endif - return (di->dumper(di->priv, virtual, physical, offset, length)); + return (dump_raw_write(di, virtual, physical, offset, length)); } int dump_write_header(struct dumperinfo *di, struct kerneldumpheader *kdh, vm_offset_t physical, off_t offset) { - int error; - error = dump_check_bounds(di, offset, sizeof(*kdh)); - if (error != 0) - return (error); - - error = di->dumper(di->priv, kdh, physical, offset, sizeof(*kdh)); - if (error != 0) - return (error); - -#ifdef EKCD - if (di->kdc->kdc_enable == 1) { - di->kdc->kdc_lastoffset = offset; - di->kdc->kdc_lastlength = sizeof(*kdh); - } -#endif - - return (0); + return (dump_raw_write(di, kdh, physical, offset, sizeof(*kdh))); } int dump_write_key(struct dumperinfo *di, struct kerneldumpkey *kdk, vm_offset_t physical, off_t offset) { - int error; - error = dump_check_bounds(di, offset, kerneldumpkey_size(kdk)); - if (error != 0) - return (error); - - error = di->dumper(di->priv, kdk, physical, offset, - kerneldumpkey_size(kdk)); - if (error != 0) - return (error); - -#ifdef EKCD - if (di->kdc->kdc_enable == 1) { - di->kdc->kdc_lastoffset = offset; - di->kdc->kdc_lastlength = kerneldumpkey_size(kdk); - } -#endif - - return (0); + return (dump_raw_write(di, kdk, physical, offset, + kerneldumpkey_size(kdk))); } void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508092238.t79McUYX015508>