diff options
| author | Klaus Schmidinger <vdr@tvdr.de> | 2005-11-05 11:21:38 +0100 | 
|---|---|---|
| committer | Klaus Schmidinger <vdr@tvdr.de> | 2005-11-05 11:21:38 +0100 | 
| commit | 9607fd33a061530b3e26e2ffae14e87548b016ba (patch) | |
| tree | a5a4ef45553f9c87e4dba63be285823b819ce009 | |
| parent | 92af12daac8a33db8be0b33335bd79330ced9463 (diff) | |
| download | vdr-9607fd33a061530b3e26e2ffae14e87548b016ba.tar.gz vdr-9607fd33a061530b3e26e2ffae14e87548b016ba.tar.bz2 | |
cSVDRP now dynamically allocates its command buffer
| -rw-r--r-- | HISTORY | 6 | ||||
| -rw-r--r-- | svdrp.c | 21 | ||||
| -rw-r--r-- | svdrp.h | 7 | ||||
| -rw-r--r-- | tools.h | 4 | 
4 files changed, 24 insertions, 14 deletions
| @@ -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. @@ -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) { @@ -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); @@ -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) | 
