Blob Blame History Raw
From: Liviu Chircu <liviu@opensips.org>
Date: Fri, 2 Feb 2018 16:21:23 +0200
Subject: [PATCH] ut.h: Minor additions

    * add shm_str_sync() and shm_str_clean()
    * improve robustness during error states

(cherry picked from commit 664aee60dabb0f9a4454b0d4a090d81c6b7a6fc4)

diff --git a/ut.h b/ut.h
index d3c39f380..3476a5832 100644
--- a/ut.h
+++ b/ut.h
@@ -595,6 +595,7 @@ static inline int shm_str_dup(str* dst, const str* src)
 	dst->s = shm_malloc(src->len);
 	if (!dst->s) {
 		LM_ERR("no shared memory left\n");
+		dst->len = 0;
 		return -1;
 	}
 
@@ -603,6 +604,7 @@ static inline int shm_str_dup(str* dst, const str* src)
 	return 0;
 }
 
+
 /*
  * Make a copy of an str structure using shm_malloc
  *	  + an additional '\0' byte, so you can make use of dst->s
@@ -617,6 +619,7 @@ static inline int shm_nt_str_dup(str* dst, const str* src)
 	dst->s = shm_malloc(src->len + 1);
 	if (!dst->s) {
 		LM_ERR("no shared memory left\n");
+		dst->len = 0;
 		return -1;
 	}
 
@@ -661,15 +664,49 @@ static inline int shm_str_resize(str *in, int size)
 	return 0;
 }
 
+
+/*
+ * Ensure "dst" matches the content of "src" without leaking memory
+ *
+ * Note: if you just want to dup a string, use "shm_str_dup()" instead
+ */
+static inline int shm_str_sync(str* dst, const str* src)
+{
+	if (!src || !src->s || src->len == 0) {
+		if (dst->s)
+			shm_free(dst->s);
+		memset(dst, 0, sizeof *dst);
+		return 0;
+	}
+
+	if (shm_str_resize(dst, src->len) != 0) {
+		LM_ERR("oom\n");
+		return -1;
+	}
+
+	memcpy(dst->s, src->s, src->len);
+	dst->len = src->len;
+	return 0;
+}
+
+
+static inline void shm_str_clean(str* dst)
+{
+	if (dst->s)
+		shm_free(dst->s);
+	memset(dst, 0, sizeof *dst);
+}
+
+
 /*
  * Make a copy of a str structure using pkg_malloc
  */
 static inline int pkg_str_dup(str* dst, const str* src)
 {
 	dst->s = pkg_malloc(src->len);
-	if (dst->s==NULL)
-	{
+	if (!dst->s) {
 		LM_ERR("no private memory left\n");
+		dst->len = 0;
 		return -1;
 	}