Procházet zdrojové kódy

libdpkg: Use varbuf_grow instead of varbufextend

Guillem Jover před 17 roky
rodič
revize
dac03e12b4
2 změnil soubory, kde provedl 7 přidání a 10 odebrání
  1. 2 0
      debian/changelog
  2. 5 10
      lib/dpkg/varbuf.c

+ 2 - 0
debian/changelog

@@ -26,6 +26,8 @@ dpkg (1.15.5) UNRELEASED; urgency=low
   * Use the size from stat to allocate the buffers for readlink, instead of
   * Use the size from stat to allocate the buffers for readlink, instead of
     indefinitely calling readlink and growing the buffer. This should reduce
     indefinitely calling readlink and growing the buffer. This should reduce
     memory usage when handling lots of symlinks, and be slightly faster.
     memory usage when handling lots of symlinks, and be slightly faster.
+  * Rework varbuf api to avoid increasing buffers indefinitely when adding
+    content to them, regardless of space being already available.
 
 
   [ Raphaël Hertzog ]
   [ Raphaël Hertzog ]
   * Add versioned dependency on base-files (>= 5.0.0) to dpkg-dev to ensure
   * Add versioned dependency on base-files (>= 5.0.0) to dpkg-dev to ensure

+ 5 - 10
lib/dpkg/varbuf.c

@@ -32,19 +32,16 @@
 void
 void
 varbufaddc(struct varbuf *v, int c)
 varbufaddc(struct varbuf *v, int c)
 {
 {
-  if (v->used >= v->size) varbufextend(v);
+  varbuf_grow(v, 1);
   v->buf[v->used++]= c;
   v->buf[v->used++]= c;
 }
 }
 
 
 void
 void
 varbufdupc(struct varbuf *v, int c, size_t n)
 varbufdupc(struct varbuf *v, int c, size_t n)
 {
 {
-  size_t old_used = v->used;
-
+  varbuf_grow(v, n);
+  memset(v->buf + v->used, c, n);
   v->used += n;
   v->used += n;
-  if (v->used >= v->size) varbufextend(v);
-
-  memset(v->buf + old_used, c, n);
 }
 }
 
 
 void
 void
@@ -96,11 +93,9 @@ int varbufvprintf(struct varbuf *v, const char *fmt, va_list va) {
 void
 void
 varbufaddbuf(struct varbuf *v, const void *s, size_t size)
 varbufaddbuf(struct varbuf *v, const void *s, size_t size)
 {
 {
-  int ou;
-  ou= v->used;
+  varbuf_grow(v, size);
+  memcpy(v->buf + v->used, s, size);
   v->used += size;
   v->used += size;
-  if (v->used >= v->size) varbufextend(v);
-  memcpy(v->buf + ou, s, size);
 }
 }
 
 
 void
 void