From a346276d3084ab76f1d950bfc87f9bcafdcdcb91 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= <rene.kijewski@fu-berlin.de>
Date: Sat, 3 May 2014 18:55:38 +0200
Subject: [PATCH] ringbuffer: don't overwrite in `ringbuffer_add`

---
 sys/include/ringbuffer.h |  4 ++--
 sys/lib/ringbuffer.c     | 17 ++++++++++++-----
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/sys/include/ringbuffer.h b/sys/include/ringbuffer.h
index 7122b95560..1564fc962c 100644
--- a/sys/include/ringbuffer.h
+++ b/sys/include/ringbuffer.h
@@ -27,8 +27,8 @@ typedef struct ringbuffer {
 } ringbuffer_t;
 
 void ringbuffer_init(ringbuffer_t *restrict rb, char *buffer, unsigned bufsize);
-void ringbuffer_add_one(ringbuffer_t *restrict rb, char c);
-void ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n);
+int ringbuffer_add_one(ringbuffer_t *restrict rb, char c);
+unsigned ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n);
 int ringbuffer_get_one(ringbuffer_t *restrict rb);
 unsigned ringbuffer_get(ringbuffer_t *restrict rb, char *buf, unsigned n);
 
diff --git a/sys/lib/ringbuffer.c b/sys/lib/ringbuffer.c
index 588a6aeec2..084ae48f24 100644
--- a/sys/lib/ringbuffer.c
+++ b/sys/lib/ringbuffer.c
@@ -44,19 +44,26 @@ static char get_head(ringbuffer_t *restrict rb)
     return result;
 }
 
-void ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n)
+unsigned ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n)
 {
-    for (unsigned i = 0; i < n; i++) {
-        ringbuffer_add_one(rb, buf[i]);
+    unsigned i;
+    for (i = 0; i < n; i++) {
+        if (ringbuffer_full(rb)) {
+            break;
+        }
+        add_tail(rb, buf[i]);
     }
+    return i;
 }
 
-void ringbuffer_add_one(ringbuffer_t *restrict rb, char c)
+int ringbuffer_add_one(ringbuffer_t *restrict rb, char c)
 {
+    int result = -1;
     if (ringbuffer_full(rb)) {
-        get_head(rb);
+        result = (unsigned char) get_head(rb);
     }
     add_tail(rb, c);
+    return result;
 }
 
 int ringbuffer_get_one(ringbuffer_t *restrict rb)
-- 
GitLab