⬢ DragonFlyBSD Kernel Audit
DF-2234 / fix.diff
← back to finding ↓ download raw
--- a/sys/libiconv/iconv.c
+++ b/sys/libiconv/iconv.c
@@ -184,6 +184,8 @@
 	char *cp;
 	int csize, ucsto, ucsfrom;
 
+	if (strlen(to) >= ICONV_CSNMAXLEN || strlen(from) >= ICONV_CSNMAXLEN)
+		return EINVAL;
 	if (iconv_lookupcs(to, from, NULL) == 0)
 		return EEXIST;
 	csize = sizeof(*csp);
@@ -365,8 +367,8 @@
 		csi.cs_id = csp->cp_id;
 		csi.cs_refcount = csp->cp_refcount;
 		csi.cs_base = csp->cp_base ? csp->cp_base->cp_id : 0;
-		strcpy(csi.cs_to, csp->cp_to);
-		strcpy(csi.cs_from, csp->cp_from);
+		strlcpy(csi.cs_to, csp->cp_to, sizeof(csi.cs_to));
+		strlcpy(csi.cs_from, csp->cp_from, sizeof(csi.cs_from));
 		error = SYSCTL_OUT(req, &csi, sizeof(csi));
 		if (error)
 			break;