git: f2b5999b2166 - stable/13 - elfctl: allow features to be specified by value

Ed Maste emaste at FreeBSD.org
Wed Jan 27 00:26:03 UTC 2021


The branch stable/13 has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=f2b5999b2166579a2ebd4b5e117a17574f18d50f

commit f2b5999b2166579a2ebd4b5e117a17574f18d50f
Author:     Ed Maste <emaste at FreeBSD.org>
AuthorDate: 2021-01-22 17:22:35 +0000
Commit:     Ed Maste <emaste at FreeBSD.org>
CommitDate: 2021-01-26 14:44:12 +0000

    elfctl: allow features to be specified by value
    
    This will allow elfctl on older releases to set bits that are not yet
    known there, so that the binary will have the correct settings applied
    if run on a later FreeBSD version.
    
    PR:             252629 (related)
    Suggested by:   kib
    Reviewed by:    gbe (manpage, earlier), kib
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D28284
    
    (cherry picked from commit 86f33b5fcf6087bf4439881011b920ff99e6e300)
    
    elfctl: fix typo from last-minute refactoring
    
    Reported by:    jkim
    
    (cherry picked from commit f302fd1aa6730facd53a3f761e0a57302731b03e)
    
    elfctl: Fix type errors.
    
    Target value for val has uint32_t type, not uint, adjust used constant.
    Change val type to unsigned so that left and right sides of comparision
    operator do not expose different signed types of same range [*].
    
    Switch to unsigned long long and strtoll(3) so that 0x80000000 is
    accepted by conversion function [**].
    
    Reported by:    kargl [*]
    Noted by:       emaste [**]
    Reviewed by:    emaste
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D28301
    
    (cherry picked from commit 9940ac808de7b7d4ed0408c3e739f667dca06d3b)
---
 usr.bin/elfctl/elfctl.1 | 15 +++++++++++++--
 usr.bin/elfctl/elfctl.c | 26 +++++++++++++++++++++++---
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/usr.bin/elfctl/elfctl.1 b/usr.bin/elfctl/elfctl.1
index f93b558fdf0d..23e2dabea49c 100644
--- a/usr.bin/elfctl/elfctl.1
+++ b/usr.bin/elfctl/elfctl.1
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 12, 2021
+.Dd January 22, 2021
 .Dt ELFCTL 1
 .Os
 .Sh NAME
@@ -64,7 +64,8 @@ to turn on the features,
 to turn off the features,
 .Dq Li =
 to only turn on the given features.
-A comma separated list of feature names follows the operation.
+A comma separated list of feature names or numeric values follows the
+operation.
 .El
 .Pp
 If
@@ -86,6 +87,16 @@ command:
 elfctl file
 elfctl -e +aslr file
 .Ed
+.Pp
+Features may be specified as numerical values:
+.Bd -literal -offset -indent
+elfctl -e =0x0001,0x0004 file
+.Ed
+.Pp
+Features may also be specified as a single combined value:
+.Bd -literal -offset -indent
+elfctl -e =0x5 file
+.Ed
 .Sh HISTORY
 .Nm
 first appeared in
diff --git a/usr.bin/elfctl/elfctl.c b/usr.bin/elfctl/elfctl.c
index 20a2c5b95444..bcdd1be394a9 100644
--- a/usr.bin/elfctl/elfctl.c
+++ b/usr.bin/elfctl/elfctl.c
@@ -33,12 +33,15 @@
 #include <sys/endian.h>
 #include <sys/stat.h>
 
+#include <ctype.h>
 #include <err.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <gelf.h>
 #include <getopt.h>
 #include <libelf.h>
 #include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -245,9 +248,26 @@ convert_to_feature_val(char *feature_str, uint32_t *feature_val)
 			}
 		}
 		if (i == len) {
-			warnx("%s is not a valid feature", feature);
-			if (!iflag)
-				return (false);
+			if (isdigit(feature[0])) {
+				char *eptr;
+				unsigned long long val;
+
+				errno = 0;
+				val = strtoll(feature, &eptr, 0);
+				if (eptr == feature || *eptr != '\0')
+					errno = EINVAL;
+				else if (val > UINT32_MAX)
+					errno = ERANGE;
+				if (errno != 0) {
+					warn("%s invalid", feature);
+					return (false);
+				}
+				input |= val;
+			} else {
+				warnx("%s is not a valid feature", feature);
+				if (!iflag)
+					return (false);
+			}
 		}
 	}
 


More information about the dev-commits-src-all mailing list