GitHub

@@ -68,10 +68,10 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __

6868

tv[0].tv_usec = 0;

6969

tv[1].tv_usec = 0;

7070

}

71-

return do_utimes(filename, t ? tv : NULL);

71+

return do_utimes(AT_FDCWD, filename, t ? tv : NULL);

7272

}

737374-

asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval __user *t)

74+

asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, struct compat_timeval __user *t)

7575

{

7676

struct timeval tv[2];

7777

@@ -82,14 +82,19 @@ asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval _

8282

get_user(tv[1].tv_usec, &t[1].tv_usec))

8383

return -EFAULT;

8484

}

85-

return do_utimes(filename, t ? tv : NULL);

85+

return do_utimes(dfd, filename, t ? tv : NULL);

86+

}

87+88+

asmlinkage long compat_sys_utimes(char __user *filename, struct compat_timeval __user *t)

89+

{

90+

return compat_sys_futimesat(AT_FDCWD, filename, t);

8691

}

87928893

asmlinkage long compat_sys_newstat(char __user * filename,

8994

struct compat_stat __user *statbuf)

9095

{

9196

struct kstat stat;

92-

int error = vfs_stat(filename, &stat);

97+

int error = vfs_stat_fd(AT_FDCWD, filename, &stat);

93989499

if (!error)

95100

error = cp_compat_stat(&stat, statbuf);

@@ -100,13 +105,34 @@ asmlinkage long compat_sys_newlstat(char __user * filename,

100105

struct compat_stat __user *statbuf)

101106

{

102107

struct kstat stat;

103-

int error = vfs_lstat(filename, &stat);

108+

int error = vfs_lstat_fd(AT_FDCWD, filename, &stat);

104109105110

if (!error)

106111

error = cp_compat_stat(&stat, statbuf);

107112

return error;

108113

}

109114115+

asmlinkage long compat_sys_newfstatat(int dfd, char __user *filename,

116+

struct compat_stat __user *statbuf, int flag)

117+

{

118+

struct kstat stat;

119+

int error = -EINVAL;

120+121+

if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)

122+

goto out;

123+124+

if (flag & AT_SYMLINK_NOFOLLOW)

125+

error = vfs_lstat_fd(dfd, filename, &stat);

126+

else

127+

error = vfs_stat_fd(dfd, filename, &stat);

128+129+

if (!error)

130+

error = cp_compat_stat(&stat, statbuf);

131+132+

out:

133+

return error;

134+

}

135+110136

asmlinkage long compat_sys_newfstat(unsigned int fd,

111137

struct compat_stat __user * statbuf)

112138

{

@@ -1290,7 +1316,17 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig

12901316

asmlinkage long

12911317

compat_sys_open(const char __user *filename, int flags, int mode)

12921318

{

1293-

return do_sys_open(filename, flags, mode);

1319+

return do_sys_open(AT_FDCWD, filename, flags, mode);

1320+

}

1321+1322+

/*

1323+

* Exactly like fs/open.c:sys_openat(), except that it doesn't set the

1324+

* O_LARGEFILE flag.

1325+

*/

1326+

asmlinkage long

1327+

compat_sys_openat(int dfd, const char __user *filename, int flags, int mode)

1328+

{

1329+

return do_sys_open(dfd, filename, flags, mode);

12941330

}

1295133112961332

/*

Read the original on github.com ↗