patch 8.2.2804: setting buffer local mapping with mapset() changes global

Problem:    Setting buffer local mapping with mapset() changes global mapping.
Solution:   Only set the local mapping. (closes #8143)
diff --git a/src/map.c b/src/map.c
index 917f1a2..f142db0 100644
--- a/src/map.c
+++ b/src/map.c
@@ -2295,6 +2295,7 @@
     int		noremap;
     int		expr;
     int		silent;
+    int		buffer;
     scid_T	sid;
     linenr_T	lnum;
     mapblock_T	**map_table = maphash;
@@ -2336,18 +2337,31 @@
     silent = dict_get_number(d, (char_u *)"silent") != 0;
     sid = dict_get_number(d, (char_u *)"sid");
     lnum = dict_get_number(d, (char_u *)"lnum");
-    if (dict_get_number(d, (char_u *)"buffer"))
+    buffer = dict_get_number(d, (char_u *)"buffer");
+    nowait = dict_get_number(d, (char_u *)"nowait") != 0;
+    // mode from the dict is not used
+
+    if (buffer)
     {
 	map_table = curbuf->b_maphash;
 	abbr_table = &curbuf->b_first_abbr;
     }
-    nowait = dict_get_number(d, (char_u *)"nowait") != 0;
-    // mode from the dict is not used
 
     // Delete any existing mapping for this lhs and mode.
-    arg = vim_strsave(lhs);
-    if (arg == NULL)
-	return;
+    if (buffer)
+    {
+	arg = alloc(STRLEN(lhs) + STRLEN("<buffer>") + 1);
+	if (arg == NULL)
+	    return;
+	STRCPY(arg, "<buffer>");
+	STRCPY(arg + 8, lhs);
+    }
+    else
+    {
+	arg = vim_strsave(lhs);
+	if (arg == NULL)
+	    return;
+    }
     do_map(1, arg, mode, is_abbr);
     vim_free(arg);