kern/160430: [patch] Add __packed to libarchive cpio metadata
structs
Ian Lepore
freebsd at damnhippie.dyndns.org
Sat Sep 3 16:30:11 UTC 2011
>Number: 160430
>Category: kern
>Synopsis: [patch] Add __packed to libarchive cpio metadata structs
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Sep 03 16:30:10 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Ian Lepore <freebsd at damnhippie.dyndns.org>
>Release: FreeBSD 8.2-RC3 arm
>Organization:
none
>Environment:
FreeBSD dvb 8.2-RC3 FreeBSD 8.2-RC3 #49: Tue Feb 15 22:52:14 UTC 2011 root at revolution.hippie.lan:/usr/obj/arm/usr/src/sys/DVB arm
>Description:
Some platforms (such as ARM) pad structures to a multiple of the platform's
"natural alignment". This causes libarchive to go into an endless loop when
processing a cpio archive on such a platform. Adding the __packed attribute
fixes the problem.
>How-To-Repeat:
Create a cpio archive ('newc' format) and attempt to list or extract it on ARM.
>Fix:
Patch attached. This patch is well-tested; it has been in use at Symmetricom
since 2007 for our products that run on both ARM and x86 (32-bit) platforms.
--- diff.tmp begins here ---
--- archive_read_support_format_cpio.c.orig 2009-12-28 22:50:34.000000000 -0700
+++ archive_read_support_format_cpio.c 2011-09-03 09:50:07.000000000 -0600
@@ -54,7 +54,7 @@ struct cpio_bin_header {
unsigned char c_mtime[4];
unsigned char c_namesize[2];
unsigned char c_filesize[4];
-};
+} __packed; /* prevent struct size padding on arm */
struct cpio_odc_header {
char c_magic[6];
@@ -68,7 +68,7 @@ struct cpio_odc_header {
char c_mtime[11];
char c_namesize[6];
char c_filesize[11];
-};
+} __packed; /* prevent struct size padding on arm */
struct cpio_newc_header {
char c_magic[6];
@@ -85,7 +85,7 @@ struct cpio_newc_header {
char c_rdevminor[8];
char c_namesize[8];
char c_crc[8];
-};
+} __packed; /* prevent struct size padding on arm */
struct links_entry {
struct links_entry *next;
--- diff.tmp ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list