Fixed ReadFileString ignoring fourth parameter (bug 3459, r=ds).

This commit is contained in:
David Anderson 2008-11-29 22:43:30 -06:00
parent b684d3aad7
commit 7ff0129f36
2 changed files with 25 additions and 7 deletions

View File

@ -802,11 +802,29 @@ static cell_t sm_ReadFileString(IPluginContext *pContext, const cell_t *params)
char *buffer; char *buffer;
pContext->LocalToString(params[2], &buffer); pContext->LocalToString(params[2], &buffer);
if (params[4] != -1)
{
if (size_t(params[4]) > size_t(params[3]))
{
return pContext->ThrowNativeError("read_count (%u) is greater than buffer size (%u)",
params[4],
params[3]);
}
num_read = (cell_t)fread(buffer, 1, params[4], pFile);
if (num_read != params[4] && ferror(pFile))
{
return -1;
}
return num_read;
}
char val; char val;
while (1) while (1)
{ {
/* If we're in stop mode, break as soon as the buffer is full. */ if (params[3] == 0 || num_read >= params[3] - 1)
if (params[4] && (params[3] == 0 || num_read >= params[3] - 1))
{ {
break; break;
} }

View File

@ -176,11 +176,11 @@ native ReadFile(Handle:hndl, items[], num_items, size);
* @param hndl Handle to the file. * @param hndl Handle to the file.
* @param buffer Buffer to store the string. * @param buffer Buffer to store the string.
* @param max_size Maximum size of the string buffer. * @param max_size Maximum size of the string buffer.
* @param stop If true, reading will stop once max_size-1 bytes have * @param read_count If -1, reads until a null terminator is encountered in
* been read. If false, reading will stop once a NUL * the file. Otherwise, read_count bytes are read
* terminator is reached. The buffer will simply be * into the buffer provided. In this case the buffer
* terminated in either case, the difference is in how * is not explicitly null terminated, and the buffer
* the far the file position is changed. * will contain any null terminators read from the file.
* @return Number of characters written to the buffer, or -1 * @return Number of characters written to the buffer, or -1
* if an error was encountered. * if an error was encountered.
* @error Invalid Handle, or read_count > max_size. * @error Invalid Handle, or read_count > max_size.