hotspot/src/os/windows/vm/perfMemory_windows.cpp
changeset 13195 be27e1b6a4b9
parent 8306 e8b13a27a0e2
child 13963 e5b53c306fb5
equal deleted inserted replaced
13099:64752e56d721 13195:be27e1b6a4b9
   118         warning("Could not close %s: %s\n", destfile, strerror(errno));
   118         warning("Could not close %s: %s\n", destfile, strerror(errno));
   119       }
   119       }
   120     }
   120     }
   121   }
   121   }
   122 
   122 
   123   FREE_C_HEAP_ARRAY(char, destfile);
   123   FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
   124 }
   124 }
   125 
   125 
   126 // Shared Memory Implementation Details
   126 // Shared Memory Implementation Details
   127 
   127 
   128 // Note: the win32 shared memory implementation uses two objects to represent
   128 // Note: the win32 shared memory implementation uses two objects to represent
   155 static char* get_user_tmp_dir(const char* user) {
   155 static char* get_user_tmp_dir(const char* user) {
   156 
   156 
   157   const char* tmpdir = os::get_temp_directory();
   157   const char* tmpdir = os::get_temp_directory();
   158   const char* perfdir = PERFDATA_NAME;
   158   const char* perfdir = PERFDATA_NAME;
   159   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
   159   size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3;
   160   char* dirname = NEW_C_HEAP_ARRAY(char, nbytes);
   160   char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   161 
   161 
   162   // construct the path name to user specific tmp directory
   162   // construct the path name to user specific tmp directory
   163   _snprintf(dirname, nbytes, "%s\\%s_%s", tmpdir, perfdir, user);
   163   _snprintf(dirname, nbytes, "%s\\%s_%s", tmpdir, perfdir, user);
   164 
   164 
   165   return dirname;
   165   return dirname;
   279     else {
   279     else {
   280       return NULL;
   280       return NULL;
   281     }
   281     }
   282   }
   282   }
   283 
   283 
   284   char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
   284   char* user_name = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
   285   strcpy(user_name, user);
   285   strcpy(user_name, user);
   286 
   286 
   287   return user_name;
   287   return user_name;
   288 }
   288 }
   289 
   289 
   313   // open the directory and check if the file for the given vmid exists.
   313   // open the directory and check if the file for the given vmid exists.
   314   // The file with the expected name and the latest creation date is used
   314   // The file with the expected name and the latest creation date is used
   315   // to determine the user name for the process id.
   315   // to determine the user name for the process id.
   316   //
   316   //
   317   struct dirent* dentry;
   317   struct dirent* dentry;
   318   char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname));
   318   char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal);
   319   errno = 0;
   319   errno = 0;
   320   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
   320   while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) {
   321 
   321 
   322     // check if the directory entry is a hsperfdata file
   322     // check if the directory entry is a hsperfdata file
   323     if (strncmp(dentry->d_name, PERFDATA_NAME, strlen(PERFDATA_NAME)) != 0) {
   323     if (strncmp(dentry->d_name, PERFDATA_NAME, strlen(PERFDATA_NAME)) != 0) {
   324       continue;
   324       continue;
   325     }
   325     }
   326 
   326 
   327     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
   327     char* usrdir_name = NEW_C_HEAP_ARRAY(char,
   328                               strlen(tmpdirname) + strlen(dentry->d_name) + 2);
   328         strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal);
   329     strcpy(usrdir_name, tmpdirname);
   329     strcpy(usrdir_name, tmpdirname);
   330     strcat(usrdir_name, "\\");
   330     strcat(usrdir_name, "\\");
   331     strcat(usrdir_name, dentry->d_name);
   331     strcat(usrdir_name, dentry->d_name);
   332 
   332 
   333     DIR* subdirp = os::opendir(usrdir_name);
   333     DIR* subdirp = os::opendir(usrdir_name);
   334 
   334 
   335     if (subdirp == NULL) {
   335     if (subdirp == NULL) {
   336       FREE_C_HEAP_ARRAY(char, usrdir_name);
   336       FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   337       continue;
   337       continue;
   338     }
   338     }
   339 
   339 
   340     // Since we don't create the backing store files in directories
   340     // Since we don't create the backing store files in directories
   341     // pointed to by symbolic links, we also don't follow them when
   341     // pointed to by symbolic links, we also don't follow them when
   342     // looking for the files. We check for a symbolic link after the
   342     // looking for the files. We check for a symbolic link after the
   343     // call to opendir in order to eliminate a small window where the
   343     // call to opendir in order to eliminate a small window where the
   344     // symlink can be exploited.
   344     // symlink can be exploited.
   345     //
   345     //
   346     if (!is_directory_secure(usrdir_name)) {
   346     if (!is_directory_secure(usrdir_name)) {
   347       FREE_C_HEAP_ARRAY(char, usrdir_name);
   347       FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   348       os::closedir(subdirp);
   348       os::closedir(subdirp);
   349       continue;
   349       continue;
   350     }
   350     }
   351 
   351 
   352     struct dirent* udentry;
   352     struct dirent* udentry;
   353     char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name));
   353     char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
   354     errno = 0;
   354     errno = 0;
   355     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
   355     while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) {
   356 
   356 
   357       if (filename_to_pid(udentry->d_name) == vmid) {
   357       if (filename_to_pid(udentry->d_name) == vmid) {
   358         struct stat statbuf;
   358         struct stat statbuf;
   359 
   359 
   360         char* filename = NEW_C_HEAP_ARRAY(char,
   360         char* filename = NEW_C_HEAP_ARRAY(char,
   361                             strlen(usrdir_name) + strlen(udentry->d_name) + 2);
   361            strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal);
   362 
   362 
   363         strcpy(filename, usrdir_name);
   363         strcpy(filename, usrdir_name);
   364         strcat(filename, "\\");
   364         strcat(filename, "\\");
   365         strcat(filename, udentry->d_name);
   365         strcat(filename, udentry->d_name);
   366 
   366 
   367         if (::stat(filename, &statbuf) == OS_ERR) {
   367         if (::stat(filename, &statbuf) == OS_ERR) {
   368            FREE_C_HEAP_ARRAY(char, filename);
   368            FREE_C_HEAP_ARRAY(char, filename, mtInternal);
   369            continue;
   369            continue;
   370         }
   370         }
   371 
   371 
   372         // skip over files that are not regular files.
   372         // skip over files that are not regular files.
   373         if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
   373         if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
   374           FREE_C_HEAP_ARRAY(char, filename);
   374           FREE_C_HEAP_ARRAY(char, filename, mtInternal);
   375           continue;
   375           continue;
   376         }
   376         }
   377 
   377 
   378         // If we found a matching file with a newer creation time, then
   378         // If we found a matching file with a newer creation time, then
   379         // save the user name. The newer creation time indicates that
   379         // save the user name. The newer creation time indicates that
   391         // later becomes the expected value.
   391         // later becomes the expected value.
   392         //
   392         //
   393         if (statbuf.st_ctime > latest_ctime) {
   393         if (statbuf.st_ctime > latest_ctime) {
   394           char* user = strchr(dentry->d_name, '_') + 1;
   394           char* user = strchr(dentry->d_name, '_') + 1;
   395 
   395 
   396           if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user);
   396           if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user, mtInternal);
   397           latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1);
   397           latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
   398 
   398 
   399           strcpy(latest_user, user);
   399           strcpy(latest_user, user);
   400           latest_ctime = statbuf.st_ctime;
   400           latest_ctime = statbuf.st_ctime;
   401         }
   401         }
   402 
   402 
   403         FREE_C_HEAP_ARRAY(char, filename);
   403         FREE_C_HEAP_ARRAY(char, filename, mtInternal);
   404       }
   404       }
   405     }
   405     }
   406     os::closedir(subdirp);
   406     os::closedir(subdirp);
   407     FREE_C_HEAP_ARRAY(char, udbuf);
   407     FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
   408     FREE_C_HEAP_ARRAY(char, usrdir_name);
   408     FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
   409   }
   409   }
   410   os::closedir(tmpdirp);
   410   os::closedir(tmpdirp);
   411   FREE_C_HEAP_ARRAY(char, tdbuf);
   411   FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
   412 
   412 
   413   return(latest_user);
   413   return(latest_user);
   414 }
   414 }
   415 
   415 
   416 // return the name of the user that owns the process identified by vmid.
   416 // return the name of the user that owns the process identified by vmid.
   451   // the id is converted to an unsigned value here because win32 allows
   451   // the id is converted to an unsigned value here because win32 allows
   452   // negative process ids. However, OpenFileMapping API complains
   452   // negative process ids. However, OpenFileMapping API complains
   453   // about a name containing a '-' characters.
   453   // about a name containing a '-' characters.
   454   //
   454   //
   455   nbytes += UINT_CHARS;
   455   nbytes += UINT_CHARS;
   456   char* name = NEW_C_HEAP_ARRAY(char, nbytes);
   456   char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   457   _snprintf(name, nbytes, "%s_%s_%u", PERFDATA_NAME, user, vmid);
   457   _snprintf(name, nbytes, "%s_%s_%u", PERFDATA_NAME, user, vmid);
   458 
   458 
   459   return name;
   459   return name;
   460 }
   460 }
   461 
   461 
   467 static char* get_sharedmem_filename(const char* dirname, int vmid) {
   467 static char* get_sharedmem_filename(const char* dirname, int vmid) {
   468 
   468 
   469   // add 2 for the file separator and a null terminator.
   469   // add 2 for the file separator and a null terminator.
   470   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
   470   size_t nbytes = strlen(dirname) + UINT_CHARS + 2;
   471 
   471 
   472   char* name = NEW_C_HEAP_ARRAY(char, nbytes);
   472   char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   473   _snprintf(name, nbytes, "%s\\%d", dirname, vmid);
   473   _snprintf(name, nbytes, "%s\\%d", dirname, vmid);
   474 
   474 
   475   return name;
   475   return name;
   476 }
   476 }
   477 
   477 
   483 // method may be unsuccessful in removing the file.
   483 // method may be unsuccessful in removing the file.
   484 //
   484 //
   485 static void remove_file(const char* dirname, const char* filename) {
   485 static void remove_file(const char* dirname, const char* filename) {
   486 
   486 
   487   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
   487   size_t nbytes = strlen(dirname) + strlen(filename) + 2;
   488   char* path = NEW_C_HEAP_ARRAY(char, nbytes);
   488   char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   489 
   489 
   490   strcpy(path, dirname);
   490   strcpy(path, dirname);
   491   strcat(path, "\\");
   491   strcat(path, "\\");
   492   strcat(path, filename);
   492   strcat(path, filename);
   493 
   493 
   498                 " store file %s : %s\n", path, strerror(errno));
   498                 " store file %s : %s\n", path, strerror(errno));
   499       }
   499       }
   500     }
   500     }
   501   }
   501   }
   502 
   502 
   503   FREE_C_HEAP_ARRAY(char, path);
   503   FREE_C_HEAP_ARRAY(char, path, mtInternal);
   504 }
   504 }
   505 
   505 
   506 // returns true if the process represented by pid is alive, otherwise
   506 // returns true if the process represented by pid is alive, otherwise
   507 // returns false. the validity of the result is only accurate if the
   507 // returns false. the validity of the result is only accurate if the
   508 // target process is owned by the same principal that owns this process.
   508 // target process is owned by the same principal that owns this process.
   636   // remove or create new files in this directory. The behavior of this
   636   // remove or create new files in this directory. The behavior of this
   637   // loop under these conditions is dependent upon the implementation of
   637   // loop under these conditions is dependent upon the implementation of
   638   // opendir/readdir.
   638   // opendir/readdir.
   639   //
   639   //
   640   struct dirent* entry;
   640   struct dirent* entry;
   641   char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname));
   641   char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
   642   errno = 0;
   642   errno = 0;
   643   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
   643   while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
   644 
   644 
   645     int pid = filename_to_pid(entry->d_name);
   645     int pid = filename_to_pid(entry->d_name);
   646 
   646 
   679       remove_file(dirname, entry->d_name);
   679       remove_file(dirname, entry->d_name);
   680     }
   680     }
   681     errno = 0;
   681     errno = 0;
   682   }
   682   }
   683   os::closedir(dirp);
   683   os::closedir(dirp);
   684   FREE_C_HEAP_ARRAY(char, dbuf);
   684   FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
   685 }
   685 }
   686 
   686 
   687 // create a file mapping object with the requested name, and size
   687 // create a file mapping object with the requested name, and size
   688 // from the file represented by the given Handle object
   688 // from the file represented by the given Handle object
   689 //
   689 //
   745 
   745 
   746     // if an ACL existed and it was not a default acl, then it must
   746     // if an ACL existed and it was not a default acl, then it must
   747     // be an ACL we enlisted. free the resources.
   747     // be an ACL we enlisted. free the resources.
   748     //
   748     //
   749     if (success && exists && pACL != NULL && !isdefault) {
   749     if (success && exists && pACL != NULL && !isdefault) {
   750       FREE_C_HEAP_ARRAY(char, pACL);
   750       FREE_C_HEAP_ARRAY(char, pACL, mtInternal);
   751     }
   751     }
   752 
   752 
   753     // free the security descriptor
   753     // free the security descriptor
   754     FREE_C_HEAP_ARRAY(char, pSD);
   754     FREE_C_HEAP_ARRAY(char, pSD, mtInternal);
   755   }
   755   }
   756 }
   756 }
   757 
   757 
   758 // method to free up a security attributes structure and any
   758 // method to free up a security attributes structure and any
   759 // contained security descriptors and ACL
   759 // contained security descriptors and ACL
   764     // free the contained security descriptor and the ACL
   764     // free the contained security descriptor and the ACL
   765     free_security_desc(lpSA->lpSecurityDescriptor);
   765     free_security_desc(lpSA->lpSecurityDescriptor);
   766     lpSA->lpSecurityDescriptor = NULL;
   766     lpSA->lpSecurityDescriptor = NULL;
   767 
   767 
   768     // free the security attributes structure
   768     // free the security attributes structure
   769     FREE_C_HEAP_ARRAY(char, lpSA);
   769     FREE_C_HEAP_ARRAY(char, lpSA, mtInternal);
   770   }
   770   }
   771 }
   771 }
   772 
   772 
   773 // get the user SID for the process indicated by the process handle
   773 // get the user SID for the process indicated by the process handle
   774 //
   774 //
   803       CloseHandle(hAccessToken);
   803       CloseHandle(hAccessToken);
   804       return NULL;
   804       return NULL;
   805     }
   805     }
   806   }
   806   }
   807 
   807 
   808   token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize);
   808   token_buf = (PTOKEN_USER) NEW_C_HEAP_ARRAY(char, rsize, mtInternal);
   809 
   809 
   810   // get the user token information
   810   // get the user token information
   811   if (!GetTokenInformation(hAccessToken, TokenUser, token_buf, rsize, &rsize)) {
   811   if (!GetTokenInformation(hAccessToken, TokenUser, token_buf, rsize, &rsize)) {
   812     if (PrintMiscellaneous && Verbose) {
   812     if (PrintMiscellaneous && Verbose) {
   813       warning("GetTokenInformation failure: lasterror = %d,"
   813       warning("GetTokenInformation failure: lasterror = %d,"
   814               " rsize = %d\n", GetLastError(), rsize);
   814               " rsize = %d\n", GetLastError(), rsize);
   815     }
   815     }
   816     FREE_C_HEAP_ARRAY(char, token_buf);
   816     FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
   817     CloseHandle(hAccessToken);
   817     CloseHandle(hAccessToken);
   818     return NULL;
   818     return NULL;
   819   }
   819   }
   820 
   820 
   821   DWORD nbytes = GetLengthSid(token_buf->User.Sid);
   821   DWORD nbytes = GetLengthSid(token_buf->User.Sid);
   822   PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes);
   822   PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
   823 
   823 
   824   if (!CopySid(nbytes, pSID, token_buf->User.Sid)) {
   824   if (!CopySid(nbytes, pSID, token_buf->User.Sid)) {
   825     if (PrintMiscellaneous && Verbose) {
   825     if (PrintMiscellaneous && Verbose) {
   826       warning("GetTokenInformation failure: lasterror = %d,"
   826       warning("GetTokenInformation failure: lasterror = %d,"
   827               " rsize = %d\n", GetLastError(), rsize);
   827               " rsize = %d\n", GetLastError(), rsize);
   828     }
   828     }
   829     FREE_C_HEAP_ARRAY(char, token_buf);
   829     FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
   830     FREE_C_HEAP_ARRAY(char, pSID);
   830     FREE_C_HEAP_ARRAY(char, pSID, mtInternal);
   831     CloseHandle(hAccessToken);
   831     CloseHandle(hAccessToken);
   832     return NULL;
   832     return NULL;
   833   }
   833   }
   834 
   834 
   835   // close the access token.
   835   // close the access token.
   836   CloseHandle(hAccessToken);
   836   CloseHandle(hAccessToken);
   837   FREE_C_HEAP_ARRAY(char, token_buf);
   837   FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
   838 
   838 
   839   return pSID;
   839   return pSID;
   840 }
   840 }
   841 
   841 
   842 // structure used to consolidate access control entry information
   842 // structure used to consolidate access control entry information
   910      assert(aces[i].pSid != 0, "pSid should not be 0");
   910      assert(aces[i].pSid != 0, "pSid should not be 0");
   911      newACLsize += GetLengthSid(aces[i].pSid);
   911      newACLsize += GetLengthSid(aces[i].pSid);
   912   }
   912   }
   913 
   913 
   914   // create the new ACL
   914   // create the new ACL
   915   newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize);
   915   newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize, mtInternal);
   916 
   916 
   917   if (!InitializeAcl(newACL, newACLsize, ACL_REVISION)) {
   917   if (!InitializeAcl(newACL, newACLsize, ACL_REVISION)) {
   918     if (PrintMiscellaneous && Verbose) {
   918     if (PrintMiscellaneous && Verbose) {
   919       warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   919       warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   920     }
   920     }
   921     FREE_C_HEAP_ARRAY(char, newACL);
   921     FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
   922     return false;
   922     return false;
   923   }
   923   }
   924 
   924 
   925   unsigned int ace_index = 0;
   925   unsigned int ace_index = 0;
   926   // copy any existing ACEs from the old ACL (if any) to the new ACL.
   926   // copy any existing ACEs from the old ACL (if any) to the new ACL.
   929       LPVOID ace;
   929       LPVOID ace;
   930       if (!GetAce(oldACL, ace_index, &ace)) {
   930       if (!GetAce(oldACL, ace_index, &ace)) {
   931         if (PrintMiscellaneous && Verbose) {
   931         if (PrintMiscellaneous && Verbose) {
   932           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   932           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   933         }
   933         }
   934         FREE_C_HEAP_ARRAY(char, newACL);
   934         FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
   935         return false;
   935         return false;
   936       }
   936       }
   937       if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) {
   937       if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) {
   938         // this is an inherited, allowed ACE; break from loop so we can
   938         // this is an inherited, allowed ACE; break from loop so we can
   939         // add the new access allowed, non-inherited ACE in the correct
   939         // add the new access allowed, non-inherited ACE in the correct
   956         if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
   956         if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
   957                     ((PACE_HEADER)ace)->AceSize)) {
   957                     ((PACE_HEADER)ace)->AceSize)) {
   958           if (PrintMiscellaneous && Verbose) {
   958           if (PrintMiscellaneous && Verbose) {
   959             warning("AddAce failure: lasterror = %d \n", GetLastError());
   959             warning("AddAce failure: lasterror = %d \n", GetLastError());
   960           }
   960           }
   961           FREE_C_HEAP_ARRAY(char, newACL);
   961           FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
   962           return false;
   962           return false;
   963         }
   963         }
   964       }
   964       }
   965       ace_index++;
   965       ace_index++;
   966     }
   966     }
   972                              aces[i].mask, aces[i].pSid)) {
   972                              aces[i].mask, aces[i].pSid)) {
   973       if (PrintMiscellaneous && Verbose) {
   973       if (PrintMiscellaneous && Verbose) {
   974         warning("AddAccessAllowedAce failure: lasterror = %d \n",
   974         warning("AddAccessAllowedAce failure: lasterror = %d \n",
   975                 GetLastError());
   975                 GetLastError());
   976       }
   976       }
   977       FREE_C_HEAP_ARRAY(char, newACL);
   977       FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
   978       return false;
   978       return false;
   979     }
   979     }
   980   }
   980   }
   981 
   981 
   982   // now copy the rest of the inherited ACEs from the old ACL
   982   // now copy the rest of the inherited ACEs from the old ACL
   987       LPVOID ace;
   987       LPVOID ace;
   988       if (!GetAce(oldACL, ace_index, &ace)) {
   988       if (!GetAce(oldACL, ace_index, &ace)) {
   989         if (PrintMiscellaneous && Verbose) {
   989         if (PrintMiscellaneous && Verbose) {
   990           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   990           warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
   991         }
   991         }
   992         FREE_C_HEAP_ARRAY(char, newACL);
   992         FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
   993         return false;
   993         return false;
   994       }
   994       }
   995       if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
   995       if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
   996                   ((PACE_HEADER)ace)->AceSize)) {
   996                   ((PACE_HEADER)ace)->AceSize)) {
   997         if (PrintMiscellaneous && Verbose) {
   997         if (PrintMiscellaneous && Verbose) {
   998           warning("AddAce failure: lasterror = %d \n", GetLastError());
   998           warning("AddAce failure: lasterror = %d \n", GetLastError());
   999         }
   999         }
  1000         FREE_C_HEAP_ARRAY(char, newACL);
  1000         FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
  1001         return false;
  1001         return false;
  1002       }
  1002       }
  1003       ace_index++;
  1003       ace_index++;
  1004     }
  1004     }
  1005   }
  1005   }
  1008   if (!SetSecurityDescriptorDacl(pSD, TRUE, newACL, FALSE)) {
  1008   if (!SetSecurityDescriptorDacl(pSD, TRUE, newACL, FALSE)) {
  1009     if (PrintMiscellaneous && Verbose) {
  1009     if (PrintMiscellaneous && Verbose) {
  1010       warning("SetSecurityDescriptorDacl failure:"
  1010       warning("SetSecurityDescriptorDacl failure:"
  1011               " lasterror = %d \n", GetLastError());
  1011               " lasterror = %d \n", GetLastError());
  1012     }
  1012     }
  1013     FREE_C_HEAP_ARRAY(char, newACL);
  1013     FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
  1014     return false;
  1014     return false;
  1015   }
  1015   }
  1016 
  1016 
  1017   // if running on windows 2000 or later, set the automatic inheritance
  1017   // if running on windows 2000 or later, set the automatic inheritance
  1018   // control flags.
  1018   // control flags.
  1028                                             SE_DACL_PROTECTED)) {
  1028                                             SE_DACL_PROTECTED)) {
  1029       if (PrintMiscellaneous && Verbose) {
  1029       if (PrintMiscellaneous && Verbose) {
  1030         warning("SetSecurityDescriptorControl failure:"
  1030         warning("SetSecurityDescriptorControl failure:"
  1031                 " lasterror = %d \n", GetLastError());
  1031                 " lasterror = %d \n", GetLastError());
  1032       }
  1032       }
  1033       FREE_C_HEAP_ARRAY(char, newACL);
  1033       FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
  1034       return false;
  1034       return false;
  1035     }
  1035     }
  1036   }
  1036   }
  1037    // Note, the security descriptor maintains a reference to the newACL, not
  1037    // Note, the security descriptor maintains a reference to the newACL, not
  1038    // a copy of it. Therefore, the newACL is not freed here. It is freed when
  1038    // a copy of it. Therefore, the newACL is not freed here. It is freed when
  1052 //
  1052 //
  1053 static LPSECURITY_ATTRIBUTES make_security_attr(ace_data_t aces[], int count) {
  1053 static LPSECURITY_ATTRIBUTES make_security_attr(ace_data_t aces[], int count) {
  1054 
  1054 
  1055   // allocate space for a security descriptor
  1055   // allocate space for a security descriptor
  1056   PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)
  1056   PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)
  1057                          NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH);
  1057      NEW_C_HEAP_ARRAY(char, SECURITY_DESCRIPTOR_MIN_LENGTH, mtInternal);
  1058 
  1058 
  1059   // initialize the security descriptor
  1059   // initialize the security descriptor
  1060   if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
  1060   if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
  1061     if (PrintMiscellaneous && Verbose) {
  1061     if (PrintMiscellaneous && Verbose) {
  1062       warning("InitializeSecurityDescriptor failure: "
  1062       warning("InitializeSecurityDescriptor failure: "
  1074 
  1074 
  1075   // allocate and initialize the security attributes structure and
  1075   // allocate and initialize the security attributes structure and
  1076   // return it to the caller.
  1076   // return it to the caller.
  1077   //
  1077   //
  1078   LPSECURITY_ATTRIBUTES lpSA = (LPSECURITY_ATTRIBUTES)
  1078   LPSECURITY_ATTRIBUTES lpSA = (LPSECURITY_ATTRIBUTES)
  1079                             NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES));
  1079     NEW_C_HEAP_ARRAY(char, sizeof(SECURITY_ATTRIBUTES), mtInternal);
  1080   lpSA->nLength = sizeof(SECURITY_ATTRIBUTES);
  1080   lpSA->nLength = sizeof(SECURITY_ATTRIBUTES);
  1081   lpSA->lpSecurityDescriptor = pSD;
  1081   lpSA->lpSecurityDescriptor = pSD;
  1082   lpSA->bInheritHandle = FALSE;
  1082   lpSA->bInheritHandle = FALSE;
  1083 
  1083 
  1084   return(lpSA);
  1084   return(lpSA);
  1145   aces[2].mask = emask;
  1145   aces[2].mask = emask;
  1146 
  1146 
  1147   // create a security attributes structure with access control
  1147   // create a security attributes structure with access control
  1148   // entries as initialized above.
  1148   // entries as initialized above.
  1149   LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3);
  1149   LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3);
  1150   FREE_C_HEAP_ARRAY(char, aces[0].pSid);
  1150   FREE_C_HEAP_ARRAY(char, aces[0].pSid, mtInternal);
  1151   FreeSid(everybodySid);
  1151   FreeSid(everybodySid);
  1152   FreeSid(administratorsSid);
  1152   FreeSid(administratorsSid);
  1153   return(lpSA);
  1153   return(lpSA);
  1154 }
  1154 }
  1155 
  1155 
  1460   cleanup_sharedmem_resources(dirname);
  1460   cleanup_sharedmem_resources(dirname);
  1461 
  1461 
  1462   assert(((size != 0) && (size % os::vm_page_size() == 0)),
  1462   assert(((size != 0) && (size % os::vm_page_size() == 0)),
  1463          "unexpected PerfMemry region size");
  1463          "unexpected PerfMemry region size");
  1464 
  1464 
  1465   FREE_C_HEAP_ARRAY(char, user);
  1465   FREE_C_HEAP_ARRAY(char, user, mtInternal);
  1466 
  1466 
  1467   // create the shared memory resources
  1467   // create the shared memory resources
  1468   sharedmem_fileMapHandle =
  1468   sharedmem_fileMapHandle =
  1469                create_sharedmem_resources(dirname, filename, objectname, size);
  1469                create_sharedmem_resources(dirname, filename, objectname, size);
  1470 
  1470 
  1471   FREE_C_HEAP_ARRAY(char, filename);
  1471   FREE_C_HEAP_ARRAY(char, filename, mtInternal);
  1472   FREE_C_HEAP_ARRAY(char, objectname);
  1472   FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
  1473   FREE_C_HEAP_ARRAY(char, dirname);
  1473   FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
  1474 
  1474 
  1475   if (sharedmem_fileMapHandle == NULL) {
  1475   if (sharedmem_fileMapHandle == NULL) {
  1476     return NULL;
  1476     return NULL;
  1477   }
  1477   }
  1478 
  1478 
  1619 
  1619 
  1620   // since we don't follow symbolic links when creating the backing
  1620   // since we don't follow symbolic links when creating the backing
  1621   // store file, we also don't following them when attaching
  1621   // store file, we also don't following them when attaching
  1622   //
  1622   //
  1623   if (!is_directory_secure(dirname)) {
  1623   if (!is_directory_secure(dirname)) {
  1624     FREE_C_HEAP_ARRAY(char, dirname);
  1624     FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
  1625     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  1625     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
  1626               "Process not found");
  1626               "Process not found");
  1627   }
  1627   }
  1628 
  1628 
  1629   char* filename = get_sharedmem_filename(dirname, vmid);
  1629   char* filename = get_sharedmem_filename(dirname, vmid);
  1638   char* robjectname = NEW_RESOURCE_ARRAY(char, strlen(objectname) + 1);
  1638   char* robjectname = NEW_RESOURCE_ARRAY(char, strlen(objectname) + 1);
  1639   strcpy(rfilename, filename);
  1639   strcpy(rfilename, filename);
  1640   strcpy(robjectname, objectname);
  1640   strcpy(robjectname, objectname);
  1641 
  1641 
  1642   // free the c heap resources that are no longer needed
  1642   // free the c heap resources that are no longer needed
  1643   if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
  1643   if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
  1644   FREE_C_HEAP_ARRAY(char, dirname);
  1644   FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
  1645   FREE_C_HEAP_ARRAY(char, filename);
  1645   FREE_C_HEAP_ARRAY(char, filename, mtInternal);
  1646   FREE_C_HEAP_ARRAY(char, objectname);
  1646   FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
  1647 
  1647 
  1648   if (*sizep == 0) {
  1648   if (*sizep == 0) {
  1649     size = sharedmem_filesize(rfilename, CHECK);
  1649     size = sharedmem_filesize(rfilename, CHECK);
  1650     assert(size != 0, "unexpected size");
  1650     assert(size != 0, "unexpected size");
  1651   }
  1651   }