Coverity reports a number of buffer overflows here.
The code was written in a way, that effectively made it hard for static
analysis to prove the buffer overflow does not happen, but the code
itself was safe.
Update it to avoid repetition and use snprintf, that guarantees no
buffer overflow will happen, and buffer will always be zero-delimited.
This buffer overflow was easy to trigger by just running:
Z:\> path <very-long-string>
We avoid the problem by using snprintf, which will trim input to
the length passed as second parameter.
Judging by the usage, this header belongs in there instead of being
limited to dos module only. This change makes it easier to reuse code
for new features related to drives mounting/unmounting.
The single use from friended class is in public interface. Removal of
friend designators allows Clang to pinpoint few additional unused
private fields.
Static analyzer indicates that in this context `rem` can be NULL,
therefore should not be passed to strchr, but in this context `rem`
cannot be NULL becasuse `args` is not NULL (even after StripSpaces).
Previous implementation avoided invocation of 'pause' in many edge
cases, e.g.: when pause should be invoked between summary lines.
Avoid displaying '.' and '..' in root directory of mounted drive (just
like other dir implementations do).
Use C++11 for-each loop for iterating over directory entries.
Split code inside the loop by option, resulting in more readable
implementation.
Use "%*s" to inject empty whitespace of calculated size instead of
outputting spaces in a loop.
Leave some TODO notes describing further improvements.
This is in line with any other implementation of 'dir' command. It's
also very useful for identifying e.g. which floppy is currently mounted.
MS-DOS and cmd.exe display Volume Serial Number, but it emulating it in
DOSBox doesn't seem to be very useful.
Adapt to 'pause' command working correctly (assuming the terminal height
is 25, this will need further adjustments for supporting 80x50 and
different modes).
Adjust "intro" by 1 space to make formatting the same as MS-DOS 'dir'
command - this makes intro not "merge" visually with the files listed.
Adjust placing of files and directories counters, to make it resemble
most 'dir' implementations.
Count intro lines for purpose of correct pagination with 'dir /p'.
Skip counting not printed lines with 'dir /b /p'.
Output of 'dir /w /p' is still broken, but fixing it will require more
invasive changes.
Fixes: #75
This newline is already ommitted from batch files and noecho commands,
this change makes the behaviour consistent in interactive mode.
Additional newline is a behaviour inherited from MS-DOS, and even still
visible in Windows cmd.exe, but all modern DOS implementations,
PowerShell, unix terminals, etc - they all prefer consistent behaviour
over addtional newline. Also, there's no point in wasting 4% of screen
estate just to show empty line.
This fixes CLS command, which is now able to properly clean the screen
and place prompt in the first line.
Move newline from the string message to the WriteOut in command itself.
This makes the PAUSE command behave like the original, which is
important for commands like DIR /P.
Cleanup before replacing SDL1.2 with SDL2.
OS/2 support was introduced in DOSBox in March 2006. OS/2 reached EOL
in December 2006.
As of 2019, OS/2 is being continued by proprietary 32-bit only ArcaOS,
although there is no official SDL2 support, despite pledges from SDL2
maintainers.
Static analysis indicated an issue, when line was being passed as 2nd
argument to strcat:
Null pointer passed as an argument to a 'nonnull' parameter
Replace repeated strcat with creating a formatted string and use
the opportunity to do a small format cleanup.
- We now first split the line into arguments using space,tab,;,=,',' as separators.
- Next we convert /Hello into H ello
- Lastly we feed the arguments 1 and 2 to the FCB_Parsename function
(- It got messy, but the results are better )
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3942