diff mbox

[libcpp] : Check the result of vasprintf

Message ID CAFULd4YMrT+yj0vxPF_-xjiR0PyCt3pwibEqbtEEC0FTtk1wbA@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak Dec. 9, 2014, 6:25 p.m. UTC
Hello!

The compilation with gentoo glibc 2.20 emits following warning:

../../../gcc-svn/trunk/libcpp/directives.c:2411:28: warning: ignoring
return value of ‘int vasprintf(char**, const char*, __gnuc_va_list)’,
declared with attribute warn_unused_result [-Wunused-result]

The manpage says:

If memory allocation wasn't possible, or some other error occurs,
these functions will return -1, and the contents of strp is undefined.

Attached patch checks the return value and sets ptr to NULL in this case.

2014-12-09  Uros Bizjak  <ubizjak@gmail.com>

    * directives.c (cpp_define_formatted): Check return value of
    vasprintf and in case of error set ptr to NULL.

Bootstrapped on x86_64-linux-gnu.

OK for mainline?

Uros.

Comments

Joseph Myers Dec. 9, 2014, 10:24 p.m. UTC | #1
On Tue, 9 Dec 2014, Uros Bizjak wrote:

> Attached patch checks the return value and sets ptr to NULL in this case.
> 
> 2014-12-09  Uros Bizjak  <ubizjak@gmail.com>
> 
>     * directives.c (cpp_define_formatted): Check return value of
>     vasprintf and in case of error set ptr to NULL.
> 
> Bootstrapped on x86_64-linux-gnu.
> 
> OK for mainline?

No, this will just continue to pass NULL into cpp_define, and so into 
strlen, where it isn't a valid argument.  You need to give an error 
message for allocation failure and exit, much like xmalloc does (or put 
xvasprintf in libiberty and use that here - see 
<https://gcc.gnu.org/ml/gcc-patches/2009-11/msg01448.html> and 
<https://gcc.gnu.org/ml/gcc-patches/2009-11/msg01449.html> - I don't know 
if that's the latest version).
diff mbox

Patch

Index: directives.c
===================================================================
--- directives.c        (revision 218525)
+++ directives.c        (working copy)
@@ -2408,7 +2408,8 @@  cpp_define_formatted (cpp_reader *pfile, const cha

   va_list ap;
   va_start (ap, fmt);
-  vasprintf (&ptr, fmt, ap);
+  if (vasprintf (&ptr, fmt, ap) < 0)
+    ptr = NULL;
   va_end (ap);

   cpp_define (pfile, ptr);