On Wed, Sep 13, 2017 at 08:34:56PM -0600, Theo de Raadt wrote:
> > If the attribute to force it into .data isn't wanted the alternative
> > gets messy as config has a bunch of bogus types and casts and treats the
> > int values as longs.
>
> Well, I believe that messiness is a result of trying to avoid the
> consequences of the ABI. I feel the ABI shouldn't be exposed here
> and changing the compilers is wrong...
>
> The -1 handling could be pushed to the very top. At the very first
> moment anything in ukc runs, set it to 0. No conditional logic later on.
Index: mkioconf.c
===================================================================
RCS file: /cvs/src/usr.sbin/config/mkioconf.c,v
retrieving revision 1.36
diff -u -p -U4 -r1.36 mkioconf.c
--- mkioconf.c 27 Oct 2016 14:33:30 -0000 1.36
+++ mkioconf.c 14 Sep 2017 02:11:17 -0000
@@ -182,9 +182,9 @@ static long loc[%d] = {", locators.used)
#define MAXEXTRALOC 32\n\
#endif\n\
long extraloc[MAXEXTRALOC] = { -1 };\n\
int nextraloc = MAXEXTRALOC;\n\
-int uextraloc = 0;\n") < 0);
+int uextraloc = -1;\n") < 0);
}
static int nlocnames, maxlocnames = 8;
static char **locnames;
Index: ukc.c
===================================================================
RCS file: /cvs/src/usr.sbin/config/ukc.c,v
retrieving revision 1.22
diff -u -p -U4 -r1.22 ukc.c
--- ukc.c 19 Oct 2016 16:39:02 -0000 1.22
+++ ukc.c 14 Sep 2017 03:14:43 -0000
@@ -61,8 +61,9 @@ ukc(char *file, char *outfile, int uflag
kvm_t *kd;
char errbuf[_POSIX2_LINE_MAX];
int histlen = 0, ok = 1;
char history[1024], kversion[1024];
+ int *uextraloc;
if (file == NULL) {
warnx("no file specified");
usage();
@@ -71,8 +72,18 @@ ukc(char *file, char *outfile, int uflag
loadkernel(file);
if (nlist(file, nl) == -1)
errx(1, "nlist: %s", file);
+
+ /*
+ * uextraloc is initialised to -1 not 0 so it will be put in .data
+ * instead of .bss so config can modify it
+ */
+ if (nl[I_UEXTRALOC].n_type != 0) {
+ uextraloc = (int *)adjust((caddr_t)nl[I_UEXTRALOC].n_value);
+ if (*uextraloc == -1)
+ *uextraloc = 0;
+ }
if (uflag) {
if ((kd = kvm_openfiles(NULL,NULL,NULL,O_RDONLY, errbuf)) == 0)
errx(1, "kvm_openfiles: %s", errbuf);