Merge ~ahasenack/ubuntu/+source/samba:fix-printing-1951490-jammy into ubuntu/+source/samba:ubuntu/devel

Proposed by Andreas Hasenack
Status: Merged
Merged at revision: 1e9cf65c8c9c9f440f365914a757ad562acbe6fd
Proposed branch: ~ahasenack/ubuntu/+source/samba:fix-printing-1951490-jammy
Merge into: ubuntu/+source/samba:ubuntu/devel
Diff against target: 260 lines (+238/-0)
3 files modified
debian/changelog (+7/-0)
debian/patches/lp-1951490-fix-printing-KB5006743.patch (+230/-0)
debian/patches/series (+1/-0)
Reviewer Review Type Date Requested Status
Sergio Durigan Junior (community) Approve
Canonical Server Pending
Review via email: mp+416666@code.launchpad.net

Description of the change

Fix printing after KB5006743 from MS is applied to the clients.

This one is complicated to test because of the environment. I will try to rely on community members for the SRU testing. Some have already tested the patch in PPA builds that others have provided in the bug.

PPA: https://launchpad.net/~ahasenack/+archive/ubuntu/samba-kb5006743-printing/

To post a comment you must log in.
Revision history for this message
Sergio Durigan Junior (sergiodj) wrote :

Thanks for the MP, Andreas.

It LGTM. I'd like to see a multi-arch-enabled PPA just to make sure that all builds are still OK, but that's just a formality in this case since it doesn't involve any arch-related changes.

I ran autopkgtest for all 3 packages you're proposing and they've all passed, so I'm +1 here.

review: Approve
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Yeah, when there is no version bump or other big change, I typically don't enable other arches in the ppa because the builds take so much longer.

Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Thanks, uploaded

$ dput ubuntu ../samba_4.15.5~dfsg-0ubuntu2_source.changes
D: Setting host argument.
Checking signature on .changes
gpg: ../samba_4.15.5~dfsg-0ubuntu2_source.changes: Valid signature from AC983EB5BF6BCBA9
Checking signature on .dsc
gpg: ../samba_4.15.5~dfsg-0ubuntu2.dsc: Valid signature from AC983EB5BF6BCBA9
Uploading to ubuntu (via ftp to upload.ubuntu.com):
  Uploading samba_4.15.5~dfsg-0ubuntu2.dsc: done.
  Uploading samba_4.15.5~dfsg-0ubuntu2.debian.tar.xz: done.
  Uploading samba_4.15.5~dfsg-0ubuntu2_source.buildinfo: done.
  Uploading samba_4.15.5~dfsg-0ubuntu2_source.changes: done.
Successfully uploaded packages.

Update scan failed

