Date: Sat, 4 Jun 2016 16:26:25 +0000 (UTC) From: Andrew Rybchenko <arybchik@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org Subject: svn commit: r301364 - stable/10/sys/dev/sfxge/common Message-ID: <201606041626.u54GQPTi035955@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: arybchik Date: Sat Jun 4 16:26:25 2016 New Revision: 301364 URL: https://svnweb.freebsd.org/changeset/base/301364 Log: MFC r299903 sfxge(4): cleanup: make TLV scans quieter Find end of segments in a more direct way that avoids an error report at the terminator. Submitted by: Richard Houldsworth <rhouldsworth at solarflare.com> Sponsored by: Solarflare Communications, Inc. Modified: stable/10/sys/dev/sfxge/common/ef10_nvram.c Directory Properties: stable/10/ (props changed) Modified: stable/10/sys/dev/sfxge/common/ef10_nvram.c ============================================================================== --- stable/10/sys/dev/sfxge/common/ef10_nvram.c Sat Jun 4 16:25:18 2016 (r301363) +++ stable/10/sys/dev/sfxge/common/ef10_nvram.c Sat Jun 4 16:26:25 2016 (r301364) @@ -901,6 +901,7 @@ ef10_nvram_buffer_find_end( // Read to end of partition tlv_cursor_t cursor; efx_rc_t rc; + uint32_t *segment_used; if ((rc = tlv_init_cursor_from_size(&cursor, (uint8_t *)bufferp, buffer_size)) != 0) { @@ -908,10 +909,31 @@ ef10_nvram_buffer_find_end( goto fail1; } - if ((rc = tlv_require_end(&cursor)) != 0) - goto fail2; + segment_used = cursor.block; - *endp = byte_offset(tlv_last_segment_end(&cursor)+1, cursor.block); + /* + * Go through each segment and check that it has an end tag. If there + * is no end tag then the previous segment was the last valid one, + * so return the used space including that end tag. + */ + while (tlv_tag(&cursor) == TLV_TAG_PARTITION_HEADER) { + if (tlv_require_end(&cursor) != 0) { + if (segment_used == cursor.block) { + /* + * First segment is corrupt, so there is + * no valid data in partition. + */ + rc = EINVAL; + goto fail2; + } + break; + } + segment_used = cursor.end + 1; + + cursor.current = segment_used; + } + /* Return space used (including the END tag) */ + *endp = (segment_used - cursor.block) * sizeof (uint32_t); return (0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606041626.u54GQPTi035955>