]> mj.ucw.cz Git - libucw.git/commitdiff
Added memory limit to bgets_bb().
authorPavel Charvat <pavel.charvat@netcentrum.cz>
Thu, 18 May 2006 10:55:58 +0000 (12:55 +0200)
committerPavel Charvat <pavel.charvat@netcentrum.cz>
Thu, 18 May 2006 10:55:58 +0000 (12:55 +0200)
lib/fastbuf.h
lib/ff-string.c

index d822ef6e4d25e235bb216902f02679544dc9c41c..6dbacce5dcebf52c73b5fdeac47cfd8511ceda23 100644 (file)
@@ -322,7 +322,7 @@ int bgets_nodie(struct fastbuf *f, byte *b, uns l);
 byte *bgets0(struct fastbuf *f, byte *b, uns l);
 
 struct mempool;
-uns bgets_bb(struct fastbuf *f, bb_t *b);
+uns bgets_bb(struct fastbuf *f, bb_t *b, uns limit);
 byte *bgets_mp(struct fastbuf *f, struct mempool *mp);
 
 struct bgets_stk_struct {
index 0f4c0b112dcf236689c4187e7d3c7edb9fdcb3d3..cb41b8c7c0f5ffa73a23f1b229f7f9874af433e9 100644 (file)
@@ -79,15 +79,16 @@ exit:
 }
 
 uns
-bgets_bb(struct fastbuf *f, bb_t *bb)
+bgets_bb(struct fastbuf *f, bb_t *bb, uns limit)
 {
+  ASSERT(limit);
   byte *src;
   uns src_len = bdirect_read_prepare(f, &src);
   if (!src_len)
     return 0;
   bb_grow(bb, 1);
   byte *buf = bb->ptr;
-  uns len = 0, buf_len = bb->len;
+  uns len = 0, buf_len = MIN(bb->len, limit);
   do
     {
       uns cnt = MIN(src_len, buf_len);
@@ -111,9 +112,11 @@ bgets_bb(struct fastbuf *f, bb_t *bb)
        src_len -= cnt;
       if (cnt == buf_len)
         {
+         if (unlikely(len == limit))
+            die("%s: Line too long", f->name);
          bb_do_grow(bb, len + 1);
          buf = bb->ptr + len;
-         buf_len = bb->len - len;
+         buf_len = MIN(bb->len, limit) - len;
        }
       else
        buf_len -= cnt;