|
@@ -19,6 +19,7 @@
|
19
|
19
|
FILE_LICENCE ( GPL2_OR_LATER );
|
20
|
20
|
|
21
|
21
|
#include <string.h>
|
|
22
|
+#include <stdlib.h>
|
22
|
23
|
#include <stdio.h>
|
23
|
24
|
#include <errno.h>
|
24
|
25
|
#include <ipxe/iobuf.h>
|
|
@@ -297,17 +298,28 @@ int xfer_deliver_raw ( struct interface *intf, const void *data, size_t len ) {
|
297
|
298
|
*/
|
298
|
299
|
int xfer_vprintf ( struct interface *intf, const char *format,
|
299
|
300
|
va_list args ) {
|
300
|
|
- size_t len;
|
301
|
301
|
va_list args_tmp;
|
|
302
|
+ char *buf;
|
|
303
|
+ int len;
|
|
304
|
+ int rc;
|
302
|
305
|
|
|
306
|
+ /* Create temporary string */
|
303
|
307
|
va_copy ( args_tmp, args );
|
304
|
|
- len = vsnprintf ( NULL, 0, format, args );
|
305
|
|
- {
|
306
|
|
- char buf[len + 1];
|
307
|
|
- vsnprintf ( buf, sizeof ( buf ), format, args_tmp );
|
308
|
|
- va_end ( args_tmp );
|
309
|
|
- return xfer_deliver_raw ( intf, buf, len );
|
|
308
|
+ len = vasprintf ( &buf, format, args );
|
|
309
|
+ if ( len < 0 ) {
|
|
310
|
+ rc = len;
|
|
311
|
+ goto err_asprintf;
|
310
|
312
|
}
|
|
313
|
+ va_end ( args_tmp );
|
|
314
|
+
|
|
315
|
+ /* Transmit string */
|
|
316
|
+ if ( ( rc = xfer_deliver_raw ( intf, buf, len ) ) != 0 )
|
|
317
|
+ goto err_deliver;
|
|
318
|
+
|
|
319
|
+ err_deliver:
|
|
320
|
+ free ( buf );
|
|
321
|
+ err_asprintf:
|
|
322
|
+ return rc;
|
311
|
323
|
}
|
312
|
324
|
|
313
|
325
|
/**
|