Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <7858846.L60ANvILD4@linuix>
Date: Sun, 17 Jun 2012 21:26:44 +0200
From: Bruno Haible <bruno@...sp.org>
To: Rich Felker <dalias@...ifal.cx>, musl@...ts.openwall.com
Subject: setvbuf, __fbufsize bug

With musl-0.9.1: This program shows that after calling setvbuf to make
a stream buffered, it may in fact be unbuffered (__fbufsize returns 0).

This problems leads to a unit test failure in gnulib.


============================= foo.c =============================
#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>

#define TESTFILE "t-fbufmode.tmp"

int
main ()
{
  FILE *fp;
  char buf[5];

  /* Create a file with some contents.  */
  fp = fopen (TESTFILE, "w");
  if (fp == NULL)
    goto skip;
  if (fwrite ("foobarsh", 1, 8, fp) < 8)
    goto skip;
  if (fclose (fp))
    goto skip;

  /* Open it for reading.  */
  fp = fopen (TESTFILE, "r");

  if (setvbuf (fp, NULL, _IONBF, 0))
    goto skip;

  if (__fbufsize (fp) > 0)
    {
      fprintf (stderr, "in unbuffered mode, __fbufsize returns > 0 !\n");
      exit (1);
    }

  if (setvbuf (fp, buf, _IOFBF, 5) == 0)
    {
      if (__fbufsize (fp) == 0)
        {
          fprintf (stderr, "in buffered mode, __fbufsize returns 0 !\n");
          exit (1);
        }
    }

  fclose (fp);

  return 0;

 skip:
  fprintf (stderr, "Skipping test: file operations failed.\n");
  return 77;
}
======================================================================
$ musl-gcc foo.c -Wall
$ ./a.out
in buffered mode, __fbufsize returns 0 !

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.