Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 33383 | Differences between
and this patch

Collapse All | Expand All

(-)libc/io/Makefile.jj (-1 / +1 lines)
Lines 57-63 static-only-routines = stat fstat lstat Link Here
57
others		:= pwd
57
others		:= pwd
58
test-srcs	:= ftwtest
58
test-srcs	:= ftwtest
59
tests		:= test-utime test-stat test-stat2 test-lfs tst-getcwd \
59
tests		:= test-utime test-stat test-stat2 test-lfs tst-getcwd \
60
		   tst-fcntl bug-ftw1 bug-ftw2 bug-ftw3
60
		   tst-fcntl bug-ftw1 bug-ftw2 bug-ftw3 bug-ftw4
61
61
62
distribute	:= ftwtest-sh
62
distribute	:= ftwtest-sh
63
63
(-)libc/io/ftw.c.jj (-12 / +14 lines)
Lines 474-480 ftw_dir (struct ftw_data *data, struct S Link Here
474
    {
474
    {
475
      result = (*data->func) (data->dirbuf, st, FTW_D, &data->ftw);
475
      result = (*data->func) (data->dirbuf, st, FTW_D, &data->ftw);
476
      if (result != 0)
476
      if (result != 0)
477
	return result;
477
	{
478
	  int save_err;
479
fail:
480
	  save_err = errno;
481
	  __closedir (dir.stream);
482
	  __set_errno (save_err);
483
484
	  if (data->actdir-- == 0)
485
	    data->actdir = data->maxdir - 1;
486
	  data->dirstreams[data->actdir] = NULL;
487
488
	  return result;
489
	}
478
    }
490
    }
479
491
480
  /* If necessary, change to this directory.  */
492
  /* If necessary, change to this directory.  */
Lines 492-508 ftw_dir (struct ftw_data *data, struct S Link Here
492
	}
504
	}
493
505
494
      if (result != 0)
506
      if (result != 0)
495
	{
507
	goto fail;
496
	  int save_err = errno;
497
	  __closedir (dir.stream);
498
	  __set_errno (save_err);
499
500
	  if (data->actdir-- == 0)
501
	    data->actdir = data->maxdir - 1;
502
	  data->dirstreams[data->actdir] = NULL;
503
504
	  return result;
505
	}
506
    }
508
    }
507
509
508
  /* Next, update the `struct FTW' information.  */
510
  /* Next, update the `struct FTW' information.  */
(-)libc/io/bug-ftw4.c.jj (+124 lines)
Line 0 Link Here
1
/* Test if ftw function doesn't leak fds.
2
   Copyright (C) 2003 Free Software Foundation, Inc.
3
   This file is part of the GNU C Library.
4
   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
5
6
   The GNU C Library is free software; you can redistribute it and/or
7
   modify it under the terms of the GNU Lesser General Public
8
   License as published by the Free Software Foundation; either
9
   version 2.1 of the License, or (at your option) any later version.
10
11
   The GNU C Library is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
   Lesser General Public License for more details.
15
16
   You should have received a copy of the GNU Lesser General Public
17
   License along with the GNU C Library; if not, write to the Free
18
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19
   02111-1307 USA.  */
20
21
#include <fcntl.h>
22
#include <ftw.h>
23
#include <stdlib.h>
24
#include <stdio.h>
25
#include <sys/stat.h>
26
#include <unistd.h>
27
28
static int cb_called;
29
30
static int
31
cb (const char *name, const struct stat64 *st, int type)
32
{
33
  return cb_called++ & 1;
34
}
35
36
int
37
main (void)
38
{
39
  char name[32] = "/tmp/ftwXXXXXX", *p;
40
  int ret, i, result = 0, fd, fd1, fd2;
41
42
  if (mkdtemp (name) == NULL)
43
    {
44
      printf ("Couldn't make temporary directory: %m\n");
45
      exit (EXIT_FAILURE);
46
    }
47
  p = strchr (name, '\0');
48
  strcpy (p, "/1");
49
  if (mkdir (name, 0755) < 0)
50
    {
51
      printf ("Couldn't make temporary subdirectory: %m\n");
52
      exit (EXIT_FAILURE);
53
    }
54
  *p = '\0';
55
56
  ret = ftw64 (name, cb, 20);
57
  if (ret != 1)
58
    {
59
      printf ("ftw64 returned %d instead of 1", ret);
60
      result = 1;
61
    }
62
63
  fd = open (name, O_RDONLY);
64
  if (fd < 0)
65
    {
66
      printf ("open failed: %m\n");
67
      result = 1;
68
    }
69
  fd1 = open (name, O_RDONLY);
70
  if (fd1 < 0)
71
    {
72
      printf ("open failed: %m\n");
73
      result = 1;
74
    }
75
  else
76
    close (fd1);
77
  if (fd >= 0)
78
    close (fd);
79
80
  for (i = 0; i < 128; ++i)
81
    {
82
      ret = ftw64 (name, cb, 20);
83
      if (ret != 1)
84
	{
85
	  printf ("ftw64 returned %d instead of 1", ret);
86
	  result = 1;
87
	}
88
    }
89
90
  fd = open (name, O_RDONLY);
91
  if (fd < 0)
92
    {
93
      printf ("open failed: %m\n");
94
      result = 1;
95
    }
96
  fd2 = open (name, O_RDONLY);
97
  if (fd2 < 0)
98
    {
99
      printf ("open failed: %m\n");
100
      result = 1;
101
    }
102
  else
103
    close (fd2);
104
  if (fd >= 0)
105
    close (fd);
106
107
  if (fd2 >= fd1 + 128)
108
    {
109
      printf ("ftw64 leaking fds: %d -> %d\n", fd1, fd2);
110
      result = 1;
111
    }
112
113
  if (cb_called != 129 * 2)
114
    {
115
      printf ("callback called %d times\n", cb_called);
116
      result = 1;
117
    }
118
119
  strcpy (p, "/1");
120
  rmdir (name);
121
  *p = '\0';
122
  rmdir (name);
123
  return result;
124
}

Return to bug 33383