Fix BZ #18757 - fmemopen fails to set errno on failure
Commit Message
On Fri, Aug 14, 2015 at 12:32 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> Paul Pluzhnikov <ppluzhnikov@gmail.com> writes:
>
>> @@ -196,7 +197,10 @@ _IO_fopencookie (cookie, mode, io_functions)
>>
>> new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
>> if (new_f == NULL)
>> - return NULL;
>> + {
>> + __set_errno (ENOMEM);
>
> This will overwrite the errno set by malloc.
Thanks. Corrected patch attached.
2015-08-13 Paul Pluzhnikov <ppluzhnikov@google.com>
[BZ #18757]
* libio/iofopncook.c (_IO_fopencookie): Set errno on failure
* libio/test-fmemopen.c (do_bz18820): Extend the test to cover BZ #18757
Comments
Paul Pluzhnikov <ppluzhnikov@google.com> writes:
> [BZ #18757]
> * libio/iofopncook.c (_IO_fopencookie): Set errno on failure
> * libio/test-fmemopen.c (do_bz18820): Extend the test to cover BZ #18757
Ok.
Andreas.
@@ -189,6 +189,7 @@ _IO_fopencookie (cookie, mode, io_functions)
read_write = _IO_NO_READS|_IO_IS_APPENDING;
break;
default:
+ __set_errno (EINVAL);
return NULL;
}
if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
@@ -19,6 +19,7 @@
static char buffer[] = "foobar";
+#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
@@ -30,6 +31,7 @@ do_bz18820 (void)
char ch;
FILE *stream;
+ errno = 0;
stream = fmemopen (&ch, 1, "?");
if (stream)
{
@@ -37,6 +39,11 @@ do_bz18820 (void)
fclose (stream);
return 1;
}
+ if (errno != EINVAL)
+ {
+ printf ("fmemopen: got %i, expected EINVAL (%i)\n", errno, EINVAL);
+ return 10;
+ }
stream = fmemopen (NULL, 42, "?");
if (stream)
@@ -46,6 +53,20 @@ do_bz18820 (void)
return 2;
}
+ errno = 0;
+ stream = fmemopen (NULL, ~0, "w");
+ if (stream)
+ {
+ printf ("fmemopen: expected NULL, got %p\n", stream);
+ fclose (stream);
+ return 3;
+ }
+ if (errno != ENOMEM)
+ {
+ printf ("fmemopen: got %i, expected ENOMEM (%i)\n", errno, ENOMEM);
+ return 20;
+ }
+
return 0;
}