Skip to content

Commit 4457d79

Browse files
vathpelamartinezjavier
authored andcommitted
More va_* work
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 <[email protected]>
1 parent 3c00db3 commit 4457d79

File tree

14 files changed

+132
-86
lines changed

14 files changed

+132
-86
lines changed

Cryptlib/Include/OpenSslSupport.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ size_t fwrite (const void *, size_t, size_t, FILE *);
227227
char *fgets (char *, int, FILE *);
228228
int fputs (const char *, FILE *);
229229
int fprintf (FILE *, const char *, ...);
230-
int vfprintf (FILE *, const char *, va_list);
230+
int vfprintf (FILE *, const char *, ms_va_list);
231231
int fflush (FILE *);
232232
int fclose (FILE *);
233233
DIR *opendir (const char *);

Cryptlib/Include/openssl/bio.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -794,11 +794,11 @@ void BIO_copy_next_retry(BIO *b);
794794
# endif
795795
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
796796
__bio_h__attr__((__format__(__printf__, 2, 3)));
797-
int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
797+
int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
798798
__bio_h__attr__((__format__(__printf__, 2, 0)));
799799
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
800800
__bio_h__attr__((__format__(__printf__, 3, 4)));
801-
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
801+
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
802802
__bio_h__attr__((__format__(__printf__, 3, 0)));
803803
# undef __bio_h__attr__
804804

Cryptlib/Include/openssl/err.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ void ERR_print_errors_fp(FILE *fp);
345345
void ERR_print_errors(BIO *bp);
346346
# endif
347347
void EFIAPI ERR_add_error_data(int num, ...);
348-
void EFIAPI ERR_add_error_vdata(int num, va_list args);
348+
void EFIAPI ERR_add_error_vdata(int num, ms_va_list args);
349349
void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
350350
void ERR_unload_strings(int lib, ERR_STRING_DATA str[]);
351351
void ERR_load_ERR_strings(void);

Cryptlib/OpenSSL/crypto/bio/b_print.c

+33-33
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static int fmtfp(char **, char **, size_t *, size_t *,
136136
static int doapr_outch(char **, char **, size_t *, size_t *, int);
137137
static int EFIAPI _dopr(char **sbuffer, char **buffer,
138138
size_t *maxlen, size_t *retlen, int *truncated,
139-
const char *format, va_list args);
139+
const char *format, ms_va_list args);
140140

