The change (008fa749e0fe5b2fffd20b7fe4891bb80d072c6a) that moved the node release code to a separate function broke death notifications in some cases. When it encountered a reference without a death notification request, it would skip looking at the remaining references, and therefore fail to send death notifications for them.
Unified · Split
| @@ -2904,7 +2904,7 @@ static int binder_node_release(struct binder_node *node, int refs) · 2903 unmodified lines | ||
| 2904 | 2904 | refs++; |
| 2905 | 2905 | |
| 2906 | 2906 | if (!ref->death) |
| 2907 | − goto out; | |
| 2907 | + continue; | |
| 2908 | 2908 | |
| 2909 | 2909 | death++; |
| 2910 | 2910 | |
| @@ -2917,7 +2917,6 @@ static int binder_node_release(struct binder_node *node, int refs) · 6 unmodified lines | ||
| 2917 | 2917 | BUG(); |
| 2918 | 2918 | } |
| 2919 | 2919 | |
| 2920 | −out: | |
| 2921 | 2920 | binder_debug(BINDER_DEBUG_DEAD_BINDER, |
| 2922 | 2921 | "node %d now dead, refs %d, death %d\n", |
| 2923 | 2922 | node->debug_id, refs, death); |