enforce maximum sample size in sample cache
authorLennart Poettering <lennart@poettering.net>
Sun, 23 Apr 2006 20:59:09 +0000 (20:59 +0000)
committerLennart Poettering <lennart@poettering.net>
Sun, 23 Apr 2006 20:59:09 +0000 (20:59 +0000)
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@787 fefdeb5f-60dc-0310-8127-8f9354f1896f

src/polypcore/core-scache.c
src/polypcore/core-scache.h
src/polypcore/pstream.c
src/polypcore/sound-file.c

index 9c40762..2e8d453 100644 (file)
@@ -133,6 +133,9 @@ int pa_scache_add_item(pa_core *c, const char *name, const pa_sample_spec *ss, c
     pa_scache_entry *e;
     assert(c && name);
 
+    if (chunk->length > PA_SCACHE_ENTRY_SIZE_MAX)
+        return -1;
+
     if (!(e = scache_add_item(c, name)))
         return -1;
 
index 151d176..9ca05f8 100644 (file)
@@ -26,6 +26,8 @@
 #include <polypcore/memchunk.h>
 #include <polypcore/sink.h>
 
+#define PA_SCACHE_ENTRY_SIZE_MAX (1024*1024*2)
+
 typedef struct pa_scache_entry {
     pa_core *core;
     uint32_t index;
index b93dca0..09bd1e2 100644 (file)
@@ -37,6 +37,7 @@
 #include <polypcore/queue.h>
 #include <polypcore/xmalloc.h>
 #include <polypcore/log.h>
+#include <polypcore/core-scache.h>
 
 #include "pstream.h"
 
@@ -52,7 +53,7 @@ enum {
 typedef uint32_t pa_pstream_descriptor[PA_PSTREAM_DESCRIPTOR_MAX];
 
 #define PA_PSTREAM_DESCRIPTOR_SIZE (PA_PSTREAM_DESCRIPTOR_MAX*sizeof(uint32_t))
-#define FRAME_SIZE_MAX (1024*500) /* half a megabyte */
+#define FRAME_SIZE_MAX PA_SCACHE_ENTRY_SIZE_MAX /* allow uploading a single sample in one frame at max */
 
 struct item_info {
     enum { PA_PSTREAM_ITEM_PACKET, PA_PSTREAM_ITEM_MEMBLOCK } type;
@@ -419,7 +420,7 @@ static int do_read(pa_pstream *p) {
 
         /* Frame size too large */
         if (ntohl(p->read.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) > FRAME_SIZE_MAX) {
-            pa_log_warn(__FILE__": Frame size too large");
+            pa_log_warn(__FILE__": Frame size too large: %lu > %lu", (unsigned long) ntohl(p->read.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]), (unsigned long) FRAME_SIZE_MAX);
             return -1;
         }
         
index 7a4ef07..a6ccb06 100644 (file)
@@ -32,8 +32,7 @@
 #include <polypcore/log.h>
 
 #include "sound-file.h"
-
-#define MAX_FILE_SIZE (1024*1024)
+#include "core-scache.h"
 
 int pa_sound_file_load(const char *fname, pa_sample_spec *ss, pa_channel_map *map, pa_memchunk *chunk, pa_memblock_stat *s) {
     SNDFILE*sf = NULL;
@@ -78,7 +77,7 @@ int pa_sound_file_load(const char *fname, pa_sample_spec *ss, pa_channel_map *ma
     if (map)
         pa_channel_map_init_auto(map, ss->channels);
     
-    if ((l = pa_frame_size(ss)*sfinfo.frames) > MAX_FILE_SIZE) {
+    if ((l = pa_frame_size(ss)*sfinfo.frames) > PA_SCACHE_ENTRY_SIZE_MAX) {
         pa_log(__FILE__": File too large");
         goto finish;
     }
@@ -134,7 +133,7 @@ int pa_sound_file_too_big_to_cache(const char *fname) {
     ss.rate = sfinfo.samplerate;
     ss.channels = sfinfo.channels;
 
-    if ((pa_frame_size(&ss) * sfinfo.frames) > MAX_FILE_SIZE) {
+    if ((pa_frame_size(&ss) * sfinfo.frames) > PA_SCACHE_ENTRY_SIZE_MAX) {
         pa_log(__FILE__": File too large %s", fname);
         return 1;
     }