141141
/* format read states */
142142
#define DP_S_DEFAULT 0
@@ -171,7 +171,7 @@ static int EFIAPI
171171
_dopr(char **sbuffer,
172172
char **buffer,
173173
size_t *maxlen,
174-
size_t *retlen, int *truncated, const char *format, va_list args)
174+
size_t *retlen, int *truncated, const char *format, ms_va_list args)
175175
{
176176
char ch;
177177
LLONG value;
@@ -236,7 +236,7 @@ _dopr(char **sbuffer,
236236
min = 10 * min + char_to_int(ch);
237237
ch = *format++;
238238
} else if (ch == '*') {
239-
min = va_arg(args, int);
239+
min = ms_va_arg(args, int);
240240
ch = *format++;
241241
state = DP_S_DOT;
242242
} else
@@ -256,7 +256,7 @@ _dopr(char **sbuffer,
256256
max = 10 * max + char_to_int(ch);
257257
ch = *format++;
258258
} else if (ch == '*') {
259-
max = va_arg(args, int);
259+
max = ms_va_arg(args, int);
260260
ch = *format++;
261261
state = DP_S_MOD;
262262
} else
@@ -297,16 +297,16 @@ _dopr(char **sbuffer,
297297
case 'i':
298298
switch (cflags) {
299299
case DP_C_SHORT:
300-
value = (short int)va_arg(args, int);
300+
value = (short int)ms_va_arg(args, int);
301301
break;
302302
case DP_C_LONG:
303-
value = va_arg(args, long int);
303+
value = ms_va_arg(args, long int);
304304
break;
305305
case DP_C_LLONG:
306-
value = va_arg(args, LLONG);
306+
value = ms_va_arg(args, LLONG);
307307
break;
308308
default:
309-
value = va_arg(args, int);
309+
value = ms_va_arg(args, int);
310310
break;
311311
}
312312
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10, min,
@@ -322,16 +322,16 @@ _dopr(char **sbuffer,
322322
flags |= DP_F_UNSIGNED;
323323
switch (cflags) {
324324
case DP_C_SHORT:
325-
value = (unsigned short int)va_arg(args, unsigned int);
325+
value = (unsigned short int)ms_va_arg(args, unsigned int);
326326
break;
327327
case DP_C_LONG:
328-
value = (LLONG) va_arg(args, unsigned long int);
328+
value = (LLONG) ms_va_arg(args, unsigned long int);
329329
break;
330330
case DP_C_LLONG:
331-
value = va_arg(args, unsigned LLONG);
331+
value = ms_va_arg(args, unsigned LLONG);
332332
break;
333333
default:
334-
value = (LLONG) va_arg(args, unsigned int);
334+
value = (LLONG) ms_va_arg(args, unsigned int);
335335
break;
336336
}
337337
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value,
@@ -342,9 +342,9 @@ _dopr(char **sbuffer,
342342
#ifndef OPENSSL_SYS_UEFI
343343
case 'f':
344344
if (cflags == DP_C_LDOUBLE)
345-
fvalue = va_arg(args, LDOUBLE);
345+
fvalue = ms_va_arg(args, LDOUBLE);
346346
else
347-
fvalue = va_arg(args, double);
347+
fvalue = ms_va_arg(args, double);
348348
if (!fmtfp(sbuffer, buffer, &currlen, maxlen, fvalue, min, max,
349349
flags))
350350
return 0;
@@ -353,26 +353,26 @@ _dopr(char **sbuffer,
353353
flags |= DP_F_UP;
354354
case 'e':
355355
if (cflags == DP_C_LDOUBLE)
356-
fvalue = va_arg(args, LDOUBLE);
356+
fvalue = ms_va_arg(args, LDOUBLE);
357357
else
358-
fvalue = va_arg(args, double);
358+
fvalue = ms_va_arg(args, double);
359359
break;
360360
case 'G':
361361
flags |= DP_F_UP;
362362
case 'g':
363363
if (cflags == DP_C_LDOUBLE)
364-
fvalue = va_arg(args, LDOUBLE);
364+
fvalue = ms_va_arg(args, LDOUBLE);
365365
else
366-
fvalue = va_arg(args, double);
366+
fvalue = ms_va_arg(args, double);
367367
break;
368368
#endif
369369
case 'c':
370370
if(!doapr_outch(sbuffer, buffer, &currlen, maxlen,
371-
va_arg(args, int)))
371+
ms_va_arg(args, int)))
372372
return 0;
373373
break;
374374
case 's':
375-
strvalue = va_arg(args, char *);
375+
strvalue = ms_va_arg(args, char *);
376376
if (max < 0) {
377377
if (buffer)
378378
max = INT_MAX;
@@ -384,27 +384,27 @@ _dopr(char **sbuffer,
384384
return 0;
385385
break;
386386
case 'p':
387-
value = (long)va_arg(args, void *);
387+
value = (long)ms_va_arg(args, void *);
388388
if (!fmtint(sbuffer, buffer, &currlen, maxlen,
389389
value, 16, min, max, flags | DP_F_NUM))
390390
return 0;
391391
break;
392392
case 'n': /* XXX */
393393
if (cflags == DP_C_SHORT) {
394394
short int *num;
395-
num = va_arg(args, short int *);
395+
num = ms_va_arg(args, short int *);
396396
*num = currlen;
397397
} else if (cflags == DP_C_LONG) { /* XXX */
398398
long int *num;
399-
num = va_arg(args, long int *);
399+
num = ms_va_arg(args, long int *);
400400
*num = (long int)currlen;
401401
} else if (cflags == DP_C_LLONG) { /* XXX */
402402
LLONG *num;
403-
num = va_arg(args, LLONG *);
403+
num = ms_va_arg(args, LLONG *);
404404
*num = (LLONG) currlen;
405405
} else {
406406
int *num;
407-
num = va_arg(args, int *);
407+
num = ms_va_arg(args, int *);
408408
*num = currlen;
409409
}
410410
break;
@@ -799,18 +799,18 @@ doapr_outch(char **sbuffer,
799799

800800
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
801801
{
802-
va_list args;
802+
ms_va_list args;
803803
int ret;
804804

805-
va_start(args, format);
805+
ms_va_start(args, format);
806806

807807
ret = BIO_vprintf(bio, format, args);
808808

809-
va_end(args);
809+
ms_va_end(args);
810810
return (ret);
811811
}
812812

813-
int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
813+
int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
814814
{
815815
int ret;
816816
size_t retlen;
@@ -847,18 +847,18 @@ int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
847847
*/
848848
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
849849
{
850-
va_list args;
850+
ms_va_list args;
851851
int ret;
852852

853-
va_start(args, format);
853+
ms_va_start(args, format);
854854

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

857-
va_end(args);
857+
ms_va_end(args);
858858
return (ret);
859859
}
860860

861-
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
861+
int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
862862
{
863863
size_t retlen;
864864
int truncated;

Cryptlib/OpenSSL/crypto/err/err.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -1077,13 +1077,13 @@ void ERR_set_error_data(char *data, int flags)
10771077

10781078
void EFIAPI ERR_add_error_data(int num, ...)
10791079
{
1080-
va_list args;
1081-
va_start(args, num);
1080+
ms_va_list args;
1081+
ms_va_start(args, num);
10821082
ERR_add_error_vdata(num, args);
1083-
va_end(args);
1083+
ms_va_end(args);
10841084
}
10851085

1086-
void EFIAPI ERR_add_error_vdata(int num, va_list args)
1086+
void EFIAPI ERR_add_error_vdata(int num, ms_va_list args)
10871087
{
10881088
int i, n, s;
10891089
char *str, *p, *a;
@@ -1096,7 +1096,7 @@ void EFIAPI ERR_add_error_vdata(int num, va_list args)
10961096

10971097
n = 0;
10981098
for (i = 0; i < num; i++) {
1099-
a = va_arg(args, char *);
1099+
a = ms_va_arg(args, char *);
11001100
/* ignore NULLs, thanks to Bob Beck <[email protected]> */
11011101
if (a != NULL) {
11021102
n += strlen(a);

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ MokManager.o: $(MOK_SOURCES)
136136
$(MMSONAME): $(MOK_OBJS) $(LIBS)
137137
$(LD) -o $@ $(LDFLAGS) $^ $(EFI_LIBS) lib/lib.a
138138

139+
gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a: CFLAGS+=-DGNU_EFI_USE_EXTERNAL_STDARG
139140
gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a:
140141
$(MAKE) -C gnu-efi \
141142
ARCH=$(ARCH_GNUEFI) TOPDIR=$(TOPDIR)/gnu-efi \

errlog.c

+11-11
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,25 @@ static UINTN nerrs = 0;
1111

1212
EFI_STATUS EFIAPI
1313
vdprint_(const CHAR16 *fmt, const char *file, int line, const char *func,
14-
va_list args)
14+
ms_va_list args)
1515
{
16-
va_list args2;
16+
ms_va_list args2;
1717
EFI_STATUS efi_status = EFI_SUCCESS;
1818

1919
if (verbose) {
20-
va_copy(args2, args);
20+
ms_va_copy(args2, args);
2121
console_print(L"%a:%d:%a() ", file, line, func);
2222
efi_status = VPrint(fmt, args2);
23-
va_end(args2);
23+
ms_va_end(args2);
2424
}
2525
return efi_status;
2626
}
2727

2828
EFI_STATUS EFIAPI
2929
VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
30-
va_list args)
30+
ms_va_list args)
3131
{
32-
va_list args2;
32+
ms_va_list args2;
3333
CHAR16 **newerrs;
3434

3535
newerrs = ReallocatePool(errs, (nerrs + 1) * sizeof(*errs),
@@ -40,11 +40,11 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
4040
newerrs[nerrs] = PoolPrint(L"%a:%d %a() ", file, line, func);
4141
if (!newerrs[nerrs])
4242
return EFI_OUT_OF_RESOURCES;
43-
va_copy(args2, args);
43+
ms_va_copy(args2, args);
4444
newerrs[nerrs+1] = VPoolPrint(fmt, args2);
4545
if (!newerrs[nerrs+1])
4646
return EFI_OUT_OF_RESOURCES;
47-
va_end(args2);
47+
ms_va_end(args2);
4848

4949
nerrs += 2;
5050
newerrs[nerrs] = NULL;
@@ -56,12 +56,12 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
5656
EFI_STATUS EFIAPI
5757
LogError_(const char *file, int line, const char *func, const CHAR16 *fmt, ...)
5858
{
59-
va_list args;
59+
ms_va_list args;
6060
EFI_STATUS efi_status;
6161

62-
va_start(args, fmt);
62+
ms_va_start(args, fmt);
6363
efi_status = VLogError(file, line, func, fmt, args);
64-
va_end(args);
64+
ms_va_end(args);
6565

6666
return efi_status;
6767
}

include/console.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ extern UINT32 verbose;
108108
#endif
109109

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

include/hexdump.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ prepare_text(const void *data, size_t size, char *buf, unsigned int position)
8181
*/
8282
static inline void UNUSED EFIAPI
8383
vhexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
84-
const void *data, unsigned long size, size_t at, va_list ap)
84+
const void *data, unsigned long size, size_t at, ms_va_list ap)
8585
{
8686
unsigned long display_offset = at;
8787
unsigned long offset = 0;
@@ -118,11 +118,11 @@ static inline void UNUSED EFIAPI
118118
hexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
119119
const void *data, unsigned long size, size_t at, ...)
120120
{
121-
va_list ap;
121+
ms_va_list ap;
122122

123-
va_start(ap, at);
123+
ms_va_start(ap, at);
124124
vhexdumpf(file, line, func, fmt, data, size, at, ap);
125-
va_end(ap);
125+
ms_va_end(ap);
126126
}
127127

128128
static inline void UNUSED

include/system/efistdarg.h

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
#ifndef _EFISTDARG_H_
99
#define _EFISTDARG_H_
1010

11+
#ifndef GNU_EFI_USE_EXTERNAL_STDARG
12+
#define GNU_EFI_USE_EXTERNAL_STDARG
13+
#endif
14+
1115
#include <stdarg.h>
1216

1317
#endif /* !_EFISTDARG_H_ */

0 commit comments

Comments
 (0)