~ubuntu-branches/ubuntu/natty/eglibc/natty-security

« back to all changes in this revision

Viewing changes to io/tst-fstatat.c

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno
  • Date: 2009-05-05 09:54:14 UTC
  • Revision ID: james.westby@ubuntu.com-20090505095414-c45qsg9ixjheohru
ImportĀ upstreamĀ versionĀ 2.9

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <dirent.h>
 
2
#include <fcntl.h>
 
3
#include <stdio.h>
 
4
#include <stdlib.h>
 
5
#include <string.h>
 
6
#include <unistd.h>
 
7
 
 
8
 
 
9
static void prepare (void);
 
10
#define PREPARE(argc, argv) prepare ()
 
11
 
 
12
static int do_test (void);
 
13
#define TEST_FUNCTION do_test ()
 
14
 
 
15
#include "../test-skeleton.c"
 
16
 
 
17
static int dir_fd;
 
18
 
 
19
static void
 
20
prepare (void)
 
21
{
 
22
  size_t test_dir_len = strlen (test_dir);
 
23
  static const char dir_name[] = "/tst-fstatat.XXXXXX";
 
24
 
 
25
  size_t dirbuflen = test_dir_len + sizeof (dir_name);
 
26
  char *dirbuf = malloc (dirbuflen);
 
27
  if (dirbuf == NULL)
 
28
    {
 
29
      puts ("out of memory");
 
30
      exit (1);
 
31
    }
 
32
 
 
33
  snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
 
34
  if (mkdtemp (dirbuf) == NULL)
 
35
    {
 
36
      puts ("cannot create temporary directory");
 
37
      exit (1);
 
38
    }
 
39
 
 
40
  add_temp_file (dirbuf);
 
41
 
 
42
  dir_fd = open (dirbuf, O_RDONLY | O_DIRECTORY);
 
43
  if (dir_fd == -1)
 
44
    {
 
45
      puts ("cannot open directory");
 
46
      exit (1);
 
47
    }
 
48
}
 
49
 
 
50
 
 
51
static int
 
52
do_test (void)
 
53
{
 
54
  /* fdopendir takes over the descriptor, make a copy.  */
 
55
  int dupfd = dup (dir_fd);
 
56
  if (dupfd == -1)
 
57
    {
 
58
      puts ("dup failed");
 
59
      return 1;
 
60
    }
 
61
  if (lseek (dupfd, 0, SEEK_SET) != 0)
 
62
    {
 
63
      puts ("1st lseek failed");
 
64
      return 1;
 
65
    }
 
66
 
 
67
  /* The directory should be empty safe the . and .. files.  */
 
68
  DIR *dir = fdopendir (dupfd);
 
69
  if (dir == NULL)
 
70
    {
 
71
      puts ("fdopendir failed");
 
72
      return 1;
 
73
    }
 
74
  struct dirent64 *d;
 
75
  while ((d = readdir64 (dir)) != NULL)
 
76
    if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
 
77
      {
 
78
        printf ("temp directory contains file \"%s\"\n", d->d_name);
 
79
        return 1;
 
80
      }
 
81
  closedir (dir);
 
82
 
 
83
  /* Try to create a file.  */
 
84
  int fd = openat (dir_fd, "some-file", O_CREAT|O_RDWR|O_EXCL, 0666);
 
85
  if (fd == -1)
 
86
    {
 
87
      if (errno == ENOSYS)
 
88
        {
 
89
          puts ("*at functions not supported");
 
90
          return 0;
 
91
        }
 
92
 
 
93
      puts ("file creation failed");
 
94
      return 1;
 
95
    }
 
96
  write (fd, "hello", 5);
 
97
  puts ("file created");
 
98
 
 
99
  struct stat64 st1;
 
100
 
 
101
  /* Before closing the file, try using this file descriptor to open
 
102
     another file.  This must fail.  */
 
103
  if (fstatat64 (fd, "some-file", &st1, 0) != -1)
 
104
    {
 
105
      puts ("fstatatat using descriptor for normal file worked");
 
106
      return 1;
 
107
    }
 
108
  if (errno != ENOTDIR)
 
109
    {
 
110
      puts ("error for fstatat using descriptor for normal file not ENOTDIR ");
 
111
      return 1;
 
112
    }
 
113
 
 
114
  if (fstat64 (fd, &st1) != 0)
 
115
    {
 
116
      puts ("fstat64 failed");
 
117
      return 1;
 
118
    }
 
119
 
 
120
  close (fd);
 
121
 
 
122
  struct stat64 st2;
 
123
  if (fstatat64 (dir_fd, "some-file", &st2, 0) != 0)
 
124
    {
 
125
      puts ("fstatat64 failed");
 
126
      return 1;
 
127
    }
 
128
 
 
129
  if (st1.st_dev != st2.st_dev
 
130
      || st1.st_ino != st2.st_ino
 
131
      || st1.st_size != st2.st_size)
 
132
    {
 
133
      puts ("stat results do not match");
 
134
      return 1;
 
135
    }
 
136
 
 
137
  if (unlinkat (dir_fd, "some-file", 0) != 0)
 
138
    {
 
139
      puts ("unlinkat failed");
 
140
      return 1;
 
141
    }
 
142
 
 
143
  if (fstatat64 (dir_fd, "some-file", &st2, 0) == 0)
 
144
    {
 
145
      puts ("second fstatat64 succeeded");
 
146
      return 1;
 
147
    }
 
148
  if (errno != ENOENT)
 
149
    {
 
150
      puts ("second fstatat64 did not fail with ENOENT");
 
151
      return 1;
 
152
    }
 
153
 
 
154
  /* Create a file descriptor which is closed again right away.  */
 
155
  int dir_fd2 = dup (dir_fd);
 
156
  if (dir_fd2 == -1)
 
157
    {
 
158
      puts ("dup failed");
 
159
      return 1;
 
160
    }
 
161
  close (dir_fd2);
 
162
 
 
163
  if (fstatat64 (dir_fd2, "some-file", &st1, 0) != -1)
 
164
    {
 
165
      puts ("fstatat64 using closed descriptor worked");
 
166
      return 1;
 
167
    }
 
168
  if (errno != EBADF)
 
169
    {
 
170
      puts ("error for fstatat using closed descriptor not EBADF ");
 
171
      return 1;
 
172
    }
 
173
 
 
174
  close (dir_fd);
 
175
 
 
176
  if (fstatat64 (-1, "some-file", &st1, 0) != -1)
 
177
    {
 
178
      puts ("fstatat64 using invalid descriptor worked");
 
179
      return 1;
 
180
    }
 
181
  if (errno != EBADF)
 
182
    {
 
183
      puts ("error for fstatat using invalid descriptor not EBADF ");
 
184
      return 1;
 
185
    }
 
186
 
 
187
  return 0;
 
188
}