Skip to content

Commit

Permalink
stat() fix for write but not read permission on a directory.
Browse files Browse the repository at this point in the history
9b9f19d missed one corner case where we do actually need to
stat the directory file and not just the name without the .DIR. If
we have write but not read access to the directory, then
stat('foo.DIR') succeeds but stat('foo') fails.  So if the first
stat failed fileify and try again.
  • Loading branch information
craigberry committed Dec 9, 2011
1 parent 61f966e commit cc5de3b
Showing 1 changed file with 25 additions and 3 deletions.
28 changes: 25 additions & 3 deletions vms/vms.c
Original file line number Diff line number Diff line change
Expand Up @@ -12628,7 +12628,8 @@ Perl_flex_stat_int(pTHX_ const char *fspec, Stat_t *statbufp, int lstat_flag)
const char *save_spec;
char *ret_spec;
int retval = -1;
int efs_hack = 0;
char efs_hack = 0;
char already_fileified = 0;
dSAVEDERRNO;

if (!fspec) {
Expand Down Expand Up @@ -12672,7 +12673,28 @@ Perl_flex_stat_int(pTHX_ const char *fspec, Stat_t *statbufp, int lstat_flag)
else
retval = lstat(fspec, &statbufp->crtl_stat);

save_spec = fspec;
if (!retval) {
save_spec = fspec;
}
else {
/* In the odd case where we have write but not read access
* to a directory, stat('foo.DIR') works but stat('foo') doesn't.
*/
fileified = PerlMem_malloc(VMS_MAXRSS);
if (fileified == NULL)
_ckvmssts_noperl(SS$_INSFMEM);

ret_spec = int_fileify_dirspec(fspec, fileified, NULL);
if (ret_spec != NULL) {
if (lstat_flag == 0)
retval = stat(fileified, &statbufp->crtl_stat);
else
retval = lstat(fileified, &statbufp->crtl_stat);
save_spec = fileified;
already_fileified = 1;
}
}

if (retval && vms_bug_stat_filename) {

temp_fspec = PerlMem_malloc(VMS_MAXRSS);
Expand Down Expand Up @@ -12749,7 +12771,7 @@ Perl_flex_stat_int(pTHX_ const char *fspec, Stat_t *statbufp, int lstat_flag)
/* If we've got a directory, save a fileified, expanded version of it
* in st_devnam. If not a directory, just an expanded version.
*/
if (S_ISDIR(statbufp->st_mode)) {
if (S_ISDIR(statbufp->st_mode) && !already_fileified) {
fileified = PerlMem_malloc(VMS_MAXRSS);
if (fileified == NULL)
_ckvmssts_noperl(SS$_INSFMEM);
Expand Down

0 comments on commit cc5de3b

Please sign in to comment.