At least one of the branches involved have failed to scan. You can manually schedule a rescan if required.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/debian/changelog b/debian/changelog
2index d83aed5..7f8f905 100644
3--- a/debian/changelog
4+++ b/debian/changelog
5@@ -1,3 +1,10 @@
6+samba (2:4.15.5~dfsg-0ubuntu2) jammy; urgency=medium
7+
8+ * d/p/lp-1951490-fix-printing-KB5006743.patch: Fix printing after
9+ Windows 2021-10 Monthly Rollup patch (LP: #1951490)
10+
11+ -- Andreas Hasenack <andreas@canonical.com> Thu, 10 Mar 2022 10:32:59 -0300
12+
13 samba (2:4.15.5~dfsg-0ubuntu1) jammy; urgency=medium
14
15 * d/{gpb.conf,watch,README.source}: update for 4.15
16diff --git a/debian/patches/lp-1951490-fix-printing-KB5006743.patch b/debian/patches/lp-1951490-fix-printing-KB5006743.patch
17new file mode 100644
18index 0000000..fa2add4
19--- /dev/null
20+++ b/debian/patches/lp-1951490-fix-printing-KB5006743.patch
21@@ -0,0 +1,230 @@
22+From e26270cbe587ebd297b2b0fbece3e9c0542862d0 Mon Sep 17 00:00:00 2001
23+From: Stefan Metzmacher <metze@samba.org>
24+Date: Sat, 22 Jan 2022 01:08:26 +0100
25+Subject: [PATCH] dcesrv_core: wrap gensec_*() calls in [un]become_root() calls
26+
27+This is important for the source3/rpc_server code as it might
28+be called embedded in smbd and may not run as root with access
29+to our private tdb/ldb files.
30+
31+Note this is only really needed for 4.15 and older, as
32+we no longer run the rpc_server embedded in smbd,
33+but we better be consistent for now.
34+
35+This should be able to fix the problem the printing no longer works
36+on Windows 7 with 2021-10 monthly rollup patch (KB5006743).
37+
38+Windows uses NTLMSSP with privacy at the DCERPC layer on top
39+of NCACN_NP (smb).
40+
41+BUG: https://bugzilla.samba.org/show_bug.cgi?id=14867
42+
43+Signed-off-by: Stefan Metzmacher <metze@samba.org>
44+Reviewed-by: Andreas Schneider <asn@samba.org>
45+(cherry picked from commit 0651fa474cd68b18d8eb9bdc7c4ba5b847ba9ad9)
46+---
47+ librpc/rpc/dcesrv_auth.c | 5 +++++
48+ librpc/rpc/dcesrv_core.c | 18 ++++++++++++++++++
49+ librpc/rpc/dcesrv_core.h | 2 ++
50+ source3/rpc_server/rpc_config.c | 2 ++
51+ source4/rpc_server/service_rpc.c | 10 ++++++++++
52+ 5 files changed, 37 insertions(+)
53+
54+Origin: upstream, https://git.samba.org/samba.git/?p=samba.git;a=commit;h=e26270cbe587ebd297b2b0fbece3e9c0542862d0
55+Bug: https://bugzilla.samba.org/show_bug.cgi?id=14867
56+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/samba/+bug/1951490
57+Last-Update: 2022-03-10
58+diff --git a/librpc/rpc/dcesrv_auth.c b/librpc/rpc/dcesrv_auth.c
59+index fec8df513a8..99d8e016216 100644
60+--- a/librpc/rpc/dcesrv_auth.c
61++++ b/librpc/rpc/dcesrv_auth.c
62+@@ -130,11 +130,13 @@ static bool dcesrv_auth_prepare_gensec(struct dcesrv_call_state *call)
63+ auth->auth_level = call->in_auth_info.auth_level;
64+ auth->auth_context_id = call->in_auth_info.auth_context_id;
65+
66++ cb->auth.become_root();
67+ status = cb->auth.gensec_prepare(
68+ auth,
69+ call,
70+ &auth->gensec_security,
71+ cb->auth.private_data);
72++ cb->auth.unbecome_root();
73+ if (!NT_STATUS_IS_OK(status)) {
74+ DEBUG(1, ("Failed to call samba_server_gensec_start %s\n",
75+ nt_errstr(status)));
76+@@ -329,6 +331,7 @@ bool dcesrv_auth_bind(struct dcesrv_call_state *call)
77+ NTSTATUS dcesrv_auth_complete(struct dcesrv_call_state *call, NTSTATUS status)
78+ {
79+ struct dcesrv_auth *auth = call->auth_state;
80++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
81+ const char *pdu = "<unknown>";
82+
83+ switch (call->pkt.ptype) {
84+@@ -359,9 +362,11 @@ NTSTATUS dcesrv_auth_complete(struct dcesrv_call_state *call, NTSTATUS status)
85+ return status;
86+ }
87+
88++ cb->auth.become_root();
89+ status = gensec_session_info(auth->gensec_security,
90+ auth,
91+ &auth->session_info);
92++ cb->auth.unbecome_root();
93+ if (!NT_STATUS_IS_OK(status)) {
94+ DEBUG(1, ("Failed to establish session_info: %s\n",
95+ nt_errstr(status)));
96+diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c
97+index d16159b0b6c..ea91fc689b4 100644
98+--- a/librpc/rpc/dcesrv_core.c
99++++ b/librpc/rpc/dcesrv_core.c
100+@@ -938,6 +938,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
101+ struct dcerpc_binding *ep_2nd_description = NULL;
102+ const char *endpoint = NULL;
103+ struct dcesrv_auth *auth = call->auth_state;
104++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
105+ struct dcerpc_ack_ctx *ack_ctx_list = NULL;
106+ struct dcerpc_ack_ctx *ack_features = NULL;
107+ struct tevent_req *subreq = NULL;
108+@@ -1143,9 +1144,11 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
109+ return dcesrv_auth_reply(call);
110+ }
111+
112++ cb->auth.become_root();
113+ subreq = gensec_update_send(call, call->event_ctx,
114+ auth->gensec_security,
115+ call->in_auth_info.credentials);
116++ cb->auth.unbecome_root();
117+ if (subreq == NULL) {
118+ return NT_STATUS_NO_MEMORY;
119+ }
120+@@ -1160,10 +1163,13 @@ static void dcesrv_bind_done(struct tevent_req *subreq)
121+ tevent_req_callback_data(subreq,
122+ struct dcesrv_call_state);
123+ struct dcesrv_connection *conn = call->conn;
124++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
125+ NTSTATUS status;
126+
127++ cb->auth.become_root();
128+ status = gensec_update_recv(subreq, call,
129+ &call->out_auth_info->credentials);
130++ cb->auth.unbecome_root();
131+ TALLOC_FREE(subreq);
132+
133+ status = dcesrv_auth_complete(call, status);
134+@@ -1221,6 +1227,7 @@ static NTSTATUS dcesrv_auth3(struct dcesrv_call_state *call)
135+ {
136+ struct dcesrv_connection *conn = call->conn;
137+ struct dcesrv_auth *auth = call->auth_state;
138++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
139+ struct tevent_req *subreq = NULL;
140+ NTSTATUS status;
141+
142+@@ -1265,9 +1272,11 @@ static NTSTATUS dcesrv_auth3(struct dcesrv_call_state *call)
143+ return NT_STATUS_OK;
144+ }
145+
146++ cb->auth.become_root();
147+ subreq = gensec_update_send(call, call->event_ctx,
148+ auth->gensec_security,
149+ call->in_auth_info.credentials);
150++ cb->auth.unbecome_root();
151+ if (subreq == NULL) {
152+ return NT_STATUS_NO_MEMORY;
153+ }
154+@@ -1283,10 +1292,13 @@ static void dcesrv_auth3_done(struct tevent_req *subreq)
155+ struct dcesrv_call_state);
156+ struct dcesrv_connection *conn = call->conn;
157+ struct dcesrv_auth *auth = call->auth_state;
158++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
159+ NTSTATUS status;
160+
161++ cb->auth.become_root();
162+ status = gensec_update_recv(subreq, call,
163+ &call->out_auth_info->credentials);
164++ cb->auth.unbecome_root();
165+ TALLOC_FREE(subreq);
166+
167+ status = dcesrv_auth_complete(call, status);
168+@@ -1555,6 +1567,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
169+ struct ncacn_packet *pkt = &call->ack_pkt;
170+ uint32_t extra_flags = 0;
171+ struct dcesrv_auth *auth = call->auth_state;
172++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
173+ struct dcerpc_ack_ctx *ack_ctx_list = NULL;
174+ struct tevent_req *subreq = NULL;
175+ size_t i;
176+@@ -1666,9 +1679,11 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
177+ return dcesrv_auth_reply(call);
178+ }
179+
180++ cb->auth.become_root();
181+ subreq = gensec_update_send(call, call->event_ctx,
182+ auth->gensec_security,
183+ call->in_auth_info.credentials);
184++ cb->auth.unbecome_root();
185+ if (subreq == NULL) {
186+ return NT_STATUS_NO_MEMORY;
187+ }
188+@@ -1683,10 +1698,13 @@ static void dcesrv_alter_done(struct tevent_req *subreq)
189+ tevent_req_callback_data(subreq,
190+ struct dcesrv_call_state);
191+ struct dcesrv_connection *conn = call->conn;
192++ struct dcesrv_context_callbacks *cb = call->conn->dce_ctx->callbacks;
193+ NTSTATUS status;
194+
195++ cb->auth.become_root();
196+ status = gensec_update_recv(subreq, call,
197+ &call->out_auth_info->credentials);
198++ cb->auth.unbecome_root();
199+ TALLOC_FREE(subreq);
200+
201+ status = dcesrv_auth_complete(call, status);
202+diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h
203+index d8d5f903095..0538442e0ce 100644
204+--- a/librpc/rpc/dcesrv_core.h
205++++ b/librpc/rpc/dcesrv_core.h
206+@@ -392,6 +392,8 @@ struct dcesrv_context_callbacks {
207+ struct gensec_security **out,
208+ void *private_data);
209+ void *private_data;
210++ void (*become_root)(void);
211++ void (*unbecome_root)(void);
212+ } auth;
213+ struct {
214+ NTSTATUS (*find)(
215+diff --git a/source3/rpc_server/rpc_config.c b/source3/rpc_server/rpc_config.c
216+index 2f1a01da1c0..289c4f39840 100644
217+--- a/source3/rpc_server/rpc_config.c
218++++ b/source3/rpc_server/rpc_config.c
219+@@ -31,6 +31,8 @@
220+ static struct dcesrv_context_callbacks srv_callbacks = {
221+ .log.successful_authz = dcesrv_log_successful_authz,
222+ .auth.gensec_prepare = dcesrv_auth_gensec_prepare,
223++ .auth.become_root = become_root,
224++ .auth.unbecome_root = unbecome_root,
225+ .assoc_group.find = dcesrv_assoc_group_find,
226+ };
227+
228+diff --git a/source4/rpc_server/service_rpc.c b/source4/rpc_server/service_rpc.c
229+index d8c6746d781..ebb50f8a7ef 100644
230+--- a/source4/rpc_server/service_rpc.c
231++++ b/source4/rpc_server/service_rpc.c
232+@@ -40,9 +40,19 @@
233+ #include "../libcli/named_pipe_auth/npa_tstream.h"
234+ #include "samba/process_model.h"
235+
236++static void skip_become_root(void)
237++{
238++}
239++
240++static void skip_unbecome_root(void)
241++{
242++}
243++
244+ static struct dcesrv_context_callbacks srv_callbacks = {
245+ .log.successful_authz = log_successful_dcesrv_authz_event,
246+ .auth.gensec_prepare = dcesrv_gensec_prepare,
247++ .auth.become_root = skip_become_root,
248++ .auth.unbecome_root = skip_unbecome_root,
249+ .assoc_group.find = dcesrv_assoc_group_find,
250+ };
251+
252diff --git a/debian/patches/series b/debian/patches/series
253index d2d04e9..b2fb6a3 100644
254--- a/debian/patches/series
255+++ b/debian/patches/series
256@@ -9,3 +9,4 @@ heimdal-rfc3454.txt
257 smbd.service-Run-update-apparmor-samba-profile-befor.patch
258 fix-nfs-service-name-to-nfs-kernel-server.patch
259 ctdb-config-enable-syslog-by-default.patch
260+lp-1951490-fix-printing-KB5006743.patch

Subscribers

People subscribed via source and target branches