diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 33abd7cf81cf4c1361ae7388ede6df2f2f457620..b24a904b4895b3f8a59bfc257fedf88e9a927b78 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -2843,7 +2843,9 @@ static int retrieve_file(char *dir, int msgnum)
 							}
 						}
 					}
-					truncate(full_fn, fdlen);
+					if (truncate(full_fn, fdlen) < 0) {
+						ast_log(LOG_WARNING, "Unable to truncate '%s': %s\n", full_fn, strerror(errno));
+					}
 				}
 			} else {
 				res = SQLGetData(stmt, x + 1, SQL_CHAR, rowdata, sizeof(rowdata), NULL);
diff --git a/channels/chan_features.c b/channels/chan_features.c
index 5da503f4cfcce7d0d6b0fa6e06935697ae28e41b..49400ad60bd94159136d1b0acf96f07c67f6bbe1 100644
--- a/channels/chan_features.c
+++ b/channels/chan_features.c
@@ -449,7 +449,11 @@ static struct ast_channel *features_new(struct feature_pvt *p, int state, int id
 	for (x=1;x<4;x++) {
 		if (b2)
 			ast_free(b2);
-		asprintf(&b2, "%s/%s-%d", p->tech, p->dest, x);
+		if (asprintf(&b2, "%s/%s-%d", p->tech, p->dest, x) < 0) {
+			ast_log(LOG_WARNING, "Unable to create channel name: %s\n", strerror(errno));
+			b2 = NULL;
+			continue;
+		}
 		for (y=0;y<3;y++) {
 			if (y == idx)
 				continue;
diff --git a/include/asterisk/stringfields.h b/include/asterisk/stringfields.h
index 4b18474154f76aba655f57382e6db630e9fcde47..20597a5913d51ff4137599cf070c6a78eccaba65 100644
--- a/include/asterisk/stringfields.h
+++ b/include/asterisk/stringfields.h
@@ -255,12 +255,16 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr,
 	const char *__d__ = (data);				\
 	size_t __dlen__ = (__d__) ? strlen(__d__) + 1 : 1;	\
 	const char **__p__ = (const char **) (ptr);		\
+	char *__q__; \
 	if (__dlen__ == 1)					\
 		*__p__ = __ast_string_field_empty;		\
-	else if (!__ast_string_field_ptr_grow(&(x)->__field_mgr, __dlen__, ptr)) \
-		memcpy((char *) *__p__, __d__, __dlen__);	\
-	else if ((*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) \
-		memcpy((char *) *__p__, __d__, __dlen__);	\
+	else if (!__ast_string_field_ptr_grow(&(x)->__field_mgr, __dlen__, ptr)) { \
+		__q__ = (char *) *__p__; \
+		memcpy(__q__, __d__, __dlen__);	\
+	} else if ((*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) { \
+		__q__ = (char *) *__p__; \
+		memcpy(__q__, __d__, __dlen__);	\
+	} \
 	} while (0)
 
 /*!
diff --git a/main/cli.c b/main/cli.c
index 6152867c12c63e0d4050677d10930ad5742cb43a..c4ffd392c6167821ddec6b700ae1e95ecdd65a59 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -1769,7 +1769,8 @@ static int __ast_cli_unregister(struct ast_cli_entry *e, struct ast_cli_entry *e
 		e->_full_cmd = NULL;
 		if (e->handler) {
 			/* this is a new-style entry. Reset fields and free memory. */
-			memset((char **)(e->cmda), '\0', sizeof(e->cmda));
+			char *cmda = (char *) e->cmda;
+			memset(cmda, '\0', sizeof(e->cmda));
 			ast_free(e->command);
 			e->command = NULL;
 			e->usage = NULL;
diff --git a/main/frame.c b/main/frame.c
index 35bb47fff154afd5acb71e4a8a87d788866c699d..8c0982b8c0bff594ce6d27d7ed0b6a046f61f017 100644
--- a/main/frame.c
+++ b/main/frame.c
@@ -478,9 +478,12 @@ struct ast_frame *ast_frdup(const struct ast_frame *f)
 		memcpy(out->data.ptr, f->data.ptr, out->datalen);	
 	}
 	if (srclen > 0) {
+		/* This may seem a little strange, but it's to avoid a gcc (4.2.4) compiler warning */
+		char *src;
 		out->src = buf + sizeof(*out) + AST_FRIENDLY_OFFSET + f->datalen;
+		src = (char *) out->src;
 		/* Must have space since we allocated for it */
-		strcpy((char *)out->src, f->src);
+		strcpy(src, f->src);
 	}
 	ast_copy_flags(out, f, AST_FRFLAG_HAS_TIMING_INFO);
 	out->ts = f->ts;
diff --git a/main/pbx.c b/main/pbx.c
index 974ca61531e5ca6e76c84f260c7bfe525edc51bf..1e6ce170e2f506ab0a25288e6ff87091f47bb04c 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -7077,14 +7077,19 @@ int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const
 {
 	struct ast_ignorepat *ignorepat, *ignorepatc, *ignorepatl = NULL;
 	int length;
+	char *pattern;
 	length = sizeof(struct ast_ignorepat);
 	length += strlen(value) + 1;
 	if (!(ignorepat = ast_calloc(1, length)))
 		return -1;
 	/* The cast to char * is because we need to write the initial value.
-	 * The field is not supposed to be modified otherwise
+	 * The field is not supposed to be modified otherwise.  Also, gcc 4.2
+	 * sees the cast as dereferencing a type-punned pointer and warns about
+	 * it.  This is the workaround (we're telling gcc, yes, that's really
+	 * what we wanted to do).
 	 */
-	strcpy((char *)ignorepat->pattern, value);
+	pattern = (char *) ignorepat->pattern;
+	strcpy(pattern, value);
 	ignorepat->next = NULL;
 	ignorepat->registrar = registrar;
 	ast_wrlock_context(con);