Skip to content

Commit

Permalink
More va_* work
Browse files Browse the repository at this point in the history
Be much more explicit about exactly which va_* stuff comes from which
ABI in both shim and gnu-efi.  This fixes the problem where we see:

| (null):0:(null)() v->name:"(null)" v->rtname:"(null)"
| (null):0:(null)() v->data_size:0 v->data:0x0

and similar messages where everything is NULL.

Signed-off-by: Peter Jones <pjones@redhat.com>
  • Loading branch information
vathpela authored and martinezjavier committed Mar 12, 2021
1 parent 3c00db3 commit 4457d79
Show file tree
Hide file tree
Showing 14 changed files with 132 additions and 86 deletions.
2 changes: 1 addition & 1 deletion Cryptlib/Include/OpenSslSupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ size_t fwrite (const void *, size_t, size_t, FILE *);
char *fgets (char *, int, FILE *);
int fputs (const char *, FILE *);
int fprintf (FILE *, const char *, ...);
int vfprintf (FILE *, const char *, va_list);
int vfprintf (FILE *, const char *, ms_va_list);
int fflush (FILE *);
int fclose (FILE *);
DIR *opendir (const char *);
Expand Down
4 changes: 2 additions & 2 deletions Cryptlib/Include/openssl/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -794,11 +794,11 @@ void BIO_copy_next_retry(BIO *b);
# endif
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
__bio_h__attr__((__format__(__printf__, 2, 3)));
int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
__bio_h__attr__((__format__(__printf__, 2, 0)));
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
__bio_h__attr__((__format__(__printf__, 3, 4)));
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
__bio_h__attr__((__format__(__printf__, 3, 0)));
# undef __bio_h__attr__

Expand Down
2 changes: 1 addition & 1 deletion Cryptlib/Include/openssl/err.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ void ERR_print_errors_fp(FILE *fp);
void ERR_print_errors(BIO *bp);
# endif
void EFIAPI ERR_add_error_data(int num, ...);
void EFIAPI ERR_add_error_vdata(int num, va_list args);
void EFIAPI ERR_add_error_vdata(int num, ms_va_list args);
void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
void ERR_unload_strings(int lib, ERR_STRING_DATA str[]);
void ERR_load_ERR_strings(void);
Expand Down
66 changes: 33 additions & 33 deletions Cryptlib/OpenSSL/crypto/bio/b_print.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ static int fmtfp(char **, char **, size_t *, size_t *,
static int doapr_outch(char **, char **, size_t *, size_t *, int);
static int EFIAPI _dopr(char **sbuffer, char **buffer,
size_t *maxlen, size_t *retlen, int *truncated,
const char *format, va_list args);
const char *format, ms_va_list args);

