Blob Blame History Raw
diff -Nura pkgconf-1.8.0/libpkgconf/tuple.c pkgconf-1.8.0_new/libpkgconf/tuple.c
--- pkgconf-1.8.0/libpkgconf/tuple.c	2021-03-18 20:15:16.000000000 +0800
+++ pkgconf-1.8.0_new/libpkgconf/tuple.c	2023-01-30 16:07:40.750297141 +0800
@@ -293,12 +293,23 @@
 				}
 			}
 
+                        PKGCONF_TRACE(client, "lookup tuple %s", varname);
+
+                        size_t remain = PKGCONF_BUFSIZE - (bptr - buf);
 			ptr += (pptr - ptr);
 			kv = pkgconf_tuple_find_global(client, varname);
 			if (kv != NULL)
 			{
-				strncpy(bptr, kv, PKGCONF_BUFSIZE - (bptr - buf));
-				bptr += strlen(kv);
+                       	        size_t nlen = pkgconf_strlcpy(bptr, kv, remain);
+				if (nlen > remain)
+				{
+					pkgconf_warn(client, "warning: truncating very long variable to 64KB\n");
+
+					bptr = buf + (PKGCONF_BUFSIZE - 1);
+					break;
+				}
+
+				bptr += nlen;
 			}
 			else
 			{
@@ -306,12 +317,20 @@
 
 				if (kv != NULL)
 				{
+                                        size_t nlen;
+
 					parsekv = pkgconf_tuple_parse(client, vars, kv);
+                                        nlen = pkgconf_strlcpy(bptr, parsekv, remain);
+					free(parsekv);
 
-					strncpy(bptr, parsekv, PKGCONF_BUFSIZE - (bptr - buf));
-					bptr += strlen(parsekv);
+                                        if (nlen > remain)
+                                        {
+                                                pkgconf_warn(client, "warning: truncating very long variable to 64KB\n");
+                                                bptr = buf + (PKGCONF_BUFSIZE - 1);
+                                                break;
+                                        }
 
-					free(parsekv);
+                                        bptr += nlen;
 				}
 			}
 		}