From unknown Thu Aug 14 18:39:46 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#70188 <70188@debbugs.gnu.org> To: bug#70188 <70188@debbugs.gnu.org> Subject: Status: [PATCH] Fix + ert for notification sending 'set unbound' when unbinding (7 of 9) Reply-To: bug#70188 <70188@debbugs.gnu.org> Date: Fri, 15 Aug 2025 01:39:46 +0000 retitle 70188 [PATCH] Fix + ert for notification sending 'set unbound' when= unbinding (7 of 9) reassign 70188 emacs submitter 70188 Robert Burks severity 70188 normal tag 70188 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Thu Apr 04 05:18:01 2024 Received: (at submit) by debbugs.gnu.org; 4 Apr 2024 09:18:02 +0000 Received: from localhost ([127.0.0.1]:60543 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rsJEL-0004lZ-Uh for submit@debbugs.gnu.org; Thu, 04 Apr 2024 05:18:01 -0400 Received: from lists.gnu.org ([2001:470:142::17]:32934) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rsIle-00021i-A9 for submit@debbugs.gnu.org; Thu, 04 Apr 2024 04:48:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rsIlU-0002wq-2R for bug-gnu-emacs@gnu.org; Thu, 04 Apr 2024 04:48:08 -0400 Received: from mail-qv1-xf36.google.com ([2607:f8b0:4864:20::f36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rsIlR-0002K2-TN for bug-gnu-emacs@gnu.org; Thu, 04 Apr 2024 04:48:07 -0400 Received: by mail-qv1-xf36.google.com with SMTP id 6a1803df08f44-69935d567a0so1260566d6.1 for ; Thu, 04 Apr 2024 01:48:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712220485; x=1712825285; darn=gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=YIr1A67jM87WM2l8yagvIKcaQmi9j5trSLT+qF+rVM0=; b=jnWv1qiZFyN2M/VqA2VQY6K2OapqdJjD682qDcnHVGXWLIIiJWSop6AGsLIaIq5esK JM0AULuN2EZQQrbE2yts7yp35NmUgNH81H/WX9ThoaxvYU98Ohy8rfiN/c4JtHdYpAvf ohsbWToIExf908Hfmpcuxl43YzL0xz+OqVm6J9LqSTTjDU9/5EO684bgLs7wCn22/h6H bNLN/tx8nN1OdT0UBek0eeVy4prSMmjQwGG8Pnp/R+VccPul9KTSBWg2e1SzrjJfc2Ax WRciwmoA7VGP6FQWdN+qLhPT1/SD/+xBlKAsOUOS6AVKH91rJSbFEzH5/koqBWxedyvg yTlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712220485; x=1712825285; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=YIr1A67jM87WM2l8yagvIKcaQmi9j5trSLT+qF+rVM0=; b=tp94qgIlrjv8SxQ9ipWEilzFBRbkkbjqEDHBWugaeuK6TDBt5ZlxV2r4Wye83hVPXU OrN3/KF+uPXUI+oIFVYYIKOAc3/y2OQ7Mv96htMdVaHuUI30ycnjFW+Css3w6MB5xKEe gIMSY+3UKHkZGAa4dk39XvsyQnhtNVr2fY/sq1GNdIoJUivSniUvTFyFJRjhYhv1ujtl fDHnUOXdo4bL+lo1UYm6WMNIAtFRN0EoeSL686I9w0ZatlDP1EEdv1zmqKAdYnKGjkuA LD0sD2TtLImoyCOIgFNQMGamTDDet2Ix9p5ylT9BkeTUgFCP7cFlJZeW7+DxzX9u6xTQ 0NgQ== X-Gm-Message-State: AOJu0YxBIs7AZZgGBAaWYjifTicw3xsTBjRxbcWTyFj4vweqLlhxIlI/ mvMjg34BPjQvc/FqC2B91vRWKQUZul0YjO4VY/IUrwZksjsMYQbWNPtNk1yIRXeJw4zv74LnsNB 4cN4uXX2mmjI8PKBSaiF0UKNpoDT+JUs= X-Google-Smtp-Source: AGHT+IGShpioozLnIrHIIWdI5vE8dyCAZvI9FC9IcGATkgJOCdQGLegzJEzVdF0Sc36PqjFIfW/yHLJARV64COIkmNM= X-Received: by 2002:a05:6214:23cf:b0:699:a2d:d794 with SMTP id hr15-20020a05621423cf00b006990a2dd794mr1755844qvb.50.1712220484674; Thu, 04 Apr 2024 01:48:04 -0700 (PDT) MIME-Version: 1.0 From: Robert Burks Date: Thu, 4 Apr 2024 04:46:47 -0400 Message-ID: Subject: [PATCH] Fix + ert for notification sending 'set unbound' when unbinding (7 of 9) To: GNU BUGS Content-Type: multipart/mixed; boundary="000000000000c4771f0615416507" Received-SPF: pass client-ip=2607:f8b0:4864:20::f36; envelope-from=rburksdev@gmail.com; helo=mail-qv1-xf36.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Thu, 04 Apr 2024 05:17:46 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) --000000000000c4771f0615416507 Content-Type: multipart/alternative; boundary="000000000000c4771d0615416505" --000000000000c4771d0615416505 Content-Type: text/plain; charset="UTF-8" (7 of 9) (Resistance is futile) Bug#00006 (The mysterious unlet to 'unbound') ** Bug recreations are at the end Once again the path from do_one_unbind leads to rare cases in set_default_internal. I have included a fix and ert. The case is do_one_unbind calls set_default_internal (foo , Qunbound, SET_INTERNAL_UNBIND) -- We reach here with Qunbound as a value only when unletting if when 'letting' the buffer saw the void default/global value. -- make_local_foo called for the first time within a let on a variable that is globally void. -- make_local_foo was called in some other buffer and a let takes place in a buffer that still sees the default as void. (let_shadows_default) -- The 'local_if_set' shadows default case cannot reach here with 'unbound' as a value, even with something like this: (defvar foo) (make-variable-buffer-local 'foo) This will establish a default of 'nil'. -- I don't think there are any other ways set_default_internal is being called with Qunbound as value on localized variables. -- My included test is the only test in data-tests.el(maybe all testing) that hits the above conditions. -- Currently it stores Qunbound to the cdr of blv->defcell and returns. This seems correct. -- I have only tested plain values. Forward symbols like DEFVAR_LISP and DEFVAR_BOOL (not DEFVAR_PER_BUFFER) could reach here with 'Qunbound' as 'new value' if they start their life unbound. If makunbound is used on one they get turned to plain value by set_internal. But if they are set unbound in 'C' who knows. Maybe we need to check for void and do blv->fwd.fwdptr = NULL? Will need testing... First example is 'make_local_foo' happened in some other buffer so the 'let' in this buffer now shadows the default. Second example is 'make_local_foo' happened in a 'let' making it 'unlet' to default. There still may exist other edge cases, I am working to uncover those. Every bug example I have sent has been fixed by the patches included in these seven emails. Additionally, the work I have submitted does not change the way Emacs handles the numerous scenarios around variable setting; it merely makes watcher notification reflect the already defined behavior. Patch 0021: Fix for this bug (one(1) place requires bug# update) Patch 0022: Make it so functions pass 'Qunbound' to 'notify' and do conversion to 'Qnil' there. This allows easier tracking in gdb, it was hard to isolate prior. Distinction may also be needed in the future by watchers. Patch 0023: ert for this bug (four(4) places require bug# update) Bug Recreation------------------------------------------------------------------ This path can only be reached through the special path from do_one_unbind that leads to set_default_internal. -------------------------------------------------------------------------------- (defvar test) test (defvar results nil) results (add-variable-watcher 'test (lambda (&rest args) (push args results))) nil (with-temp-buffer (make-local-variable 'test) (let ((test 99)) (set 'test 66))) 66 (let ((test 99)) (set 'test 66)) 66 results ((test unbound set nil) (test 66 set nil) (test 99 let nil) (test nil unlet #) (test 66 set #) (test 99 let #)) ;; notice it says 'unbound' vs 'nil', all other functions that notify use 'nil' ;; for the unbound case. 'test' is still unbound globally. It is returning a ;; potential legitimate symbol 'unbound' because it is sending the 'C' string ;; definition for Qunbound; ;; Also, this should say 'unlet' (This was fixed with the bug#00004/5 solution) -------------------------------------------------------------------------------- Extra broke case -------------------------------------------------------------------------------- (defvar test) test (defvar results nil) results (add-variable-watcher 'test (lambda (&rest args) (push args results))) nil (let ((test 99)) (make-local-variable 'test) (set 'test 66)) 66 test 66 results ((test unbound set nil) (test 66 set #) (test 99 let nil)) ;; should be (test nil unlet nil) as it is now 66 in *scratch* but void globally Not a Bugged Case**************************************************************** Notice this case works. One of the rare cases already tested for. -------------------------------------------------------------------------------- (defvar test) test (defvar results nil) results (add-variable-watcher 'test (lambda (&rest args) (push args results))) nil (make-local-variable 'test) test (let ((test 99)) (set 'test 66)) 66 results ((test nil unlet #) (test 66 set #) (test 99 let #)) --000000000000c4771d0615416505 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
(7 of 9) (Resistance is futile)

