Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F164965001
D18933.id56303.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
D18933.id56303.diff
View Options
Index: .gitignore
===================================================================
--- .gitignore
+++ .gitignore
@@ -17,3 +17,4 @@
ID
cscope.out
?cscope.out
+tags
Index: contrib/libarchive/libarchive/archive_read_support_format_ar.c
===================================================================
--- contrib/libarchive/libarchive/archive_read_support_format_ar.c
+++ contrib/libarchive/libarchive/archive_read_support_format_ar.c
@@ -388,9 +388,10 @@
/*
* "/" is the SVR4/GNU archive symbol table.
+ * "/SYM64/" is the SVR4/GNU 64-bit variant archive symbol table.
*/
- if (strcmp(filename, "/") == 0) {
- archive_entry_copy_pathname(entry, "/");
+ if (strcmp(filename, "/") == 0 || strcmp(filename, "/SYM64/") == 0) {
+ archive_entry_copy_pathname(entry, filename);
/* Parse the time, owner, mode, size fields. */
r = ar_parse_common_header(ar, entry, h);
/* Force the file type to a regular file. */
Index: contrib/libarchive/libarchive/archive_write_set_format_ar.c
===================================================================
--- contrib/libarchive/libarchive/archive_write_set_format_ar.c
+++ contrib/libarchive/libarchive/archive_write_set_format_ar.c
@@ -187,6 +187,11 @@
buff[AR_name_offset] = '/';
goto stat;
}
+ if (strcmp(pathname, "/SYM64/") == 0 ) {
+ /* Entry is archive symbol table in GNU 64-bit format */
+ memcpy(buff + AR_name_offset, "/SYM64/", 7);
+ goto stat;
+ }
if (strcmp(pathname, "__.SYMDEF") == 0) {
/* Entry is archive symbol table in BSD format */
memcpy(buff + AR_name_offset, "__.SYMDEF", 9);
Index: usr.bin/ar/ar.h
===================================================================
--- usr.bin/ar/ar.h
+++ usr.bin/ar/ar.h
@@ -100,9 +100,11 @@
/*
* Fields for the archive symbol table.
*/
- uint32_t s_cnt; /* current number of symbols. */
- uint32_t *s_so; /* symbol offset table. */
+ uint64_t s_cnt; /* current number of symbols. */
+ uint64_t *s_so; /* symbol offset table. */
+ uint64_t s_so_max; /* Maximum symbol offset (for determining which ar format to use)*/
size_t s_so_cap; /* capacity of so table buffer. */
+
char *s_sn; /* symbol name table */
size_t s_sn_cap; /* capacity of sn table buffer. */
size_t s_sn_sz; /* current size of sn table. */
Index: usr.bin/ar/read.c
===================================================================
--- usr.bin/ar/read.c
+++ usr.bin/ar/read.c
@@ -109,7 +109,8 @@
break;
/* Skip pseudo members. */
- if (strcmp(name, "/") == 0 || strcmp(name, "//") == 0)
+ if (strcmp(name, "/") == 0 || strcmp(name, "/SYM64/") == 0 ||
+ strcmp(name, "//") == 0)
continue;
if (bsdar->argc > 0) {
Index: usr.bin/ar/write.c
===================================================================
--- usr.bin/ar/write.c
+++ usr.bin/ar/write.c
@@ -50,7 +50,7 @@
#define _ARMAG_LEN 8 /* length of ar magic string */
#define _ARHDR_LEN 60 /* length of ar header */
#define _INIT_AS_CAP 128 /* initial archive string table size */
-#define _INIT_SYMOFF_CAP (256*(sizeof(uint32_t))) /* initial so table size */
+#define _INIT_SYMOFF_CAP (256*(sizeof(uint64_t))) /* initial so table size */
#define _INIT_SYMNAME_CAP 1024 /* initial sn table size */
#define _MAXNAMELEN_SVR4 15 /* max member name length in svr4 variant */
#define _TRUNCATE_LEN 15 /* number of bytes to keep for member name */
@@ -557,6 +557,7 @@
free(bsdar->s_sn);
bsdar->as = NULL;
bsdar->s_so = NULL;
+ bsdar->s_so_max = 0;
bsdar->s_sn = NULL;
}
@@ -613,7 +614,9 @@
struct archive_entry *entry;
size_t s_sz; /* size of archive symbol table. */
size_t pm_sz; /* size of pseudo members */
- int i, nr;
+ size_t w_sz; /* size of words in symbol table */
+ uint64_t nr;
+ int i;
if (elf_version(EV_CURRENT) == EV_NONE)
bsdar_errc(bsdar, EX_SOFTWARE, 0,
@@ -628,9 +631,6 @@
if (strlen(obj->name) > _MAXNAMELEN_SVR4)
add_to_ar_str_table(bsdar, obj->name);
bsdar->rela_off += _ARHDR_LEN + obj->size + obj->size % 2;
- if (bsdar->rela_off > UINT32_MAX)
- bsdar_errc(bsdar, EX_SOFTWARE, 0,
- "Symbol table offset overflow");
}
/*
@@ -657,17 +657,29 @@
* absolute_offset = htobe32(relative_offset + size_of_pseudo_members)
*/
+ w_sz = sizeof(uint32_t);
+ if (bsdar->s_so_max > UINT32_MAX)
+ w_sz = sizeof(uint64_t);
if (bsdar->s_cnt != 0) {
s_sz = (bsdar->s_cnt + 1) * sizeof(uint32_t) + bsdar->s_sn_sz;
pm_sz = _ARMAG_LEN + (_ARHDR_LEN + s_sz);
if (bsdar->as != NULL)
pm_sz += _ARHDR_LEN + bsdar->as_sz;
+ /* Use the 64-bit word size format if necessary. */
+ if (bsdar->s_so_max > UINT32_MAX - pm_sz) {
+ w_sz = sizeof(uint64_t);
+ pm_sz -= s_sz;
+ s_sz = (bsdar->s_cnt + 1) * sizeof(uint64_t) + bsdar->s_sn_sz;
+ pm_sz += s_sz;
+ }
+
for (i = 0; (size_t)i < bsdar->s_cnt; i++) {
- if (*(bsdar->s_so + i) > UINT32_MAX - pm_sz)
- bsdar_errc(bsdar, EX_SOFTWARE, 0,
- "Symbol table offset overflow");
- *(bsdar->s_so + i) = htobe32(*(bsdar->s_so + i) +
- pm_sz);
+ if (w_sz == sizeof(uint32_t))
+ *(bsdar->s_so + i) = (uint64_t)htobe32((uint32_t)(*(bsdar->s_so + i)) +
+ pm_sz);
+ else
+ *(bsdar->s_so + i) = htobe64(*(bsdar->s_so + i) +
+ pm_sz);
}
}
@@ -689,16 +701,27 @@
if (entry == NULL)
bsdar_errc(bsdar, EX_SOFTWARE, 0,
"archive_entry_new failed");
- archive_entry_copy_pathname(entry, "/");
+ if (w_sz == sizeof(uint64_t))
+ archive_entry_copy_pathname(entry, "/SYM64/");
+ else
+ archive_entry_copy_pathname(entry, "/");
if ((bsdar->options & AR_D) == 0)
archive_entry_set_mtime(entry, time(NULL), 0);
archive_entry_set_size(entry, (bsdar->s_cnt + 1) *
- sizeof(uint32_t) + bsdar->s_sn_sz);
+ w_sz + bsdar->s_sn_sz);
AC(archive_write_header(a, entry));
- nr = htobe32(bsdar->s_cnt);
- write_data(bsdar, a, &nr, sizeof(uint32_t));
- write_data(bsdar, a, bsdar->s_so, sizeof(uint32_t) *
- bsdar->s_cnt);
+ if(w_sz == sizeof(uint32_t))
+ nr = (uint64_t)htobe32((uint32_t)bsdar->s_cnt);
+ else
+ nr = htobe64(bsdar->s_cnt);
+ write_data(bsdar, a, &nr, w_sz);
+ if(w_sz == sizeof(uint64_t))
+ write_data(bsdar, a, bsdar->s_so, sizeof(uint64_t) *
+ bsdar->s_cnt);
+ else
+ for (i = 0; (size_t)i < bsdar->s_cnt; i++)
+ write_data(bsdar, a, (uint32_t *)&bsdar->s_so[i],
+ sizeof(uint32_t));
write_data(bsdar, a, bsdar->s_sn, bsdar->s_sn_sz);
archive_entry_free(entry);
}
@@ -904,13 +927,14 @@
bsdar->s_sn_sz = 0;
}
- if (bsdar->s_cnt * sizeof(uint32_t) >= bsdar->s_so_cap) {
+ if (bsdar->s_cnt * sizeof(uint64_t) >= bsdar->s_so_cap) {
bsdar->s_so_cap *= 2;
bsdar->s_so = realloc(bsdar->s_so, bsdar->s_so_cap);
if (bsdar->s_so == NULL)
bsdar_errc(bsdar, EX_SOFTWARE, errno, "realloc failed");
}
- bsdar->s_so[bsdar->s_cnt] = bsdar->rela_off;
+ bsdar->s_so[bsdar->s_cnt] = (uint64_t)bsdar->rela_off;
+ bsdar->s_so_max = (uint64_t)bsdar->rela_off > bsdar->s_so_max ? (uint64_t)bsdar->rela_off : bsdar->s_so_max;
bsdar->s_cnt++;
/*
Index: usr.sbin/freebsd-update/freebsd-update.sh
===================================================================
--- usr.sbin/freebsd-update/freebsd-update.sh
+++ usr.sbin/freebsd-update/freebsd-update.sh
@@ -670,26 +670,31 @@
# Disallow upgrade from a version that is not a release
case ${RELNUM} in
- *-RELEASE | *-ALPHA* | *-BETA* | *-RC*)
- ;;
- *)
- echo -n "`basename $0`: "
- cat <<- EOF
- Cannot upgrade from a version that is not a release
- (including alpha, beta and release candidates)
- using `basename $0`. Instead, FreeBSD can be directly
- upgraded by source or upgraded to a RELEASE/RELENG version
- prior to running `basename $0`.
- Currently running: ${RELNUM}
- EOF
- exit 1
- ;;
+ *-RELEASE | *-ALPHA* | *-BETA* | *-RC*)
+ ;;
+ *)
+ echo -n "`basename $0`: "
+ cat <<- EOF
+ Cannot upgrade from a version that is not a release
+ (including alpha, beta and release candidates)
+ using `basename $0`. Instead, FreeBSD can be directly
+ upgraded by source or upgraded to a RELEASE/RELENG version
+ prior to running `basename $0`.
+ Currently running: ${RELNUM}
+ EOF
+ exit 1
+ ;;
esac
# Figure out what directory contains the running kernel
BOOTFILE=`sysctl -n kern.bootfile`
KERNELDIR=${BOOTFILE%/kernel}
- if ! [ -d ${KERNELDIR} ]; then
+ # With old kernels, "/kernel" may be returned by sysctl.
+ # In this case, assume the default location.
+ KERNELDIR=${KERNELDIR:-/boot/kernel}
+
+ if ! [ -d ${KERNELDIR} ] ||
+ ! [ -f ${KERNELDIR}/${BOOTFILE} ]; then
echo "Cannot identify running kernel"
exit 1
fi
@@ -831,7 +836,12 @@
# Figure out what directory contains the running kernel
BOOTFILE=`sysctl -n kern.bootfile`
KERNELDIR=${BOOTFILE%/kernel}
- if ! [ -d ${KERNELDIR} ]; then
+ # With old kernels, "/kernel" may be returned by sysctl.
+ # In this case, assume the default location.
+ KERNELDIR=${KERNELDIR:-/boot/kernel}
+
+ if ! [ -d ${KERNELDIR} ] ||
+ ! [ -f ${KERNELDIR}/${BOOTFILE} ]; then
echo "Cannot identify running kernel"
exit 1
fi
@@ -925,7 +935,12 @@
# Figure out what directory contains the running kernel
BOOTFILE=`sysctl -n kern.bootfile`
KERNELDIR=${BOOTFILE%/kernel}
- if ! [ -d ${KERNELDIR} ]; then
+ # With old kernels, "/kernel" may be returned by sysctl.
+ # In this case, assume the default location.
+ KERNELDIR=${KERNELDIR:-/boot/kernel}
+
+ if ! [ -d ${KERNELDIR} ] ||
+ ! [ -f ${KERNELDIR}/${BOOTFILE} ]; then
echo "Cannot identify running kernel"
exit 1
fi
@@ -1022,7 +1037,16 @@
# Have we run out of mirrors?
if [ `wc -l < serverlist` -eq 0 ]; then
- echo "No mirrors remaining, giving up."
+ cat <<- EOF
+ No mirrors remaining, giving up.
+
+ This may be because upgrading from this platform (${ARCH})
+ or release (${RELNUM}) is unsupported by `basename $0`. Only
+ platforms with Tier 1 support can be upgraded by `basename $0`.
+ See https://www.freebsd.org/platforms/index.html for more info.
+
+ If unsupported, FreeBSD must be upgraded by source.
+ EOF
return 1
fi
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Aug 6, 3:46 AM (3 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36071164
Default Alt Text
D18933.id56303.diff (9 KB)
Attached To
Mode
D18933: Ensure kernel.bootfile is a real file
Attached
Detach File
Event Timeline
Log In to Comment