diff --git a/HISTORY b/HISTORY index d242c4a0..013b3e72 100644 --- a/HISTORY +++ b/HISTORY @@ -3913,7 +3913,7 @@ Video Disk Recorder Revision History - The new class cUnbufferedFile is used for the recording files to avoid trashing the file system cache (based on a patch by Ralf Müller). -2005-11-04: Version 1.3.36 +2005-11-05: Version 1.3.36 - Fixed a NULL pointer access with the cUnbufferedFile when a replay session runs all the way until the end of the recording (thanks to Joachim Wilke). @@ -3929,3 +3929,7 @@ Video Disk Recorder Revision History - Changed cConfig::Load() to use cReadLine instead of a fixed buffer (thanks to Andreas Mair for reporting a problem with extremely long summary fields in timers). +- cSVDRP now dynamically allocates its command buffer in order to handle + commands of any length. The MAXPARSEBUFFER macros is now obsolete and has + been removed. If a plugin has used that macro, it should either define + a buffer size of its own, or use cReadLine when reading files. diff --git a/svdrp.c b/svdrp.c index cc5df706..8e09d41c 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 1.82 2005/09/25 10:36:59 kls Exp $ + * $Id: svdrp.c 1.83 2005/11/05 11:21:38 kls Exp $ */ #include "svdrp.h" @@ -361,6 +361,8 @@ cSVDRP::cSVDRP(int Port) { PUTEhandler = NULL; numChars = 0; + length = BUFSIZ; + cmdLine = MALLOC(char, length); message = NULL; lastActivity = 0; isyslog("SVDRP listening on port %d", Port); @@ -370,6 +372,7 @@ cSVDRP::~cSVDRP() { Close(); free(message); + free(cmdLine); } void cSVDRP::Close(bool Timeout) @@ -1442,6 +1445,11 @@ bool cSVDRP::Process(void) // showtime! Execute(cmdLine); numChars = 0; + if (length > BUFSIZ) { + free(cmdLine); // let's not tie up too much memory + length = BUFSIZ; + cmdLine = MALLOC(char, length); + } } else if (c == 0x04 && numChars == 0) { // end of file (only at beginning of line) @@ -1455,15 +1463,14 @@ bool cSVDRP::Process(void) else if (c <= 0x03 || c == 0x0D) { // ignore control characters } - else if (numChars < sizeof(cmdLine) - 1) { + else { + if (numChars >= length - 1) { + length += BUFSIZ; + cmdLine = (char *)realloc(cmdLine, length); + } cmdLine[numChars++] = c; cmdLine[numChars] = 0; } - else { - Reply(501, "Command line too long"); - esyslog("SVDRP: command line too long: '%s'", cmdLine); - numChars = 0; - } lastActivity = time(NULL); } else if (r < 0) { diff --git a/svdrp.h b/svdrp.h index 9275bf27..2e182f21 100644 --- a/svdrp.h +++ b/svdrp.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: svdrp.h 1.24 2005/10/09 11:11:59 kls Exp $ + * $Id: svdrp.h 1.25 2005/11/05 10:54:22 kls Exp $ */ #ifndef __SVDRP_H @@ -45,8 +45,9 @@ private: cFile file; cRecordings Recordings; cPUTEhandler *PUTEhandler; - uint numChars; - char cmdLine[MAXPARSEBUFFER]; + int numChars; + int length; + char *cmdLine; char *message; time_t lastActivity; void Close(bool Timeout = false); diff --git a/tools.h b/tools.h index cc4c9e30..c344fce2 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 1.82 2005/11/04 17:05:35 kls Exp $ + * $Id: tools.h 1.83 2005/11/05 10:54:39 kls Exp $ */ #ifndef __TOOLS_H @@ -38,8 +38,6 @@ extern int SysLogLevel; #define KILOBYTE(n) ((n) * 1024) #define MEGABYTE(n) ((n) * 1024 * 1024) -#define MAXPARSEBUFFER KILOBYTE(10) - #define MALLOC(type, size) (type *)malloc(sizeof(type) * (size)) #define DELETENULL(p) (delete (p), p = NULL)