diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 84d6db11e6f49fdd8ff4adf4f3e3c8a3aab469fc..c79877a851e012a6acdd2d12efea23317c76a85e 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -572,12 +572,63 @@ static int outbound_auths_to_str(const void *obj, const intptr_t *args, char **b
 	return ast_sip_auths_to_str(&endpoint->outbound_auths, buf);
 }
 
+/*!
+ * \internal
+ * \brief Convert identify_by method to string.
+ *
+ * \param method Method value to convert to string
+ *
+ * \return String representation.
+ */
+static const char *sip_endpoint_identifier_type2str(enum ast_sip_endpoint_identifier_type method)
+{
+	const char *str = "<unknown>";
+
+	switch (method) {
+	case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME:
+		str = "username";
+		break;
+	case AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME:
+		str = "auth_username";
+		break;
+	case AST_SIP_ENDPOINT_IDENTIFY_BY_IP:
+		str = "ip";
+		break;
+	}
+	return str;
+}
+
+/*!
+ * \internal
+ * \brief Convert string to an endpoint identifier token.
+ *
+ * \param str String to convert
+ *
+ * \retval enum ast_sip_endpoint_identifier_type token value on success.
+ * \retval -1 on failure.
+ */
+static int sip_endpoint_identifier_str2type(const char *str)
+{
+	int method;
+
+	if (!strcasecmp(str, "username")) {
+		method = AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
+	} else if (!strcasecmp(str, "auth_username")) {
+		method = AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME;
+	} else if (!strcasecmp(str, "ip")) {
+		method = AST_SIP_ENDPOINT_IDENTIFY_BY_IP;
+	} else {
+		method = -1;
+	}
+	return method;
+}
+
 static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
 {
 	struct ast_sip_endpoint *endpoint = obj;
 	char *idents = ast_strdupa(var->value);
 	char *val;
-	enum ast_sip_endpoint_identifier_type method;
+	int method;
 
 	/*
 	 * If there's already something in the vector when we get here,
@@ -593,13 +644,8 @@ static int ident_handler(const struct aco_option *opt, struct ast_variable *var,
 			continue;
 		}
 
-		if (!strcasecmp(val, "username")) {
-			method = AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME;
-		} else if (!strcasecmp(val, "auth_username")) {
-			method = AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME;
-		} else if (!strcasecmp(val, "ip")) {
-			method = AST_SIP_ENDPOINT_IDENTIFY_BY_IP;
-		} else {
+		method = sip_endpoint_identifier_str2type(val);
+		if (method == -1) {
 			ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
 					val, ast_sorcery_object_get_id(endpoint));
 			AST_VECTOR_RESET(&endpoint->ident_method_order, AST_VECTOR_ELEM_CLEANUP_NOOP);
@@ -622,34 +668,41 @@ static int ident_to_str(const void *obj, const intptr_t *args, char **buf)
 {
 	const struct ast_sip_endpoint *endpoint = obj;
 	int methods;
-	char *method;
-	int i;
-	int j = 0;
+	int idx;
+	int buf_used = 0;
+	int buf_size = MAX_OBJECT_FIELD;
 
 	methods = AST_VECTOR_SIZE(&endpoint->ident_method_order);
 	if (!methods) {
 		return 0;
 	}
 
-	if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
+	*buf = ast_malloc(buf_size);
+	if (!*buf) {
 		return -1;
 	}
 
-	for (i = 0; i < methods; i++) {
-		switch (AST_VECTOR_GET(&endpoint->ident_method_order, i)) {
-		case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME :
-			method = "username";
-			break;
-		case AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME :
-			method = "auth_username";
-			break;
-		case AST_SIP_ENDPOINT_IDENTIFY_BY_IP :
-			method = "ip";
-			break;
-		default:
+	for (idx = 0; idx < methods; ++idx) {
+		enum ast_sip_endpoint_identifier_type method;
+		const char *method_str;
+
+		method = AST_VECTOR_GET(&endpoint->ident_method_order, idx);
+		method_str = sip_endpoint_identifier_type2str(method);
+
+		/* Should never have an "<unknown>" method string */
+		ast_assert(strcmp(method_str, "<unknown>"));
+		if (!strcmp(method_str, "<unknown>")) {
 			continue;
 		}
-		j = sprintf(*buf + j, "%s%s", method, i < methods - 1 ? "," : "");
+
+		buf_used += snprintf(*buf + buf_used, buf_size - buf_used, "%s%s",
+			method_str, idx < methods - 1 ? "," : "");
+		if (buf_size <= buf_used) {
+			/* Need more room than available, truncating. */
+			*(*buf + (buf_size - 1)) = '\0';
+			ast_log(LOG_WARNING, "Truncated identify_by string: %s\n", *buf);
+			break;
+		}
 	}
 
 	return 0;