osmo_hexdump: Fix segfault when input is too long.
[osmocom-bb.git] / src / utils.c
index 2155885..e1d4c89 100644 (file)
@@ -4,7 +4,7 @@
 #include <errno.h>
 #include <stdio.h>
 
-#include <osmocore/utils.h>
+#include <osmocom/core/utils.h>
 
 static char namebuf[255];
 const char *get_value_string(const struct value_string *vs, uint32_t val)
@@ -35,7 +35,7 @@ int get_string_value(const struct value_string *vs, const char *str)
        return -EINVAL;
 }
 
-char bcd2char(uint8_t bcd)
+char osmo_bcd2char(uint8_t bcd)
 {
        if (bcd < 0xa)
                return '0' + bcd;
@@ -43,13 +43,13 @@ char bcd2char(uint8_t bcd)
                return 'A' + (bcd - 0xa);
 }
 
-/* only works for numbers in ascci */
-uint8_t char2bcd(char c)
+/* only works for numbers in ascii */
+uint8_t osmo_char2bcd(char c)
 {
        return c - 0x30;
 }
 
-int hexparse(const char *str, uint8_t *b, int max_len)
+int osmo_hexparse(const char *str, uint8_t *b, int max_len)
 
 {
        int i, l, v;
@@ -78,7 +78,7 @@ int hexparse(const char *str, uint8_t *b, int max_len)
 
 static char hexd_buff[4096];
 
-static char *_hexdump(const unsigned char *buf, int len, char *delim)
+static char *_osmo_hexdump(const unsigned char *buf, int len, char *delim)
 {
        int i;
        char *cur = hexd_buff;
@@ -86,6 +86,8 @@ static char *_hexdump(const unsigned char *buf, int len, char *delim)
        hexd_buff[0] = 0;
        for (i = 0; i < len; i++) {
                int len_remain = sizeof(hexd_buff) - (cur - hexd_buff);
+               if (len_remain <= 0)
+                       break;
                int rc = snprintf(cur, len_remain, "%02x%s", buf[i], delim);
                if (rc <= 0)
                        break;
@@ -95,12 +97,64 @@ static char *_hexdump(const unsigned char *buf, int len, char *delim)
        return hexd_buff;
 }
 
-char *hexdump(const unsigned char *buf, int len)
+char *osmo_ubit_dump(const uint8_t *bits, unsigned int len)
 {
-       return _hexdump(buf, len, " ");
+       int i;
+
+       if (len > sizeof(hexd_buff)-1)
+               len = sizeof(hexd_buff)-1;
+       memset(hexd_buff, 0, sizeof(hexd_buff));
+
+       for (i = 0; i < len; i++) {
+               char outch;
+               switch (bits[i]) {
+               case 0:
+                       outch = '0';
+                       break;
+               case 0xff:
+                       outch = '?';
+                       break;
+               case 1:
+                       outch = '1';
+                       break;
+               default:
+                       outch = 'E';
+                       break;
+               }
+               hexd_buff[i] = outch;
+       }
+       hexd_buff[sizeof(hexd_buff)-1] = 0;
+       return hexd_buff;
 }
 
-char *hexdump_nospc(const unsigned char *buf, int len)
+char *osmo_hexdump(const unsigned char *buf, int len)
 {
-       return _hexdump(buf, len, "");
+       return _osmo_hexdump(buf, len, " ");
+}
+
+char *osmo_osmo_hexdump_nospc(const unsigned char *buf, int len)
+{
+       return _osmo_hexdump(buf, len, "");
+}
+
+#include "../config.h"
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+void osmo_str2lower(char *out, const char *in)
+{
+       unsigned int i;
+
+       for (i = 0; i < strlen(in); i++)
+               out[i] = tolower(in[i]);
+       out[strlen(in)] = '\0';
+}
+
+void osmo_str2upper(char *out, const char *in)
+{
+       unsigned int i;
+
+       for (i = 0; i < strlen(in); i++)
+               out[i] = toupper(in[i]);
+       out[strlen(in)] = '\0';
 }
+#endif /* HAVE_CTYPE_H */