/* format read states */
#define DP_S_DEFAULT 0
Expand Down Expand Up @@ -171,7 +171,7 @@ static int EFIAPI
_dopr(char **sbuffer,
char **buffer,
size_t *maxlen,
size_t *retlen, int *truncated, const char *format, va_list args)
size_t *retlen, int *truncated, const char *format, ms_va_list args)
{
char ch;
LLONG value;
Expand Down Expand Up @@ -236,7 +236,7 @@ _dopr(char **sbuffer,
min = 10 * min + char_to_int(ch);
ch = *format++;
} else if (ch == '*') {
min = va_arg(args, int);
min = ms_va_arg(args, int);
ch = *format++;
state = DP_S_DOT;
} else
Expand All @@ -256,7 +256,7 @@ _dopr(char **sbuffer,
max = 10 * max + char_to_int(ch);
ch = *format++;
} else if (ch == '*') {
max = va_arg(args, int);
max = ms_va_arg(args, int);
ch = *format++;
state = DP_S_MOD;
} else
Expand Down Expand Up @@ -297,16 +297,16 @@ _dopr(char **sbuffer,
case 'i':
switch (cflags) {
case DP_C_SHORT:
value = (short int)va_arg(args, int);
value = (short int)ms_va_arg(args, int);
break;
case DP_C_LONG:
value = va_arg(args, long int);
value = ms_va_arg(args, long int);
break;
case DP_C_LLONG:
value = va_arg(args, LLONG);
value = ms_va_arg(args, LLONG);
break;
default:
value = va_arg(args, int);
value = ms_va_arg(args, int);
break;
}
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10, min,
Expand All @@ -322,16 +322,16 @@ _dopr(char **sbuffer,
flags |= DP_F_UNSIGNED;
switch (cflags) {
case DP_C_SHORT:
value = (unsigned short int)va_arg(args, unsigned int);
value = (unsigned short int)ms_va_arg(args, unsigned int);
break;
case DP_C_LONG:
value = (LLONG) va_arg(args, unsigned long int);
value = (LLONG) ms_va_arg(args, unsigned long int);
break;
case DP_C_LLONG:
value = va_arg(args, unsigned LLONG);
value = ms_va_arg(args, unsigned LLONG);
break;
default:
value = (LLONG) va_arg(args, unsigned int);
value = (LLONG) ms_va_arg(args, unsigned int);
break;
}
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value,
Expand All @@ -342,9 +342,9 @@ _dopr(char **sbuffer,
#ifndef OPENSSL_SYS_UEFI
case 'f':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg(args, LDOUBLE);
fvalue = ms_va_arg(args, LDOUBLE);
else
fvalue = va_arg(args, double);
fvalue = ms_va_arg(args, double);
if (!fmtfp(sbuffer, buffer, &currlen, maxlen, fvalue, min, max,
flags))
return 0;
Expand All @@ -353,26 +353,26 @@ _dopr(char **sbuffer,
flags |= DP_F_UP;
case 'e':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg(args, LDOUBLE);
fvalue = ms_va_arg(args, LDOUBLE);
else
fvalue = va_arg(args, double);
fvalue = ms_va_arg(args, double);
break;
case 'G':
flags |= DP_F_UP;
case 'g':
if (cflags == DP_C_LDOUBLE)
fvalue = va_arg(args, LDOUBLE);
fvalue = ms_va_arg(args, LDOUBLE);
else
fvalue = va_arg(args, double);
fvalue = ms_va_arg(args, double);
break;
#endif
case 'c':
if(!doapr_outch(sbuffer, buffer, &currlen, maxlen,
va_arg(args, int)))
ms_va_arg(args, int)))
return 0;
break;
case 's':
strvalue = va_arg(args, char *);
strvalue = ms_va_arg(args, char *);
if (max < 0) {
if (buffer)
max = INT_MAX;
Expand All @@ -384,27 +384,27 @@ _dopr(char **sbuffer,
return 0;
break;
case 'p':
value = (long)va_arg(args, void *);
value = (long)ms_va_arg(args, void *);
if (!fmtint(sbuffer, buffer, &currlen, maxlen,
value, 16, min, max, flags | DP_F_NUM))
return 0;
break;
case 'n': /* XXX */
if (cflags == DP_C_SHORT) {
short int *num;
num = va_arg(args, short int *);
num = ms_va_arg(args, short int *);
*num = currlen;
} else if (cflags == DP_C_LONG) { /* XXX */
long int *num;
num = va_arg(args, long int *);
num = ms_va_arg(args, long int *);
*num = (long int)currlen;
} else if (cflags == DP_C_LLONG) { /* XXX */
LLONG *num;
num = va_arg(args, LLONG *);
num = ms_va_arg(args, LLONG *);
*num = (LLONG) currlen;
} else {
int *num;
num = va_arg(args, int *);
num = ms_va_arg(args, int *);
*num = currlen;
}
break;
Expand Down Expand Up @@ -799,18 +799,18 @@ doapr_outch(char **sbuffer,

int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
{
va_list args;
ms_va_list args;
int ret;

va_start(args, format);
ms_va_start(args, format);

ret = BIO_vprintf(bio, format, args);

va_end(args);
ms_va_end(args);
return (ret);
}

int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
{
int ret;
size_t retlen;
Expand Down Expand Up @@ -847,18 +847,18 @@ int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
*/
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
{
va_list args;
ms_va_list args;
int ret;

va_start(args, format);
ms_va_start(args, format);

ret = BIO_vsnprintf(buf, n, format, args);

va_end(args);
ms_va_end(args);
return (ret);
}

int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
{
size_t retlen;
int truncated;
Expand Down
10 changes: 5 additions & 5 deletions Cryptlib/OpenSSL/crypto/err/err.c
Original file line number Diff line number Diff line change
Expand Up @@ -1077,13 +1077,13 @@ void ERR_set_error_data(char *data, int flags)

void EFIAPI ERR_add_error_data(int num, ...)
{
va_list args;
va_start(args, num);
ms_va_list args;
ms_va_start(args, num);
ERR_add_error_vdata(num, args);
va_end(args);
ms_va_end(args);
}

void EFIAPI ERR_add_error_vdata(int num, va_list args)
void EFIAPI ERR_add_error_vdata(int num, ms_va_list args)
{
int i, n, s;
char *str, *p, *a;
Expand All @@ -1096,7 +1096,7 @@ void EFIAPI ERR_add_error_vdata(int num, va_list args)

n = 0;
for (i = 0; i < num; i++) {
a = va_arg(args, char *);
a = ms_va_arg(args, char *);
/* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */
if (a != NULL) {
n += strlen(a);
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ MokManager.o: $(MOK_SOURCES)
$(MMSONAME): $(MOK_OBJS) $(LIBS)
$(LD) -o $@ $(LDFLAGS) $^ $(EFI_LIBS) lib/lib.a

gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a: CFLAGS+=-DGNU_EFI_USE_EXTERNAL_STDARG
gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a:
$(MAKE) -C gnu-efi \
ARCH=$(ARCH_GNUEFI) TOPDIR=$(TOPDIR)/gnu-efi \
Expand Down
22 changes: 11 additions & 11 deletions errlog.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,25 @@ static UINTN nerrs = 0;

EFI_STATUS EFIAPI
vdprint_(const CHAR16 *fmt, const char *file, int line, const char *func,
va_list args)
ms_va_list args)
{
va_list args2;
ms_va_list args2;
EFI_STATUS efi_status = EFI_SUCCESS;

if (verbose) {
va_copy(args2, args);
ms_va_copy(args2, args);
console_print(L"%a:%d:%a() ", file, line, func);
efi_status = VPrint(fmt, args2);
va_end(args2);
ms_va_end(args2);
}
return efi_status;
}

EFI_STATUS EFIAPI
VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
va_list args)
ms_va_list args)
{
va_list args2;
ms_va_list args2;
CHAR16 **newerrs;

newerrs = ReallocatePool(errs, (nerrs + 1) * sizeof(*errs),
Expand All @@ -40,11 +40,11 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
newerrs[nerrs] = PoolPrint(L"%a:%d %a() ", file, line, func);
if (!newerrs[nerrs])
return EFI_OUT_OF_RESOURCES;
va_copy(args2, args);
ms_va_copy(args2, args);
newerrs[nerrs+1] = VPoolPrint(fmt, args2);
if (!newerrs[nerrs+1])
return EFI_OUT_OF_RESOURCES;
va_end(args2);
ms_va_end(args2);

nerrs += 2;
newerrs[nerrs] = NULL;
Expand All @@ -56,12 +56,12 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
EFI_STATUS EFIAPI
LogError_(const char *file, int line, const char *func, const CHAR16 *fmt, ...)
{
va_list args;
ms_va_list args;
EFI_STATUS efi_status;

va_start(args, fmt);
ms_va_start(args, fmt);
efi_status = VLogError(file, line, func, fmt, args);
va_end(args);
ms_va_end(args);

return efi_status;
}
Expand Down
2 changes: 1 addition & 1 deletion gnu-efi
2 changes: 1 addition & 1 deletion include/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ extern UINT32 verbose;
#endif

extern EFI_STATUS EFIAPI vdprint_(const CHAR16 *fmt, const char *file, int line,
const char *func, va_list args);
const char *func, ms_va_list args);
#define vdprint(fmt, ...) \
vdprint_(fmt, __FILE__, __LINE__ - 1, __func__, ##__VA_ARGS__)

Expand Down
8 changes: 4 additions & 4 deletions include/hexdump.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ prepare_text(const void *data, size_t size, char *buf, unsigned int position)
*/
static inline void UNUSED EFIAPI
vhexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
const void *data, unsigned long size, size_t at, va_list ap)
const void *data, unsigned long size, size_t at, ms_va_list ap)
{
unsigned long display_offset = at;
unsigned long offset = 0;
Expand Down Expand Up @@ -118,11 +118,11 @@ static inline void UNUSED EFIAPI
hexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
const void *data, unsigned long size, size_t at, ...)
{
va_list ap;
ms_va_list ap;

va_start(ap, at);
ms_va_start(ap, at);
vhexdumpf(file, line, func, fmt, data, size, at, ap);
va_end(ap);
ms_va_end(ap);
}

static inline void UNUSED
Expand Down
4 changes: 4 additions & 0 deletions include/system/efistdarg.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
#ifndef _EFISTDARG_H_
#define _EFISTDARG_H_

#ifndef GNU_EFI_USE_EXTERNAL_STDARG
#define GNU_EFI_USE_EXTERNAL_STDARG
#endif

#include <stdarg.h>

#endif /* !_EFISTDARG_H_ */
Expand Down
Loading

0 comments on commit 4457d79

Please sign in to comment.