comparison src/os/solaris/vm/os_solaris.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 716c64bda5ba
children 2cb439954abf f34d701e952e cd3d6a6b95d9
comparison
equal deleted inserted replaced
6932:857f3ce858dd 6966:6cb0d32b828b
1892 return false; 1892 return false;
1893 } 1893 }
1894 return os::stat(filename, &statbuf) == 0; 1894 return os::stat(filename, &statbuf) == 0;
1895 } 1895 }
1896 1896
1897 void os::dll_build_name(char* buffer, size_t buflen, 1897 bool os::dll_build_name(char* buffer, size_t buflen,
1898 const char* pname, const char* fname) { 1898 const char* pname, const char* fname) {
1899 bool retval = false;
1899 const size_t pnamelen = pname ? strlen(pname) : 0; 1900 const size_t pnamelen = pname ? strlen(pname) : 0;
1900 1901
1901 // Quietly truncate on buffer overflow. Should be an error. 1902 // Return error on buffer overflow.
1902 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { 1903 if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
1903 *buffer = '\0'; 1904 return retval;
1904 return;
1905 } 1905 }
1906 1906
1907 if (pnamelen == 0) { 1907 if (pnamelen == 0) {
1908 snprintf(buffer, buflen, "lib%s.so", fname); 1908 snprintf(buffer, buflen, "lib%s.so", fname);
1909 retval = true;
1909 } else if (strchr(pname, *os::path_separator()) != NULL) { 1910 } else if (strchr(pname, *os::path_separator()) != NULL) {
1910 int n; 1911 int n;
1911 char** pelements = split_path(pname, &n); 1912 char** pelements = split_path(pname, &n);
1912 for (int i = 0 ; i < n ; i++) { 1913 for (int i = 0 ; i < n ; i++) {
1913 // really shouldn't be NULL but what the heck, check can't hurt 1914 // really shouldn't be NULL but what the heck, check can't hurt
1914 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { 1915 if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
1915 continue; // skip the empty path values 1916 continue; // skip the empty path values
1916 } 1917 }
1917 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); 1918 snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
1918 if (file_exists(buffer)) { 1919 if (file_exists(buffer)) {
1920 retval = true;
1919 break; 1921 break;
1920 } 1922 }
1921 } 1923 }
1922 // release the storage 1924 // release the storage
1923 for (int i = 0 ; i < n ; i++) { 1925 for (int i = 0 ; i < n ; i++) {
1928 if (pelements != NULL) { 1930 if (pelements != NULL) {
1929 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); 1931 FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
1930 } 1932 }
1931 } else { 1933 } else {
1932 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); 1934 snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
1933 } 1935 retval = true;
1936 }
1937 return retval;
1934 } 1938 }
1935 1939
1936 const char* os::get_current_directory(char *buf, int buflen) { 1940 const char* os::get_current_directory(char *buf, int buflen) {
1937 return getcwd(buf, buflen); 1941 return getcwd(buf, buflen);
1938 } 1942 }