Bug#00006 (The myst= erious unlet to 'unbound')
** Bug recreations are at the end
=
Once again the path from do_one_unbind leads to rare cases in
set_de= fault_internal.=C2=A0 I have included a fix and ert.

The case is do_= one_unbind calls set_default_internal (foo , Qunbound, SET_INTERNAL_UNBIND)=
-- We reach here with Qunbound as a value only when unletting if when &= #39;letting'
=C2=A0 =C2=A0the buffer saw the void default/global val= ue.
-- make_local_foo called for the first time within a let on a varia= ble that is globally void.
-- make_local_foo was called in some other bu= ffer and a let takes place in a buffer that
=C2=A0 =C2=A0still sees the = default as void. (let_shadows_default)
-- The 'local_if_set' sha= dows default case cannot reach here with 'unbound' as a value,
= =C2=A0 =C2=A0even with something like this:
=C2=A0 =C2=A0(defvar foo)=C2=A0 =C2=A0(make-variable-buffer-local 'foo)
=C2=A0 =C2=A0This wi= ll establish a default of 'nil'.
-- I don't think there are= any other ways set_default_internal is being called
=C2=A0 =C2=A0with Q= unbound as value on localized variables.
-- My included test is the only= test in data-tests.el(maybe all testing) that
=C2=A0 =C2=A0hits the abo= ve conditions.

-- Currently it stores Qunbound to the cdr of blv->= ;defcell and returns.=C2=A0 This seems correct.
-- I have only tested pl= ain values.=C2=A0 Forward symbols like DEFVAR_LISP and DEFVAR_BOOL
=C2= =A0 =C2=A0(not DEFVAR_PER_BUFFER) could reach here with 'Qunbound' = as 'new value' if they start
=C2=A0 =C2=A0their life unbound.=C2= =A0 If makunbound is used on one they get turned to plain value
=C2=A0 = =C2=A0by set_internal.=C2=A0 But if they are set unbound in 'C' who= knows.
=C2=A0 =C2=A0Maybe we need to check for void and do blv->fwd.= fwdptr =3D NULL? Will need testing...

First example is 'make_loc= al_foo' happened in some other buffer so the 'let' in this
b= uffer now shadows the default.

Second example is 'make_local_foo= ' happened in a 'let' making it 'unlet' to default.
There still may exist other edge cases, I am working to uncover those.= =C2=A0 Every bug
example I have sent has been fixed by the patches inclu= ded in these seven emails.

Additionally, the work I have submitted d= oes not change the way Emacs handles the
numerous scenarios around varia= ble setting; it merely makes watcher notification
reflect the already de= fined behavior.

Patch 0021: =C2=A0Fix for this bug (one(1) place req= uires bug# update)

Patch 0022: =C2=A0Make it so functions pass '= Qunbound' to 'notify' and do conversion
=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0to 'Qnil' there.=C2=A0 This allows easi= er tracking in gdb, it was hard
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0to isolate prior.=C2=A0 Distinction may also be needed in the fut= ure by
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0watchers. =C2=A0<= br>
Patch 0023: =C2=A0ert for this bug (four(4) places require bug# upda= te)

Bug Recreation--------------------------------------------------= ----------------

This path can only be reached through the special p= ath from do_one_unbind that
leads to set_default_internal.
----------= ----------------------------------------------------------------------
(= defvar test)
test

(defvar results nil)
results

(add-var= iable-watcher 'test (lambda (&rest args)
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 (push args results)))
nil

(with-temp-buffer
=C2=A0 = (make-local-variable 'test)
=C2=A0 (let ((test 99))
=C2=A0 =C2=A0= (set 'test 66)))
66

(let ((test 99))
=C2=A0 (set 'tes= t 66))
66

results
((test unbound set nil) (test 66 set nil) (t= est 99 let nil) (test nil unlet #<killed buffer>) (test 66 set #<k= illed buffer>) (test 99 let #<killed buffer>))
;; notice it say= s 'unbound' vs 'nil', all other functions that notify use &= #39;nil'
;; for the unbound case. =C2=A0'test' is still unbo= und globally.=C2=A0 It is returning a
;; potential legitimate symbol = 9;unbound' because it is sending the 'C' string
;; definitio= n for Qunbound;
;; Also, this should say 'unlet' (This was fixed= with the bug#00004/5 solution)
----------------------------------------= ----------------------------------------
Extra broke case
-----------= ---------------------------------------------------------------------
(d= efvar test)
test

(defvar results nil)
results

(add-vari= able-watcher 'test (lambda (&rest args)
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (push args results)))
nil

(let ((test 99))
=C2=A0 (make= -local-variable 'test)
=C2=A0 (set 'test 66))
66

test<= br>66

results
((test unbound set nil) (test 66 set #<buffer *s= cratch*>) (test 99 let nil))
;; should be (test nil unlet nil) as it = is now 66 in *scratch* but void globally


Not a Bugged Case******= **********************************************************
Notice this c= ase works. One of the rare cases already tested for.
-------------------= -------------------------------------------------------------
(defvar te= st)
test

(defvar results nil)
results

(add-variable-wat= cher 'test (lambda (&rest args)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= push args results)))
nil

(make-local-variable 'test)
test<= br>
(let ((test 99))
=C2=A0 (set 'test 66))
66

results<= br>((test nil unlet #<buffer *scratch*>) (test 66 set #<buffer *sc= ratch*>) (test 99 let #<buffer *scratch*>))
--000000000000c4771d0615416505-- --000000000000c4771f0615416507 Content-Type: application/x-patch; name="0022-Functions-will-now-pass-Qunbound-to-notify_variable_.patch" Content-Disposition: attachment; filename="0022-Functions-will-now-pass-Qunbound-to-notify_variable_.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lukwgjge1 RnJvbSA3NTM2ZjZjODVjZDdhODc4ZDMwMjMzYTgwNWY4ZWRlZTAzMzI4YWY3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiUm9iZXJ0IEEuIEJ1cmtzIiA8cmJ1cmtzZGV2QGdtYWlsLmNv bT4KRGF0ZTogVHVlLCAxOSBNYXIgMjAyNCAxNzo1MTo0MyAtMDQwMApTdWJqZWN0OiBbUEFUQ0gg MjIvMzFdICogRnVuY3Rpb25zIHdpbGwgbm93IHBhc3MgJ1F1bmJvdW5kJyB0bwogJ25vdGlmeV92 YXJpYWJsZV93YXRjaGVzJwoKJ25vdGlmeSB2YXJpYWJsZV93YXRjaGVycycgd2lsbCBjb252ZXJ0 IHRvICdRbmlsJyBmb3Igbm90aWZpY2F0aW9uLgpUaGlzIGFsbG93cyBmb3IgdHJhY2tpbmcgdGhl IHNvdXJjZSBvZiAnUXVuYm91bmQnIHZzICdRbmlsJyBhbmQgYWxzbwphbGxvd3MgZm9yIGFueSBm dXR1cmUgbmVlZCB0byAgZGlmZmVyZW50aWF0ZSB0aGUgdHdvLgoKKiBzcmMvYnVmZmVyLmMgKHJl c2V0X2J1ZmZlcl9sb2NhbF92YXJpYWJsZXMpOgoqIHNyYy9kYXRhLmMgKHNldF9pbnRlcm5hbCkg KG5vdGlmeV92YXJpYWJsZV93YXRjaGVycykKKHNldF9kZWZhdWx0X2ludGVybmFsKSAoa2lsbC1s b2NhbC12YXJpYWJsZXMpOgotLS0KIHNyYy9idWZmZXIuYyB8ICAyICstCiBzcmMvZGF0YS5jICAg fCAyNiArKysrKysrKysrKysrKysrKystLS0tLS0tLQogMiBmaWxlcyBjaGFuZ2VkLCAxOSBpbnNl cnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9idWZmZXIuYyBiL3Ny Yy9idWZmZXIuYwppbmRleCAyOTFjN2QzZjkxMS4uYjZjYzQ0MjllOTIgMTAwNjQ0Ci0tLSBhL3Ny Yy9idWZmZXIuYworKysgYi9zcmMvYnVmZmVyLmMKQEAgLTExNTcsNyArMTE1Nyw3IEBAIHJlc2V0 X2J1ZmZlcl9sb2NhbF92YXJpYWJsZXMgKHN0cnVjdCBidWZmZXIgKmIsIGJvb2wgcGVybWFuZW50 X3RvbykKIAogICAgICAgICAgIC8qIFdhdGNoZXJzIGFyZSBydW4gKmJlZm9yZSogbW9kaWZ5aW5n IHRoZSB2YXIuICAqLwogICAgICAgICAgIGlmIChYU1lNQk9MIChsb2NhbF92YXIpLT51LnMudHJh cHBlZF93cml0ZSA9PSBTWU1CT0xfVFJBUFBFRF9XUklURSkKLSAgICAgICAgICAgIG5vdGlmeV92 YXJpYWJsZV93YXRjaGVycyAobG9jYWxfdmFyLCBRbmlsLAorICAgICAgICAgICAgbm90aWZ5X3Zh cmlhYmxlX3dhdGNoZXJzIChsb2NhbF92YXIsIFF1bmJvdW5kLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBRbWFrdW5ib3VuZCwgRmN1cnJlbnRfYnVmZmVyICgpKTsKIAog ICAgICAgICAgIGVhc3NlcnQgKFhTWU1CT0wgKHN5bSktPnUucy5yZWRpcmVjdCA9PSBTWU1CT0xf TE9DQUxJWkVEKTsKZGlmZiAtLWdpdCBhL3NyYy9kYXRhLmMgYi9zcmMvZGF0YS5jCmluZGV4IGM2 YTQzYWZmODgyLi5jNzk5Y2QxOGM0OCAxMDA2NDQKLS0tIGEvc3JjL2RhdGEuYworKysgYi9zcmMv ZGF0YS5jCkBAIC0xNjU4LDcgKzE2NTgsNyBAQCBzZXRfaW50ZXJuYWwgKExpc3BfT2JqZWN0IHN5 bWJvbCwgTGlzcF9PYmplY3QgbmV3dmFsLCBMaXNwX09iamVjdCB3aGVyZSwKIAkvKiBJZiB3YXRj aGVkIG5vdGlmeS4gUGxhaW4gdmFsdWVzIGFyZSBoYW5kbGVkIGJ5ICd1bnJld2luZCcuCiAJICAg V2Ugd2lsbCBub3QgcmVhY2ggaGVyZSBkdXJpbmcgdGhyZWFkIHN3aXRjaC4gICovCiAJaWYgKHN5 bS0+dS5zLnRyYXBwZWRfd3JpdGUgPT0gU1lNQk9MX1RSQVBQRURfV1JJVEUpCi0JICBub3RpZnlf dmFyaWFibGVfd2F0Y2hlcnMgKHN5bWJvbCwgdm9pZGU/IFFuaWwgOiBuZXd2YWwsCisJICBub3Rp ZnlfdmFyaWFibGVfd2F0Y2hlcnMgKHN5bWJvbCwgbmV3dmFsLAogCQkJCSAgICAoYmluZGZsYWcg PT0gU0VUX0lOVEVSTkFMX0JJTkQ/IFFsZXQgOgogCQkJCSAgICAgYmluZGZsYWcgPT0gU0VUX0lO VEVSTkFMX1VOQklORD8gUXVubGV0IDoKIAkJCQkgICAgIHZvaWRlPyBRbWFrdW5ib3VuZCA6IFFz ZXQpLCBRbmlsKTsKQEAgLTE2ODMsNyArMTY4Myw3IEBAIHNldF9pbnRlcm5hbCAoTGlzcF9PYmpl Y3Qgc3ltYm9sLCBMaXNwX09iamVjdCBuZXd2YWwsIExpc3BfT2JqZWN0IHdoZXJlLAogCQkgICAg ICAgICYmICFsZXRfc2hhZG93c19idWZmZXJfYmluZGluZ19wIChzeW0pKSkpCiAJICAgICAgWFNF VEJVRkZFUiAod2hlcmUsIGN1cnJlbnRfYnVmZmVyKTsKIAotCSAgICBub3RpZnlfdmFyaWFibGVf d2F0Y2hlcnMgKHN5bWJvbCwgdm9pZGU/IFFuaWwgOiBuZXd2YWwsCisJICAgIG5vdGlmeV92YXJp YWJsZV93YXRjaGVycyAoc3ltYm9sLCBuZXd2YWwsCiAJCQkJICAgICAgKGJpbmRmbGFnID09IFNF VF9JTlRFUk5BTF9CSU5EPyBRbGV0IDoKIAkJCQkgICAgICAgYmluZGZsYWcgPT0gU0VUX0lOVEVS TkFMX1VOQklORD8gUXVubGV0IDoKIAkJCQkgICAgICAgdm9pZGU/IFFtYWt1bmJvdW5kIDogUXNl dCksIHdoZXJlKTsKQEAgLTE4MTAsNyArMTgxMCw3IEBAIHNldF9pbnRlcm5hbCAoTGlzcF9PYmpl Y3Qgc3ltYm9sLCBMaXNwX09iamVjdCBuZXd2YWwsIExpc3BfT2JqZWN0IHdoZXJlLAogCQkmJiBC VUZGRVJfT0JKRldEUCAoaW5uZXJjb250ZW50cykpCiAJICAgICAgWFNFVEJVRkZFUiAod2hlcmUs IGN1cnJlbnRfYnVmZmVyKTsKIAotCSAgICBub3RpZnlfdmFyaWFibGVfd2F0Y2hlcnMgKHN5bWJv bCwgdm9pZGU/IFFuaWwgOiBuZXd2YWwsCisJICAgIG5vdGlmeV92YXJpYWJsZV93YXRjaGVycyAo c3ltYm9sLCBuZXd2YWwsCiAJCQkJICAgICAgKGJpbmRmbGFnID09IFNFVF9JTlRFUk5BTF9CSU5E PyBRbGV0IDoKIAkJCQkgICAgICAgYmluZGZsYWcgPT0gU0VUX0lOVEVSTkFMX1VOQklORD8gUXVu bGV0IDoKIAkJCQkgICAgICAgdm9pZGU/IFFtYWt1bmJvdW5kIDogUXNldCksIHdoZXJlKTsKQEAg LTE5MjMsNiArMTkyMywxMSBAQCBub3RpZnlfdmFyaWFibGVfd2F0Y2hlcnMgKExpc3BfT2JqZWN0 IHN5bWJvbCwKICAgaWYgKEVRIChvcGVyYXRpb24sIFFzZXRfZGVmYXVsdCkpCiAgICAgb3BlcmF0 aW9uID0gUXNldDsKIAorICAvKiBDYW4gYXJyaXZlIGhlcmUgd2l0aCAnUW1ha3VuYm91bmQnIGFu ZCBub3QgJ1F1bmJvdW5kJyBpZiBjYW1lCisgICAgIGZyb20gYSByZXNldF9idWZmZXJfbG9jYWxf dmFyaWFibGVzJyBsaXN0LiAgKi8KKyAgaWYgKEJBU0VfRVEgKG5ld3ZhbCwgUXVuYm91bmQpKQor ICAgIG5ld3ZhbCA9IFFuaWw7CisKICAgZm9yIChMaXNwX09iamVjdCB3YXRjaGVycyA9IEZnZXQg KHN5bWJvbCwgUXdhdGNoZXJzKTsKICAgICAgICBDT05TUCAod2F0Y2hlcnMpOwogICAgICAgIHdh dGNoZXJzID0gWENEUiAod2F0Y2hlcnMpKQpAQCAtMjA0OCw4ICsyMDUzLDYgQEAgc2V0X2RlZmF1 bHRfaW50ZXJuYWwgKExpc3BfT2JqZWN0IHN5bWJvbCwgTGlzcF9PYmplY3QgdmFsdWUsCiAgICAg ICB7CiAJc3RydWN0IExpc3BfQnVmZmVyX0xvY2FsX1ZhbHVlICpibHYgPSBTWU1CT0xfQkxWIChz eW0pOwogCi0JYm9vbCB2b2lkZSA9IEJBU0VfRVEgKHZhbHVlLCBRdW5ib3VuZCk7Ci0KIAkvKiBJ ZiB3YXRjaGVkIG5vdGlmeSB1bmxlc3MgdGhyZWFkIHN3aXRjaGluZyAqLwogCWlmIChzeW0tPnUu cy50cmFwcGVkX3dyaXRlID09IFNZTUJPTF9UUkFQUEVEX1dSSVRFCiAJICAgICYmIGJpbmRmbGFn ICE9IFNFVF9JTlRFUk5BTF9USFJFQURfU1dJVENIKQpAQCAtMjA1OSwxMSArMjA2MiwxOCBAQCBz ZXRfZGVmYXVsdF9pbnRlcm5hbCAoTGlzcF9PYmplY3Qgc3ltYm9sLCBMaXNwX09iamVjdCB2YWx1 ZSwKIAkgICAgICAgd2FzIHVzZWQgZm9yIGZpcnN0IHRpbWUgaW4gdGhpcyBsZXQsIHVubGV0IGlz IHRvIGRlZmF1bHQuCiAJICAgICAgIElmIG5vdCBmcm9tIGRvX29uZV91bmJpbmQgdGhpcyBpcyBh IGRpcmVjdCBjYWxsLiAgKi8KIAkgICAgaWYgKGJpbmRmbGFnID09IFNFVF9JTlRFUk5BTF9VTkJJ TkQpCi0JICAgICAgbm90aWZ5X3ZhcmlhYmxlX3dhdGNoZXJzIChzeW1ib2wsIHZvaWRlID8gUW5p bCA6IHZhbHVlLCBRdW5sZXQsIFFuaWwpOworCSAgICAgIG5vdGlmeV92YXJpYWJsZV93YXRjaGVy cyAoc3ltYm9sLCB2YWx1ZSwgUXVubGV0LCBRbmlsKTsKIAkgICAgZWxzZQogCSAgICAgIG5vdGlm eV92YXJpYWJsZV93YXRjaGVycyAoc3ltYm9sLCB2YWx1ZSwgUXNldF9kZWZhdWx0LCBRbmlsKTsK IAkgIH0KIAorCS8qIElmIG1ha2VfbG9jYWxfZm9vIGlzIHVzZWQgb24gYSBnbG9iYWxseSB1bmJv dW5kIHN5bWJvbAorCSAgIHdpdGhpbiBhIGxldCBmb3IgdGhlIGZpcnN0IHRpbWUsIG9yIG1ha2Vf bG9jYWxfZm9vIGlzIHVzZWQgaW4KKwkgICBzb21lIGJ1ZmZlciB0aGVuIGZvbyBpcyBsZXQgYm91 bmQgaW4gYSBidWZmZXIgdGhhdCBzZWVzIGFuCisJICAgdW5ib3VuZCBkZWZhdWx0IHZhbHVlICgn bGV0X3NoYWRvd3NfZGVmYXVsdCcpLCB0aGVuIHdlIGNhbgorCSAgIHJlYWNoIGhlcmUgZHVyaW5n IHRoZSB1bmxldCB3aXRoICd2YWx1ZScgPSAnUXVuYm91bmQnLgorCSAgIHdlIG1heSBuZWVkIHRo aXM6IGJvb2wgdm9pZGUgPSBCQVNFX0VRICh2YWx1ZSwgUXVuYm91bmQpOyAgKi8KKwogCS8qIFN0 b3JlIG5ldyB2YWx1ZSBpbnRvIHRoZSBERUZBVUxULVZBTFVFIHNsb3QuICAqLwogCVhTRVRDRFIg KGJsdi0+ZGVmY2VsbCwgdmFsdWUpOwogCkBAIC0yMDkyLDcgKzIxMDIsNyBAQCBzZXRfZGVmYXVs dF9pbnRlcm5hbCAoTGlzcF9PYmplY3Qgc3ltYm9sLCBMaXNwX09iamVjdCB2YWx1ZSwKIAkJICAg ZnJvbSBhICdtYWt1bmJvdW5kJyB3aXRoaW4gYSBsZXQuICAqLwogCQlib29sIHZvaWRlID0gQkFT RV9FUSAodmFsdWUsIFF1bmJvdW5kKTsKIAotCQlub3RpZnlfdmFyaWFibGVfd2F0Y2hlcnMgKHN5 bWJvbCwgdm9pZGU/IFFuaWwgOiB2YWx1ZSwKKwkJbm90aWZ5X3ZhcmlhYmxlX3dhdGNoZXJzIChz eW1ib2wsIHZhbHVlLAogCQkJCQkgIChiaW5kZmxhZyA9PSBTRVRfSU5URVJOQUxfQklORD8gUWxl dCA6CiAJCQkJCSAgIGJpbmRmbGFnID09IFNFVF9JTlRFUk5BTF9VTkJJTkQ/IFF1bmxldCA6CiAJ CQkJCSAgIHZvaWRlPyBRbWFrdW5ib3VuZCA6IFFzZXRfZGVmYXVsdCksIFFuaWwpOwpAQCAtMjM5 MSw3ICsyNDAxLDcgQEAgREVGVU4gKCJraWxsLWxvY2FsLXZhcmlhYmxlIiwgRmtpbGxfbG9jYWxf dmFyaWFibGUsIFNraWxsX2xvY2FsX3ZhcmlhYmxlLAogICAgIH0KIAogICBpZiAoc3ltLT51LnMu dHJhcHBlZF93cml0ZSA9PSBTWU1CT0xfVFJBUFBFRF9XUklURSkKLSAgICBub3RpZnlfdmFyaWFi bGVfd2F0Y2hlcnMgKHZhcmlhYmxlLCBRbmlsLCBRbWFrdW5ib3VuZCwgRmN1cnJlbnRfYnVmZmVy ICgpKTsKKyAgICBub3RpZnlfdmFyaWFibGVfd2F0Y2hlcnMgKHZhcmlhYmxlLCBRdW5ib3VuZCwg UW1ha3VuYm91bmQsIEZjdXJyZW50X2J1ZmZlciAoKSk7CiAKICAgLyogR2V0IHJpZCBvZiB0aGlz IGJ1ZmZlcidzIGFsaXN0IGVsZW1lbnQsIGlmIGFueS4gICovCiAgIFhTRVRTWU1CT0wgKHZhcmlh YmxlLCBzeW0pOwkvKiBQcm9wYWdhdGUgdmFyaWFibGUgaW5kaXJlY3Rpb24uICAqLwotLSAKMi4z NC4xCgo= --000000000000c4771f0615416507 Content-Type: application/x-patch; name="0021-Fix-set_default-from-notifying-watchers-with-unbound.patch" Content-Disposition: attachment; filename="0021-Fix-set_default-from-notifying-watchers-with-unbound.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lukwgjgk2 RnJvbSBkNTJiMDcxMDU3YzE1Y2E5YzQ4ZTA3YWU1MjkzODMyOWNhNWI3MWNlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiUm9iZXJ0IEEuIEJ1cmtzIiA8cmJ1cmtzZGV2QGdtYWlsLmNv bT4KRGF0ZTogU3VuLCAxNyBNYXIgMjAyNCAyMDoyNjowNiAtMDQwMApTdWJqZWN0OiBbUEFUQ0gg MjEvMzFdICogRml4IHNldF9kZWZhdWx0IGZyb20gbm90aWZ5aW5nIHdhdGNoZXJzIHdpdGgKICd1 bmJvdW5kJyAoQlVHIzAwMDA2KQoKSW4gc29tZSBjYXNlcyBzZXRfZGVmYXVsdCBpcyBjYWxsZWQg ZnJvbSBkb19vbmVfdW5iaW5kIGFuZCB3b3VsZCBub3RpZnkKJ3VuYm91bmQnIHJhdGhlciB0aGFu ICduaWwnLgoKKiBzcmMvZGF0YS5jIChzZXRfZGVmYXVsdF9pbnRlcm5hbCk6Ci0tLQogc3JjL2Rh dGEuYyB8IDQgKysrLQogMSBmaWxlIGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlv bigtKQoKZGlmZiAtLWdpdCBhL3NyYy9kYXRhLmMgYi9zcmMvZGF0YS5jCmluZGV4IDlmZDQ4MWNh YTE5Li5jNmE0M2FmZjg4MiAxMDA2NDQKLS0tIGEvc3JjL2RhdGEuYworKysgYi9zcmMvZGF0YS5j CkBAIC0yMDQ4LDYgKzIwNDgsOCBAQCBzZXRfZGVmYXVsdF9pbnRlcm5hbCAoTGlzcF9PYmplY3Qg c3ltYm9sLCBMaXNwX09iamVjdCB2YWx1ZSwKICAgICAgIHsKIAlzdHJ1Y3QgTGlzcF9CdWZmZXJf TG9jYWxfVmFsdWUgKmJsdiA9IFNZTUJPTF9CTFYgKHN5bSk7CiAKKwlib29sIHZvaWRlID0gQkFT RV9FUSAodmFsdWUsIFF1bmJvdW5kKTsKKwogCS8qIElmIHdhdGNoZWQgbm90aWZ5IHVubGVzcyB0 aHJlYWQgc3dpdGNoaW5nICovCiAJaWYgKHN5bS0+dS5zLnRyYXBwZWRfd3JpdGUgPT0gU1lNQk9M X1RSQVBQRURfV1JJVEUKIAkgICAgJiYgYmluZGZsYWcgIT0gU0VUX0lOVEVSTkFMX1RIUkVBRF9T V0lUQ0gpCkBAIC0yMDU3LDcgKzIwNTksNyBAQCBzZXRfZGVmYXVsdF9pbnRlcm5hbCAoTGlzcF9P YmplY3Qgc3ltYm9sLCBMaXNwX09iamVjdCB2YWx1ZSwKIAkgICAgICAgd2FzIHVzZWQgZm9yIGZp cnN0IHRpbWUgaW4gdGhpcyBsZXQsIHVubGV0IGlzIHRvIGRlZmF1bHQuCiAJICAgICAgIElmIG5v dCBmcm9tIGRvX29uZV91bmJpbmQgdGhpcyBpcyBhIGRpcmVjdCBjYWxsLiAgKi8KIAkgICAgaWYg KGJpbmRmbGFnID09IFNFVF9JTlRFUk5BTF9VTkJJTkQpCi0JICAgICAgbm90aWZ5X3ZhcmlhYmxl X3dhdGNoZXJzIChzeW1ib2wsIHZhbHVlLCBRdW5sZXQsIFFuaWwpOworCSAgICAgIG5vdGlmeV92 YXJpYWJsZV93YXRjaGVycyAoc3ltYm9sLCB2b2lkZSA/IFFuaWwgOiB2YWx1ZSwgUXVubGV0LCBR bmlsKTsKIAkgICAgZWxzZQogCSAgICAgIG5vdGlmeV92YXJpYWJsZV93YXRjaGVycyAoc3ltYm9s LCB2YWx1ZSwgUXNldF9kZWZhdWx0LCBRbmlsKTsKIAkgIH0KLS0gCjIuMzQuMQoK --000000000000c4771f0615416507 Content-Type: application/x-patch; name="0023-Add-ert-for-unbound-watcher-notification-BUG-00006.patch" Content-Disposition: attachment; filename="0023-Add-ert-for-unbound-watcher-notification-BUG-00006.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lukwgjg50 RnJvbSBhYjY4ZWIzMTI1NjliYjU0OWZhYzdjY2E4MDBkYmQ1N2Y5OTJhNDM5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiUm9iZXJ0IEEuIEJ1cmtzIiA8cmJ1cmtzZGV2QGdtYWlsLmNv bT4KRGF0ZTogTW9uLCAxOCBNYXIgMjAyNCAwMjoxNjo0MiAtMDQwMApTdWJqZWN0OiBbUEFUQ0gg MjMvMzFdICogQWRkIGVydCBmb3IgJ3VuYm91bmQnIHdhdGNoZXIgbm90aWZpY2F0aW9uCiAoQlVH IzAwMDA2KQoKKiB0ZXN0L3NyYy9kYXRhLXRlc3RzLmVsIChlcnQtZGVmdGVzdCBkYXRhLXRlc3Rz LW1ha2UtbG9jYWwtd2F0Y2hlci1idWcwMDAwNik6Ci0tLQogdGVzdC9zcmMvZGF0YS10ZXN0cy5l bCB8IDY2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDY2IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS90ZXN0L3NyYy9kYXRhLXRl c3RzLmVsIGIvdGVzdC9zcmMvZGF0YS10ZXN0cy5lbAppbmRleCA4NDM3OWYyNGJiNy4uMThkYWU1 ZjczNjMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3JjL2RhdGEtdGVzdHMuZWwKKysrIGIvdGVzdC9zcmMv ZGF0YS10ZXN0cy5lbApAQCAtOTM2LDYgKzkzNiw3MiBAQCBkYXRhLXRlc3RzLW1ha3VuYm91bmQt d2F0Y2hlci1idWcwMDAwNQogICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYyIDIwMCBz ZXQgLGIxKSkpCiAgICAgKHNob3VsZCAobnVsbCAgcjEpKSkpCiAKKzs7IEJVRyMwMDAwNgorKGVy dC1kZWZ0ZXN0IGRhdGEtdGVzdHMtbWFrZS1sb2NhbC13YXRjaGVyLWJ1ZzAwMDA2ICgpCisgIDs7 IG1ha2VfbG9jYWxfZm9vIHdpbGwgYmUgdXNlZCBvbiB1bmJvdW5kIHN5bWJvbHMKKyAgKGxldCog KChyMSBuaWwpICAgICAgIDs7IHJlc3VsdHMKKyAgICAgICAgIChiMSBuaWwpICAgICAgIDs7IGJ1 ZmZlciAxCisgICAgICAgICAoYjIgKGdlbnN5bSkpICA7OyBidWZmZXIgMgorICAgICAgICAgKHYx IChnZW5zeW0pKSAgOzsgbWFrZV9sb2NhbF9mb28gaW4gc29tZSBidWZmZXIKKyAgICAgICAgICh2 MiAoZ2Vuc3ltKSkgIDs7IG1ha2VfbG9jYWxfZm9vIGluIGEgbGV0CisgICAgICAgICAodjMgKGdl bnN5bSkpICA7OyBBIG1vcmUgY29tcGxleCBleGFtcGxlCisgICAgICAgICAoZjEgKGxhbWJkYSAo JnJlc3QgYXJncykgKHB1c2ggYXJncyByMSkpKSkKKyAgICAoYWRkLXZhcmlhYmxlLXdhdGNoZXIg djEgZjEpCisgICAgKGFkZC12YXJpYWJsZS13YXRjaGVyIHYyIGYxKQorICAgIChhZGQtdmFyaWFi bGUtd2F0Y2hlciB2MyBmMSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHNldHEgYjEg KGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgIChtYWtlLWxvY2FsLXZhcmlhYmxlIHYxKQorICAgICAg KGV2YWwgYChsZXQgKCgsdjEgMTAwKSkKKyAgICAgICAgICAgICAgIChzZXQgJyx2MSAyMDApKSkp CisgICAgKGV2YWwgYChsZXQgKCgsdjEgMzAwKSkKKyAgICAgICAgICAgICAoc2V0ICcsdjEgNDAw KSkpCisgICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjEgbmlsIHVubGV0IG5pbCkpKQor ICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYxIDQwMCBzZXQgbmlsKSkpCisgICAgKHNo b3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjEgMzAwIGxldCBuaWwpKSkKKyAgICAoc2hvdWxkIChl cXVhbCAocG9wIHIxKSBgKCx2MSBuaWwgdW5sZXQgLGIxKSkpCisgICAgKHNob3VsZCAoZXF1YWwg KHBvcCByMSkgYCgsdjEgMjAwIHNldCAsYjEpKSkKKyAgICAoc2hvdWxkIChlcXVhbCAocG9wIHIx KSBgKCx2MSAxMDAgbGV0ICxiMSkpKQorICAgIChzaG91bGQgKG51bGwgIHIxKSkKKyAgICAoc2V0 cSBiMSAoY3VycmVudC1idWZmZXIpKQorICAgIChldmFsIGAobGV0ICgoLHYyIDMwMCkpCisgICAg ICAgICAgICAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJyx2MikKKyAgICAgICAgICAgICAoc2V0ICcs djIgNDAwKSkpCisgICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjIgbmlsIHVubGV0IG5p bCkpKQorICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYyIDQwMCBzZXQgLGIxKSkpCisg ICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjIgMzAwIGxldCBuaWwpKSkKKyAgICAoc2hv dWxkIChudWxsICByMSkpCisgICAgKHNldHEgYjEgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAoZXZh bCBgKGxldCAoKCx2MyA1MCkpCisgICAgICAgICAgICAgKHNldCAnLHYzIDEwMCkKKyAgICAgICAg ICAgICAobWFrZS1sb2NhbC12YXJpYWJsZSAnLHYzKQorICAgICAgICAgICAgIChzZXQgJyx2MyAy MDApCisgICAgICAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAgICAgIChzZXQg JyxiMiAoY3VycmVudC1idWZmZXIpKQorICAgICAgICAgICAgICAgKGxldCAoKCx2MyAzMDApKQor ICAgICAgICAgICAgICAgICAoc2V0ICcsdjMgNDAwKSkKKyAgICAgICAgICAgICAgIChtYWtlLWxv Y2FsLXZhcmlhYmxlICcsdjMpCisgICAgICAgICAgICAgICAobGV0ICgoLHYzIDUwMCkpCisgICAg ICAgICAgICAgICAgIChzZXQgJyx2MyA2MDApKSkKKyAgICAgICAgICAgICAobGV0ICgoLHYzIDcw MCkpCisgICAgICAgICAgICAgICAoc2V0ICcsdjMgODAwKSkKKyAgICAgICAgICAgICAoc2V0ICcs djMgOTAwKSkpCisgICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjMgbmlsIHVubGV0IG5p bCkpKQorICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYzIDkwMCBzZXQgLGIxKSkpCisg ICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjMgMjAwIHVubGV0ICxiMSkpKQorICAgIChz aG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYzIDgwMCBzZXQgLGIxKSkpCisgICAgKHNob3VsZCAo ZXF1YWwgKHBvcCByMSkgYCgsdjMgNzAwIGxldCAsYjEpKSkKKyAgICAoc2hvdWxkIChlcXVhbCAo cG9wIHIxKSBgKCx2MyAxMDAgdW5sZXQgLChldmFsIGIyKSkpKQorICAgIChzaG91bGQgKGVxdWFs IChwb3AgcjEpIGAoLHYzIDYwMCBzZXQgLChldmFsIGIyKSkpKQorICAgIChzaG91bGQgKGVxdWFs IChwb3AgcjEpIGAoLHYzIDUwMCBsZXQgLChldmFsIGIyKSkpKQorICAgIChzaG91bGQgKGVxdWFs IChwb3AgcjEpIGAoLHYzIDEwMCB1bmxldCBuaWwpKSkKKyAgICAoc2hvdWxkIChlcXVhbCAocG9w IHIxKSBgKCx2MyA0MDAgc2V0IG5pbCkpKQorICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAo LHYzIDMwMCBsZXQgbmlsKSkpCisgICAgKHNob3VsZCAoZXF1YWwgKHBvcCByMSkgYCgsdjMgMjAw IHNldCAsYjEpKSkKKyAgICAoc2hvdWxkIChlcXVhbCAocG9wIHIxKSBgKCx2MyAxMDAgc2V0IG5p bCkpKQorICAgIChzaG91bGQgKGVxdWFsIChwb3AgcjEpIGAoLHYzIDUwIGxldCBuaWwpKSkKKyAg ICAoc2hvdWxkIChudWxsICByMSkpKSkKKwogKGVydC1kZWZ0ZXN0IGRhdGEtdGVzdHMta2lsbC1h bGwtbG9jYWwtdmFyaWFibGVzICgpIDtidWcjMzA4NDYKICAgKHdpdGgtdGVtcC1idWZmZXIKICAg ICAoc2V0cS1sb2NhbCBkYXRhLXRlc3RzLWZvbzEgMSkKLS0gCjIuMzQuMQoK --000000000000c4771f0615416507-- From debbugs-submit-bounces@debbugs.gnu.org Sat Apr 06 03:42:34 2024 Received: (at 70188) by debbugs.gnu.org; 6 Apr 2024 07:42:35 +0000 Received: from localhost ([127.0.0.1]:38103 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rt0h6-0006Kq-2Z for submit@debbugs.gnu.org; Sat, 06 Apr 2024 03:42:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:58860) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rt0h3-0006KK-TZ for 70188@debbugs.gnu.org; Sat, 06 Apr 2024 03:42:30 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rt0gs-0002kR-AI; Sat, 06 Apr 2024 03:42:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=3sxHBhhj809IdTdDC7+tE1/4RChKTJiIcW7EjHE6JLM=; b=Mh7IhA6RwVon YR8w9hsamBzBSEU9NgZGKuVF9bINkttftOOkpAtuWjfGyxMmXlThTdj0ailw6z0jcqvQvyf6I52EX EaqvcJMb8f4dasykKtPMQhhQUTRSmyuT4CBgddKT2msNOUhRre2fff8DuXa7AFCOvtFiMSQDTXXF0 J46VjvXKyuXqtkFgEXtbsUKe/IwiC1NT79mMk2GYqRpp9UeshFZTcdkOBGHuBMDYLgkWAFM2nPSXI trDF0l6696NhQ+3IKhSzUscTVD8+9mNC1Nz3Jh6rWcYCw0kFyOGK8SVEIsp3Fw3/2zC45NK8G1Fun 3KGAUIQFazRvqj5/hh8JBA==; Date: Sat, 06 Apr 2024 10:42:16 +0300 Message-Id: <86jzlb3pk7.fsf@gnu.org> From: Eli Zaretskii To: Robert Burks , Stefan Monnier In-Reply-To: (message from Robert Burks on Thu, 4 Apr 2024 04:46:47 -0400) Subject: Re: bug#70188: [PATCH] Fix + ert for notification sending 'set unbound' when unbinding (7 of 9) References: X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 70188 Cc: 70188@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Robert Burks > Date: Thu, 4 Apr 2024 04:46:47 -0400 > > (7 of 9) (Resistance is futile) > > Bug#00006 (The mysterious unlet to 'unbound') > ** Bug recreations are at the end > > Once again the path from do_one_unbind leads to rare cases in > set_default_internal. I have included a fix and ert. > > The case is do_one_unbind calls set_default_internal (foo , Qunbound, SET_INTERNAL_UNBIND) > -- We reach here with Qunbound as a value only when unletting if when 'letting' > the buffer saw the void default/global value. > -- make_local_foo called for the first time within a let on a variable that is globally void. > -- make_local_foo was called in some other buffer and a let takes place in a buffer that > still sees the default as void. (let_shadows_default) > -- The 'local_if_set' shadows default case cannot reach here with 'unbound' as a value, > even with something like this: > (defvar foo) > (make-variable-buffer-local 'foo) > This will establish a default of 'nil'. > -- I don't think there are any other ways set_default_internal is being called > with Qunbound as value on localized variables. > -- My included test is the only test in data-tests.el(maybe all testing) that > hits the above conditions. > > -- Currently it stores Qunbound to the cdr of blv->defcell and returns. This seems correct. > -- I have only tested plain values. Forward symbols like DEFVAR_LISP and DEFVAR_BOOL > (not DEFVAR_PER_BUFFER) could reach here with 'Qunbound' as 'new value' if they start > their life unbound. If makunbound is used on one they get turned to plain value > by set_internal. But if they are set unbound in 'C' who knows. > Maybe we need to check for void and do blv->fwd.fwdptr = NULL? Will need testing... > > First example is 'make_local_foo' happened in some other buffer so the 'let' in this > buffer now shadows the default. > > Second example is 'make_local_foo' happened in a 'let' making it 'unlet' to default. > > There still may exist other edge cases, I am working to uncover those. Every bug > example I have sent has been fixed by the patches included in these seven emails. > > Additionally, the work I have submitted does not change the way Emacs handles the > numerous scenarios around variable setting; it merely makes watcher notification > reflect the already defined behavior. > > Patch 0021: Fix for this bug (one(1) place requires bug# update) > > Patch 0022: Make it so functions pass 'Qunbound' to 'notify' and do conversion > to 'Qnil' there. This allows easier tracking in gdb, it was hard > to isolate prior. Distinction may also be needed in the future by > watchers. > > Patch 0023: ert for this bug (four(4) places require bug# update) > > Bug Recreation------------------------------------------------------------------ > > This path can only be reached through the special path from do_one_unbind that > leads to set_default_internal. > -------------------------------------------------------------------------------- > (defvar test) > test > > (defvar results nil) > results > > (add-variable-watcher 'test (lambda (&rest args) > (push args results))) > nil > > (with-temp-buffer > (make-local-variable 'test) > (let ((test 99)) > (set 'test 66))) > 66 > > (let ((test 99)) > (set 'test 66)) > 66 > > results > ((test unbound set nil) (test 66 set nil) (test 99 let nil) (test nil unlet #) (test 66 set # buffer>) (test 99 let #)) > ;; notice it says 'unbound' vs 'nil', all other functions that notify use 'nil' > ;; for the unbound case. 'test' is still unbound globally. It is returning a > ;; potential legitimate symbol 'unbound' because it is sending the 'C' string > ;; definition for Qunbound; > ;; Also, this should say 'unlet' (This was fixed with the bug#00004/5 solution) > -------------------------------------------------------------------------------- > Extra broke case > -------------------------------------------------------------------------------- > (defvar test) > test > > (defvar results nil) > results > > (add-variable-watcher 'test (lambda (&rest args) > (push args results))) > nil > > (let ((test 99)) > (make-local-variable 'test) > (set 'test 66)) > 66 > > test > 66 > > results > ((test unbound set nil) (test 66 set #) (test 99 let nil)) > ;; should be (test nil unlet nil) as it is now 66 in *scratch* but void globally > > Not a Bugged Case**************************************************************** > Notice this case works. One of the rare cases already tested for. > -------------------------------------------------------------------------------- > (defvar test) > test > > (defvar results nil) > results > > (add-variable-watcher 'test (lambda (&rest args) > (push args results))) > nil > > (make-local-variable 'test) > test > > (let ((test 99)) > (set 'test 66)) > 66 > > results > ((test nil unlet #) (test 66 set #) (test 99 let #)) This changes how the watchers are called, so it needs suitable changes in NEWS in and in the ELisp manual. Stefan, any comments?