Infinite loop in FileSystemUtils.freeSpaceWindows if share directory empty
--------------------------------------------------------------------------
Key: IO-90
URL: http://issues.apache.org/jira/browse/IO-90
Project: Commons IO
Issue Type: Bug
Components: Utilities
Affects Versions: 1.2
Environment: Windows NT or higher
Reporter: Thomas Ledoux
When using FileSystemUtils.freeSpaceWindows in an empty share directory, the
line containing the free space does not exist which causes an infinite loop
(the outerloop doesn't decrease the i index).
In fact to deal with all possible errors, I propose to test the exitCode of the
dir command.
Here is a proposed new code for this function :
/**
* Find free space on the Windows platform using the 'dir' command.
*
* @param path the path to get free space for, including the colon
* @return the amount of free drive space on the drive
* @throws IOException if an error occurs
*/
long freeSpaceWindows(String path) throws IOException {
path = FilenameUtils.normalize(path);
if (path.length() > 2 && path.charAt(1) == ':') {
path = path.substring(0, 2); // seems to make it work
}
// build and run the 'dir' command
String[] cmdAttrbs = new String[] {"cmd.exe", "/C", "dir /-c " + path};
// read in the output of the command to an ArrayList
BufferedReader in = null;
String line = null;
ArrayList lines = new ArrayList();
int errorLevel = 0;
try {
Process proc = Runtime.getRuntime().exec(cmdAttrbs);
in = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
line = in.readLine();
while (line != null) {
line = line.toLowerCase().trim();
lines.add(line);
line = in.readLine();
}
proc.waitFor();
errorLevel = proc.exitValue();
} finally {
IOUtils.closeQuietly(in);
}
if (lines.size() == 0) {
// unknown problem, throw exception
throw new IOException(
"Command line 'dir /-c' did not return any info " +
"for command '" + cmdAttrbs[2] + "'");
}
if (errorLevel != 0) {
if (errorLevel == 2) {
// Empty directory : unable to calculate the freeSpace
return Integer.MAX_VALUE; // ???
} else {
// unknown problem, throw exception
throw new IOException(
"Command line 'dir /-c' error [" + errorLevel +
"] for command '" + cmdAttrbs[2] + "'");
}
}
// now iterate over the lines we just read and find the LAST
// non-empty line (the free space bytes should be in the last element
// of the ArrayList anyway, but this will ensure it works even if it's
// not, still assuming it is on the last non-blank line)
long bytes = -1;
int i = lines.size() - 1;
int bytesStart = 0;
int bytesEnd = 0;
outerLoop: while (i > 0) {
line = (String) lines.get(i);
if (line.length() > 0) {
// found it, so now read from the end of the line to find the
// last numeric character on the line, then continue until we
// find the first non-numeric character, and everything between
// that and the last numeric character inclusive is our free
// space bytes count
int j = line.length() - 1;
innerLoop1: while (j >= 0) {
char c = line.charAt(j);
if (Character.isDigit(c)) {
// found the last numeric character, this is the end of
// the free space bytes count
bytesEnd = j + 1;
break innerLoop1;
}
j--;
}
innerLoop2: while (j >= 0) {
char c = line.charAt(j);
if (!Character.isDigit(c) && c != ',' && c != '.') {
// found the next non-numeric character, this is the
// beginning of the free space bytes count
bytesStart = j + 1;
break innerLoop2;
}
j--;
}
break outerLoop;
} else {
// If the last line is empty we are unable to parse the
freeSpace
throw new IOException(
"Command line 'dir /-c' did not return valid info " +
"for command '" + cmdAttrbs[2] + "'");
}
}
// remove commas and dots in the bytes count
StringBuffer buf = new StringBuffer(line.substring(bytesStart,
bytesEnd));
for (int k = 0; k < buf.length(); k++) {
if (buf.charAt(k) == ',' || buf.charAt(k) == '.') {
buf.deleteCharAt(k--);
}
}
bytes = Long.parseLong(buf.toString());
return bytes;
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]