comparison src/os/linux/vm/os_linux.cpp @ 6966:6cb0d32b828b

8001185: parsing of sun.boot.library.path in os::dll_build_name somewhat broken Summary: dll_dir can contain multiple paths, need to parse them correctly when loading agents Reviewed-by: dholmes, dlong Contributed-by: bill.pittore@oracle.com
author bpittore
date Wed, 07 Nov 2012 17:53:02 -0500
parents bf2edd3c9b0f
children 2cb439954abf f34d701e952e cd3d6a6b95d9
comparison
equal deleted inserted replaced
6932:857f3ce858dd 6966:6cb0d32b828b
1648 return false; 1648 return false;
1649 } 1649 }
1650 return os::stat(filename, &statbuf) == 0; 1650 return os::stat(filename, &statbuf) == 0;
1651 } 1651 }
1652 1652
1653 void os::dll_build_name(char* buffer, size_t buflen, 1653 bool os::dll_build_name(char* buffer, size_t buflen,
1654 const char* pname, const char* fname) { 1654 const char* pname, const char* fname) {
1655 bool retval = false;
1655 // Copied from libhpi 1656 // Copied from libhpi
1656 const size_t pnamelen = pname ? strlen(pname) : 0; 1657 const size_t pnamelen = pname ? strlen(pname) : 0;
1657 1658
1658 // Quietly truncate on buffer overflow. Should be an error. 1659 // Return error on buffer overflow.
1659 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1660 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1660 *buffer = '\0'; 1661 return retval;
1661 return;
1662 } 1662 }
1663 1663
1664 if (pnamelen == 0) { 1664 if (pnamelen == 0) {
1665 snprintf(buffer, buflen, "lib%s.so", fname); 1665 snprintf(buffer, buflen, "lib%s.so", fname);
1666 retval = true;
1666 } else if (strchr(pname, *os::path_separator()) != NULL) { 1667 } else if (strchr(pname, *os::path_separator()) != NULL) {
1667 int n; 1668 int n;
1668 char** pelements = split_path(pname, &n); 1669 char** pelements = split_path(pname, &n);
1669 for (int i = 0 ; i < n ; i++) { 1670 for (int i = 0 ; i < n ; i++) {
1670 // Really shouldn't be NULL, but check can't hurt 1671 // Really shouldn't be NULL, but check can't hurt
1671 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { 1672 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1672 continue; // skip the empty path values 1673 continue; // skip the empty path values
1673 } 1674 }
1674 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); 1675 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1675 if (file_exists(buffer)) { 1676 if (file_exists(buffer)) {
1677 retval = true;
1676 break; 1678 break;
1677 } 1679 }
1678 } 1680 }
1679 // release the storage 1681 // release the storage
1680 for (int i = 0 ; i < n ; i++) { 1682 for (int i = 0 ; i < n ; i++) {
1685 if (pelements != NULL) { 1687 if (pelements != NULL) {
1686 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); 1688 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1687 } 1689 }
1688 } else { 1690 } else {
1689 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); 1691 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1690 } 1692 retval = true;
1693 }
1694 return retval;
1691 } 1695 }
1692 1696
1693 const char* os::get_current_directory(char *buf, int buflen) { 1697 const char* os::get_current_directory(char *buf, int buflen) {
1694 return getcwd(buf, buflen); 1698 return getcwd(buf, buflen);
1695 } 1699 }