summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY6
-rw-r--r--svdrp.c21
-rw-r--r--svdrp.h7
-rw-r--r--tools.h4
4 files changed, 24 insertions, 14 deletions
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)